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

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

?? aerdrv.c

?? linux內(nèi)核源碼
?? C
字號(hào):
/* * drivers/pci/pcie/aer/aerdrv.c * * This file is subject to the terms and conditions of the GNU General Public * License.  See the file "COPYING" in the main directory of this archive * for more details. * * This file implements the AER root port service driver. The driver will * register an irq handler. When root port triggers an AER interrupt, the irq * handler will collect root port status and schedule a work. * * Copyright (C) 2006 Intel Corp. *	Tom Long Nguyen (tom.l.nguyen@intel.com) *	Zhang Yanmin (yanmin.zhang@intel.com) * */#include <linux/module.h>#include <linux/pci.h>#include <linux/kernel.h>#include <linux/errno.h>#include <linux/pm.h>#include <linux/init.h>#include <linux/interrupt.h>#include <linux/delay.h>#include <linux/pcieport_if.h>#include "aerdrv.h"/* * Version Information */#define DRIVER_VERSION "v1.0"#define DRIVER_AUTHOR "tom.l.nguyen@intel.com"#define DRIVER_DESC "Root Port Advanced Error Reporting Driver"MODULE_AUTHOR(DRIVER_AUTHOR);MODULE_DESCRIPTION(DRIVER_DESC);MODULE_LICENSE("GPL");static int __devinit aer_probe (struct pcie_device *dev,	const struct pcie_port_service_id *id );static void aer_remove(struct pcie_device *dev);static int aer_suspend(struct pcie_device *dev, pm_message_t state){return 0;}static int aer_resume(struct pcie_device *dev) {return 0;}static pci_ers_result_t aer_error_detected(struct pci_dev *dev,	enum pci_channel_state error);static void aer_error_resume(struct pci_dev *dev);static pci_ers_result_t aer_root_reset(struct pci_dev *dev);/* * PCI Express bus's AER Root service driver data structure */static struct pcie_port_service_id aer_id[] = {	{	.vendor 	= PCI_ANY_ID,	.device 	= PCI_ANY_ID,	.port_type 	= PCIE_RC_PORT,	.service_type 	= PCIE_PORT_SERVICE_AER,	},	{ /* end: all zeroes */ }};static struct pci_error_handlers aer_error_handlers = {	.error_detected = aer_error_detected,	.resume = aer_error_resume,};static struct pcie_port_service_driver aerdriver = {	.name		= "aer",	.id_table	= &aer_id[0],	.probe		= aer_probe,	.remove		= aer_remove,	.suspend	= aer_suspend,	.resume		= aer_resume,	.err_handler	= &aer_error_handlers,	.reset_link	= aer_root_reset,};static int pcie_aer_disable;void pci_no_aer(void){	pcie_aer_disable = 1;	/* has priority over 'forceload' */}/** * aer_irq - Root Port's ISR * @irq: IRQ assigned to Root Port * @context: pointer to Root Port data structure * * Invoked when Root Port detects AER messages. **/static irqreturn_t aer_irq(int irq, void *context){	unsigned int status, id;	struct pcie_device *pdev = (struct pcie_device *)context;	struct aer_rpc *rpc = get_service_data(pdev);	int next_prod_idx;	unsigned long flags;	int pos;	pos = pci_find_aer_capability(pdev->port);	/*	 * Must lock access to Root Error Status Reg, Root Error ID Reg,	 * and Root error producer/consumer index	 */	spin_lock_irqsave(&rpc->e_lock, flags);	/* Read error status */	pci_read_config_dword(pdev->port, pos + PCI_ERR_ROOT_STATUS, &status);	if (!(status & ROOT_ERR_STATUS_MASKS)) {		spin_unlock_irqrestore(&rpc->e_lock, flags);		return IRQ_NONE;	}	/* Read error source and clear error status */	pci_read_config_dword(pdev->port, pos + PCI_ERR_ROOT_COR_SRC, &id);	pci_write_config_dword(pdev->port, pos + PCI_ERR_ROOT_STATUS, status);	/* Store error source for later DPC handler */	next_prod_idx = rpc->prod_idx + 1;	if (next_prod_idx == AER_ERROR_SOURCES_MAX)		next_prod_idx = 0;	if (next_prod_idx == rpc->cons_idx) {		/*		 * Error Storm Condition - possibly the same error occurred.		 * Drop the error.		 */		spin_unlock_irqrestore(&rpc->e_lock, flags);		return IRQ_HANDLED;	}	rpc->e_sources[rpc->prod_idx].status =  status;	rpc->e_sources[rpc->prod_idx].id = id;	rpc->prod_idx = next_prod_idx;	spin_unlock_irqrestore(&rpc->e_lock, flags);	/*  Invoke DPC handler */	schedule_work(&rpc->dpc_handler);	return IRQ_HANDLED;}/** * aer_alloc_rpc - allocate Root Port data structure * @dev: pointer to the pcie_dev data structure * * Invoked when Root Port's AER service is loaded. **/static struct aer_rpc* aer_alloc_rpc(struct pcie_device *dev){	struct aer_rpc *rpc;	if (!(rpc = kzalloc(sizeof(struct aer_rpc),		GFP_KERNEL)))		return NULL;	/*	 * Initialize Root lock access, e_lock, to Root Error Status Reg,	 * Root Error ID Reg, and Root error producer/consumer index.	 */	spin_lock_init(&rpc->e_lock);	rpc->rpd = dev;	INIT_WORK(&rpc->dpc_handler, aer_isr);	rpc->prod_idx = rpc->cons_idx = 0;	mutex_init(&rpc->rpc_mutex);	init_waitqueue_head(&rpc->wait_release);	/* Use PCIE bus function to store rpc into PCIE device */	set_service_data(dev, rpc);	return rpc;}/** * aer_remove - clean up resources * @dev: pointer to the pcie_dev data structure * * Invoked when PCI Express bus unloads or AER probe fails. **/static void aer_remove(struct pcie_device *dev){	struct aer_rpc *rpc = get_service_data(dev);	if (rpc) {		/* If register interrupt service, it must be free. */		if (rpc->isr)			free_irq(dev->irq, dev);		wait_event(rpc->wait_release, rpc->prod_idx == rpc->cons_idx);		aer_delete_rootport(rpc);		set_service_data(dev, NULL);	}}/** * aer_probe - initialize resources * @dev: pointer to the pcie_dev data structure * @id: pointer to the service id data structure * * Invoked when PCI Express bus loads AER service driver. **/static int __devinit aer_probe (struct pcie_device *dev,				const struct pcie_port_service_id *id ){	int status;	struct aer_rpc *rpc;	struct device *device = &dev->device;	/* Init */	if ((status = aer_init(dev)))		return status;	/* Alloc rpc data structure */	if (!(rpc = aer_alloc_rpc(dev))) {		printk(KERN_DEBUG "%s: Alloc rpc fails on PCIE device[%s]\n",			__FUNCTION__, device->bus_id);		aer_remove(dev);		return -ENOMEM;	}	/* Request IRQ ISR */	if ((status = request_irq(dev->irq, aer_irq, IRQF_SHARED, "aerdrv",				dev))) {		printk(KERN_DEBUG "%s: Request ISR fails on PCIE device[%s]\n",			__FUNCTION__, device->bus_id);		aer_remove(dev);		return status;	}	rpc->isr = 1;	aer_enable_rootport(rpc);	return status;}/** * aer_root_reset - reset link on Root Port * @dev: pointer to Root Port's pci_dev data structure * * Invoked by Port Bus driver when performing link reset at Root Port. **/static pci_ers_result_t aer_root_reset(struct pci_dev *dev){	u16 p2p_ctrl;	u32 status;	int pos;	pos = pci_find_aer_capability(dev);	/* Disable Root's interrupt in response to error messages */	pci_write_config_dword(dev, pos + PCI_ERR_ROOT_COMMAND, 0);	/* Assert Secondary Bus Reset */	pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &p2p_ctrl);	p2p_ctrl |= PCI_CB_BRIDGE_CTL_CB_RESET;	pci_write_config_word(dev, PCI_BRIDGE_CONTROL, p2p_ctrl);	/* De-assert Secondary Bus Reset */	p2p_ctrl &= ~PCI_CB_BRIDGE_CTL_CB_RESET;	pci_write_config_word(dev, PCI_BRIDGE_CONTROL, p2p_ctrl);	/*	 * System software must wait for at least 100ms from the end	 * of a reset of one or more device before it is permitted	 * to issue Configuration Requests to those devices.	 */	msleep(200);	printk(KERN_DEBUG "Complete link reset at Root[%s]\n", dev->dev.bus_id);	/* Enable Root Port's interrupt in response to error messages */	pci_read_config_dword(dev, pos + PCI_ERR_ROOT_STATUS, &status);	pci_write_config_dword(dev, pos + PCI_ERR_ROOT_STATUS, status);	pci_write_config_dword(dev,		pos + PCI_ERR_ROOT_COMMAND,		ROOT_PORT_INTR_ON_MESG_MASK);	return PCI_ERS_RESULT_RECOVERED;}/** * aer_error_detected - update severity status * @dev: pointer to Root Port's pci_dev data structure * @error: error severity being notified by port bus * * Invoked by Port Bus driver during error recovery. **/static pci_ers_result_t aer_error_detected(struct pci_dev *dev,			enum pci_channel_state error){	/* Root Port has no impact. Always recovers. */	return PCI_ERS_RESULT_CAN_RECOVER;}/** * aer_error_resume - clean up corresponding error status bits * @dev: pointer to Root Port's pci_dev data structure * * Invoked by Port Bus driver during nonfatal recovery. **/static void aer_error_resume(struct pci_dev *dev){	int pos;	u32 status, mask;	u16 reg16;	/* Clean up Root device status */	pos = pci_find_capability(dev, PCI_CAP_ID_EXP);	pci_read_config_word(dev, pos + PCI_EXP_DEVSTA, &reg16);	pci_write_config_word(dev, pos + PCI_EXP_DEVSTA, reg16);	/* Clean AER Root Error Status */	pos = pci_find_aer_capability(dev);	pci_read_config_dword(dev, pos + PCI_ERR_UNCOR_STATUS, &status);	pci_read_config_dword(dev, pos + PCI_ERR_UNCOR_SEVER, &mask);	if (dev->error_state == pci_channel_io_normal)		status &= ~mask; /* Clear corresponding nonfatal bits */	else		status &= mask; /* Clear corresponding fatal bits */	pci_write_config_dword(dev, pos + PCI_ERR_UNCOR_STATUS, status);}/** * aer_service_init - register AER root service driver * * Invoked when AER root service driver is loaded. **/static int __init aer_service_init(void){	if (pcie_aer_disable)		return -ENXIO;	return pcie_port_service_register(&aerdriver);}/** * aer_service_exit - unregister AER root service driver * * Invoked when AER root service driver is unloaded. **/static void __exit aer_service_exit(void){	pcie_port_service_unregister(&aerdriver);}module_init(aer_service_init);module_exit(aer_service_exit);

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
免费高清视频精品| 国产精品你懂的在线欣赏| 99综合影院在线| 久久疯狂做爰流白浆xx| 亚洲特黄一级片| 久久久久久久久岛国免费| 欧美性猛交xxxx乱大交退制版| 国产一区在线不卡| 狠狠色丁香婷婷综合| 丝袜美腿亚洲一区| 亚洲综合色婷婷| 亚洲精选视频免费看| 国产精品久久久久影院老司 | 成人午夜大片免费观看| 久久精品72免费观看| 色哦色哦哦色天天综合| 9色porny自拍视频一区二区| 99r国产精品| 在线亚洲高清视频| 欧美日韩三级视频| 欧美日韩国产首页| 欧美精品123区| 日韩视频免费观看高清完整版在线观看| 欧美性生活大片视频| 欧美va亚洲va| 国产精品日日摸夜夜摸av| 亚洲猫色日本管| 三级在线观看一区二区| 久久精品国产第一区二区三区| 天堂午夜影视日韩欧美一区二区| 水野朝阳av一区二区三区| 久久精品国产精品青草| 精品福利一区二区三区| 国产精品乱码久久久久久| 国产精品成人网| 日本亚洲欧美天堂免费| 国产精品99久| 欧美性视频一区二区三区| 国产网站一区二区| 亚洲va在线va天堂| 高清成人在线观看| 欧美日韩国产在线观看| 日本一区二区三区电影| 亚洲高清在线精品| 色综合天天综合网天天狠天天 | 久久久久国产精品麻豆| 亚洲精品欧美综合四区| 韩国一区二区视频| 欧美在线999| 国产精品白丝在线| 九九精品视频在线看| 欧美日本在线视频| 亚洲美女免费视频| 波多野结衣91| 国产欧美一区二区精品仙草咪 | 日本中文字幕一区二区视频| 91丨porny丨在线| 亚洲国产精品av| 国模一区二区三区白浆| 制服丝袜在线91| 视频一区中文字幕| 欧美综合亚洲图片综合区| 亚洲欧美日韩国产中文在线| 成人福利视频在线看| 国产亚洲综合av| 国产一区二区三区香蕉| 精品日韩一区二区三区免费视频| 免费日韩伦理电影| 精品成人a区在线观看| 国产乱淫av一区二区三区| 精品久久人人做人人爰| 国产一区二区不卡老阿姨| 26uuu色噜噜精品一区| 国产成人免费网站| 亚洲欧美怡红院| 日本乱码高清不卡字幕| 日本一道高清亚洲日美韩| 欧美不卡一区二区| 成人爽a毛片一区二区免费| 中文字幕制服丝袜成人av| 日本电影亚洲天堂一区| 亚洲国产一区二区三区青草影视| 欧美一区二区三区在线观看视频| 免费在线成人网| 亚洲男同性视频| 日韩欧美在线1卡| 97精品国产露脸对白| 日韩精品五月天| 亚洲婷婷综合久久一本伊一区| 欧美高清性hdvideosex| 成人国产精品免费观看动漫| 日本午夜精品一区二区三区电影| 国产精品久久久久久妇女6080| 欧美久久久久久久久中文字幕| 精品无人区卡一卡二卡三乱码免费卡| 国产精品美女久久久久久久久| 欧美三级电影一区| 国产1区2区3区精品美女| 日本视频一区二区| 亚洲国产精品久久久久婷婷884| 国产片一区二区| 26uuu欧美日本| 日韩一区二区精品葵司在线| 欧美性猛片aaaaaaa做受| 99精品久久久久久| 豆国产96在线|亚洲| 国内精品国产三级国产a久久| 日韩va亚洲va欧美va久久| 一区二区三区在线观看动漫| 国产精品短视频| 国产精品卡一卡二卡三| 国产欧美一区二区三区鸳鸯浴| 日韩美女一区二区三区| 欧美疯狂性受xxxxx喷水图片| 91福利国产成人精品照片| 色老汉一区二区三区| 色菇凉天天综合网| 欧美主播一区二区三区| 在线观看日韩精品| 7777精品伊人久久久大香线蕉完整版| 欧美三级中文字幕| 制服视频三区第一页精品| 欧美日韩不卡一区| 精品欧美一区二区三区精品久久| 欧美一区二区三区四区高清| 亚洲精品一区二区三区四区高清| wwwwww.欧美系列| 欧美国产禁国产网站cc| 久久se这里有精品| www.综合网.com| 精品视频在线视频| 精品国产成人系列| 亚洲精品一二三| 蜜桃av噜噜一区| 成人黄色大片在线观看| 91官网在线免费观看| 精品国产不卡一区二区三区| 中文字幕一区在线观看视频| 亚洲h动漫在线| 懂色av一区二区三区蜜臀| 欧美精品色综合| 国产精品美女久久久久高潮| 偷拍与自拍一区| 99精品视频在线播放观看| 亚洲狠狠爱一区二区三区| 国产激情视频一区二区在线观看 | 国产午夜精品一区二区三区视频| 亚洲精品久久久久久国产精华液 | 另类专区欧美蜜桃臀第一页| 不卡高清视频专区| 亚洲精品一区二区三区蜜桃下载| 一区二区三区欧美日韩| 欧美另类变人与禽xxxxx| 国产精品久久久久久久第一福利| 日韩1区2区日韩1区2区| 欧美亚一区二区| 亚洲精品一二三| 成人综合婷婷国产精品久久蜜臀| 欧美日韩电影一区| 亚洲一区在线电影| 97精品久久久午夜一区二区三区| 久久综合国产精品| 另类调教123区| 7777精品伊人久久久大香线蕉的| 一区二区高清在线| 91精彩视频在线观看| 亚洲精品videosex极品| 色综合久久综合中文综合网| 国产精品国产三级国产aⅴ无密码| 国产精品88888| 欧美国产国产综合| 欧美日韩一区二区在线视频| 一区二区三区高清不卡| 欧美亚洲动漫另类| 视频一区视频二区中文| 4438x成人网最大色成网站| 久久99精品久久久久久国产越南 | 久久精品99久久久| 久久精品在线观看| 成人激情文学综合网| 亚洲狼人国产精品| 欧美另类z0zxhd电影| 国产乱码精品一区二区三| 国产精品久久久爽爽爽麻豆色哟哟| 在线视频国内自拍亚洲视频| 日本不卡一区二区三区| 国产日韩欧美高清| 色丁香久综合在线久综合在线观看 | 精品处破学生在线二十三| av一区二区三区黑人| 无码av免费一区二区三区试看| 欧美巨大另类极品videosbest | 91国偷自产一区二区三区成为亚洲经典| 亚洲高清在线视频| 久久亚洲精精品中文字幕早川悠里| www.日韩av| 精品一区二区三区免费视频| 日本少妇一区二区| 亚洲欧美视频一区| 国产欧美精品一区aⅴ影院|