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

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

?? ehci-sched.c

?? 硬實(shí)時(shí)linux補(bǔ)丁rtai下usb協(xié)議棧
?? C
?? 第 1 頁 / 共 4 頁
字號:
					qh->period, qh->c_usecs))			goto done;		if (!check_period (ehci, frame, uframe + qh->gap_uf,					qh->period, qh->c_usecs))			goto done;		retval = 0;	}done:	return retval;}/* "first fit" scheduling policy used the first time through, * or when the previous schedule slot can't be re-used. */static int qh_schedule (struct ehci_hcd *ehci, struct ehci_qh *qh){	int 		status;	unsigned	uframe;	__le32		c_mask;	unsigned	frame;		/* 0..(qh->period - 1), or NO_FRAME */	qh_refresh(ehci, qh);	qh->hw_next = EHCI_LIST_END;	frame = qh->start;	/* reuse the previous schedule slots, if we can */	if (frame < qh->period) {		uframe = ffs (le32_to_cpup (&qh->hw_info2) & QH_SMASK);		status = check_intr_schedule (ehci, frame, --uframe,				qh, &c_mask);	} else {		uframe = 0;		c_mask = 0;		status = -ENOSPC;	}	/* else scan the schedule to find a group of slots such that all	 * uframes have enough periodic bandwidth available.	 */	if (status) {		/* "normal" case, uframing flexible except with splits */		if (qh->period) {			frame = qh->period - 1;			do {				for (uframe = 0; uframe < 8; uframe++) {					status = check_intr_schedule (ehci,							frame, uframe, qh,							&c_mask);					if (status == 0)						break;				}			} while (status && frame--);		/* qh->period == 0 means every uframe */		} else {			frame = 0;			status = check_intr_schedule (ehci, 0, 0, qh, &c_mask);		}		if (status)			goto done;		qh->start = frame;		/* reset S-frame and (maybe) C-frame masks */		qh->hw_info2 &= __constant_cpu_to_le32(~(QH_CMASK | QH_SMASK));		qh->hw_info2 |= qh->period			? cpu_to_le32 (1 << uframe)			: __constant_cpu_to_le32 (QH_SMASK);		qh->hw_info2 |= c_mask;	} else		ehci_dbg (ehci, "reused qh %p schedule\n", qh);	/* stuff into the periodic schedule */ 	status = qh_link_periodic (ehci, qh);done:	return status;}static int intr_submit (	struct ehci_hcd		*ehci,	struct rtdm_usb_host_endpoint *ep,	struct rtdm_urb		*urb,	struct list_head	*qtd_list) {	unsigned		epnum;	unsigned long		context;	struct ehci_qh		*qh;	int			status = 0;	struct list_head	empty;	/* get endpoint and transfer/schedule data */	epnum = ep->desc.bEndpointAddress;	rtdm_lock_get_irqsave(&ehci->rt_lock, context);	/* get qh and force any scheduling errors */	INIT_LIST_HEAD (&empty);	qh = qh_append_tds (ehci, urb, &empty, epnum, &ep->hcpriv);	if (qh == NULL) {		status = -ENOMEM;		goto done;	}	if (qh->qh_state == QH_STATE_IDLE) {		if ((status = qh_schedule (ehci, qh)) != 0)			goto done;	}	/* then queue the urb's tds to the qh */	qh = qh_append_tds (ehci, urb, qtd_list, epnum, &ep->hcpriv);	BUG_ON (qh == NULL);	/* ... update usbfs periodic stats */	ehci_to_hcd(ehci)->self.bandwidth_int_reqs++;done:	rtdm_lock_put_irqrestore(&ehci->rt_lock, context);	if (status)		qtd_list_free (ehci, urb, qtd_list);	return status;}/*-------------------------------------------------------------------------*//* ehci_iso_stream ops work with both ITD and SITD */static struct ehci_iso_stream *iso_stream_alloc (void){	struct ehci_iso_stream *stream;	stream = kzalloc(sizeof *stream, GFP_ATOMIC);	if (likely (stream != NULL)) {		INIT_LIST_HEAD(&stream->td_list);		INIT_LIST_HEAD(&stream->free_list);		stream->next_uframe = -1;		stream->refcount = 1;	}	return stream;}static voidiso_stream_init (	struct ehci_hcd		*ehci,	struct ehci_iso_stream	*stream,	struct rtdm_usb_device	*dev,	int			pipe,	unsigned		interval){	static const u8 smask_out [] = { 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f };	u32			buf1;	unsigned		epnum, maxp;	int			is_input;	long			bandwidth;	/*	 * this might be a "high bandwidth" highspeed endpoint,	 * as encoded in the ep descriptor's wMaxPacket field	 */	epnum = rtdm_usb_pipeendpoint (pipe);	is_input = rtdm_usb_pipein (pipe) ? USB_DIR_IN : 0;	maxp = rtdm_usb_maxpacket(dev, pipe, !is_input);	if (is_input) {		buf1 = (1 << 11);	} else {		buf1 = 0;	}	/* knows about ITD vs SITD */	if (dev->speed == USB_SPEED_HIGH) {		unsigned multi = hb_mult(maxp);		stream->highspeed = 1;		maxp = max_packet(maxp);		buf1 |= maxp;		maxp *= multi;		stream->buf0 = cpu_to_le32 ((epnum << 8) | dev->devnum);		stream->buf1 = cpu_to_le32 (buf1);		stream->buf2 = cpu_to_le32 (multi);		/* usbfs wants to report the average usecs per frame tied up		 * when transfers on this endpoint are scheduled ...		 */		stream->usecs = HS_USECS_ISO (maxp);		bandwidth = stream->usecs * 8;		bandwidth /= 1 << (interval - 1);	} else {		u32		addr;		int		think_time;		addr = dev->ttport << 24;		if (!ehci_is_TDI(ehci)				|| (dev->tt->hub !=					ehci_to_hcd(ehci)->self.root_hub))			addr |= dev->tt->hub->devnum << 16;		addr |= epnum << 8;		addr |= dev->devnum;		stream->usecs = HS_USECS_ISO (maxp);		think_time = dev->tt ? dev->tt->think_time : 0;		stream->tt_usecs = NS_TO_US (think_time + rtdm_usb_calc_bus_time (				dev->speed, is_input, 1, maxp));		if (is_input) {			u32	tmp;			addr |= 1 << 31;			stream->c_usecs = stream->usecs;			stream->usecs = HS_USECS_ISO (1);			stream->raw_mask = 1;			/* pessimistic c-mask */			tmp = rtdm_usb_calc_bus_time (USB_SPEED_FULL, 1, 0, maxp)					/ (125 * 1000);			stream->raw_mask |= 3 << (tmp + 9);		} else			stream->raw_mask = smask_out [maxp / 188];		bandwidth = stream->usecs + stream->c_usecs;		bandwidth /= 1 << (interval + 2);		/* stream->splits gets created from raw_mask later */		stream->address = cpu_to_le32 (addr);	}	stream->bandwidth = bandwidth;	stream->udev = dev;	stream->bEndpointAddress = is_input | epnum;	stream->interval = interval;	stream->maxp = maxp;}static voidiso_stream_put(struct ehci_hcd *ehci, struct ehci_iso_stream *stream){	stream->refcount--;	int i;	/* free whenever just a dev->ep reference remains.	 * not like a QH -- no persistent state (toggle, halt)	 */	if (stream->refcount == 1) {		int		is_in;		// BUG_ON (!list_empty(&stream->td_list));		while (!list_empty (&stream->free_list)) {			struct list_head	*entry;			entry = stream->free_list.next;			list_del (entry);			/* knows about ITD vs SITD */			if (stream->highspeed) {				struct ehci_itd		*itd;				itd = list_entry (entry, struct ehci_itd,						itd_list);				rtdm_sem_down(&ehci->itd_buffer_semaphore);				for(i = 0; i < EHCI_MAX_ITD; i++){					if(ehci->itd_buffer_pool[i].buffer == itd) break;				}					if(i != EHCI_MAX_ITD){					ehci->itd_buffer_pool[i].in_use = 0;				}				rtdm_sem_up(&ehci->itd_buffer_semaphore);			} else {				struct ehci_sitd	*sitd;				sitd = list_entry (entry, struct ehci_sitd,						sitd_list);				rtdm_sem_down(&ehci->sitd_buffer_semaphore);				for(i = 0; i < EHCI_MAX_SITD; i++){					if(ehci->sitd_buffer_pool[i].buffer == sitd) break;				}					if(i != EHCI_MAX_SITD){					ehci->sitd_buffer_pool[i].in_use = 0;				}				rtdm_sem_up(&ehci->sitd_buffer_semaphore);			}		}		is_in = (stream->bEndpointAddress & USB_DIR_IN) ? 0x10 : 0;		stream->bEndpointAddress &= 0x0f;		stream->ep->hcpriv = NULL;		if (stream->rescheduled) {			ehci_info (ehci, "ep%d%s-iso rescheduled "				"%lu times in %lu seconds\n",				stream->bEndpointAddress, is_in ? "in" : "out",				stream->rescheduled,				((jiffies - stream->start)/HZ)				);		}		kfree(stream);	}}static inline struct ehci_iso_stream *iso_stream_get (struct ehci_iso_stream *stream){	if (likely (stream != NULL))		stream->refcount++;	return stream;}static struct ehci_iso_stream *iso_stream_find (struct ehci_hcd *ehci, struct rtdm_urb *urb){	unsigned		epnum;	struct ehci_iso_stream	*stream;	struct rtdm_usb_host_endpoint *ep;	unsigned long		context;	epnum = rtdm_usb_pipeendpoint (urb->pipe);	if (rtdm_usb_pipein(urb->pipe))		ep = urb->dev->ep_in[epnum];	else		ep = urb->dev->ep_out[epnum];	rtdm_lock_get_irqsave(&ehci->rt_lock, context);	stream = ep->hcpriv;	if (unlikely (stream == NULL)) {		stream = iso_stream_alloc(/*GFP_ATOMIC*/);		if (likely (stream != NULL)) {			/* dev->ep owns the initial refcount */			ep->hcpriv = stream;			stream->ep = ep;			iso_stream_init(ehci, stream, urb->dev, urb->pipe,					urb->interval);		}	/* if dev->ep [epnum] is a QH, info1.maxpacket is nonzero */	} else if (unlikely (stream->hw_info1 != 0)) {		ehci_dbg(ehci, "dev %s ep%d%s, not iso??\n",			urb->dev->devpath, epnum,			rtdm_usb_pipein(urb->pipe) ? "in" : "out");		stream = NULL;	}	/* caller guarantees an eventual matching iso_stream_put */	stream = iso_stream_get (stream);	rtdm_lock_put_irqrestore(&ehci->rt_lock, context);	return stream;}/*-------------------------------------------------------------------------*//* ehci_iso_sched ops can be ITD-only or SITD-only */static struct ehci_iso_sched *iso_sched_alloc (unsigned packets){	struct ehci_iso_sched	*iso_sched;	int			size = sizeof *iso_sched;	size += packets * sizeof (struct ehci_iso_packet);	iso_sched = kmalloc (size, GFP_ATOMIC);	if (likely (iso_sched != NULL)) {		memset(iso_sched, 0, size);		INIT_LIST_HEAD (&iso_sched->td_list);	}	return iso_sched;}static inline voiditd_sched_init (	struct ehci_iso_sched	*iso_sched,	struct ehci_iso_stream	*stream,	struct rtdm_urb		*urb){	unsigned	i;	dma_addr_t	dma = urb->transfer_dma;	/* how many uframes are needed for these transfers */	iso_sched->span = urb->number_of_packets * stream->interval;	/* figure out per-uframe itd fields that we'll need later	 * when we fit new itds into the schedule.	 */	for (i = 0; i < urb->number_of_packets; i++) {		struct ehci_iso_packet	*uframe = &iso_sched->packet [i];		unsigned		length;		dma_addr_t		buf;		u32			trans;		length = urb->iso_frame_desc [i].length;		buf = dma + urb->iso_frame_desc [i].offset;		trans = EHCI_ISOC_ACTIVE;		trans |= buf & 0x0fff;		if (unlikely (((i + 1) == urb->number_of_packets))				  && !(urb->transfer_flags & RTDM_URB_NO_INTERRUPT))			trans |= EHCI_ITD_IOC;		trans |= length << 16;		uframe->transaction = cpu_to_le32 (trans);		/* might need to cross a buffer page within a uframe */		uframe->bufp = (buf & ~(u64)0x0fff);		buf += length;		if (unlikely ((uframe->bufp != (buf & ~(u64)0x0fff))))			uframe->cross = 1;	}}static voidiso_sched_free (	struct ehci_iso_stream	*stream,	struct ehci_iso_sched	*iso_sched){	if (!iso_sched)		return;	// caller must hold ehci->lock!	list_splice (&iso_sched->td_list, &stream->free_list);	kfree (iso_sched);}static intitd_urb_transaction (	struct ehci_iso_stream	*stream,	struct ehci_hcd		*ehci,	struct rtdm_urb		*urb){	struct ehci_itd		*itd;	dma_addr_t		itd_dma = 0;	int			i, j;	unsigned		num_itds;	struct ehci_iso_sched	*sched;	unsigned long		context;	sched = iso_sched_alloc (urb->number_of_packets);	if (unlikely (sched == NULL))		return -ENOMEM;	itd_sched_init (sched, stream, urb);	if (urb->interval < 8)		num_itds = 1 + (sched->span + 7) / 8;	else		num_itds = urb->number_of_packets;	/* allocate/init ITDs */	rtdm_lock_get_irqsave(&ehci->rt_lock, context);	for (i = 0; i < num_itds; i++) {		/* free_list.next might be cache-hot ... but maybe		 * the HC caches it too. avoid that issue for now.		 */		/* prefer previously-allocated itds */		if (likely (!list_empty(&stream->free_list))) {			itd = list_entry (stream->free_list.prev,					 struct ehci_itd, itd_list);			list_del (&itd->itd_list);			itd_dma = itd->itd_dma;		} else			itd = NULL;		if (!itd) {			rtdm_lock_put_irqrestore(&ehci->rt_lock, context);			rtdm_sem_down(&ehci->itd_buffer_semaphore);			for(j = 0; j < EHCI_MAX_ITD; j++){				if(!ehci->itd_buffer_pool[j].in_use)break;			}				if(j != EHCI_MAX_ITD){				ehci->itd_buffer_pool[j].in_use = ~0;				itd = ehci->itd_buffer_pool[j].buffer;				itd_dma = ehci->itd_buffer_pool[j].dma_address; 			}			else{				itd = NULL;				ehci_err (ehci, "unable to allocate sitd\n");			}			rtdm_sem_up(&ehci->itd_buffer_semaphore);			rtdm_lock_get_irqsave(&ehci->rt_lock, context);		}		if (unlikely (NULL == itd)) {			iso_sched_free (stream, sched);			rtdm_lock_put_irqrestore(&ehci->rt_lock, context);			return -ENOMEM;		}		memset (itd, 0, sizeof *itd);		itd->itd_dma = itd_dma;		list_add (&itd->itd_list, &sched->td_list);	}	rtdm_lock_put_irqrestore(&ehci->rt_lock, context);	/* temporarily store schedule info in hcpriv */	urb->hcpriv = sched;	urb->error_count = 0;	return 0;}/*-------------------------------------------------------------------------*/static inline intitd_slot_ok (	struct ehci_hcd		*ehci,	u32			mod,	u32			uframe,	u8			usecs,

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
尤物在线观看一区| 蜜臀av一区二区在线免费观看| 欧美午夜精品久久久| 久久成人久久鬼色| 亚洲日本欧美天堂| 精品久久久久一区| 欧美三级中文字幕| 9i看片成人免费高清| 免费看日韩精品| 亚洲激情五月婷婷| 国产精品久久综合| 精品欧美一区二区三区精品久久| 色av成人天堂桃色av| 成人开心网精品视频| 九九精品一区二区| 偷偷要91色婷婷| 亚洲女女做受ⅹxx高潮| 国产欧美精品一区aⅴ影院| 日韩视频在线永久播放| 欧美午夜精品久久久久久孕妇| 不卡一区二区中文字幕| 国产精品1区二区.| 久久国产精品免费| 日韩av中文字幕一区二区| 一区二区三区精品| 亚洲欧美成aⅴ人在线观看| 国产欧美日韩久久| 国产亚洲精品久| 欧美大片在线观看一区二区| 欧美三级电影网| 色婷婷国产精品综合在线观看| 成人h动漫精品一区二| 国产成人精品影院| 国产大片一区二区| 国产另类ts人妖一区二区| 黄色资源网久久资源365| 久久精品国产一区二区三 | 一区精品在线播放| 国产婷婷色一区二区三区在线| 精品久久久久久久久久久久包黑料 | 国产欧美一区二区精品性| 欧美mv和日韩mv国产网站| 日韩一区二区三区视频在线| 欧美精选一区二区| 欧美裸体一区二区三区| 欧美日韩日日摸| 在线播放欧美女士性生活| 欧美老女人第四色| 欧美一区在线视频| 欧美xxxxx牲另类人与| 久久女同互慰一区二区三区| 国产亚洲一区二区在线观看| 欧美国产欧美亚州国产日韩mv天天看完整 | 一区二区三区四区亚洲| 一区二区视频在线| 亚洲福利电影网| 日产国产高清一区二区三区| 日本视频一区二区| 国产一区二区精品久久| 国产suv一区二区三区88区| av在线播放不卡| 色猫猫国产区一区二在线视频| 欧美日韩国产小视频在线观看| 日韩一区二区影院| 国产亚洲一区字幕| 亚洲日本成人在线观看| 亚洲国产视频网站| 九九久久精品视频| 成人av午夜电影| 欧美在线短视频| 精品乱人伦一区二区三区| 国产精品视频观看| 亚洲国产另类av| 韩国精品免费视频| 91丨porny丨中文| 91精品国产一区二区三区| 久久综合久久综合九色| 国产精品入口麻豆九色| 午夜视频在线观看一区| 国产在线精品一区二区夜色| 91丨porny丨在线| 日韩三级免费观看| 亚洲品质自拍视频网站| 日本成人在线电影网| 国产.精品.日韩.另类.中文.在线.播放| www.欧美精品一二区| 欧美精品一二三| 国产日产欧美一区| 亚洲电影一级片| 国产suv精品一区二区6| 69久久99精品久久久久婷婷| 国产精品久久久久久久久动漫| 日本不卡视频在线观看| 成人性生交大片免费看在线播放| 欧美男人的天堂一二区| 欧美激情一区二区三区四区| 婷婷亚洲久悠悠色悠在线播放| 国产成人福利片| 日韩三级高清在线| 亚洲一区二区精品久久av| 国产不卡一区视频| 日韩欧美专区在线| 亚洲午夜久久久久久久久久久| 国产精品影音先锋| 91精品国产高清一区二区三区| 综合激情网...| 国产风韵犹存在线视精品| 日韩一级在线观看| 亚洲一二三区视频在线观看| 国产黄色成人av| 欧美成人女星排名| 亚洲第一二三四区| 91福利视频久久久久| 国产精品国产三级国产a| 国产自产v一区二区三区c| 欧美疯狂做受xxxx富婆| 亚洲卡通动漫在线| 波多野结衣中文字幕一区| 久久综合av免费| 免费观看久久久4p| 欧美精品第1页| 亚洲一区二区三区中文字幕在线| av激情成人网| 中文字幕国产一区二区| 精品一区二区免费看| 4438x亚洲最大成人网| 亚洲福利一二三区| 欧美色偷偷大香| 亚洲美女屁股眼交| www.激情成人| 亚洲另类春色校园小说| av一本久道久久综合久久鬼色| 国产三级精品三级在线专区| 国产剧情一区二区| 国产欧美一区二区在线| 国产在线麻豆精品观看| 久久久久九九视频| 国产成人无遮挡在线视频| 久久精品夜色噜噜亚洲aⅴ| 成人黄色片在线观看| 欧美午夜不卡在线观看免费| 国产aⅴ综合色| 久久久午夜精品| 91一区一区三区| 热久久免费视频| 国产婷婷色一区二区三区在线| 99精品热视频| 美洲天堂一区二卡三卡四卡视频| 久久久久久久久久久久电影 | 欧美激情在线观看视频免费| 国产成人精品影视| 26uuu精品一区二区在线观看| 精品一区二区久久| 国产欧美中文在线| 99久精品国产| 午夜亚洲福利老司机| 日韩一级在线观看| 国产精品77777竹菊影视小说| 国产精品久久久久aaaa| 在线国产电影不卡| 奇米影视一区二区三区小说| 欧美成人福利视频| 成人黄色777网| 亚洲欧洲综合另类在线| 欧美日韩在线亚洲一区蜜芽| 男女激情视频一区| 久久精品网站免费观看| 99re8在线精品视频免费播放| 亚洲午夜精品在线| 久久综合久久99| a级精品国产片在线观看| 一区二区三区高清不卡| 日韩一区二区三区免费观看| 国产成人亚洲综合a∨婷婷| 亚洲精品亚洲人成人网在线播放| 欧美日韩中文精品| 国产精品系列在线观看| 樱花草国产18久久久久| 精品久久人人做人人爽| 一本在线高清不卡dvd| 日本女优在线视频一区二区| 国产精品久久久久影院| 4438x亚洲最大成人网| 成人性色生活片免费看爆迷你毛片| 亚洲第一综合色| 亚洲国产高清aⅴ视频| 欧美美女一区二区三区| 国产91精品精华液一区二区三区 | 午夜精品一区二区三区电影天堂| 久久女同精品一区二区| 欧美日韩一区国产| 国产精品资源在线看| 日韩福利视频网| 日韩美女视频一区二区| 精品国产网站在线观看| 久久不见久久见免费视频1| 亚洲电影你懂得| 中文字幕一区二区三区蜜月| 日韩欧美国产一区二区在线播放 | 婷婷综合久久一区二区三区|