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

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

?? ehci-pci.c

?? usb driver for 2.6.17
?? C
字號:
/* * EHCI HCD (Host Controller Driver) PCI Bus Glue. * * Copyright (c) 2000-2004 by David Brownell * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License * for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */#ifndef CONFIG_PCI#error "This file is PCI bus glue.  CONFIG_PCI must be defined."#endif/*-------------------------------------------------------------------------*//* called after powerup, by probe or system-pm "wakeup" */static int ehci_pci_reinit(struct ehci_hcd *ehci, struct pci_dev *pdev){	u32			temp;	int			retval;	/* optional debug port, normally in the first BAR */	temp = pci_find_capability(pdev, 0x0a);	if (temp) {		pci_read_config_dword(pdev, temp, &temp);		temp >>= 16;		if ((temp & (3 << 13)) == (1 << 13)) {			temp &= 0x1fff;			ehci->debug = ehci_to_hcd(ehci)->regs + temp;			temp = readl(&ehci->debug->control);			ehci_info(ehci, "debug port %d%s\n",				HCS_DEBUG_PORT(ehci->hcs_params),				(temp & DBGP_ENABLED)					? " IN USE"					: "");			if (!(temp & DBGP_ENABLED))				ehci->debug = NULL;		}	}	/* we expect static quirk code to handle the "extended capabilities"	 * (currently just BIOS handoff) allowed starting with EHCI 0.96	 */	/* PCI Memory-Write-Invalidate cycle support is optional (uncommon) */	retval = pci_set_mwi(pdev);	if (!retval)		ehci_dbg(ehci, "MWI active\n");	ehci_port_power(ehci, 0);	return 0;}/* called during probe() after chip reset completes */static int ehci_pci_setup(struct usb_hcd *hcd){	struct ehci_hcd		*ehci = hcd_to_ehci(hcd);	struct pci_dev		*pdev = to_pci_dev(hcd->self.controller);	u32			temp;	int			retval;	ehci->caps = hcd->regs;	ehci->regs = hcd->regs + HC_LENGTH(readl(&ehci->caps->hc_capbase));	dbg_hcs_params(ehci, "reset");	dbg_hcc_params(ehci, "reset");	/* cache this readonly data; minimize chip reads */	ehci->hcs_params = readl(&ehci->caps->hcs_params);	retval = ehci_halt(ehci);	if (retval)		return retval;	/* data structure init */	retval = ehci_init(hcd);	if (retval)		return retval;	/* NOTE:  only the parts below this line are PCI-specific */	switch (pdev->vendor) {	case PCI_VENDOR_ID_TDI:		if (pdev->device == PCI_DEVICE_ID_TDI_EHCI) {			ehci->is_tdi_rh_tt = 1;			tdi_reset(ehci);		}		break;	case PCI_VENDOR_ID_AMD:		/* AMD8111 EHCI doesn't work, according to AMD errata */		if (pdev->device == 0x7463) {			ehci_info(ehci, "ignoring AMD8111 (errata)\n");			retval = -EIO;			goto done;		}		break;	case PCI_VENDOR_ID_NVIDIA:		switch (pdev->device) {		/* NVidia reports that certain chips don't handle		 * QH, ITD, or SITD addresses above 2GB.  (But TD,		 * data buffer, and periodic schedule are normal.)		 */		case 0x003c:	/* MCP04 */		case 0x005b:	/* CK804 */		case 0x00d8:	/* CK8 */		case 0x00e8:	/* CK8S */			if (pci_set_consistent_dma_mask(pdev,						DMA_31BIT_MASK) < 0)				ehci_warn(ehci, "can't enable NVidia "					"workaround for >2GB RAM\n");			break;		/* Some NForce2 chips have problems with selective suspend;		 * fixed in newer silicon.		 */		case 0x0068:			pci_read_config_dword(pdev, PCI_REVISION_ID, &temp);			if ((temp & 0xff) < 0xa4)				ehci->no_selective_suspend = 1;			break;		}		break;	}	if (ehci_is_TDI(ehci))		ehci_reset(ehci);	/* at least the Genesys GL880S needs fixup here */	temp = HCS_N_CC(ehci->hcs_params) * HCS_N_PCC(ehci->hcs_params);	temp &= 0x0f;	if (temp && HCS_N_PORTS(ehci->hcs_params) > temp) {		ehci_dbg(ehci, "bogus port configuration: "			"cc=%d x pcc=%d < ports=%d\n",			HCS_N_CC(ehci->hcs_params),			HCS_N_PCC(ehci->hcs_params),			HCS_N_PORTS(ehci->hcs_params));		switch (pdev->vendor) {		case 0x17a0:		/* GENESYS */			/* GL880S: should be PORTS=2 */			temp |= (ehci->hcs_params & ~0xf);			ehci->hcs_params = temp;			break;		case PCI_VENDOR_ID_NVIDIA:			/* NF4: should be PCC=10 */			break;		}	}	/* Serial Bus Release Number is at PCI 0x60 offset */	pci_read_config_byte(pdev, 0x60, &ehci->sbrn);	/* Workaround current PCI init glitch:  wakeup bits aren't	 * being set from PCI PM capability.	 */	if (!device_can_wakeup(&pdev->dev)) {		u16	port_wake;		pci_read_config_word(pdev, 0x62, &port_wake);		if (port_wake & 0x0001)			device_init_wakeup(&pdev->dev, 1);	}#ifdef	CONFIG_USB_SUSPEND	/* REVISIT: the controller works fine for wakeup iff the root hub	 * itself is "globally" suspended, but usbcore currently doesn't	 * understand such things.	 *	 * System suspend currently expects to be able to suspend the entire	 * device tree, device-at-a-time.  If we failed selective suspend	 * reports, system suspend would fail; so the root hub code must claim	 * success.  That's lying to usbcore, and it matters for for runtime	 * PM scenarios with selective suspend and remote wakeup...	 */	if (ehci->no_selective_suspend && device_can_wakeup(&pdev->dev))		ehci_warn(ehci, "selective suspend/wakeup unavailable\n");#endif	retval = ehci_pci_reinit(ehci, pdev);done:	return retval;}/*-------------------------------------------------------------------------*/#ifdef	CONFIG_PM/* suspend/resume, section 4.3 *//* These routines rely on the PCI bus glue * to handle powerdown and wakeup, and currently also on * transceivers that don't need any software attention to set up * the right sort of wakeup. * Also they depend on separate root hub suspend/resume. */static int ehci_pci_suspend(struct usb_hcd *hcd, pm_message_t message){	struct ehci_hcd		*ehci = hcd_to_ehci(hcd);	unsigned long		flags;	int			rc = 0;	if (time_before(jiffies, ehci->next_statechange))		msleep(10);	/* Root hub was already suspended. Disable irq emission and	 * mark HW unaccessible, bail out if RH has been resumed. Use	 * the spinlock to properly synchronize with possible pending	 * RH suspend or resume activity.	 *	 * This is still racy as hcd->state is manipulated outside of	 * any locks =P But that will be a different fix.	 */	spin_lock_irqsave (&ehci->lock, flags);	if (hcd->state != HC_STATE_SUSPENDED) {		rc = -EINVAL;		goto bail;	}	writel (0, &ehci->regs->intr_enable);	(void)readl(&ehci->regs->intr_enable);	clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); bail:	spin_unlock_irqrestore (&ehci->lock, flags);	// could save FLADJ in case of Vaux power loss	// ... we'd only use it to handle clock skew	return rc;}static int ehci_pci_resume(struct usb_hcd *hcd){	struct ehci_hcd		*ehci = hcd_to_ehci(hcd);	unsigned		port;	struct pci_dev		*pdev = to_pci_dev(hcd->self.controller);	int			retval = -EINVAL;	// maybe restore FLADJ	if (time_before(jiffies, ehci->next_statechange))		msleep(100);	/* Mark hardware accessible again as we are out of D3 state by now */	set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);	/* If CF is clear, we lost PCI Vaux power and need to restart.  */	if (readl(&ehci->regs->configured_flag) != FLAG_CF)		goto restart;	/* If any port is suspended (or owned by the companion),	 * we know we can/must resume the HC (and mustn't reset it).	 * We just defer that to the root hub code.	 */	for (port = HCS_N_PORTS(ehci->hcs_params); port > 0; ) {		u32	status;		port--;		status = readl(&ehci->regs->port_status [port]);		if (!(status & PORT_POWER))			continue;		if (status & (PORT_SUSPEND | PORT_RESUME | PORT_OWNER)) {			usb_hcd_resume_root_hub(hcd);			return 0;		}	}restart:	ehci_dbg(ehci, "lost power, restarting\n");	usb_root_hub_lost_power(hcd->self.root_hub);	/* Else reset, to cope with power loss or flush-to-storage	 * style "resume" having let BIOS kick in during reboot.	 */	(void) ehci_halt(ehci);	(void) ehci_reset(ehci);	(void) ehci_pci_reinit(ehci, pdev);	/* emptying the schedule aborts any urbs */	spin_lock_irq(&ehci->lock);	if (ehci->reclaim)		ehci->reclaim_ready = 1;	ehci_work(ehci, NULL);	spin_unlock_irq(&ehci->lock);	/* restart; khubd will disconnect devices */	retval = ehci_run(hcd);	/* here we "know" root ports should always stay powered */	ehci_port_power(ehci, 1);	return retval;}#endifstatic const struct hc_driver ehci_pci_hc_driver = {	.description =		hcd_name,	.product_desc =		"EHCI Host Controller",	.hcd_priv_size =	sizeof(struct ehci_hcd),	/*	 * generic hardware linkage	 */	.irq =			ehci_irq,	.flags =		HCD_MEMORY | HCD_USB2,	/*	 * basic lifecycle operations	 */	.reset =		ehci_pci_setup,	.start =		ehci_run,#ifdef	CONFIG_PM	.suspend =		ehci_pci_suspend,	.resume =		ehci_pci_resume,#endif	.stop =			ehci_stop,	/*	 * managing i/o requests and associated device resources	 */	.urb_enqueue =		ehci_urb_enqueue,	.urb_dequeue =		ehci_urb_dequeue,	.endpoint_disable =	ehci_endpoint_disable,	/*	 * scheduling support	 */	.get_frame_number =	ehci_get_frame,	/*	 * root hub support	 */	.hub_status_data =	ehci_hub_status_data,	.hub_control =		ehci_hub_control,	.bus_suspend =		ehci_bus_suspend,	.bus_resume =		ehci_bus_resume,};/*-------------------------------------------------------------------------*//* PCI driver selection metadata; PCI hotplugging uses this */static const struct pci_device_id pci_ids [] = { {	/* handle any USB 2.0 EHCI controller */	PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_USB_EHCI, ~0),	.driver_data =	(unsigned long) &ehci_pci_hc_driver,	},	{ /* end: all zeroes */ }};MODULE_DEVICE_TABLE(pci, pci_ids);/* pci driver glue; this is a "new style" PCI driver module */static struct pci_driver ehci_pci_driver = {	.name =		(char *) hcd_name,	.id_table =	pci_ids,	.probe =	usb_hcd_pci_probe,	.remove =	usb_hcd_pci_remove,#ifdef	CONFIG_PM	.suspend =	usb_hcd_pci_suspend,	.resume =	usb_hcd_pci_resume,#endif};static int __init ehci_hcd_pci_init(void){	if (usb_disabled())		return -ENODEV;	pr_debug("%s: block sizes: qh %Zd qtd %Zd itd %Zd sitd %Zd\n",		hcd_name,		sizeof(struct ehci_qh), sizeof(struct ehci_qtd),		sizeof(struct ehci_itd), sizeof(struct ehci_sitd));	return pci_register_driver(&ehci_pci_driver);}module_init(ehci_hcd_pci_init);static void __exit ehci_hcd_pci_cleanup(void){	pci_unregister_driver(&ehci_pci_driver);}module_exit(ehci_hcd_pci_cleanup);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品国产综合久久久久| 久久激五月天综合精品| 精品日韩一区二区| 7777精品伊人久久久大香线蕉完整版 | 国产精品亚洲第一| 看国产成人h片视频| 日本成人在线看| 蜜乳av一区二区三区| 日本成人在线不卡视频| 日本欧美一区二区在线观看| 五月婷婷综合激情| 美女一区二区视频| 国产一区二区在线视频| 国产精品影视天天线| 国产xxx精品视频大全| 国产成人日日夜夜| 成人97人人超碰人人99| 色婷婷一区二区| 在线视频国内自拍亚洲视频| 欧美性三三影院| 欧美一区二区三区四区久久| 欧美不卡一区二区三区四区| 久久这里只有精品6| 国产精品久久精品日日| 一区二区三区四区在线播放 | 欧美精品在线一区二区三区| 欧美老人xxxx18| 精品国产伦一区二区三区观看方式| 久久综合久久综合亚洲| 国产欧美日本一区视频| 成人免费三级在线| 日韩美一区二区三区| 91在线观看地址| 欧美酷刑日本凌虐凌虐| 久久精品夜色噜噜亚洲a∨| 亚洲女同ⅹxx女同tv| 日韩黄色免费网站| 成人精品高清在线| 在线电影国产精品| 中文字幕av在线一区二区三区| 一区二区三区久久久| 经典三级视频一区| 一本久道中文字幕精品亚洲嫩| 欧美一区二区三区四区五区 | 风间由美一区二区三区在线观看| 日本久久电影网| 久久伊人蜜桃av一区二区| 亚洲韩国一区二区三区| 国产91精品入口| 欧美一级二级三级乱码| 亚洲日穴在线视频| 黑人精品欧美一区二区蜜桃| 欧美三级欧美一级| 久久久精品2019中文字幕之3| 一区二区三区av电影| 丁香激情综合国产| 欧美成人福利视频| 五月天久久比比资源色| 91老司机福利 在线| 欧美激情一区二区在线| 免费的国产精品| 欧美视频精品在线观看| 日韩久久一区二区| 成人av免费在线观看| 久久午夜色播影院免费高清| 日本不卡不码高清免费观看| 欧美性色黄大片| 亚洲男人电影天堂| 色综合视频一区二区三区高清| 国产精品久线在线观看| 国产盗摄视频一区二区三区| 日韩女优视频免费观看| 日本在线播放一区二区三区| 欧美日韩在线播放| 亚洲精品乱码久久久久久黑人| www.日韩av| 国产精品久久久久久久久快鸭| 国产一区二三区| 久久综合久久综合九色| 狠狠狠色丁香婷婷综合激情| 26uuu精品一区二区| 狂野欧美性猛交blacked| 日韩欧美www| 美女精品自拍一二三四| 日韩女优av电影| 国产一区二区三区四区五区美女| 久久综合九色综合久久久精品综合| 日韩电影一区二区三区四区| 日韩欧美你懂的| 狠狠色综合播放一区二区| 久久影音资源网| jlzzjlzz亚洲日本少妇| 亚洲男人都懂的| 欧美高清性hdvideosex| 免费成人在线网站| 国产欧美精品在线观看| 色噜噜狠狠成人中文综合| 亚洲成在人线在线播放| 欧美v日韩v国产v| 波多野结衣中文字幕一区| 亚洲免费av在线| 欧美一级理论片| 成人h精品动漫一区二区三区| 亚洲视频免费看| 欧美精品久久天天躁| 国产精品一区二区久久不卡 | 欧美亚洲综合色| 日本sm残虐另类| 久久综合九色综合欧美就去吻| 国产综合久久久久久鬼色| 国产精品久线观看视频| 日韩在线卡一卡二| 精品国产乱码久久久久久闺蜜| 国产高清精品网站| 亚洲午夜在线视频| 久久先锋资源网| 欧美视频中文字幕| 久久电影网站中文字幕| 亚洲女与黑人做爰| 久久久久久久精| 欧美日韩dvd在线观看| 福利一区二区在线观看| 日韩精品高清不卡| 国产精品美日韩| 日韩精品中午字幕| 欧美性xxxxxxxx| 福利电影一区二区三区| 人人狠狠综合久久亚洲| 亚洲视频免费观看| 欧美国产视频在线| 日韩精品在线一区| 在线视频一区二区三| 大胆欧美人体老妇| 国产中文字幕精品| 日韩成人免费看| 亚洲国产视频一区二区| 国产精品国产三级国产三级人妇 | 亚洲国产精品精华液ab| 91精品国产综合久久久久久| 在线视频一区二区免费| 99免费精品在线| 国产成人精品一区二区三区四区| 日韩中文字幕av电影| 亚洲v中文字幕| 国产精品毛片大码女人| 国产视频911| 久久久久青草大香线综合精品| 91精品福利在线一区二区三区 | 午夜精品影院在线观看| 亚洲婷婷在线视频| 中文字幕欧美三区| 国产精品拍天天在线| 欧美激情一区二区在线| 久久久精品综合| 国产亚洲欧美激情| 久久天天做天天爱综合色| 久久综合九色综合欧美就去吻| 精品福利一区二区三区免费视频| 欧美日韩的一区二区| 欧美精品黑人性xxxx| 日韩欧美国产一区在线观看| 欧美一级二级三级乱码| 精品国产制服丝袜高跟| 久久这里都是精品| 国产精品欧美一区二区三区| 中文字幕中文字幕在线一区| 国产精品国产三级国产普通话99| 国产精品伦理在线| 一区二区三区中文字幕| 午夜激情综合网| 免费看欧美女人艹b| 国产一区二区三区黄视频| 成人午夜视频在线| 日本韩国精品一区二区在线观看| 欧美伊人久久久久久久久影院| 欧美精品一卡两卡| 精品久久国产字幕高潮| 国产精品美女久久福利网站| 亚洲精品成人在线| 日韩av网站在线观看| 国产精品自在在线| 91麻豆国产自产在线观看| 欧美视频三区在线播放| 久久午夜老司机| 一区二区三区在线视频播放| 日本美女视频一区二区| 国产不卡视频一区| 欧美精品免费视频| 中文av一区二区| 日韩精品成人一区二区在线| 国产精品自拍av| 欧美色图第一页| 欧美图区在线视频| 久久久影院官网| 男人的j进女人的j一区| 婷婷中文字幕综合| 成人h动漫精品一区二区| 欧美一区二区三区播放老司机| 日本一区二区三区四区| 日韩在线卡一卡二|