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

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

?? uhci-hcd.c

?? host usb 主設(shè)備程序 支持sd卡 mouse keyboard 的最單單的驅(qū)動(dòng)程序 gcc編譯
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
	uhci->io_addr = (unsigned long) hcd->rsrc_start;	/* The UHCI spec says devices must have 2 ports, and goes on to say	 * they may have more but gives no way to determine how many there	 * are.  However according to the UHCI spec, Bit 7 of the port	 * status and control register is always set to 1.  So we try to	 * use this to our advantage.  Another common failure mode when	 * a nonexistent register is addressed is to return all ones, so	 * we test for that also.	 */	for (port = 0; port < (io_size - USBPORTSC1) / 2; port++) {		unsigned int portstatus;		portstatus = inw(uhci->io_addr + USBPORTSC1 + (port * 2));		if (!(portstatus & 0x0080) || portstatus == 0xffff)			break;	}	if (debug)		dev_info(uhci_dev(uhci), "detected %d ports\n", port);	/* Anything greater than 7 is weird so we'll ignore it. */	if (port > UHCI_RH_MAXCHILD) {		dev_info(uhci_dev(uhci), "port count misdetected? "				"forcing to 2 ports\n");		port = 2;	}	uhci->rh_numports = port;	/* Kick BIOS off this hardware and reset if the controller	 * isn't already safely quiescent.	 */	check_and_reset_hc(uhci);	return 0;}/* Make sure the controller is quiescent and that we're not using it * any more.  This is mainly for the benefit of programs which, like kexec, * expect the hardware to be idle: not doing DMA or generating IRQs. * * This routine may be called in a damaged or failing kernel.  Hence we * do not acquire the spinlock before shutting down the controller. */static void uhci_shutdown(struct pci_dev *pdev){	struct usb_hcd *hcd = (struct usb_hcd *) pci_get_drvdata(pdev);	uhci_hc_died(hcd_to_uhci(hcd));}/* * Allocate a frame list, and then setup the skeleton * * The hardware doesn't really know any difference * in the queues, but the order does matter for the * protocols higher up.  The order in which the queues * are encountered by the hardware is: * *  - All isochronous events are handled before any *    of the queues. We don't do that here, because *    we'll create the actual TD entries on demand. *  - The first queue is the high-period interrupt queue. *  - The second queue is the period-1 interrupt and async *    (low-speed control, full-speed control, then bulk) queue. *  - The third queue is the terminating bandwidth reclamation queue, *    which contains no members, loops back to itself, and is present *    only when FSBR is on and there are no full-speed control or bulk QHs. */static int uhci_start(struct usb_hcd *hcd){	struct uhci_hcd *uhci = hcd_to_uhci(hcd);	int retval = -EBUSY;	int i;	struct dentry *dentry;	hcd->uses_new_polling = 1;	spin_lock_init(&uhci->lock);	setup_timer(&uhci->fsbr_timer, uhci_fsbr_timeout,			(unsigned long) uhci);	INIT_LIST_HEAD(&uhci->idle_qh_list);	init_waitqueue_head(&uhci->waitqh);	if (DEBUG_CONFIGURED) {		dentry = debugfs_create_file(hcd->self.bus_name,				S_IFREG|S_IRUGO|S_IWUSR, uhci_debugfs_root,				uhci, &uhci_debug_operations);		if (!dentry) {			dev_err(uhci_dev(uhci), "couldn't create uhci "					"debugfs entry\n");			retval = -ENOMEM;			goto err_create_debug_entry;		}		uhci->dentry = dentry;	}	uhci->frame = dma_alloc_coherent(uhci_dev(uhci),			UHCI_NUMFRAMES * sizeof(*uhci->frame),			&uhci->frame_dma_handle, 0);	if (!uhci->frame) {		dev_err(uhci_dev(uhci), "unable to allocate "				"consistent memory for frame list\n");		goto err_alloc_frame;	}	memset(uhci->frame, 0, UHCI_NUMFRAMES * sizeof(*uhci->frame));	uhci->frame_cpu = kcalloc(UHCI_NUMFRAMES, sizeof(*uhci->frame_cpu),			GFP_KERNEL);	if (!uhci->frame_cpu) {		dev_err(uhci_dev(uhci), "unable to allocate "				"memory for frame pointers\n");		goto err_alloc_frame_cpu;	}	uhci->td_pool = dma_pool_create("uhci_td", uhci_dev(uhci),			sizeof(struct uhci_td), 16, 0);	if (!uhci->td_pool) {		dev_err(uhci_dev(uhci), "unable to create td dma_pool\n");		goto err_create_td_pool;	}	uhci->qh_pool = dma_pool_create("uhci_qh", uhci_dev(uhci),			sizeof(struct uhci_qh), 16, 0);	if (!uhci->qh_pool) {		dev_err(uhci_dev(uhci), "unable to create qh dma_pool\n");		goto err_create_qh_pool;	}	uhci->term_td = uhci_alloc_td(uhci);	if (!uhci->term_td) {		dev_err(uhci_dev(uhci), "unable to allocate terminating TD\n");		goto err_alloc_term_td;	}	for (i = 0; i < UHCI_NUM_SKELQH; i++) {		uhci->skelqh[i] = uhci_alloc_qh(uhci, NULL, NULL);		if (!uhci->skelqh[i]) {			dev_err(uhci_dev(uhci), "unable to allocate QH\n");			goto err_alloc_skelqh;		}	}	/*	 * 8 Interrupt queues; link all higher int queues to int1 = async	 */	for (i = SKEL_ISO + 1; i < SKEL_ASYNC; ++i)		uhci->skelqh[i]->link = LINK_TO_QH(uhci->skel_async_qh);	uhci->skel_async_qh->link = UHCI_PTR_TERM;	uhci->skel_term_qh->link = LINK_TO_QH(uhci->skel_term_qh);	/* This dummy TD is to work around a bug in Intel PIIX controllers */	uhci_fill_td(uhci->term_td, 0, uhci_explen(0) |			(0x7f << TD_TOKEN_DEVADDR_SHIFT) | USB_PID_IN, 0);	uhci->term_td->link = UHCI_PTR_TERM;	uhci->skel_async_qh->element = uhci->skel_term_qh->element =			LINK_TO_TD(uhci->term_td);	/*	 * Fill the frame list: make all entries point to the proper	 * interrupt queue.	 */	for (i = 0; i < UHCI_NUMFRAMES; i++) {		/* Only place we don't use the frame list routines */		uhci->frame[i] = uhci_frame_skel_link(uhci, i);	}	/*	 * Some architectures require a full mb() to enforce completion of	 * the memory writes above before the I/O transfers in configure_hc().	 */	mb();	configure_hc(uhci);	uhci->is_initialized = 1;	start_rh(uhci);	return 0;/* * error exits: */err_alloc_skelqh:	for (i = 0; i < UHCI_NUM_SKELQH; i++) {		if (uhci->skelqh[i])			uhci_free_qh(uhci, uhci->skelqh[i]);	}	uhci_free_td(uhci, uhci->term_td);err_alloc_term_td:	dma_pool_destroy(uhci->qh_pool);err_create_qh_pool:	dma_pool_destroy(uhci->td_pool);err_create_td_pool:	kfree(uhci->frame_cpu);err_alloc_frame_cpu:	dma_free_coherent(uhci_dev(uhci),			UHCI_NUMFRAMES * sizeof(*uhci->frame),			uhci->frame, uhci->frame_dma_handle);err_alloc_frame:	debugfs_remove(uhci->dentry);err_create_debug_entry:	return retval;}static void uhci_stop(struct usb_hcd *hcd){	struct uhci_hcd *uhci = hcd_to_uhci(hcd);	spin_lock_irq(&uhci->lock);	if (test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags) && !uhci->dead)		uhci_hc_died(uhci);	uhci_scan_schedule(uhci);	spin_unlock_irq(&uhci->lock);	del_timer_sync(&uhci->fsbr_timer);	release_uhci(uhci);}#ifdef CONFIG_PMstatic int uhci_rh_suspend(struct usb_hcd *hcd){	struct uhci_hcd *uhci = hcd_to_uhci(hcd);	int rc = 0;	spin_lock_irq(&uhci->lock);	if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags))		rc = -ESHUTDOWN;	else if (!uhci->dead)		suspend_rh(uhci, UHCI_RH_SUSPENDED);	spin_unlock_irq(&uhci->lock);	return rc;}static int uhci_rh_resume(struct usb_hcd *hcd){	struct uhci_hcd *uhci = hcd_to_uhci(hcd);	int rc = 0;	spin_lock_irq(&uhci->lock);	if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) {		dev_warn(&hcd->self.root_hub->dev, "HC isn't running!\n");		rc = -ESHUTDOWN;	} else if (!uhci->dead)		wakeup_rh(uhci);	spin_unlock_irq(&uhci->lock);	return rc;}static int uhci_suspend(struct usb_hcd *hcd, pm_message_t message){	struct uhci_hcd *uhci = hcd_to_uhci(hcd);	int rc = 0;	dev_dbg(uhci_dev(uhci), "%s\n", __FUNCTION__);	spin_lock_irq(&uhci->lock);	if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags) || uhci->dead)		goto done_okay;		/* Already suspended or dead */	if (uhci->rh_state > UHCI_RH_SUSPENDED) {		dev_warn(uhci_dev(uhci), "Root hub isn't suspended!\n");		rc = -EBUSY;		goto done;	};	/* All PCI host controllers are required to disable IRQ generation	 * at the source, so we must turn off PIRQ.	 */	pci_write_config_word(to_pci_dev(uhci_dev(uhci)), USBLEGSUP, 0);	mb();	hcd->poll_rh = 0;	/* FIXME: Enable non-PME# remote wakeup? */	/* make sure snapshot being resumed re-enumerates everything */	if (message.event == PM_EVENT_PRETHAW)		uhci_hc_died(uhci);done_okay:	clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);done:	spin_unlock_irq(&uhci->lock);	return rc;}static int uhci_resume(struct usb_hcd *hcd){	struct uhci_hcd *uhci = hcd_to_uhci(hcd);	dev_dbg(uhci_dev(uhci), "%s\n", __FUNCTION__);	/* Since we aren't in D3 any more, it's safe to set this flag	 * even if the controller was dead.	 */	set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);	mb();	spin_lock_irq(&uhci->lock);	/* FIXME: Disable non-PME# remote wakeup? */	/* The firmware or a boot kernel may have changed the controller	 * settings during a system wakeup.  Check it and reconfigure	 * to avoid problems.	 */	check_and_reset_hc(uhci);	/* If the controller was dead before, it's back alive now */	configure_hc(uhci);	if (uhci->rh_state == UHCI_RH_RESET) {		/* The controller had to be reset */		usb_root_hub_lost_power(hcd->self.root_hub);		suspend_rh(uhci, UHCI_RH_SUSPENDED);	}	spin_unlock_irq(&uhci->lock);	if (!uhci->working_RD) {		/* Suspended root hub needs to be polled */		hcd->poll_rh = 1;		usb_hcd_poll_rh_status(hcd);	}	return 0;}#endif/* Wait until a particular device/endpoint's QH is idle, and free it */static void uhci_hcd_endpoint_disable(struct usb_hcd *hcd,		struct usb_host_endpoint *hep){	struct uhci_hcd *uhci = hcd_to_uhci(hcd);	struct uhci_qh *qh;	spin_lock_irq(&uhci->lock);	qh = (struct uhci_qh *) hep->hcpriv;	if (qh == NULL)		goto done;	while (qh->state != QH_STATE_IDLE) {		++uhci->num_waiting;		spin_unlock_irq(&uhci->lock);		wait_event_interruptible(uhci->waitqh,				qh->state == QH_STATE_IDLE);		spin_lock_irq(&uhci->lock);		--uhci->num_waiting;	}	uhci_free_qh(uhci, qh);done:	spin_unlock_irq(&uhci->lock);}static int uhci_hcd_get_frame_number(struct usb_hcd *hcd){	struct uhci_hcd *uhci = hcd_to_uhci(hcd);	unsigned frame_number;	unsigned delta;	/* Minimize latency by avoiding the spinlock */	frame_number = uhci->frame_number;	barrier();	delta = (inw(uhci->io_addr + USBFRNUM) - frame_number) &			(UHCI_NUMFRAMES - 1);	return frame_number + delta;}static const char hcd_name[] = "uhci_hcd";static const struct hc_driver uhci_driver = {	.description =		hcd_name,	.product_desc =		"UHCI Host Controller",	.hcd_priv_size =	sizeof(struct uhci_hcd),	/* Generic hardware linkage */	.irq =			uhci_irq,	.flags =		HCD_USB11,	/* Basic lifecycle operations */	.reset =		uhci_init,	.start =		uhci_start,#ifdef CONFIG_PM	.suspend =		uhci_suspend,	.resume =		uhci_resume,	.bus_suspend =		uhci_rh_suspend,	.bus_resume =		uhci_rh_resume,#endif	.stop =			uhci_stop,	.urb_enqueue =		uhci_urb_enqueue,	.urb_dequeue =		uhci_urb_dequeue,	.endpoint_disable =	uhci_hcd_endpoint_disable,	.get_frame_number =	uhci_hcd_get_frame_number,	.hub_status_data =	uhci_hub_status_data,	.hub_control =		uhci_hub_control,};static const struct pci_device_id uhci_pci_ids[] = { {	/* handle any USB UHCI controller */	PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_USB_UHCI, ~0),	.driver_data =	(unsigned long) &uhci_driver,	}, { /* end: all zeroes */ }};MODULE_DEVICE_TABLE(pci, uhci_pci_ids);static struct pci_driver uhci_pci_driver = {	.name =		(char *)hcd_name,	.id_table =	uhci_pci_ids,	.probe =	usb_hcd_pci_probe,	.remove =	usb_hcd_pci_remove,	.shutdown =	uhci_shutdown,#ifdef	CONFIG_PM	.suspend =	usb_hcd_pci_suspend,	.resume =	usb_hcd_pci_resume,#endif	/* PM */}; static int __init uhci_hcd_init(void){	int retval = -ENOMEM;	printk(KERN_INFO DRIVER_DESC " " DRIVER_VERSION "%s\n",			ignore_oc ? ", overcurrent ignored" : "");	if (usb_disabled())		return -ENODEV;	if (DEBUG_CONFIGURED) {		errbuf = kmalloc(ERRBUF_LEN, GFP_KERNEL);		if (!errbuf)			goto errbuf_failed;		uhci_debugfs_root = debugfs_create_dir("uhci", NULL);		if (!uhci_debugfs_root)			goto debug_failed;	}	uhci_up_cachep = kmem_cache_create("uhci_urb_priv",		sizeof(struct urb_priv), 0, 0, NULL, NULL);	if (!uhci_up_cachep)		goto up_failed;	retval = pci_register_driver(&uhci_pci_driver);	if (retval)		goto init_failed;	return 0;init_failed:	kmem_cache_destroy(uhci_up_cachep);up_failed:	debugfs_remove(uhci_debugfs_root);debug_failed:	kfree(errbuf);errbuf_failed:	return retval;}static void __exit uhci_hcd_cleanup(void) {	pci_unregister_driver(&uhci_pci_driver);	kmem_cache_destroy(uhci_up_cachep);	debugfs_remove(uhci_debugfs_root);	kfree(errbuf);}module_init(uhci_hcd_init);module_exit(uhci_hcd_cleanup);MODULE_AUTHOR(DRIVER_AUTHOR);MODULE_DESCRIPTION(DRIVER_DESC);MODULE_LICENSE("GPL");

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品国产精品国产专区不蜜 | 成人app在线观看| 色悠久久久久综合欧美99| 欧美一区二区三区免费| 亚洲欧美激情视频在线观看一区二区三区| 一本久久综合亚洲鲁鲁五月天| 国产精品国模大尺度视频| 91精品福利在线一区二区三区| 国产欧美日韩另类一区| 日本伊人色综合网| 在线观看一区日韩| 中文字幕一区二区三区色视频| 蜜桃一区二区三区在线观看| 欧美视频日韩视频在线观看| 国产精品美女久久久久久久久久久| 蜜桃av一区二区三区电影| 欧美日韩在线直播| 夜夜嗨av一区二区三区网页 | 午夜久久福利影院| 色网站国产精品| 中文字幕中文字幕在线一区 | 久久精品免费观看| 91精品国产一区二区三区| 亚洲国产三级在线| 欧美自拍丝袜亚洲| 亚洲一区二区综合| 在线观看精品一区| 亚洲成在人线在线播放| 91国产福利在线| 亚洲乱码中文字幕| 一本大道久久a久久精二百| 国产精品国产馆在线真实露脸| 国产精品12区| 日本一区二区免费在线观看视频| 国产一区二区毛片| 久久精品一区二区三区四区| 国产麻豆精品theporn| 久久综合色天天久久综合图片| 精品一区二区在线看| 久久综合九色综合欧美98| 国产老妇另类xxxxx| 久久精品亚洲一区二区三区浴池| 国产一区二区三区在线观看免费 | 日韩美一区二区三区| 狠狠色狠狠色综合日日91app| 精品国产精品一区二区夜夜嗨 | 热久久一区二区| 精品成人a区在线观看| 精品一区二区三区日韩| 中文字幕欧美国产| 欧美综合亚洲图片综合区| 午夜亚洲国产au精品一区二区| 6080亚洲精品一区二区| 青青草原综合久久大伊人精品优势| 欧美精品一区二区三区视频| 粉嫩一区二区三区性色av| 国产精品久久久久久久久久久免费看| 91在线小视频| 天堂va蜜桃一区二区三区| 久久婷婷久久一区二区三区| 成人av电影在线网| 日韩av网站在线观看| 国产亚洲精品bt天堂精选| 91黄色免费观看| 精品制服美女久久| 亚洲婷婷国产精品电影人久久| 884aa四虎影成人精品一区| 国产美女主播视频一区| 一区二区三区欧美日| 精品国产凹凸成av人导航| 97久久久精品综合88久久| 日韩电影免费在线看| 欧美国产精品专区| 日韩一区二区三| 91在线丨porny丨国产| 蜜臀久久久久久久| 亚洲人成亚洲人成在线观看图片| 678五月天丁香亚洲综合网| 高潮精品一区videoshd| 日韩二区三区四区| 综合精品久久久| 久久久久一区二区三区四区| 欧美艳星brazzers| www.综合网.com| 国模一区二区三区白浆| 亚洲国产欧美在线| 亚洲视频在线观看三级| 久久尤物电影视频在线观看| 欧美日韩不卡视频| 色综合久久66| 成人免费va视频| 国产精品一区二区三区99| 五月婷婷久久丁香| 亚洲综合免费观看高清完整版在线 | 久久精品人人做人人综合 | 狠狠色综合日日| 日韩专区欧美专区| 亚洲综合免费观看高清在线观看| 国产精品污www在线观看| 26uuu成人网一区二区三区| 欧美一区二区网站| 911精品国产一区二区在线| 色综合视频在线观看| 波多野结衣亚洲| 波多野结衣在线一区| 国产一区二区三区免费在线观看 | 欧美一级日韩一级| 4438x成人网最大色成网站| 色女孩综合影院| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 久久嫩草精品久久久久| 欧美va亚洲va| 久久尤物电影视频在线观看| xnxx国产精品| 欧美激情艳妇裸体舞| 国产免费观看久久| 国产蜜臀97一区二区三区| 中文字幕二三区不卡| 中文字幕一区三区| 亚洲视频你懂的| 亚洲电影一区二区三区| 午夜日韩在线电影| 日产欧产美韩系列久久99| 免费高清视频精品| 国产麻豆精品在线| 99这里只有精品| 在线精品视频小说1| 555夜色666亚洲国产免| 日韩一区二区在线播放| 欧美精品一区在线观看| 日本一区二区三区高清不卡| 中文字幕日韩一区| 亚洲一区二区三区在线看| 丝瓜av网站精品一区二区| 久久精品国产免费| 国产精品亚洲第一区在线暖暖韩国 | 精品视频免费在线| 日韩一区二区三区视频在线| 欧美精品一区二区三区蜜臀 | 五月婷婷欧美视频| 久久疯狂做爰流白浆xx| 高清国产一区二区| 色先锋aa成人| 精品国产自在久精品国产| 国产精品国产三级国产| 国产成人午夜高潮毛片| 91在线国内视频| 欧美欧美欧美欧美| 中文av字幕一区| 亚洲bt欧美bt精品| 成人性生交大片免费| 欧美日韩国产小视频在线观看| 精品国产免费久久| 亚洲人精品午夜| 久久草av在线| 在线观看91视频| 国产精品嫩草影院av蜜臀| 日韩高清在线一区| 成人一区二区视频| 91精品久久久久久久91蜜桃| 中文字幕欧美三区| 老司机精品视频一区二区三区| 国产成人综合精品三级| 欧美日韩午夜在线视频| 国产精品久99| 久久se这里有精品| 欧美日韩亚洲综合一区二区三区| 久久一区二区视频| 日韩成人av影视| 色综合久久九月婷婷色综合| 久久亚洲二区三区| 日韩av高清在线观看| 色老综合老女人久久久| 国产日韩欧美制服另类| 六月婷婷色综合| 欧美日韩不卡一区| 一区二区三区免费在线观看| 粉嫩aⅴ一区二区三区四区| 4438x亚洲最大成人网| 一区二区成人在线视频 | 在线播放日韩导航| 亚洲免费大片在线观看| 成人aa视频在线观看| 精品粉嫩超白一线天av| 人人爽香蕉精品| 91精品国产黑色紧身裤美女| 亚洲综合小说图片| 91福利在线免费观看| 亚洲欧美怡红院| 成人免费视频一区| 国产精品久久久久久久久免费樱桃| 国产揄拍国内精品对白| 日韩欧美色综合| 久久se这里有精品| 久久亚洲欧美国产精品乐播| 久久精品久久久精品美女| 日韩精品一区二区三区四区| 久久精品国产亚洲一区二区三区 | 色综合久久天天综合网| 亚洲美女在线一区|