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

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

?? dwc_otg_hcd_queue.c

?? host usb 主設(shè)備程序 支持sd卡 mouse keyboard 的最單單的驅(qū)動(dòng)程序 gcc編譯
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
	status = periodic_channel_available(_hcd);	if (status) {		DWC_NOTICE("%s: No host channel available for periodic " "transfer.\n", __func__);		return status;	}	status = check_periodic_bandwidth(_hcd, _qh);	if (status) {		DWC_NOTICE("%s: Insufficient periodic bandwidth for "			   "periodic transfer.\n", __func__);		return status;	}	status = check_max_xfer_size(_hcd, _qh);	if (status) {		DWC_NOTICE("%s: Channel max transfer size too small "			   "for periodic transfer.\n", __func__);		return status;	}	/* Always start in the inactive schedule. */	list_add_tail(&_qh->qh_list_entry, &_hcd->periodic_sched_inactive);	/* Reserve the periodic channel. */	_hcd->periodic_channels++;	/* Update claimed usecs per (micro)frame. */	_hcd->periodic_usecs += _qh->usecs;	/* Update average periodic bandwidth claimed and # periodic reqs for usbfs. */	hcd_to_bus(dwc_otg_hcd_to_hcd(_hcd))->bandwidth_allocated += _qh->usecs / _qh->interval;	if (_qh->ep_type == USB_ENDPOINT_XFER_INT) {		hcd_to_bus(dwc_otg_hcd_to_hcd(_hcd))->bandwidth_int_reqs++;		DWC_DEBUGPL(DBG_HCD, "Scheduled intr: qh %p, usecs %d, period %d\n",			    _qh, _qh->usecs, _qh->interval);	} else {		hcd_to_bus(dwc_otg_hcd_to_hcd(_hcd))->bandwidth_isoc_reqs++;		DWC_DEBUGPL(DBG_HCD, "Scheduled isoc: qh %p, usecs %d, period %d\n",			    _qh, _qh->usecs, _qh->interval);	}	return status;}/** * This function adds a QH to either the non periodic or periodic schedule if * it is not already in the schedule. If the QH is already in the schedule, no * action is taken. * * @return 0 if successful, negative error code otherwise. */int dwc_otg_hcd_qh_add(dwc_otg_hcd_t * _hcd, dwc_otg_qh_t * _qh){	unsigned long flags;	int status = 0;	local_irq_save(flags);	if (!list_empty(&_qh->qh_list_entry)) {		/* QH already in a schedule. */		goto done;	}	/* Add the new QH to the appropriate schedule */	if (dwc_qh_is_non_per(_qh)) {		/* Always start in the inactive schedule. */		list_add_tail(&_qh->qh_list_entry, &_hcd->non_periodic_sched_inactive);	} else {		status = schedule_periodic(_hcd, _qh);	}      done:	local_irq_restore(flags);	return status;}/** * Removes an interrupt or isochronous transfer from the periodic schedule. * * @param _hcd The HCD state structure for the DWC OTG controller. * @param _qh QH for the periodic transfer. */static void deschedule_periodic(dwc_otg_hcd_t * _hcd, dwc_otg_qh_t * _qh){	list_del_init(&_qh->qh_list_entry);	/* Release the periodic channel reservation. */	_hcd->periodic_channels--;	/* Update claimed usecs per (micro)frame. */	_hcd->periodic_usecs -= _qh->usecs;	/* Update average periodic bandwidth claimed and # periodic reqs for usbfs. */	hcd_to_bus(dwc_otg_hcd_to_hcd(_hcd))->bandwidth_allocated -= _qh->usecs / _qh->interval;	if (_qh->ep_type == USB_ENDPOINT_XFER_INT) {		hcd_to_bus(dwc_otg_hcd_to_hcd(_hcd))->bandwidth_int_reqs--;		DWC_DEBUGPL(DBG_HCD, "Descheduled intr: qh %p, usecs %d, period %d\n",			    _qh, _qh->usecs, _qh->interval);	} else {		hcd_to_bus(dwc_otg_hcd_to_hcd(_hcd))->bandwidth_isoc_reqs--;		DWC_DEBUGPL(DBG_HCD, "Descheduled isoc: qh %p, usecs %d, period %d\n",			    _qh, _qh->usecs, _qh->interval);	}}/** * Removes a QH from either the non-periodic or periodic schedule.  Memory is * not freed. * * @param[in] _hcd The HCD state structure. * @param[in] _qh QH to remove from schedule. */void dwc_otg_hcd_qh_remove(dwc_otg_hcd_t * _hcd, dwc_otg_qh_t * _qh){	unsigned long flags;	local_irq_save(flags);	if (list_empty(&_qh->qh_list_entry)) {		/* QH is not in a schedule. */		goto done;	}	if (dwc_qh_is_non_per(_qh)) {		if (_hcd->non_periodic_qh_ptr == &_qh->qh_list_entry) {			_hcd->non_periodic_qh_ptr = _hcd->non_periodic_qh_ptr->next;		}		list_del_init(&_qh->qh_list_entry);	} else {		deschedule_periodic(_hcd, _qh);	}      done:	local_irq_restore(flags);}/** * Deactivates a QH. For non-periodic QHs, removes the QH from the active * non-periodic schedule. The QH is added to the inactive non-periodic * schedule if any QTDs are still attached to the QH. * * For periodic QHs, the QH is removed from the periodic queued schedule. If * there are any QTDs still attached to the QH, the QH is added to either the * periodic inactive schedule or the periodic ready schedule and its next * scheduled frame is calculated. The QH is placed in the ready schedule if * the scheduled frame has been reached already. Otherwise it's placed in the * inactive schedule. If there are no QTDs attached to the QH, the QH is * completely removed from the periodic schedule. */void dwc_otg_hcd_qh_deactivate(dwc_otg_hcd_t * _hcd, dwc_otg_qh_t * _qh,			       int sched_next_periodic_split){	unsigned long flags;	local_irq_save(flags);	if (dwc_qh_is_non_per(_qh)) {		dwc_otg_hcd_qh_remove(_hcd, _qh);		if (!list_empty(&_qh->qtd_list)) {			/* Add back to inactive non-periodic schedule. */			dwc_otg_hcd_qh_add(_hcd, _qh);		}	} else {		uint16_t frame_number = dwc_otg_hcd_get_frame_number(dwc_otg_hcd_to_hcd(_hcd));		if (_qh->do_split) {			/* Schedule the next continuing periodic split transfer */			if (sched_next_periodic_split) {				_qh->sched_frame = frame_number;				if (dwc_frame_num_le(frame_number,						     dwc_frame_num_inc(_qh->start_split_frame,								       1))) {					/*					 * Allow one frame to elapse after start					 * split microframe before scheduling					 * complete split, but DONT if we are					 * doing the next start split in the					 * same frame for an ISOC out.					 */					if ((_qh->ep_type != USB_ENDPOINT_XFER_ISOC)					    || (_qh->ep_is_in != 0)) {						_qh->sched_frame =							dwc_frame_num_inc(_qh->sched_frame, 1);					}				}			} else {				_qh->sched_frame = dwc_frame_num_inc(_qh->start_split_frame,								     _qh->interval);				if (dwc_frame_num_le(_qh->sched_frame, frame_number)) {					_qh->sched_frame = frame_number;				}				_qh->sched_frame |= 0x7;				_qh->start_split_frame = _qh->sched_frame;			}		} else {			_qh->sched_frame = dwc_frame_num_inc(_qh->sched_frame, _qh->interval);			if (dwc_frame_num_le(_qh->sched_frame, frame_number)) {				_qh->sched_frame = frame_number;			}		}		if (list_empty(&_qh->qtd_list)) {			dwc_otg_hcd_qh_remove(_hcd, _qh);		} else {			/*			 * Remove from periodic_sched_queued and move to			 * appropriate queue.			 */			if (_qh->sched_frame == frame_number) {				list_move(&_qh->qh_list_entry, &_hcd->periodic_sched_ready);			} else {				list_move(&_qh->qh_list_entry, &_hcd->periodic_sched_inactive);			}		}	}	local_irq_restore(flags);}#if 0/** Allocates memory for a QTD structure. * @return Returns the memory allocate or NULL on error. */static inline dwc_otg_qtd_t *dwc_otg_hcd_qtd_alloc (void){	return (dwc_otg_qtd_t *) kmalloc (sizeof(dwc_otg_qtd_t), GFP_KERNEL);}#endif/** * Initializes a QTD structure. * * @param[in] _qtd The QTD to initialize. * @param[in] _urb The URB to use for initialization.  */static void dwc_otg_hcd_qtd_init(dwc_otg_qtd_t * _qtd, struct urb *_urb){	memset(_qtd, 0, sizeof(dwc_otg_qtd_t));	_qtd->urb = _urb;	if (usb_pipecontrol(_urb->pipe)) {		/*		 * The only time the QTD data toggle is used is on the data		 * phase of control transfers. This phase always starts with		 * DATA1.		 */		_qtd->data_toggle = DWC_OTG_HC_PID_DATA1;		_qtd->control_phase = DWC_OTG_CONTROL_SETUP;	}	/* start split */	_qtd->complete_split = 0;	_qtd->isoc_split_pos = DWC_HCSPLIT_XACTPOS_ALL;	_qtd->isoc_split_offset = 0;	/* Store the qtd ptr in the urb to reference what QTD. */	_urb->hcpriv = _qtd;	return;}/** * This function allocates and initializes a QTD. * * @param[in] _urb The URB to create a QTD from.  Each URB-QTD pair will end up * pointing to each other so each pair should have a unique correlation. * * @return Returns pointer to the newly allocated QTD, or NULL on error. */dwc_otg_qtd_t *dwc_otg_hcd_qtd_create(struct urb *_urb){	dwc_otg_qtd_t *qtd;#if 0	qtd = dwc_otg_hcd_qtd_alloc();#else	qtd = (dwc_otg_qtd_t *) kmalloc (sizeof(dwc_otg_qtd_t), GFP_KERNEL);#endif	if (qtd == NULL) {		return NULL;	}	dwc_otg_hcd_qtd_init(qtd, _urb);	return qtd;}/** * This function adds a QTD to the QTD-list of a QH.  It will find the correct * QH to place the QTD into.  If it does not find a QH, then it will create a * new QH. If the QH to which the QTD is added is not currently scheduled, it * is placed into the proper schedule based on its EP type. * * @param[in] _qtd The QTD to add * @param[in] _dwc_otg_hcd The DWC HCD structure * * @return 0 if successful, negative error code otherwise. */int dwc_otg_hcd_qtd_add(dwc_otg_qtd_t * _qtd, dwc_otg_hcd_t * _dwc_otg_hcd){	struct usb_host_endpoint *ep;	dwc_otg_qh_t *qh;	unsigned long flags;	int retval = 0;	struct urb *urb = _qtd->urb;	local_irq_save(flags);	/*	 * Get the QH which holds the QTD-list to insert to. Create QH if it	 * doesn't exist.	 */	ep = dwc_urb_to_endpoint(urb);	qh = (dwc_otg_qh_t *) ep->hcpriv;	if (qh == NULL) {		qh = dwc_otg_hcd_qh_create(_dwc_otg_hcd, urb);		if (qh == NULL) {			goto done;		}		ep->hcpriv = qh;	}	retval = dwc_otg_hcd_qh_add(_dwc_otg_hcd, qh);	if (retval == 0) {		list_add_tail(&_qtd->qtd_list_entry, &qh->qtd_list);	}done:	local_irq_restore(flags);	return retval;}#endif				/* DWC_DEVICE_ONLY */

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美美女一区二区| 欧美情侣在线播放| 亚洲一二三级电影| 精品久久五月天| 色猫猫国产区一区二在线视频| 青青草国产精品亚洲专区无| 国产精品久久久久影院老司| 91精品在线观看入口| 91在线观看下载| 国产一区中文字幕| 亚洲v中文字幕| 亚洲欧美日韩中文播放 | 国产精品123区| 亚洲一区在线观看免费观看电影高清| 久久丝袜美腿综合| 91精品国产色综合久久ai换脸| 99re热这里只有精品视频| 黑人精品欧美一区二区蜜桃| 亚洲成人免费影院| 伊人开心综合网| 国产精品久久久久久久久久久免费看| 欧美一区二区三区四区久久| 欧美亚洲国产一区二区三区| www.成人在线| 懂色中文一区二区在线播放| 麻豆极品一区二区三区| 五月天网站亚洲| 亚洲一区二区三区视频在线播放| 最新高清无码专区| 国产精品视频你懂的| 国产亚洲精品精华液| 2014亚洲片线观看视频免费| 欧美xxxx老人做受| 日韩欧美综合在线| 日韩限制级电影在线观看| 欧美精品视频www在线观看| 欧美日韩免费观看一区三区| 欧美又粗又大又爽| 一本到不卡精品视频在线观看| a在线欧美一区| www.日韩在线| 一本久道中文字幕精品亚洲嫩| 91在线观看污| 欧美视频一区二区在线观看| 欧美日韩日日摸| 日韩视频免费观看高清在线视频| 777奇米四色成人影色区| 欧美一区二区三区在线观看| 777亚洲妇女| 精品嫩草影院久久| 久久久久久**毛片大全| 国产色91在线| 国产精品久久久久久久久晋中 | 亚洲激情六月丁香| 亚洲欧美电影一区二区| 亚洲午夜激情av| 免费成人在线视频观看| 日产欧产美韩系列久久99| 日本不卡在线视频| 国产精品自拍一区| a在线播放不卡| 欧美三级在线播放| 日韩欧美123| 欧美激情一区二区| 一区二区国产视频| 日韩av高清在线观看| 国产精品综合一区二区三区| 91网站在线观看视频| 国产精品毛片高清在线完整版| 中文成人av在线| 亚洲五码中文字幕| 国内外成人在线| av中文一区二区三区| 欧美三级电影精品| 26uuuu精品一区二区| 一区视频在线播放| 丝袜诱惑亚洲看片| 国产美女av一区二区三区| 97se狠狠狠综合亚洲狠狠| 7777精品伊人久久久大香线蕉最新版 | 国产精品一二三区在线| 91香蕉国产在线观看软件| 日韩三级免费观看| 亚洲免费av高清| 免费观看日韩av| 91视频com| 精品欧美一区二区久久| 亚洲乱码国产乱码精品精98午夜| 免费日韩伦理电影| 99国产一区二区三精品乱码| 91精品免费观看| 国产精品国产馆在线真实露脸 | 国产精一品亚洲二区在线视频| 在线看国产一区二区| 精品国免费一区二区三区| 中文字幕一区二区5566日韩| 麻豆国产精品官网| 91看片淫黄大片一级| xf在线a精品一区二区视频网站| 一个色在线综合| 成人免费观看av| 日韩欧美成人午夜| 亚洲v精品v日韩v欧美v专区| k8久久久一区二区三区| 日韩欧美一区二区视频| 夜夜爽夜夜爽精品视频| 国产成人免费高清| 欧美va亚洲va在线观看蝴蝶网| 一区二区三区四区视频精品免费| 欧美tickling网站挠脚心| 亚洲在线观看免费视频| eeuss影院一区二区三区| 欧美成人精品高清在线播放| 亚洲国产精品自拍| 99国产精品国产精品久久| 久久久久久综合| 精品中文字幕一区二区小辣椒| 欧美羞羞免费网站| 亚洲欧美一区二区三区久本道91| 激情深爱一区二区| 日韩亚洲欧美一区二区三区| 五月激情综合网| 欧美日韩综合在线| 亚洲黄色片在线观看| 99综合电影在线视频| 欧美精彩视频一区二区三区| 国产东北露脸精品视频| 久久久不卡影院| 国产精品一二三四| 国产拍揄自揄精品视频麻豆| 另类小说欧美激情| 日韩欧美一区在线| 狠狠色丁香久久婷婷综合_中 | 日韩欧美高清dvd碟片| 日本午夜一区二区| 欧美一区二区三区四区视频| 日韩黄色免费电影| 56国语精品自产拍在线观看| 日韩电影在线观看电影| 51精品秘密在线观看| 日本女优在线视频一区二区| 欧美精品精品一区| 男女男精品网站| 日韩你懂的在线观看| 国内精品视频一区二区三区八戒| 精品久久久久久久久久久久久久久久久 | 国产精品美女久久久久aⅴ | 日韩片之四级片| 国内久久婷婷综合| 国产亚洲一本大道中文在线| 国产成人啪午夜精品网站男同| 国产精品伦一区二区三级视频| 99久久国产综合色|国产精品| 亚洲欧洲日本在线| 在线观看精品一区| 调教+趴+乳夹+国产+精品| 日韩一区二区三免费高清| 久久91精品国产91久久小草| 国产偷国产偷精品高清尤物| 成人免费黄色大片| 亚洲伊人色欲综合网| 日韩美女视频一区二区在线观看| 国产久卡久卡久卡久卡视频精品| 中文字幕五月欧美| 欧美日韩免费一区二区三区| 精品亚洲免费视频| 国产精品乱子久久久久| 欧美中文字幕久久 | 欧洲亚洲精品在线| 欧美a级理论片| 日本一区二区三级电影在线观看| 97久久精品人人做人人爽50路| 亚洲综合成人在线| 亚洲精品一区二区三区影院| 成人avav影音| 婷婷开心久久网| 国产欧美日韩综合| 欧美日韩精品系列| 欧美成人女星排名| www.在线成人| 久久er精品视频| 亚洲三级电影网站| 日韩欧美一级二级三级久久久| 成人免费毛片片v| 奇米777欧美一区二区| 国产精品欧美综合在线| 欧美精品日韩综合在线| 成人动漫中文字幕| 日本成人在线网站| 玉足女爽爽91| 久久久久国产一区二区三区四区| 欧美少妇bbb| 丁香啪啪综合成人亚洲小说 | 成人av网址在线| 日韩福利电影在线| 亚洲精品高清在线| 国产蜜臀97一区二区三区| 7799精品视频| 欧美亚洲国产一区在线观看网站 | 91麻豆swag|