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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ehci-q.c

?? host usb 主設備程序 支持sd卡 mouse keyboard 的最單單的驅動程序 gcc編譯
?? C
?? 第 1 頁 / 共 3 頁
字號:
			/* token in overlay may be most current */			if (state == QH_STATE_IDLE					&& cpu_to_le32 (qtd->qtd_dma)						== qh->hw_current)				token = le32_to_cpu (qh->hw_token);			/* force halt for unlinked or blocked qh, so we'll			 * patch the qh later and so that completions can't			 * activate it while we "know" it's stopped.			 */			if ((HALT_BIT & qh->hw_token) == 0) {halt:				qh->hw_token |= HALT_BIT;				wmb ();			}		}		/* remove it from the queue */		spin_lock (&urb->lock);		qtd_copy_status (ehci, urb, qtd->length, token);		do_status = (urb->status == -EREMOTEIO)				&& usb_pipecontrol (urb->pipe);		spin_unlock (&urb->lock);		if (stopped && qtd->qtd_list.prev != &qh->qtd_list) {			last = list_entry (qtd->qtd_list.prev,					struct ehci_qtd, qtd_list);			last->hw_next = qtd->hw_next;		}		list_del (&qtd->qtd_list);		last = qtd;	}	/* last urb's completion might still need calling */	if (likely (last != NULL)) {		ehci_urb_done (ehci, last->urb);		count++;		ehci_qtd_free (ehci, last);	}	/* restore original state; caller must unlink or relink */	qh->qh_state = state;	/* be sure the hardware's done with the qh before refreshing	 * it after fault cleanup, or recovering from silicon wrongly	 * overlaying the dummy qtd (which reduces DMA chatter).	 */	if (stopped != 0 || qh->hw_qtd_next == EHCI_LIST_END) {		switch (state) {		case QH_STATE_IDLE:			qh_refresh(ehci, qh);			break;		case QH_STATE_LINKED:			/* should be rare for periodic transfers,			 * except maybe high bandwidth ...			 */			if ((__constant_cpu_to_le32 (QH_SMASK)					& qh->hw_info2) != 0) {				intr_deschedule (ehci, qh);				(void) qh_schedule (ehci, qh);			} else				unlink_async (ehci, qh);			break;		/* otherwise, unlink already started */		}	}	return count;}/*-------------------------------------------------------------------------*/// high bandwidth multiplier, as encoded in highspeed endpoint descriptors#define hb_mult(wMaxPacketSize) (1 + (((wMaxPacketSize) >> 11) & 0x03))// ... and packet size, for any kind of endpoint descriptor#define max_packet(wMaxPacketSize) ((wMaxPacketSize) & 0x07ff)/* * reverse of qh_urb_transaction:  free a list of TDs. * used for cleanup after errors, before HC sees an URB's TDs. */static void qtd_list_free (	struct ehci_hcd		*ehci,	struct urb		*urb,	struct list_head	*qtd_list) {	struct list_head	*entry, *temp;	list_for_each_safe (entry, temp, qtd_list) {		struct ehci_qtd	*qtd;		qtd = list_entry (entry, struct ehci_qtd, qtd_list);		list_del (&qtd->qtd_list);		ehci_qtd_free (ehci, qtd);	}}/* * create a list of filled qtds for this URB; won't link into qh. */static struct list_head *qh_urb_transaction (	struct ehci_hcd		*ehci,	struct urb		*urb,	struct list_head	*head,	gfp_t			flags) {	struct ehci_qtd		*qtd, *qtd_prev;	dma_addr_t		buf;	int			len, maxpacket;	int			is_input;	u32			token;	/*	 * URBs map to sequences of QTDs:  one logical transaction	 */	qtd = ehci_qtd_alloc (ehci, flags);	if (unlikely (!qtd))		return NULL;	list_add_tail (&qtd->qtd_list, head);	qtd->urb = urb;	token = QTD_STS_ACTIVE;	token |= (EHCI_TUNE_CERR << 10);	/* for split transactions, SplitXState initialized to zero */	len = urb->transfer_buffer_length;	is_input = usb_pipein (urb->pipe);	if (usb_pipecontrol (urb->pipe)) {		/* SETUP pid */		qtd_fill (qtd, urb->setup_dma, sizeof (struct usb_ctrlrequest),			token | (2 /* "setup" */ << 8), 8);		/* ... and always at least one more pid */		token ^= QTD_TOGGLE;		qtd_prev = qtd;		qtd = ehci_qtd_alloc (ehci, flags);		if (unlikely (!qtd))			goto cleanup;		qtd->urb = urb;		qtd_prev->hw_next = QTD_NEXT (qtd->qtd_dma);		list_add_tail (&qtd->qtd_list, head);		/* for zero length DATA stages, STATUS is always IN */		if (len == 0)			token |= (1 /* "in" */ << 8);	}	/*	 * data transfer stage:  buffer setup	 */	buf = urb->transfer_dma;	if (is_input)		token |= (1 /* "in" */ << 8);	/* else it's already initted to "out" pid (0 << 8) */	maxpacket = max_packet(usb_maxpacket(urb->dev, urb->pipe, !is_input));	/*	 * buffer gets wrapped in one or more qtds;	 * last one may be "short" (including zero len)	 * and may serve as a control status ack	 */	for (;;) {		int this_qtd_len;		this_qtd_len = qtd_fill (qtd, buf, len, token, maxpacket);		len -= this_qtd_len;		buf += this_qtd_len;		if (is_input)			qtd->hw_alt_next = ehci->async->hw_alt_next;		/* qh makes control packets use qtd toggle; maybe switch it */		if ((maxpacket & (this_qtd_len + (maxpacket - 1))) == 0)			token ^= QTD_TOGGLE;		if (likely (len <= 0))			break;		qtd_prev = qtd;		qtd = ehci_qtd_alloc (ehci, flags);		if (unlikely (!qtd))			goto cleanup;		qtd->urb = urb;		qtd_prev->hw_next = QTD_NEXT (qtd->qtd_dma);		list_add_tail (&qtd->qtd_list, head);	}	/* unless the bulk/interrupt caller wants a chance to clean	 * up after short reads, hc should advance qh past this urb	 */	if (likely ((urb->transfer_flags & URB_SHORT_NOT_OK) == 0				|| usb_pipecontrol (urb->pipe)))		qtd->hw_alt_next = EHCI_LIST_END;	/*	 * control requests may need a terminating data "status" ack;	 * bulk ones may need a terminating short packet (zero length).	 */	if (likely (urb->transfer_buffer_length != 0)) {		int	one_more = 0;		if (usb_pipecontrol (urb->pipe)) {			one_more = 1;			token ^= 0x0100;	/* "in" <--> "out"  */			token |= QTD_TOGGLE;	/* force DATA1 */		} else if (usb_pipebulk (urb->pipe)				&& (urb->transfer_flags & URB_ZERO_PACKET)				&& !(urb->transfer_buffer_length % maxpacket)) {			one_more = 1;		}		if (one_more) {			qtd_prev = qtd;			qtd = ehci_qtd_alloc (ehci, flags);			if (unlikely (!qtd))				goto cleanup;			qtd->urb = urb;			qtd_prev->hw_next = QTD_NEXT (qtd->qtd_dma);			list_add_tail (&qtd->qtd_list, head);			/* never any data in such packets */			qtd_fill (qtd, 0, 0, token, 0);		}	}	/* by default, enable interrupt on urb completion */	if (likely (!(urb->transfer_flags & URB_NO_INTERRUPT)))		qtd->hw_token |= __constant_cpu_to_le32 (QTD_IOC);	return head;cleanup:	qtd_list_free (ehci, urb, head);	return NULL;}/*-------------------------------------------------------------------------*/// Would be best to create all qh's from config descriptors,// when each interface/altsetting is established.  Unlink// any previous qh and cancel its urbs first; endpoints are// implicitly reset then (data toggle too).// That'd mean updating how usbcore talks to HCDs. (2.7?)/* * Each QH holds a qtd list; a QH is used for everything except iso. * * For interrupt urbs, the scheduler must set the microframe scheduling * mask(s) each time the QH gets scheduled.  For highspeed, that's * just one microframe in the s-mask.  For split interrupt transactions * there are additional complications: c-mask, maybe FSTNs. */static struct ehci_qh *qh_make (	struct ehci_hcd		*ehci,	struct urb		*urb,	gfp_t			flags) {	struct ehci_qh		*qh = ehci_qh_alloc (ehci, flags);	u32			info1 = 0, info2 = 0;	int			is_input, type;	int			maxp = 0;	if (!qh)		return qh;	/*	 * init endpoint/device data for this QH	 */	info1 |= usb_pipeendpoint (urb->pipe) << 8;	info1 |= usb_pipedevice (urb->pipe) << 0;	is_input = usb_pipein (urb->pipe);	type = usb_pipetype (urb->pipe);	maxp = usb_maxpacket (urb->dev, urb->pipe, !is_input);	/* Compute interrupt scheduling parameters just once, and save.	 * - allowing for high bandwidth, how many nsec/uframe are used?	 * - split transactions need a second CSPLIT uframe; same question	 * - splits also need a schedule gap (for full/low speed I/O)	 * - qh has a polling interval	 *	 * For control/bulk requests, the HC or TT handles these.	 */	if (type == PIPE_INTERRUPT) {		qh->usecs = NS_TO_US (usb_calc_bus_time (USB_SPEED_HIGH, is_input, 0,				hb_mult (maxp) * max_packet (maxp)));		qh->start = NO_FRAME;		if (urb->dev->speed == USB_SPEED_HIGH) {			qh->c_usecs = 0;			qh->gap_uf = 0;			qh->period = urb->interval >> 3;			if (qh->period == 0 && urb->interval != 1) {				/* NOTE interval 2 or 4 uframes could work.				 * But interval 1 scheduling is simpler, and				 * includes high bandwidth.				 */				dbg ("intr period %d uframes, NYET!",						urb->interval);				goto done;			}		} else {			struct usb_tt	*tt = urb->dev->tt;			int		think_time;			/* gap is f(FS/LS transfer times) */			qh->gap_uf = 1 + usb_calc_bus_time (urb->dev->speed,					is_input, 0, maxp) / (125 * 1000);			/* FIXME this just approximates SPLIT/CSPLIT times */			if (is_input) {		// SPLIT, gap, CSPLIT+DATA				qh->c_usecs = qh->usecs + HS_USECS (0);				qh->usecs = HS_USECS (1);			} else {		// SPLIT+DATA, gap, CSPLIT				qh->usecs += HS_USECS (1);				qh->c_usecs = HS_USECS (0);			}			think_time = tt ? tt->think_time : 0;			qh->tt_usecs = NS_TO_US (think_time +					usb_calc_bus_time (urb->dev->speed,					is_input, 0, max_packet (maxp)));			qh->period = urb->interval;		}	}	/* support for tt scheduling, and access to toggles */	qh->dev = urb->dev;	/* using TT? */	switch (urb->dev->speed) {	case USB_SPEED_LOW:		info1 |= (1 << 12);	/* EPS "low" */		/* FALL THROUGH */	case USB_SPEED_FULL:		/* EPS 0 means "full" */		if (type != PIPE_INTERRUPT)			info1 |= (EHCI_TUNE_RL_TT << 28);		if (type == PIPE_CONTROL) {			info1 |= (1 << 27);	/* for TT */			info1 |= 1 << 14;	/* toggle from qtd */		}		info1 |= maxp << 16;		info2 |= (EHCI_TUNE_MULT_TT << 30);		/* Some Freescale processors have an erratum in which the		 * port number in the queue head was 0..N-1 instead of 1..N.		 */		if (ehci_has_fsl_portno_bug(ehci))			info2 |= (urb->dev->ttport-1) << 23;		else			info2 |= urb->dev->ttport << 23;		/* set the address of the TT; for TDI's integrated		 * root hub tt, leave it zeroed.		 */		if (!ehci_is_TDI(ehci)				|| urb->dev->tt->hub !=					ehci_to_hcd(ehci)->self.root_hub)			info2 |= urb->dev->tt->hub->devnum << 16;		/* NOTE:  if (PIPE_INTERRUPT) { scheduler sets c-mask } */		break;	case USB_SPEED_HIGH:		/* no TT involved */		info1 |= (2 << 12);	/* EPS "high" */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久久久99久久久精品网站| 在线电影院国产精品| 美女mm1313爽爽久久久蜜臀| 一区二区三区在线影院| 亚洲欧美区自拍先锋| 国产精品福利一区| 亚洲国产精品成人综合色在线婷婷| 久久综合久久鬼色中文字| 欧美一区二区三区免费观看视频| 欧美人动与zoxxxx乱| 91精品国产91久久久久久一区二区| 欧美福利电影网| 久久这里只有精品首页| 国产日韩欧美亚洲| 亚洲日本在线a| 亚洲午夜一区二区| 热久久久久久久| 国产一区二区网址| 国产成人免费在线视频| 色婷婷久久久久swag精品| 欧美日韩情趣电影| 精品成a人在线观看| 中文字幕高清不卡| 亚洲一区二三区| 免费日韩伦理电影| 成人网在线播放| 在线观看国产精品网站| 91麻豆精品国产无毒不卡在线观看 | 成人av综合在线| 在线看不卡av| 精品久久久久av影院| 国产欧美日韩一区二区三区在线观看| 国产精品久久午夜| 日韩黄色在线观看| 成人av网站在线观看| 欧美色大人视频| 国产蜜臀97一区二区三区| 亚洲欧美aⅴ...| 麻豆传媒一区二区三区| aaa欧美日韩| 日韩精品一区二区三区视频在线观看| 欧美经典三级视频一区二区三区| 亚洲精品乱码久久久久久久久| 日本亚洲电影天堂| 一本高清dvd不卡在线观看| 欧美一区二区不卡视频| 亚洲视频一二三| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 国产精品色哟哟网站| 亚洲大片免费看| 北岛玲一区二区三区四区| 欧美一卡2卡三卡4卡5免费| 中文字幕字幕中文在线中不卡视频| 麻豆精品一区二区av白丝在线| 91视频国产资源| 久久久国产午夜精品| 日本亚洲视频在线| 欧美日韩精品一区二区在线播放| 中文av字幕一区| 经典一区二区三区| 91精品国产综合久久久久久久久久 | 九九视频精品免费| 欧美理论片在线| 亚洲综合视频网| 91亚洲永久精品| 国产精品久久精品日日| 国产乱妇无码大片在线观看| 91精品综合久久久久久| 一区二区免费在线播放| 99久久精品情趣| 中文字幕av资源一区| 国产一区二区精品久久| 精品噜噜噜噜久久久久久久久试看| 亚洲高清不卡在线观看| 欧美影院一区二区三区| 一二三区精品视频| 欧美色图在线观看| 亚洲成人黄色小说| 91精品国产色综合久久不卡电影 | 国产精品女人毛片| 成人高清免费在线播放| 欧美国产一区二区在线观看| 成人免费观看av| 最新欧美精品一区二区三区| 波多野结衣精品在线| 亚洲欧美日韩国产成人精品影院 | 99久久精品国产毛片| **性色生活片久久毛片| 91久久国产最好的精华液| 一区二区三区在线影院| 欧美精品精品一区| 久久99国产精品久久99 | 亚洲图片激情小说| 欧洲一区在线观看| 麻豆成人久久精品二区三区小说| 精品美女一区二区| 成人不卡免费av| 亚洲影院免费观看| 日韩精品一区二区三区在线观看 | 欧美日韩精品一区二区三区四区| 亚洲成人www| 日韩欧美色综合| 成人av高清在线| 亚洲电影在线播放| 精品粉嫩aⅴ一区二区三区四区| 国产精品一级在线| 亚洲乱码精品一二三四区日韩在线| 日本精品一级二级| 久久国产精品色| 亚洲欧美色图小说| 欧美成人激情免费网| 成人av电影观看| 天堂久久久久va久久久久| 国产视频亚洲色图| 欧美日韩国产大片| 从欧美一区二区三区| 亚洲成人动漫av| 中文字幕中文字幕在线一区| 4438成人网| 9色porny自拍视频一区二区| 日韩高清在线一区| 国产精品久久午夜| 久久久久综合网| 欧美日韩精品一区二区三区四区| 国产成人在线观看免费网站| 五月激情综合婷婷| 亚洲视频图片小说| 亚洲国产精品av| 欧美成人一区二区三区片免费| 色婷婷激情综合| 不卡的av网站| 国产高清精品在线| 久久99日本精品| 亚洲一级二级三级在线免费观看| 久久这里都是精品| 日韩免费观看高清完整版在线观看| 色婷婷av一区二区三区gif| 国产成人综合在线| 精品一区二区三区在线观看| 亚洲成人激情综合网| 一区二区三区精品| 亚洲欧美日韩中文播放| 国产精品视频一二三区| 久久久久亚洲综合| 欧美精品一区二区三区在线播放| 欧美精品日韩一本| 精品视频一区二区三区免费| 91丝袜国产在线播放| www.亚洲国产| 成人av资源在线| 91色porny蝌蚪| 91毛片在线观看| 色哟哟国产精品| 日本韩国精品一区二区在线观看| 97久久精品人人澡人人爽| 99久久99久久免费精品蜜臀| 成人午夜精品在线| 99久久精品情趣| 91极品美女在线| 欧美日韩久久久久久| 欧美一区二区视频观看视频| 555www色欧美视频| 国产亚洲综合在线| 国产精品免费丝袜| 亚洲乱码国产乱码精品精小说| 亚洲欧美日韩国产手机在线| 亚洲国产视频在线| 人人精品人人爱| 高潮精品一区videoshd| 91免费国产在线观看| 欧美在线不卡视频| 欧美一区二区三区免费视频 | 午夜成人免费视频| 精彩视频一区二区三区| 丰满白嫩尤物一区二区| 欧洲人成人精品| 4438x成人网最大色成网站| 精品国产乱码久久久久久牛牛| 久久精品日韩一区二区三区| 亚洲欧洲一区二区在线播放| 一区二区三区欧美激情| 日本不卡在线视频| 大胆亚洲人体视频| 69久久夜色精品国产69蝌蚪网| 26uuu久久天堂性欧美| 亚洲欧美日韩国产综合在线| 日韩国产欧美在线观看| 成人午夜激情在线| 欧美一区二区视频在线观看2022| 久久免费美女视频| 性做久久久久久久久| 国产在线视频一区二区| 91日韩精品一区| 欧美成人一区二区三区片免费 | 亚洲一区二区3| 国产91高潮流白浆在线麻豆| 色婷婷综合久久久| 国产欧美在线观看一区| 一区二区三区精密机械公司| 国产一区二区三区蝌蚪|