亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? cdc-acm.c

?? linux 內(nèi)核源代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
				  buf->base,				  acm->readsize,				  acm_read_bulk, rcv);		rcv->urb->transfer_dma = buf->dma;		rcv->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;		dbg("acm_rx_tasklet: sending urb 0x%p, rcv 0x%p, buf 0x%p", rcv->urb, rcv, buf);		/* This shouldn't kill the driver as unsuccessful URBs are returned to the		   free-urbs-pool and resubmited ASAP */		if (usb_submit_urb(rcv->urb, GFP_ATOMIC) < 0) {			list_add(&buf->list, &acm->spare_read_bufs);			spin_lock_irqsave(&acm->read_lock, flags);			list_add(&rcv->list, &acm->spare_read_urbs);			spin_unlock_irqrestore(&acm->read_lock, flags);			return;		}	}}/* data interface wrote those outgoing bytes */static void acm_write_bulk(struct urb *urb){	struct acm *acm = (struct acm *)urb->context;	dbg("Entering acm_write_bulk with status %d", urb->status);	acm_write_done(acm);	acm_write_start(acm);	if (ACM_READY(acm))		schedule_work(&acm->work);}static void acm_softint(struct work_struct *work){	struct acm *acm = container_of(work, struct acm, work);	dbg("Entering acm_softint.");		if (!ACM_READY(acm))		return;	tty_wakeup(acm->tty);}/* * TTY handlers */static int acm_tty_open(struct tty_struct *tty, struct file *filp){	struct acm *acm;	int rv = -EINVAL;	int i;	dbg("Entering acm_tty_open.");	mutex_lock(&open_mutex);	acm = acm_table[tty->index];	if (!acm || !acm->dev)		goto err_out;	else		rv = 0;	tty->driver_data = acm;	acm->tty = tty;	/* force low_latency on so that our tty_push actually forces the data through,	   otherwise it is scheduled, and with high data rates data can get lost. */	tty->low_latency = 1;	if (acm->used++) {		goto done;        }	acm->ctrlurb->dev = acm->dev;	if (usb_submit_urb(acm->ctrlurb, GFP_KERNEL)) {		dbg("usb_submit_urb(ctrl irq) failed");		goto bail_out;	}	if (0 > acm_set_control(acm, acm->ctrlout = ACM_CTRL_DTR | ACM_CTRL_RTS) &&	    (acm->ctrl_caps & USB_CDC_CAP_LINE))		goto full_bailout;	INIT_LIST_HEAD(&acm->spare_read_urbs);	INIT_LIST_HEAD(&acm->spare_read_bufs);	INIT_LIST_HEAD(&acm->filled_read_bufs);	for (i = 0; i < acm->rx_buflimit; i++) {		list_add(&(acm->ru[i].list), &acm->spare_read_urbs);	}	for (i = 0; i < acm->rx_buflimit; i++) {		list_add(&(acm->rb[i].list), &acm->spare_read_bufs);	}	acm->throttle = 0;	tasklet_schedule(&acm->urb_task);done:err_out:	mutex_unlock(&open_mutex);	return rv;full_bailout:	usb_kill_urb(acm->ctrlurb);bail_out:	acm->used--;	mutex_unlock(&open_mutex);	return -EIO;}static void acm_tty_unregister(struct acm *acm){	int i,nr;	nr = acm->rx_buflimit;	tty_unregister_device(acm_tty_driver, acm->minor);	usb_put_intf(acm->control);	acm_table[acm->minor] = NULL;	usb_free_urb(acm->ctrlurb);	usb_free_urb(acm->writeurb);	for (i = 0; i < nr; i++)		usb_free_urb(acm->ru[i].urb);	kfree(acm->country_codes);	kfree(acm);}static void acm_tty_close(struct tty_struct *tty, struct file *filp){	struct acm *acm = tty->driver_data;	int i,nr;	if (!acm || !acm->used)		return;	nr = acm->rx_buflimit;	mutex_lock(&open_mutex);	if (!--acm->used) {		if (acm->dev) {			acm_set_control(acm, acm->ctrlout = 0);			usb_kill_urb(acm->ctrlurb);			usb_kill_urb(acm->writeurb);			for (i = 0; i < nr; i++)				usb_kill_urb(acm->ru[i].urb);		} else			acm_tty_unregister(acm);	}	mutex_unlock(&open_mutex);}static int acm_tty_write(struct tty_struct *tty, const unsigned char *buf, int count){	struct acm *acm = tty->driver_data;	int stat;	unsigned long flags;	int wbn;	struct acm_wb *wb;	dbg("Entering acm_tty_write to write %d bytes,", count);	if (!ACM_READY(acm))		return -EINVAL;	if (!count)		return 0;	spin_lock_irqsave(&acm->write_lock, flags);	if ((wbn = acm_wb_alloc(acm)) < 0) {		spin_unlock_irqrestore(&acm->write_lock, flags);		acm_write_start(acm);		return 0;	}	wb = &acm->wb[wbn];	count = (count > acm->writesize) ? acm->writesize : count;	dbg("Get %d bytes...", count);	memcpy(wb->buf, buf, count);	wb->len = count;	spin_unlock_irqrestore(&acm->write_lock, flags);	if ((stat = acm_write_start(acm)) < 0)		return stat;	return count;}static int acm_tty_write_room(struct tty_struct *tty){	struct acm *acm = tty->driver_data;	if (!ACM_READY(acm))		return -EINVAL;	/*	 * Do not let the line discipline to know that we have a reserve,	 * or it might get too enthusiastic.	 */	return (acm->write_ready && acm_wb_is_avail(acm)) ? acm->writesize : 0;}static int acm_tty_chars_in_buffer(struct tty_struct *tty){	struct acm *acm = tty->driver_data;	if (!ACM_READY(acm))		return -EINVAL;	/*	 * This is inaccurate (overcounts), but it works.	 */	return (ACM_NW - acm_wb_is_avail(acm)) * acm->writesize;}static void acm_tty_throttle(struct tty_struct *tty){	struct acm *acm = tty->driver_data;	if (!ACM_READY(acm))		return;	spin_lock_bh(&acm->throttle_lock);	acm->throttle = 1;	spin_unlock_bh(&acm->throttle_lock);}static void acm_tty_unthrottle(struct tty_struct *tty){	struct acm *acm = tty->driver_data;	if (!ACM_READY(acm))		return;	spin_lock_bh(&acm->throttle_lock);	acm->throttle = 0;	spin_unlock_bh(&acm->throttle_lock);	tasklet_schedule(&acm->urb_task);}static void acm_tty_break_ctl(struct tty_struct *tty, int state){	struct acm *acm = tty->driver_data;	if (!ACM_READY(acm))		return;	if (acm_send_break(acm, state ? 0xffff : 0))		dbg("send break failed");}static int acm_tty_tiocmget(struct tty_struct *tty, struct file *file){	struct acm *acm = tty->driver_data;	if (!ACM_READY(acm))		return -EINVAL;	return (acm->ctrlout & ACM_CTRL_DTR ? TIOCM_DTR : 0) |	       (acm->ctrlout & ACM_CTRL_RTS ? TIOCM_RTS : 0) |	       (acm->ctrlin  & ACM_CTRL_DSR ? TIOCM_DSR : 0) |	       (acm->ctrlin  & ACM_CTRL_RI  ? TIOCM_RI  : 0) |	       (acm->ctrlin  & ACM_CTRL_DCD ? TIOCM_CD  : 0) |	       TIOCM_CTS;}static int acm_tty_tiocmset(struct tty_struct *tty, struct file *file,			    unsigned int set, unsigned int clear){	struct acm *acm = tty->driver_data;	unsigned int newctrl;	if (!ACM_READY(acm))		return -EINVAL;	newctrl = acm->ctrlout;	set = (set & TIOCM_DTR ? ACM_CTRL_DTR : 0) | (set & TIOCM_RTS ? ACM_CTRL_RTS : 0);	clear = (clear & TIOCM_DTR ? ACM_CTRL_DTR : 0) | (clear & TIOCM_RTS ? ACM_CTRL_RTS : 0);	newctrl = (newctrl & ~clear) | set;	if (acm->ctrlout == newctrl)		return 0;	return acm_set_control(acm, acm->ctrlout = newctrl);}static int acm_tty_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg){	struct acm *acm = tty->driver_data;	if (!ACM_READY(acm))		return -EINVAL;	return -ENOIOCTLCMD;}static const __u32 acm_tty_speed[] = {	0, 50, 75, 110, 134, 150, 200, 300, 600,	1200, 1800, 2400, 4800, 9600, 19200, 38400,	57600, 115200, 230400, 460800, 500000, 576000,	921600, 1000000, 1152000, 1500000, 2000000,	2500000, 3000000, 3500000, 4000000};static const __u8 acm_tty_size[] = {	5, 6, 7, 8};static void acm_tty_set_termios(struct tty_struct *tty, struct ktermios *termios_old){	struct acm *acm = tty->driver_data;	struct ktermios *termios = tty->termios;	struct usb_cdc_line_coding newline;	int newctrl = acm->ctrlout;	if (!ACM_READY(acm))		return;	newline.dwDTERate = cpu_to_le32p(acm_tty_speed +		(termios->c_cflag & CBAUD & ~CBAUDEX) + (termios->c_cflag & CBAUDEX ? 15 : 0));	newline.bCharFormat = termios->c_cflag & CSTOPB ? 2 : 0;	newline.bParityType = termios->c_cflag & PARENB ?		(termios->c_cflag & PARODD ? 1 : 2) + (termios->c_cflag & CMSPAR ? 2 : 0) : 0;	newline.bDataBits = acm_tty_size[(termios->c_cflag & CSIZE) >> 4];	acm->clocal = ((termios->c_cflag & CLOCAL) != 0);	if (!newline.dwDTERate) {		newline.dwDTERate = acm->line.dwDTERate;		newctrl &= ~ACM_CTRL_DTR;	} else  newctrl |=  ACM_CTRL_DTR;	if (newctrl != acm->ctrlout)		acm_set_control(acm, acm->ctrlout = newctrl);	if (memcmp(&acm->line, &newline, sizeof newline)) {		memcpy(&acm->line, &newline, sizeof newline);		dbg("set line: %d %d %d %d", le32_to_cpu(newline.dwDTERate),			newline.bCharFormat, newline.bParityType,			newline.bDataBits);		acm_set_line(acm, &acm->line);	}}/* * USB probe and disconnect routines. *//* Little helper: write buffers free */static void acm_write_buffers_free(struct acm *acm){	int i;	struct acm_wb *wb;	for (wb = &acm->wb[0], i = 0; i < ACM_NW; i++, wb++) {		usb_buffer_free(acm->dev, acm->writesize, wb->buf, wb->dmah);	}}/* Little helper: write buffers allocate */static int acm_write_buffers_alloc(struct acm *acm){	int i;	struct acm_wb *wb;	for (wb = &acm->wb[0], i = 0; i < ACM_NW; i++, wb++) {		wb->buf = usb_buffer_alloc(acm->dev, acm->writesize, GFP_KERNEL,		    &wb->dmah);		if (!wb->buf) {			while (i != 0) {				--i;				--wb;				usb_buffer_free(acm->dev, acm->writesize,				    wb->buf, wb->dmah);			}			return -ENOMEM;		}	}	return 0;}static int acm_probe (struct usb_interface *intf,		      const struct usb_device_id *id){	struct usb_cdc_union_desc *union_header = NULL;	struct usb_cdc_country_functional_desc *cfd = NULL;	char *buffer = intf->altsetting->extra;	int buflen = intf->altsetting->extralen;	struct usb_interface *control_interface;	struct usb_interface *data_interface;	struct usb_endpoint_descriptor *epctrl;	struct usb_endpoint_descriptor *epread;	struct usb_endpoint_descriptor *epwrite;	struct usb_device *usb_dev = interface_to_usbdev(intf);	struct acm *acm;	int minor;	int ctrlsize,readsize;	u8 *buf;	u8 ac_management_function = 0;	u8 call_management_function = 0;	int call_interface_num = -1;	int data_interface_num;	unsigned long quirks;	int num_rx_buf;	int i;	/* normal quirks */	quirks = (unsigned long)id->driver_info;	num_rx_buf = (quirks == SINGLE_RX_URB) ? 1 : ACM_NR;	/* handle quirks deadly to normal probing*/	if (quirks == NO_UNION_NORMAL) {		data_interface = usb_ifnum_to_if(usb_dev, 1);		control_interface = usb_ifnum_to_if(usb_dev, 0);		goto skip_normal_probe;	}		/* normal probing*/	if (!buffer) {		err("Weird descriptor references\n");		return -EINVAL;	}	if (!buflen) {		if (intf->cur_altsetting->endpoint->extralen && intf->cur_altsetting->endpoint->extra) {			dev_dbg(&intf->dev,"Seeking extra descriptors on endpoint\n");			buflen = intf->cur_altsetting->endpoint->extralen;			buffer = intf->cur_altsetting->endpoint->extra;		} else {			err("Zero length descriptor references\n");			return -EINVAL;		}	}	while (buflen > 0) {		if (buffer [1] != USB_DT_CS_INTERFACE) {			err("skipping garbage\n");			goto next_desc;		}		switch (buffer [2]) {			case USB_CDC_UNION_TYPE: /* we've found it */				if (union_header) {					err("More than one union descriptor, skipping ...");

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
92国产精品观看| 亚洲欧美福利一区二区| 亚洲综合区在线| 91黄色激情网站| 一区二区三区加勒比av| 欧美日韩一二三区| 日韩中文欧美在线| 日韩一区二区三区视频在线观看| 天天操天天干天天综合网| 在线观看视频一区| 秋霞午夜鲁丝一区二区老狼| 精品成人a区在线观看| 国产一区美女在线| 亚洲三级在线观看| 日韩一区二区三区电影在线观看| 麻豆精品精品国产自在97香蕉| 久久久久久一级片| 欧洲中文字幕精品| 国产一区二区精品久久99| 亚洲色图丝袜美腿| 日韩欧美亚洲国产另类| 91免费看片在线观看| 蜜臀精品一区二区三区在线观看 | 欧美成人在线直播| 99久久久久久| 国内精品伊人久久久久av影院| 国产精品美女一区二区三区| 欧美日韩一区在线观看| 国产成人午夜视频| 日韩av一区二区在线影视| 中文字幕一区二区三区不卡在线| 欧美顶级少妇做爰| 日本大香伊一区二区三区| 国产成人精品网址| 看国产成人h片视频| 午夜精品视频一区| 亚洲国产婷婷综合在线精品| 国产精品毛片高清在线完整版| 8x福利精品第一导航| 在线免费观看日本欧美| 91美女福利视频| 9i在线看片成人免费| 国产98色在线|日韩| 国产精品一区二区三区乱码| 久久激五月天综合精品| 蜜乳av一区二区三区| 日韩精品一级二级| 视频一区中文字幕国产| 日本强好片久久久久久aaa| 日韩国产一区二| 美国毛片一区二区| 国产裸体歌舞团一区二区| 国产一区二区三区香蕉| 懂色av一区二区夜夜嗨| 成人黄色小视频| 色综合久久久久网| 欧美日韩国产综合一区二区三区| 欧美老人xxxx18| 欧美mv和日韩mv国产网站| 久久久精品国产免大香伊| 欧美高清在线视频| 亚洲一区二区三区四区在线| 奇米影视一区二区三区| 成人激情视频网站| 欧美午夜视频网站| 久久久久久黄色| 亚洲午夜在线观看视频在线| 美女视频一区二区| 成人av网站大全| 日韩亚洲欧美一区| 1000部国产精品成人观看| 午夜日韩在线电影| 国产福利一区二区| 欧美日本一区二区| 亚洲欧洲成人自拍| 久久精品国产成人一区二区三区| 99视频一区二区| 日韩欧美国产麻豆| 亚洲国产综合91精品麻豆| 国内精品不卡在线| 在线免费观看日韩欧美| 国产精品久久久久影院色老大| 石原莉奈在线亚洲三区| 91在线云播放| 免费欧美高清视频| 欧美日韩三级一区| 亚洲精品欧美综合四区| 从欧美一区二区三区| 精品成人一区二区| 秋霞电影网一区二区| 欧美视频在线观看一区二区| 中文字幕在线不卡国产视频| 粉嫩av一区二区三区| 欧美激情一区不卡| 粉嫩嫩av羞羞动漫久久久| 国产欧美一区二区精品性| 蜜臀久久99精品久久久画质超高清 | 中文字幕一区二区视频| 成人性生交大片| 亚洲人妖av一区二区| 成人99免费视频| 亚洲色欲色欲www| 中文子幕无线码一区tr| 99综合电影在线视频| 亚洲精品一二三| 欧美丰满美乳xxx高潮www| 美女一区二区视频| 国产视频一区在线播放| 99精品久久只有精品| 日韩专区一卡二卡| 久久久久亚洲蜜桃| 色乱码一区二区三区88| 丝袜美腿成人在线| 日本一区二区三区国色天香| 一本色道亚洲精品aⅴ| 日本伊人精品一区二区三区观看方式| 这里只有精品电影| 国产米奇在线777精品观看| 一区二区在线观看视频在线观看| 91精品久久久久久久久99蜜臂 | 伊人开心综合网| 久久精品人人做| 欧洲视频一区二区| 国产高清无密码一区二区三区| 一区二区三区毛片| 国产精品青草综合久久久久99| 欧美日韩一级片在线观看| 国产91精品露脸国语对白| 蜜臀av性久久久久蜜臀aⅴ流畅 | 亚洲国产一区在线观看| 国产精品进线69影院| 久久精品一区二区三区不卡| 91精品国产色综合久久不卡蜜臀| a级精品国产片在线观看| 久久综合综合久久综合| 亚洲一区二区三区爽爽爽爽爽| 久久久精品天堂| 久久亚洲二区三区| 26uuu亚洲综合色欧美| 91精品国产一区二区三区| 欧美性生活一区| 色哟哟国产精品| 色综合激情五月| 色婷婷久久久亚洲一区二区三区| 国产999精品久久久久久绿帽| 国产在线视频一区二区三区| 精品系列免费在线观看| 久久99精品国产.久久久久| 日韩在线一区二区三区| 日本不卡一区二区三区高清视频| 亚洲午夜一区二区三区| 午夜精品在线视频一区| 日韩电影免费在线观看网站| 午夜精品久久久久久久99樱桃| 亚洲网友自拍偷拍| 亚洲成人激情av| 国产在线视频精品一区| av不卡在线播放| 欧美区一区二区三区| 日韩欧美精品在线视频| 久久久蜜桃精品| 精品成a人在线观看| 国产精品的网站| 亚洲国产精品久久艾草纯爱| 久久av老司机精品网站导航| 99精品视频在线观看| 欧美一区二区三区在线| 国产日韩成人精品| 亚洲国产sm捆绑调教视频| 激情国产一区二区| 欧美日韩一区久久| 欧美国产精品专区| 99国产精品视频免费观看| 在线91免费看| 一区二区三区免费观看| 国产一区二区调教| 欧美日本高清视频在线观看| 久久精品男人天堂av| 毛片不卡一区二区| 欧美性大战久久久久久久蜜臀| 国产亚洲精品资源在线26u| 一区二区日韩电影| av在线这里只有精品| 337p粉嫩大胆噜噜噜噜噜91av | 日韩毛片高清在线播放| 美腿丝袜亚洲色图| 欧美日韩精品免费观看视频| 亚洲视频一区在线观看| a亚洲天堂av| 中文久久乱码一区二区| 国产精品综合一区二区三区| 日韩一卡二卡三卡| 美国三级日本三级久久99| 欧美精品在线观看播放| 亚洲一区二区成人在线观看| 99国产精品久| 亚洲三级小视频| 97久久精品人人做人人爽| 亚洲激情网站免费观看| 欧美性大战xxxxx久久久|