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

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

?? ehci-pci.c

?? LINUX 2.6.17.4的源碼
?? 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一区二区三区免费野_久草精品视频
成人精品小蝌蚪| 欧美性大战久久久| 欧美在线|欧美| 久久久99久久| 日本伊人色综合网| 一本大道久久精品懂色aⅴ| 26uuu国产电影一区二区| 亚洲午夜国产一区99re久久| 成人性生交大合| 日韩欧美亚洲一区二区| 亚洲综合另类小说| 成人av网站在线| 精品88久久久久88久久久| 偷拍与自拍一区| 91成人免费网站| 亚洲天堂中文字幕| 成人夜色视频网站在线观看| 精品国产一区二区精华| 日韩精品电影在线观看| 在线观看免费成人| 亚洲激情六月丁香| 91视频免费播放| 亚洲情趣在线观看| av电影天堂一区二区在线观看| 久久蜜臀中文字幕| 国产乱码精品一区二区三区忘忧草 | 蜜桃传媒麻豆第一区在线观看| 91在线精品一区二区三区| 国产农村妇女精品| 国产69精品久久久久毛片| 欧美精品一区二区三区视频| 九九在线精品视频| 久久久久久9999| 国产一区二区美女| 久久精品视频一区二区三区| 国产精品自拍av| 中文字幕va一区二区三区| 99天天综合性| 樱桃视频在线观看一区| 在线日韩av片| 视频在线观看一区| 久久伊人蜜桃av一区二区| 黄色日韩三级电影| 国产精品午夜久久| 91视频精品在这里| 午夜精品久久久久久久蜜桃app | 色综合久久久久| 日韩美女精品在线| 欧美天天综合网| 天堂蜜桃一区二区三区| 精品日韩在线观看| 国产成人av福利| 亚洲免费观看视频| 欧美精品久久一区二区三区| 久久国内精品视频| 欧美国产日产图区| 欧美在线一区二区三区| 免费在线观看精品| 国产午夜精品一区二区| 欧洲色大大久久| 精品影院一区二区久久久| 中文一区二区完整视频在线观看| 色系网站成人免费| 日韩不卡在线观看日韩不卡视频| 精品日韩99亚洲| 色综合天天综合狠狠| 五月激情综合色| 中文字幕亚洲在| 日韩天堂在线观看| 91老司机福利 在线| 久久99精品国产麻豆婷婷洗澡| 国产精品久久久久久亚洲伦| 在线91免费看| 91免费视频观看| 激情伊人五月天久久综合| 亚洲黄色性网站| 国产日韩三级在线| 56国语精品自产拍在线观看| 粉嫩一区二区三区性色av| 免费xxxx性欧美18vr| 自拍偷拍亚洲欧美日韩| 欧美成人官网二区| 欧美调教femdomvk| 91在线观看一区二区| 美女视频黄久久| 一区二区三区.www| 国产欧美日韩不卡| 精品久久国产字幕高潮| 日本精品一区二区三区高清 | 国产视频亚洲色图| 欧美另类高清zo欧美| 91小视频免费看| 成人av在线资源网站| 亚洲一区中文在线| 亚洲天堂免费看| 国产精品色婷婷| 精品国产乱码久久久久久浪潮| 欧美在线视频不卡| 91麻豆123| 成人h动漫精品一区二区| 国产综合久久久久影院| 免费成人av资源网| 污片在线观看一区二区| 亚洲不卡av一区二区三区| 亚洲女子a中天字幕| 中文字幕 久热精品 视频在线| 久久久亚洲精品一区二区三区 | 欧美日韩视频在线第一区| eeuss鲁一区二区三区| 国产精品原创巨作av| 麻豆成人久久精品二区三区小说| 亚洲电影在线免费观看| 亚洲在线成人精品| 一区二区免费看| 亚洲精品欧美专区| 亚洲影院在线观看| 亚洲午夜在线观看视频在线| 亚洲亚洲精品在线观看| 亚洲成人免费视| 日韩av电影免费观看高清完整版 | 一区二区三区在线视频免费观看| 亚洲欧美日韩国产综合| 亚洲免费观看高清完整版在线观看 | 777亚洲妇女| 欧美一区二区三区视频| 欧美成人激情免费网| 精品日韩在线观看| 国产精品日韩成人| 一区二区视频在线| 日韩不卡一区二区| 久久国产精品露脸对白| 国产精品99久久久久久久vr| 波多野结衣中文字幕一区二区三区| 国产成人aaa| 一本大道久久a久久精二百| 91成人国产精品| 欧美大片顶级少妇| 中文字幕综合网| 三级在线观看一区二区| 韩国精品一区二区| 91蝌蚪porny九色| 欧美一区二区在线播放| 久久亚洲春色中文字幕久久久| 国产精品三级av在线播放| 亚洲一卡二卡三卡四卡无卡久久 | 一本一本久久a久久精品综合麻豆| 欧美亚洲国产一区二区三区va| 777xxx欧美| 中文字幕不卡三区| 人禽交欧美网站| 99久久久精品免费观看国产蜜| 欧美片在线播放| 欧美极品少妇xxxxⅹ高跟鞋 | 麻豆久久一区二区| 韩日av一区二区| 91麻豆高清视频| 日韩精品一区二区三区四区 | 久久精品一级爱片| 一区二区三区在线免费| 九九国产精品视频| 欧美少妇bbb| 中文字幕第一页久久| 天堂久久久久va久久久久| 国产99久久久精品| 日韩精品一区二区三区视频在线观看 | 欧美调教femdomvk| 日本一区二区视频在线观看| 日韩激情一区二区| 99re亚洲国产精品| www国产精品av| 调教+趴+乳夹+国产+精品| 成人午夜视频福利| 久久综合色综合88| 免费xxxx性欧美18vr| 在线观看日韩高清av| 中文字幕在线一区| 黑人巨大精品欧美黑白配亚洲 | 99久久国产综合色|国产精品| 日韩视频一区二区在线观看| 亚洲精品中文在线| 成人久久18免费网站麻豆| 精品国产伦一区二区三区观看体验| 亚洲福利视频三区| 色综合一个色综合亚洲| 亚洲国产精品精华液2区45| 男男视频亚洲欧美| 欧美日韩免费视频| 亚洲激情图片一区| 91成人免费网站| 亚洲精品菠萝久久久久久久| 成人av资源站| 亚洲品质自拍视频| 日本精品裸体写真集在线观看| 国产精品理伦片| 成人动漫精品一区二区| 国产午夜精品久久久久久久| 狠狠色2019综合网| 久久欧美一区二区| 粉嫩av一区二区三区在线播放 | 久久看人人爽人人|