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

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

?? portdrv_core.c

?? h內核
?? C
字號:
/* * File:	portdrv_core.c * Purpose:	PCI Express Port Bus Driver's Core Functions * * Copyright (C) 2004 Intel * Copyright (C) Tom Long Nguyen (tom.l.nguyen@intel.com) */#include <linux/module.h>#include <linux/pci.h>#include <linux/kernel.h>#include <linux/errno.h>#include <linux/pm.h>#include <linux/pcieport_if.h>#include "portdrv.h"extern int pcie_mch_quirk;	/* MSI-quirk Indicator */static int pcie_port_probe_service(struct device *dev){	struct pcie_device *pciedev;	struct pcie_port_service_driver *driver;	int status = -ENODEV;	if (!dev || !dev->driver)		return status; 	driver = to_service_driver(dev->driver);	if (!driver || !driver->probe)		return status;	pciedev = to_pcie_device(dev);	status = driver->probe(pciedev, driver->id_table);	if (!status) {		printk(KERN_DEBUG "Load service driver %s on pcie device %s\n",			driver->name, dev->bus_id);		get_device(dev);	}	return status;}static int pcie_port_remove_service(struct device *dev){	struct pcie_device *pciedev;	struct pcie_port_service_driver *driver;	if (!dev || !dev->driver)		return 0;	pciedev = to_pcie_device(dev); 	driver = to_service_driver(dev->driver);	if (driver && driver->remove) { 		printk(KERN_DEBUG "Unload service driver %s on pcie device %s\n",			driver->name, dev->bus_id);		driver->remove(pciedev);		put_device(dev);	}	return 0;}static void pcie_port_shutdown_service(struct device *dev) {}static int pcie_port_suspend_service(struct device *dev, u32 state, u32 level){	struct pcie_device *pciedev;	struct pcie_port_service_driver *driver;	if (!dev || !dev->driver)		return 0;	pciedev = to_pcie_device(dev); 	driver = to_service_driver(dev->driver);	if (driver && driver->suspend)		driver->suspend(pciedev, state);	return 0;}static int pcie_port_resume_service(struct device *dev, u32 state){	struct pcie_device *pciedev;	struct pcie_port_service_driver *driver;	if (!dev || !dev->driver)		return 0;	pciedev = to_pcie_device(dev); 	driver = to_service_driver(dev->driver);	if (driver && driver->resume)		driver->resume(pciedev);	return 0;}/* * release_pcie_device *	 *	Being invoked automatically when device is being removed  *	in response to device_unregister(dev) call. *	Release all resources being claimed. */static void release_pcie_device(struct device *dev){	printk(KERN_DEBUG "Free Port Service[%s]\n", dev->bus_id);	kfree(to_pcie_device(dev));			}static int is_msi_quirked(struct pci_dev *dev){	int port_type, quirk = 0;	u16 reg16;	pci_read_config_word(dev, 		pci_find_capability(dev, PCI_CAP_ID_EXP) + 		PCIE_CAPABILITIES_REG, &reg16);	port_type = (reg16 >> 4) & PORT_TYPE_MASK;	switch(port_type) {	case PCIE_RC_PORT:		if (pcie_mch_quirk == 1)			quirk = 1;		break;	case PCIE_SW_UPSTREAM_PORT:	case PCIE_SW_DOWNSTREAM_PORT:	default:		break;		}	return quirk;}	static int assign_interrupt_mode(struct pci_dev *dev, int *vectors, int mask){	int i, pos, nvec, status = -EINVAL;	int interrupt_mode = PCIE_PORT_INTx_MODE;	/* Set INTx as default */	for (i = 0, nvec = 0; i < PCIE_PORT_DEVICE_MAXSERVICES; i++) {		if (mask & (1 << i)) 			nvec++;		vectors[i] = dev->irq;	}		/* Check MSI quirk */	if (is_msi_quirked(dev))		return interrupt_mode;	/* Select MSI-X over MSI if supported */			pos = pci_find_capability(dev, PCI_CAP_ID_MSIX);	if (pos) {		struct msix_entry msix_entries[PCIE_PORT_DEVICE_MAXSERVICES] = 			{{0, 0}, {0, 1}, {0, 2}, {0, 3}};		printk("%s Found MSIX capability\n", __FUNCTION__);		status = pci_enable_msix(dev, msix_entries, nvec);		if (!status) {			int j = 0;			interrupt_mode = PCIE_PORT_MSIX_MODE;			for (i = 0; i < PCIE_PORT_DEVICE_MAXSERVICES; i++) {				if (mask & (1 << i)) 					vectors[i] = msix_entries[j++].vector;			}		}	} 	if (status) {		pos = pci_find_capability(dev, PCI_CAP_ID_MSI);		if (pos) {			printk("%s Found MSI capability\n", __FUNCTION__);			status = pci_enable_msi(dev);			if (!status) {				interrupt_mode = PCIE_PORT_MSI_MODE;				for (i = 0;i < PCIE_PORT_DEVICE_MAXSERVICES;i++)					vectors[i] = dev->irq;			}		}	} 	return interrupt_mode;}static int get_port_device_capability(struct pci_dev *dev){	int services = 0, pos;	u16 reg16;	u32 reg32;	pos = pci_find_capability(dev, PCI_CAP_ID_EXP);	pci_read_config_word(dev, pos + PCIE_CAPABILITIES_REG, &reg16);	/* Hot-Plug Capable */	if (reg16 & PORT_TO_SLOT_MASK) {		pci_read_config_dword(dev, 			pos + PCIE_SLOT_CAPABILITIES_REG, &reg32);		if (reg32 & SLOT_HP_CAPABLE_MASK)			services |= PCIE_PORT_SERVICE_HP;	} 	/* PME Capable */	pos = pci_find_capability(dev, PCI_CAP_ID_PME);	if (pos) 		services |= PCIE_PORT_SERVICE_PME;		pos = PCI_CFG_SPACE_SIZE;	while (pos) {		pci_read_config_dword(dev, pos, &reg32);		switch (reg32 & 0xffff) {		case PCI_EXT_CAP_ID_ERR:			services |= PCIE_PORT_SERVICE_AER;			pos = reg32 >> 20;			break;		case PCI_EXT_CAP_ID_VC:			services |= PCIE_PORT_SERVICE_VC;			pos = reg32 >> 20;			break;		default:			pos = 0;			break;		}	}	return services;}static void pcie_device_init(struct pci_dev *parent, struct pcie_device *dev, 	int port_type, int service_type, int irq, int irq_mode){	struct device *device;	dev->port = parent;	dev->interrupt_mode = irq_mode;	dev->irq = irq;	dev->id.vendor = parent->vendor;	dev->id.device = parent->device;	dev->id.port_type = port_type;	dev->id.service_type = (1 << service_type);	/* Initialize generic device interface */	device = &dev->device;	memset(device, 0, sizeof(struct device));	INIT_LIST_HEAD(&device->node);	INIT_LIST_HEAD(&device->children);	INIT_LIST_HEAD(&device->bus_list);	device->bus = &pcie_port_bus_type;	device->driver = NULL;	device->driver_data = NULL; 	device->release = release_pcie_device;	/* callback to free pcie dev */	sprintf(&device->bus_id[0], "pcie%02x", 		get_descriptor_id(port_type, service_type));	device->parent = &parent->dev;}static struct pcie_device* alloc_pcie_device(struct pci_dev *parent, 	int port_type, int service_type, int irq, int irq_mode){	struct pcie_device *device;	device = kmalloc(sizeof(struct pcie_device), GFP_KERNEL);	if (!device)		return NULL;	memset(device, 0, sizeof(struct pcie_device));	pcie_device_init(parent, device, port_type, service_type, irq,irq_mode);	printk(KERN_DEBUG "Allocate Port Service[%s]\n", device->device.bus_id);	return device;}int pcie_port_device_probe(struct pci_dev *dev){	int pos, type;	u16 reg;	if (!(pos = pci_find_capability(dev, PCI_CAP_ID_EXP)))		return -ENODEV;	pci_read_config_word(dev, pos + PCIE_CAPABILITIES_REG, &reg);	type = (reg >> 4) & PORT_TYPE_MASK;	if (	type == PCIE_RC_PORT || type == PCIE_SW_UPSTREAM_PORT ||		type == PCIE_SW_DOWNSTREAM_PORT )  		return 0; 	return -ENODEV;}int pcie_port_device_register(struct pci_dev *dev){	int status, type, capabilities, irq_mode, i;	int vectors[PCIE_PORT_DEVICE_MAXSERVICES];	u16 reg16;	/* Get port type */	pci_read_config_word(dev, 		pci_find_capability(dev, PCI_CAP_ID_EXP) + 		PCIE_CAPABILITIES_REG, &reg16);	type = (reg16 >> 4) & PORT_TYPE_MASK;	/* Now get port services */	capabilities = get_port_device_capability(dev);	irq_mode = assign_interrupt_mode(dev, vectors, capabilities);	/* Allocate child services if any */	for (i = 0; i < PCIE_PORT_DEVICE_MAXSERVICES; i++) {		struct pcie_device *child;		if (capabilities & (1 << i)) {			child = alloc_pcie_device(				dev, 		/* parent */				type,		/* port type */ 				i,		/* service type */				vectors[i],	/* irq */				irq_mode	/* interrupt mode */);			if (child) { 				status = device_register(&child->device);				if (status) {					kfree(child);					continue;				}				get_device(&child->device);			}		}	}	return 0;}#ifdef CONFIG_PMint pcie_port_device_suspend(struct pci_dev *dev, u32 state){	struct list_head 		*head, *tmp;	struct device 			*parent, *child;	struct device_driver 		*driver;	struct pcie_port_service_driver *service_driver;	parent = &dev->dev;	head = &parent->children;	tmp = head->next;	while (head != tmp) {		child = container_of(tmp, struct device, node);		tmp = tmp->next;		if (child->bus != &pcie_port_bus_type)			continue;		driver = child->driver;		if (!driver)			continue;		service_driver = to_service_driver(driver);		if (service_driver->suspend)  			service_driver->suspend(to_pcie_device(child), state);	}	return 0; }int pcie_port_device_resume(struct pci_dev *dev) { 	struct list_head 		*head, *tmp;	struct device 			*parent, *child;	struct device_driver 		*driver;	struct pcie_port_service_driver *service_driver;	parent = &dev->dev;	head = &parent->children;	tmp = head->next;	while (head != tmp) {		child = container_of(tmp, struct device, node);		tmp = tmp->next;		if (child->bus != &pcie_port_bus_type)			continue;		driver = child->driver;		if (!driver)			continue;		service_driver = to_service_driver(driver);		if (service_driver->resume)  			service_driver->resume(to_pcie_device(child));	}	return 0; }#endifvoid pcie_port_device_remove(struct pci_dev *dev){	struct list_head 		*head, *tmp;	struct device 			*parent, *child;	struct device_driver 		*driver;	struct pcie_port_service_driver *service_driver;	int interrupt_mode = PCIE_PORT_INTx_MODE;	parent = &dev->dev;	head = &parent->children;	tmp = head->next;	while (head != tmp) {		child = container_of(tmp, struct device, node);		tmp = tmp->next;		if (child->bus != &pcie_port_bus_type)			continue;		driver = child->driver;		if (driver) { 			service_driver = to_service_driver(driver);			if (service_driver->remove)  				service_driver->remove(to_pcie_device(child));		}		interrupt_mode = (to_pcie_device(child))->interrupt_mode;		put_device(child);		device_unregister(child);	}	/* Switch to INTx by default if MSI enabled */	if (interrupt_mode == PCIE_PORT_MSIX_MODE)		pci_disable_msix(dev);	else if (interrupt_mode == PCIE_PORT_MSI_MODE)		pci_disable_msi(dev);}void pcie_port_bus_register(void){	bus_register(&pcie_port_bus_type);}void pcie_port_bus_unregister(void){	bus_unregister(&pcie_port_bus_type);}int pcie_port_service_register(struct pcie_port_service_driver *new){	new->driver.name = (char *)new->name;	new->driver.bus = &pcie_port_bus_type;	new->driver.probe = pcie_port_probe_service;	new->driver.remove = pcie_port_remove_service;	new->driver.shutdown = pcie_port_shutdown_service;	new->driver.suspend = pcie_port_suspend_service;	new->driver.resume = pcie_port_resume_service;	return driver_register(&new->driver);} void pcie_port_service_unregister(struct pcie_port_service_driver *new){	driver_unregister(&new->driver);}EXPORT_SYMBOL(pcie_port_service_register);EXPORT_SYMBOL(pcie_port_service_unregister);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国产免费久久| 天堂va蜜桃一区二区三区漫画版| 亚洲美女免费在线| 麻豆国产欧美一区二区三区| 99久久99久久免费精品蜜臀| 日韩免费高清视频| 亚洲r级在线视频| 不卡av在线网| 国产日韩影视精品| 国产最新精品精品你懂的| 欧美三级电影网站| 亚洲欧美韩国综合色| 成人免费视频caoporn| 精品国产一区二区国模嫣然| 午夜久久久影院| 欧美日韩中文字幕精品| 中文字幕色av一区二区三区| 国产福利一区二区| 日韩女优av电影在线观看| 视频一区二区三区入口| 欧美视频精品在线| 一区二区三区四区不卡视频| 一本色道久久综合亚洲aⅴ蜜桃 | 欧美成人video| 亚洲h精品动漫在线观看| 欧美伊人精品成人久久综合97| 国产精品九色蝌蚪自拍| 从欧美一区二区三区| 中文字幕av不卡| 成人sese在线| 亚洲男人电影天堂| 91精品91久久久中77777| 亚洲免费三区一区二区| 91欧美一区二区| 亚洲一区视频在线观看视频| 欧美色爱综合网| 天堂影院一区二区| 日韩三级免费观看| 狠狠色狠狠色合久久伊人| 精品sm捆绑视频| 国产成人在线色| 亚洲视频免费看| 欧美日韩视频专区在线播放| 日本中文字幕一区二区视频| 精品日韩99亚洲| 国产精品小仙女| 亚洲欧美aⅴ...| 91精品婷婷国产综合久久性色| 蜜臂av日日欢夜夜爽一区| 欧美成人精品高清在线播放| 国产成人精品免费网站| 亚洲欧洲99久久| 欧美日韩成人综合在线一区二区| 日韩精品成人一区二区在线| 精品剧情v国产在线观看在线| 国产精品一区2区| 亚洲欧洲综合另类| 欧美一区二区视频免费观看| 国产激情偷乱视频一区二区三区| 亚洲色图欧洲色图婷婷| 制服.丝袜.亚洲.中文.综合| 国产精品一区二区无线| 亚洲综合色区另类av| 日韩女优av电影在线观看| aa级大片欧美| 紧缚奴在线一区二区三区| 国产精品成人免费在线| 欧美精品少妇一区二区三区| 懂色中文一区二区在线播放| 亚洲电影你懂得| 国产精品无码永久免费888| 欧美性猛片aaaaaaa做受| 国产自产2019最新不卡| 亚洲高清免费观看| 国产婷婷色一区二区三区在线| 在线看一区二区| 国产麻豆精品theporn| 亚洲国产日韩在线一区模特| 久久久91精品国产一区二区精品| 欧美日韩一区二区不卡| 国产suv精品一区二区6| 亚洲第一福利一区| 亚洲天堂2014| 国产亚洲精品超碰| 91精品国产一区二区三区蜜臀| 丁香啪啪综合成人亚洲小说 | 国产精品一线二线三线| 无码av免费一区二区三区试看| 欧美国产成人精品| 欧美大胆一级视频| 欧美色网站导航| 99在线精品观看| 国产不卡在线播放| 免费在线观看日韩欧美| 无码av中文一区二区三区桃花岛| 日韩伦理电影网| 欧美高清在线一区| 精品国产亚洲一区二区三区在线观看| 在线免费观看一区| 色婷婷综合久久| va亚洲va日韩不卡在线观看| 国产一区二区视频在线播放| 精一区二区三区| 久久se这里有精品| 久久超碰97中文字幕| 免费成人在线视频观看| 日韩二区三区四区| 亚洲成a人v欧美综合天堂| 亚洲精品中文字幕乱码三区| 亚洲女与黑人做爰| 亚洲精品国产a| 一区二区三区日本| 亚洲一区二区三区视频在线播放 | 在线一区二区三区| 91一区二区在线| 色妞www精品视频| 色婷婷狠狠综合| 欧美亚洲综合色| 欧美高清视频在线高清观看mv色露露十八 | 91视频www| 色婷婷综合激情| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 99麻豆久久久国产精品免费 | 欧美精品一区二| 久久免费视频色| 国产精品天天摸av网| 亚洲三级理论片| 天天影视涩香欲综合网| 蜜桃视频免费观看一区| 国产一区福利在线| 99精品欧美一区二区三区小说| 99精品视频中文字幕| 欧美日韩国产首页| 精品国产乱码久久久久久久久 | 亚洲精品久久久久久国产精华液| 亚洲欧美另类综合偷拍| 五月激情六月综合| 国产福利电影一区二区三区| 91在线无精精品入口| 欧美乱妇23p| 精品99一区二区三区| 国产精品嫩草99a| 亚洲精品一二三四区| 蜜臀久久99精品久久久久宅男| 久久成人免费网站| 99国内精品久久| 日韩亚洲欧美一区二区三区| 日本一区二区在线不卡| 亚洲第一福利视频在线| 国产二区国产一区在线观看| 91蜜桃免费观看视频| 日韩视频一区在线观看| 国产精品久久久久毛片软件| 亚洲午夜电影在线观看| 粉嫩在线一区二区三区视频| 欧美日韩国产综合视频在线观看| 久久久一区二区| 视频一区视频二区在线观看| 成人精品国产一区二区4080| 91麻豆精品国产91久久久使用方法| 国产精品青草久久| 美女视频黄频大全不卡视频在线播放| av电影在线观看一区| 精品人伦一区二区色婷婷| 亚洲一区二区五区| 国产99久久精品| 日韩欧美成人午夜| 亚洲成人黄色影院| 成人精品国产福利| 久久久久久久网| 老司机免费视频一区二区三区| 91精品办公室少妇高潮对白| 日本一区二区免费在线| 久草精品在线观看| 欧美美女喷水视频| 亚洲国产日韩一级| 色呦呦日韩精品| 亚洲欧美日韩国产中文在线| 国产999精品久久久久久绿帽| 欧美一区二区免费视频| 亚洲一级二级在线| 色婷婷久久久久swag精品| 中文一区一区三区高中清不卡| 精品一区二区三区视频在线观看| 在线欧美日韩国产| 亚洲色图清纯唯美| 色综合天天性综合| 中文字幕视频一区二区三区久| 国产成人精品综合在线观看 | 精品久久一区二区| 热久久久久久久| 欧美一级一级性生活免费录像| 午夜精品久久久久久久久| 欧美三级在线看| 午夜亚洲福利老司机| 欧美日韩国产首页| 香蕉成人伊视频在线观看| 欧美剧情片在线观看| 天天色天天操综合| 欧美一区二区三区免费观看视频|