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

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

?? aerdrv_core.c

?? linux內核源碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
	pci_ers_result_t status;	struct find_aer_service_data data;	if (dev->hdr_type & PCI_HEADER_TYPE_BRIDGE)		udev = dev;	else		udev= dev->bus->self;	data.is_downstream = 0;	data.aer_driver = NULL;	find_aer_service(udev, &data);	/*	 * Use the aer driver of the error agent firstly.	 * If it hasn't the aer driver, use the root port's	 */	if (!data.aer_driver || !data.aer_driver->reset_link) {		if (data.is_downstream &&			aerdev->device.driver &&			to_service_driver(aerdev->device.driver)->reset_link) {			data.aer_driver =				to_service_driver(aerdev->device.driver);		} else {			printk(KERN_DEBUG "No link-reset support to Device ID"				"[%s]\n",				dev->dev.bus_id);			return PCI_ERS_RESULT_DISCONNECT;		}	}	status = data.aer_driver->reset_link(udev);	if (status != PCI_ERS_RESULT_RECOVERED) {		printk(KERN_DEBUG "Link reset at upstream Device ID"			"[%s] failed\n",			udev->dev.bus_id);		return PCI_ERS_RESULT_DISCONNECT;	}	return status;}/** * do_recovery - handle nonfatal/fatal error recovery process * @aerdev: pointer to a pcie_device data structure of root port * @dev: pointer to a pci_dev data structure of agent detecting an error * @severity: error severity type * * Invoked when an error is nonfatal/fatal. Once being invoked, broadcast * error detected message to all downstream drivers within a hierarchy in * question and return the returned code. */static pci_ers_result_t do_recovery(struct pcie_device *aerdev,		struct pci_dev *dev,		int severity){	pci_ers_result_t status, result = PCI_ERS_RESULT_RECOVERED;	enum pci_channel_state state;	if (severity == AER_FATAL)		state = pci_channel_io_frozen;	else		state = pci_channel_io_normal;	status = broadcast_error_message(dev,			state,			"error_detected",			report_error_detected);	if (severity == AER_FATAL) {		result = reset_link(aerdev, dev);		if (result != PCI_ERS_RESULT_RECOVERED) {			/* TODO: Should panic here? */			return result;		}	}	if (status == PCI_ERS_RESULT_CAN_RECOVER)		status = broadcast_error_message(dev,				state,				"mmio_enabled",				report_mmio_enabled);	if (status == PCI_ERS_RESULT_NEED_RESET) {		/*		 * TODO: Should call platform-specific		 * functions to reset slot before calling		 * drivers' slot_reset callbacks?		 */		status = broadcast_error_message(dev,				state,				"slot_reset",				report_slot_reset);	}	if (status == PCI_ERS_RESULT_RECOVERED)		broadcast_error_message(dev,				state,				"resume",				report_resume);	return status;}/** * handle_error_source - handle logging error into an event log * @aerdev: pointer to pcie_device data structure of the root port * @dev: pointer to pci_dev data structure of error source device * @info: comprehensive error information * * Invoked when an error being detected by Root Port. */static void handle_error_source(struct pcie_device * aerdev,	struct pci_dev *dev,	struct aer_err_info info){	pci_ers_result_t status = 0;	int pos;	if (info.severity == AER_CORRECTABLE) {		/*		 * Correctable error does not need software intevention.		 * No need to go through error recovery process.		 */		pos = pci_find_aer_capability(dev);		if (pos)			pci_write_config_dword(dev, pos + PCI_ERR_COR_STATUS,					info.status);	} else {		status = do_recovery(aerdev, dev, info.severity);		if (status == PCI_ERS_RESULT_RECOVERED) {			printk(KERN_DEBUG "AER driver successfully recovered\n");		} else {			/* TODO: Should kernel panic here? */			printk(KERN_DEBUG "AER driver didn't recover\n");		}	}}/** * aer_enable_rootport - enable Root Port's interrupts when receiving messages * @rpc: pointer to a Root Port data structure * * Invoked when PCIE bus loads AER service driver. */void aer_enable_rootport(struct aer_rpc *rpc){	struct pci_dev *pdev = rpc->rpd->port;	int pos, aer_pos;	u16 reg16;	u32 reg32;	pos = pci_find_capability(pdev, PCI_CAP_ID_EXP);	/* Clear PCIE Capability's Device Status */	pci_read_config_word(pdev, pos+PCI_EXP_DEVSTA, &reg16);	pci_write_config_word(pdev, pos+PCI_EXP_DEVSTA, reg16);	/* Disable system error generation in response to error messages */	pci_read_config_word(pdev, pos + PCI_EXP_RTCTL, &reg16);	reg16 &= ~(SYSTEM_ERROR_INTR_ON_MESG_MASK);	pci_write_config_word(pdev, pos + PCI_EXP_RTCTL, reg16);	aer_pos = pci_find_aer_capability(pdev);	/* Clear error status */	pci_read_config_dword(pdev, aer_pos + PCI_ERR_ROOT_STATUS, &reg32);	pci_write_config_dword(pdev, aer_pos + PCI_ERR_ROOT_STATUS, reg32);	pci_read_config_dword(pdev, aer_pos + PCI_ERR_COR_STATUS, &reg32);	pci_write_config_dword(pdev, aer_pos + PCI_ERR_COR_STATUS, reg32);	pci_read_config_dword(pdev, aer_pos + PCI_ERR_UNCOR_STATUS, &reg32);	pci_write_config_dword(pdev, aer_pos + PCI_ERR_UNCOR_STATUS, reg32);	/* Enable Root Port device reporting error itself */	pci_read_config_word(pdev, pos+PCI_EXP_DEVCTL, &reg16);	reg16 = reg16 |		PCI_EXP_DEVCTL_CERE |		PCI_EXP_DEVCTL_NFERE |		PCI_EXP_DEVCTL_FERE |		PCI_EXP_DEVCTL_URRE;	pci_write_config_word(pdev, pos+PCI_EXP_DEVCTL,		reg16);	/* Enable Root Port's interrupt in response to error messages */	pci_write_config_dword(pdev,		aer_pos + PCI_ERR_ROOT_COMMAND,		ROOT_PORT_INTR_ON_MESG_MASK);}/** * disable_root_aer - disable Root Port's interrupts when receiving messages * @rpc: pointer to a Root Port data structure * * Invoked when PCIE bus unloads AER service driver. */static void disable_root_aer(struct aer_rpc *rpc){	struct pci_dev *pdev = rpc->rpd->port;	u32 reg32;	int pos;	pos = pci_find_aer_capability(pdev);	/* Disable Root's interrupt in response to error messages */	pci_write_config_dword(pdev, pos + PCI_ERR_ROOT_COMMAND, 0);	/* Clear Root's error status reg */	pci_read_config_dword(pdev, pos + PCI_ERR_ROOT_STATUS, &reg32);	pci_write_config_dword(pdev, pos + PCI_ERR_ROOT_STATUS, reg32);}/** * get_e_source - retrieve an error source * @rpc: pointer to the root port which holds an error * * Invoked by DPC handler to consume an error. */static struct aer_err_source* get_e_source(struct aer_rpc *rpc){	struct aer_err_source *e_source;	unsigned long flags;	/* Lock access to Root error producer/consumer index */	spin_lock_irqsave(&rpc->e_lock, flags);	if (rpc->prod_idx == rpc->cons_idx) {		spin_unlock_irqrestore(&rpc->e_lock, flags);		return NULL;	}	e_source = &rpc->e_sources[rpc->cons_idx];	rpc->cons_idx++;	if (rpc->cons_idx == AER_ERROR_SOURCES_MAX)		rpc->cons_idx = 0;	spin_unlock_irqrestore(&rpc->e_lock, flags);	return e_source;}static int get_device_error_info(struct pci_dev *dev, struct aer_err_info *info){	int pos;	pos = pci_find_aer_capability(dev);	/* The device might not support AER */	if (!pos)		return AER_SUCCESS;	if (info->severity == AER_CORRECTABLE) {		pci_read_config_dword(dev, pos + PCI_ERR_COR_STATUS,			&info->status);		if (!(info->status & ERR_CORRECTABLE_ERROR_MASK))			return AER_UNSUCCESS;	} else if (dev->hdr_type & PCI_HEADER_TYPE_BRIDGE ||		info->severity == AER_NONFATAL) {		/* Link is still healthy for IO reads */		pci_read_config_dword(dev, pos + PCI_ERR_UNCOR_STATUS,			&info->status);		if (!(info->status & ERR_UNCORRECTABLE_ERROR_MASK))			return AER_UNSUCCESS;		if (info->status & AER_LOG_TLP_MASKS) {			info->flags |= AER_TLP_HEADER_VALID_FLAG;			pci_read_config_dword(dev,				pos + PCI_ERR_HEADER_LOG, &info->tlp.dw0);			pci_read_config_dword(dev,				pos + PCI_ERR_HEADER_LOG + 4, &info->tlp.dw1);			pci_read_config_dword(dev,				pos + PCI_ERR_HEADER_LOG + 8, &info->tlp.dw2);			pci_read_config_dword(dev,				pos + PCI_ERR_HEADER_LOG + 12, &info->tlp.dw3);		}	}	return AER_SUCCESS;}/** * aer_isr_one_error - consume an error detected by root port * @p_device: pointer to error root port service device * @e_src: pointer to an error source */static void aer_isr_one_error(struct pcie_device *p_device,		struct aer_err_source *e_src){	struct device *s_device;	struct aer_err_info e_info = {0, 0, 0,};	int i;	u16 id;	/*	 * There is a possibility that both correctable error and	 * uncorrectable error being logged. Report correctable error first.	 */	for (i = 1; i & ROOT_ERR_STATUS_MASKS ; i <<= 2) {		if (i > 4)			break;		if (!(e_src->status & i))			continue;		/* Init comprehensive error information */		if (i & PCI_ERR_ROOT_COR_RCV) {			id = ERR_COR_ID(e_src->id);			e_info.severity = AER_CORRECTABLE;		} else {			id = ERR_UNCOR_ID(e_src->id);			e_info.severity = ((e_src->status >> 6) & 1);		}		if (e_src->status &			(PCI_ERR_ROOT_MULTI_COR_RCV |			 PCI_ERR_ROOT_MULTI_UNCOR_RCV))			e_info.flags |= AER_MULTI_ERROR_VALID_FLAG;		if (!(s_device = find_source_device(p_device->port, id))) {			printk(KERN_DEBUG "%s->can't find device of ID%04x\n",				__FUNCTION__, id);			continue;		}		if (get_device_error_info(to_pci_dev(s_device), &e_info) ==				AER_SUCCESS) {			aer_print_error(to_pci_dev(s_device), &e_info);			handle_error_source(p_device,				to_pci_dev(s_device),				e_info);		}	}}/** * aer_isr - consume errors detected by root port * @work: definition of this work item * * Invoked, as DPC, when root port records new detected error */void aer_isr(struct work_struct *work){	struct aer_rpc *rpc = container_of(work, struct aer_rpc, dpc_handler);	struct pcie_device *p_device = rpc->rpd;	struct aer_err_source *e_src;	mutex_lock(&rpc->rpc_mutex);	e_src = get_e_source(rpc);	while (e_src) {		aer_isr_one_error(p_device, e_src);		e_src = get_e_source(rpc);	}	mutex_unlock(&rpc->rpc_mutex);	wake_up(&rpc->wait_release);}/** * aer_delete_rootport - disable root port aer and delete service data * @rpc: pointer to a root port device being deleted * * Invoked when AER service unloaded on a specific Root Port */void aer_delete_rootport(struct aer_rpc *rpc){	/* Disable root port AER itself */	disable_root_aer(rpc);	kfree(rpc);}/** * aer_init - provide AER initialization * @dev: pointer to AER pcie device * * Invoked when AER service driver is loaded. */int aer_init(struct pcie_device *dev){	if (aer_osc_setup(dev) && !forceload)		return -ENXIO;	return AER_SUCCESS;}EXPORT_SYMBOL_GPL(pci_find_aer_capability);EXPORT_SYMBOL_GPL(pci_enable_pcie_error_reporting);EXPORT_SYMBOL_GPL(pci_disable_pcie_error_reporting);EXPORT_SYMBOL_GPL(pci_cleanup_aer_uncorrect_error_status);EXPORT_SYMBOL_GPL(pci_cleanup_aer_correct_error_status);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品福利av | 国模冰冰炮一区二区| 激情综合色丁香一区二区| 99re成人精品视频| 337p日本欧洲亚洲大胆精品| 最新国产精品久久精品| 久久国产免费看| 欧美日韩精品免费| 日韩一区有码在线| 国产成人免费视频网站高清观看视频 | 久久久不卡网国产精品二区| 亚洲精品五月天| 国产成人精品影院| 欧美v亚洲v综合ⅴ国产v| 亚洲国产色一区| 99国产精品视频免费观看| 久久久精品国产免大香伊| 日韩不卡免费视频| 在线不卡一区二区| 亚洲成人午夜影院| 色偷偷久久一区二区三区| 国产精品―色哟哟| 成人av免费观看| 中文字幕欧美区| 丁香啪啪综合成人亚洲小说| 久久综合久久综合九色| 久久国产麻豆精品| 精品国产伦一区二区三区观看体验 | 亚洲欧美一区二区三区久本道91| 国产精品自拍三区| 欧美精品一区二区三区四区 | 亚洲国产精品精华液ab| 国产河南妇女毛片精品久久久| 欧美一区二区视频在线观看2022 | 丰满白嫩尤物一区二区| www国产成人| 国产黄色精品网站| 中文字幕一区二区在线观看| 成人精品国产福利| 一区二区不卡在线视频 午夜欧美不卡在| 91在线免费播放| 亚洲美女免费在线| 欧美片网站yy| 精品一区二区在线免费观看| 久久久久国产免费免费| 粉嫩av一区二区三区| 成人欧美一区二区三区黑人麻豆| 91欧美一区二区| 亚洲国产婷婷综合在线精品| 91精品欧美福利在线观看| 日本中文字幕一区| 国产日韩欧美精品电影三级在线| jiyouzz国产精品久久| 亚洲欧美另类久久久精品| 欧美天天综合网| 美女在线观看视频一区二区| 国产欧美一区二区在线| 91麻豆产精品久久久久久 | 中文字幕一区二区三区色视频| 色综合色狠狠天天综合色| 日精品一区二区| 久久久亚洲欧洲日产国码αv| av不卡免费在线观看| 亚洲国产一区二区三区青草影视| 精品国产乱码久久久久久浪潮 | 亚洲色图清纯唯美| 欧美一区二区三区在线| 国产成人精品三级| 亚洲国产日韩a在线播放性色| 日韩欧美视频在线 | 国产制服丝袜一区| 亚洲乱码中文字幕| 日韩亚洲欧美成人一区| 成人综合在线视频| 三级在线观看一区二区| 国产精品欧美久久久久一区二区 | 久久99日本精品| 亚洲人成伊人成综合网小说| 日韩午夜三级在线| 欧美在线色视频| 国产传媒日韩欧美成人| 日本三级亚洲精品| 亚洲人成亚洲人成在线观看图片| 日韩欧美视频一区| 欧美精品在线一区二区| 波多野结衣中文一区| 久久99蜜桃精品| 亚洲第四色夜色| 亚洲人成影院在线观看| 久久久久久久久久久久电影| 91精品久久久久久久99蜜桃 | 日韩综合一区二区| 亚洲欧美日本韩国| 国产精品美女久久久久久2018| 精品久久久久久综合日本欧美 | 日韩国产欧美在线播放| 一区二区三区免费看视频| 中文一区二区完整视频在线观看| 日韩女同互慰一区二区| 欧美精品九九99久久| 欧美在线免费播放| 欧美亚洲尤物久久| 日本韩国精品在线| 色偷偷成人一区二区三区91 | 国产经典欧美精品| 国产一区二区在线视频| 日本欧美一区二区| 日韩高清国产一区在线| 日本午夜一本久久久综合| 亚洲高清免费观看| 五月综合激情网| 亚洲 欧美综合在线网络| 亚洲福利一区二区三区| 亚洲国产中文字幕| 日韩在线卡一卡二| 日本麻豆一区二区三区视频| 午夜视频一区二区| 日韩电影在线免费| 久久99热这里只有精品| 亚洲激情成人在线| 亚洲第一久久影院| 青草av.久久免费一区| 韩国精品在线观看| 国产精品456| 91浏览器打开| 欧美日韩不卡一区二区| 日韩欧美你懂的| 中文字幕 久热精品 视频在线| 亚洲特黄一级片| 亚洲电影欧美电影有声小说| 日韩电影在线观看网站| 国产永久精品大片wwwapp| 成人毛片在线观看| 在线视频综合导航| 日韩一区二区三区四区| 精品电影一区二区三区| 国产精品欧美一区喷水| 亚洲图片欧美一区| 精品一区二区三区香蕉蜜桃| 成人中文字幕合集| 欧美私模裸体表演在线观看| 69堂精品视频| 日本一区二区动态图| 亚洲一区二区三区四区在线| 亚洲成a人片综合在线| 国精产品一区一区三区mba视频| 97久久精品人人澡人人爽| 欧美日韩一区二区三区高清| 久久亚洲精精品中文字幕早川悠里 | 国产三级精品在线| 亚洲第一av色| 成人免费视频国产在线观看| 欧美色精品在线视频| 久久精品视频一区二区| 亚洲综合av网| 国产精品亚洲午夜一区二区三区 | 99精品国产热久久91蜜凸| 91精品国产色综合久久不卡蜜臀 | 成人av电影在线| 91精品蜜臀在线一区尤物| 国产精品狼人久久影院观看方式| 视频在线观看一区| 色av一区二区| 欧美国产成人精品| 蜜臀av性久久久久蜜臀aⅴ| 91欧美一区二区| 国产欧美在线观看一区| 另类调教123区| 欧美午夜精品久久久| 中文字幕中文在线不卡住| 久色婷婷小香蕉久久| 色婷婷综合久色| 1区2区3区精品视频| 国产在线视频精品一区| 91精品国产综合久久精品app| 亚洲人成电影网站色mp4| 成人性色生活片免费看爆迷你毛片| 这里只有精品视频在线观看| 尤物在线观看一区| 不卡视频免费播放| 久久精品人人做人人综合| 久久99精品久久久久久久久久久久| 色综合咪咪久久| **性色生活片久久毛片| 国产精品一二三区| 久久九九影视网| 国产综合成人久久大片91| 欧美大胆一级视频| 婷婷开心激情综合| 欧美日韩精品一区视频| 夜夜揉揉日日人人青青一国产精品| av成人免费在线| 亚洲视频一区二区在线| 成人免费高清视频| 国产精品不卡在线观看| 99久久婷婷国产| 亚洲人成亚洲人成在线观看图片| 99国产欧美另类久久久精品 | 久久99精品久久久久久国产越南 | 欧美网站大全在线观看|