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

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

?? pciehp_pci.c

?? 底層驅動開發
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * PCI Express Hot Plug Controller Driver * * Copyright (C) 1995,2001 Compaq Computer Corporation * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com) * Copyright (C) 2001 IBM Corp. * Copyright (C) 2003-2004 Intel Corporation * * All rights reserved. * * 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, GOOD TITLE or * NON INFRINGEMENT.  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. * * Send feedback to <greg@kroah.com>, <kristen.c.accardi@intel.com> * */#include <linux/config.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/types.h>#include <linux/slab.h>#include <linux/workqueue.h>#include <linux/proc_fs.h>#include <linux/pci.h>#include "../pci.h"#include "pciehp.h"#ifndef CONFIG_IA64#include "../../../arch/i386/pci/pci.h"    /* horrible hack showing how processor dependant we are... */#endifint pciehp_configure_device (struct controller* ctrl, struct pci_func* func)  {	unsigned char bus;	struct pci_bus *child;	int num;	if (func->pci_dev == NULL)		func->pci_dev = pci_find_slot(func->bus, PCI_DEVFN(func->device, func->function));	/* Still NULL ? Well then scan for it ! */	if (func->pci_dev == NULL) {		dbg("%s: pci_dev still null. do pci_scan_slot\n", __FUNCTION__);		num = pci_scan_slot(ctrl->pci_dev->subordinate, PCI_DEVFN(func->device, func->function));		if (num)			pci_bus_add_devices(ctrl->pci_dev->subordinate);				func->pci_dev = pci_find_slot(func->bus, PCI_DEVFN(func->device, func->function));		if (func->pci_dev == NULL) {			dbg("ERROR: pci_dev still null\n");			return 0;		}	}	if (func->pci_dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) {		pci_read_config_byte(func->pci_dev, PCI_SECONDARY_BUS, &bus);		child = pci_add_new_bus(func->pci_dev->bus, (func->pci_dev), bus);		pci_do_scan_bus(child);	}	return 0;}int pciehp_unconfigure_device(struct pci_func* func) {	int rc = 0;	int j;	struct pci_bus *pbus;	dbg("%s: bus/dev/func = %x/%x/%x\n", __FUNCTION__, func->bus,				func->device, func->function);	pbus = func->pci_dev->bus;	for (j=0; j<8 ; j++) {		struct pci_dev* temp = pci_find_slot(func->bus,				(func->device << 3) | j);		if (temp) {			pci_remove_bus_device(temp);		}	}	/* 	 * Some PCI Express root ports require fixup after hot-plug operation.	 */	if (pcie_mch_quirk) 		pci_fixup_device(pci_fixup_final, pbus->self);		return rc;}/* * pciehp_set_irq * * @bus_num: bus number of PCI device * @dev_num: device number of PCI device * @slot: pointer to u8 where slot number will be returned */int pciehp_set_irq (u8 bus_num, u8 dev_num, u8 int_pin, u8 irq_num){#if defined(CONFIG_X86) && !defined(CONFIG_X86_IO_APIC) && !defined(CONFIG_X86_64)	int rc;	u16 temp_word;	struct pci_dev fakedev;	struct pci_bus fakebus;	fakedev.devfn = dev_num << 3;	fakedev.bus = &fakebus;	fakebus.number = bus_num;	dbg("%s: dev %d, bus %d, pin %d, num %d\n",	    __FUNCTION__, dev_num, bus_num, int_pin, irq_num);	rc = pcibios_set_irq_routing(&fakedev, int_pin - 0x0a, irq_num);	dbg("%s: rc %d\n", __FUNCTION__, rc);	if (!rc)		return !rc;	/* set the Edge Level Control Register (ELCR) */	temp_word = inb(0x4d0);	temp_word |= inb(0x4d1) << 8;	temp_word |= 0x01 << irq_num;	/* This should only be for x86 as it sets the Edge Level Control Register */	outb((u8) (temp_word & 0xFF), 0x4d0);	outb((u8) ((temp_word & 0xFF00) >> 8), 0x4d1);#endif	return 0;}/* More PCI configuration routines; this time centered around hotplug controller *//* * pciehp_save_config * * Reads configuration for all slots in a PCI bus and saves info. * * Note:  For non-hot plug busses, the slot # saved is the device # * * returns 0 if success */int pciehp_save_config(struct controller *ctrl, int busnumber, int num_ctlr_slots, int first_device_num){	int rc;	u8 class_code;	u8 header_type;	u32 ID;	u8 secondary_bus;	struct pci_func *new_slot;	int sub_bus;	int max_functions;	int function;	u8 DevError;	int device = 0;	int cloop = 0;	int stop_it;	int index;	int is_hot_plug = num_ctlr_slots || first_device_num;	struct pci_bus lpci_bus, *pci_bus;	int FirstSupported, LastSupported;	dbg("%s: Enter\n", __FUNCTION__);	memcpy(&lpci_bus, ctrl->pci_dev->subordinate, sizeof(lpci_bus));	pci_bus = &lpci_bus;	dbg("%s: num_ctlr_slots = %d, first_device_num = %d\n", __FUNCTION__,				num_ctlr_slots, first_device_num);	/*   Decide which slots are supported */	if (is_hot_plug) {		/*********************************		 *  is_hot_plug is the slot mask		 *********************************/		FirstSupported = first_device_num;		LastSupported = FirstSupported + num_ctlr_slots - 1;	} else {		FirstSupported = 0;		LastSupported = 0x1F;	}	dbg("FirstSupported = %d, LastSupported = %d\n", FirstSupported,					LastSupported);	/*   Save PCI configuration space for all devices in supported slots */	dbg("%s: pci_bus->number = %x\n", __FUNCTION__, pci_bus->number);	pci_bus->number = busnumber;	dbg("%s: bus = %x, dev = %x\n", __FUNCTION__, busnumber, device);	for (device = FirstSupported; device <= LastSupported; device++) {		ID = 0xFFFFFFFF;		rc = pci_bus_read_config_dword(pci_bus, PCI_DEVFN(device, 0),					PCI_VENDOR_ID, &ID);		if (ID != 0xFFFFFFFF) {	  /*  device in slot */			dbg("%s: ID = %x\n", __FUNCTION__, ID);			rc = pci_bus_read_config_byte(pci_bus, PCI_DEVFN(device, 0),					0x0B, &class_code);			if (rc)				return rc;			rc = pci_bus_read_config_byte(pci_bus, PCI_DEVFN(device, 0),					PCI_HEADER_TYPE, &header_type);			if (rc)				return rc;			dbg("class_code = %x, header_type = %x\n", class_code, header_type);			/* If multi-function device, set max_functions to 8 */			if (header_type & 0x80)				max_functions = 8;			else				max_functions = 1;			function = 0;			do {				DevError = 0;				dbg("%s: In do loop\n", __FUNCTION__);				if ((header_type & 0x7F) == PCI_HEADER_TYPE_BRIDGE) {   /* P-P Bridge */					/* Recurse the subordinate bus					 * get the subordinate bus number					 */					rc = pci_bus_read_config_byte(pci_bus,						PCI_DEVFN(device, function), 						PCI_SECONDARY_BUS, &secondary_bus);					if (rc) {						return rc;					} else {						sub_bus = (int) secondary_bus;						/* Save secondary bus cfg spc with this recursive call. */						rc = pciehp_save_config(ctrl, sub_bus, 0, 0);						if (rc)							return rc;					}				}				index = 0;				new_slot = pciehp_slot_find(busnumber, device, index++);				dbg("%s: new_slot = %p bus %x dev %x fun %x\n",				__FUNCTION__, new_slot, busnumber, device, index-1);				while (new_slot && (new_slot->function != (u8) function)) {					new_slot = pciehp_slot_find(busnumber, device, index++);					dbg("%s: while loop, new_slot = %p bus %x dev %x fun %x\n",					__FUNCTION__, new_slot, busnumber, device, index-1);				}				if (!new_slot) {					/* Setup slot structure. */					new_slot = pciehp_slot_create(busnumber);					dbg("%s: if, new_slot = %p bus %x dev %x fun %x\n",					__FUNCTION__, new_slot, busnumber, device, function);					if (new_slot == NULL)						return(1);				}				new_slot->bus = (u8) busnumber;				new_slot->device = (u8) device;				new_slot->function = (u8) function;				new_slot->is_a_board = 1;				new_slot->switch_save = 0x10;				/* In case of unsupported board */				new_slot->status = DevError;				new_slot->pci_dev = pci_find_slot(new_slot->bus,					(new_slot->device << 3) | new_slot->function);				dbg("new_slot->pci_dev = %p\n", new_slot->pci_dev);				for (cloop = 0; cloop < 0x20; cloop++) {					rc = pci_bus_read_config_dword(pci_bus,						PCI_DEVFN(device, function),						cloop << 2, 						(u32 *) &(new_slot->config_space [cloop]));					/* dbg("new_slot->config_space[%x] = %x\n",						cloop, new_slot->config_space[cloop]); */					if (rc)						return rc;				}				function++;				stop_it = 0;				/*  this loop skips to the next present function				 *  reading in Class Code and Header type.				 */				while ((function < max_functions)&&(!stop_it)) {					dbg("%s: In while loop \n", __FUNCTION__);					rc = pci_bus_read_config_dword(pci_bus,							PCI_DEVFN(device, function),							PCI_VENDOR_ID, &ID);					if (ID == 0xFFFFFFFF) {  /* nothing there. */						function++;						dbg("Nothing there\n");					} else {  /* Something there */						rc = pci_bus_read_config_byte(pci_bus,							PCI_DEVFN(device, function),							0x0B, &class_code);						if (rc)							return rc;						rc = pci_bus_read_config_byte(pci_bus,							PCI_DEVFN(device, function),							PCI_HEADER_TYPE, &header_type);						if (rc)							return rc;						dbg("class_code = %x, header_type = %x\n", class_code, header_type);						stop_it++;					}				}			} while (function < max_functions);			/* End of IF (device in slot?) */		} else if (is_hot_plug) {			/* Setup slot structure with entry for empty slot */			new_slot = pciehp_slot_create(busnumber);			if (new_slot == NULL) {				return(1);			}			dbg("new_slot = %p, bus = %x, dev = %x, fun = %x\n", new_slot,				new_slot->bus, new_slot->device, new_slot->function);			new_slot->bus = (u8) busnumber;			new_slot->device = (u8) device;			new_slot->function = 0;			new_slot->is_a_board = 0;			new_slot->presence_save = 0;			new_slot->switch_save = 0;		}	} 			/* End of FOR loop */	dbg("%s: Exit\n", __FUNCTION__);	return(0);}/* * pciehp_save_slot_config * * Saves configuration info for all PCI devices in a given slot * including subordinate busses. * * returns 0 if success */int pciehp_save_slot_config(struct controller *ctrl, struct pci_func * new_slot){	int rc;	u8 class_code;	u8 header_type;	u32 ID;	u8 secondary_bus;	int sub_bus;	int max_functions;	int function;	int cloop = 0;	int stop_it;	struct pci_bus lpci_bus, *pci_bus;	memcpy(&lpci_bus, ctrl->pci_dev->subordinate, sizeof(lpci_bus));	pci_bus = &lpci_bus;	pci_bus->number = new_slot->bus;	ID = 0xFFFFFFFF;	pci_bus_read_config_dword(pci_bus, PCI_DEVFN(new_slot->device, 0),					PCI_VENDOR_ID, &ID);	if (ID != 0xFFFFFFFF) {	  /*  device in slot */		pci_bus_read_config_byte(pci_bus, PCI_DEVFN(new_slot->device, 0),					0x0B, &class_code);		pci_bus_read_config_byte(pci_bus, PCI_DEVFN(new_slot->device, 0),					PCI_HEADER_TYPE, &header_type);		if (header_type & 0x80)	/* Multi-function device */			max_functions = 8;		else			max_functions = 1;		function = 0;		do {			if ((header_type & 0x7F) == PCI_HEADER_TYPE_BRIDGE) {	  /* PCI-PCI Bridge */				/*  Recurse the subordinate bus */				pci_bus_read_config_byte(pci_bus,					PCI_DEVFN(new_slot->device, function), 					PCI_SECONDARY_BUS, &secondary_bus);				sub_bus = (int) secondary_bus;				/* Save the config headers for the secondary bus. */				rc = pciehp_save_config(ctrl, sub_bus, 0, 0);				if (rc)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲视频一区在线观看| 欧美一区二区视频在线观看| 91丨九色porny丨蝌蚪| 欧美午夜影院一区| 欧美成人bangbros| 欧美高清视频www夜色资源网| 狠狠色丁香婷婷综合| 黄色日韩网站视频| 99久久国产综合色|国产精品| 欧美精品乱码久久久久久| 国产亚洲女人久久久久毛片| 国产精品视频一区二区三区不卡| 日韩高清中文字幕一区| 夫妻av一区二区| 欧美丰满少妇xxxxx高潮对白| 久久精品欧美一区二区三区不卡| 亚洲一区二区三区四区的| 国产99久久久久久免费看农村| 欧美三级日韩在线| 欧美国产精品中文字幕| 日本中文字幕一区二区有限公司| 粉嫩aⅴ一区二区三区四区五区 | 在线精品国精品国产尤物884a| 欧美不卡在线视频| 一区二区三区精品视频在线| 国产一区二区成人久久免费影院| 色综合欧美在线视频区| 久久久美女艺术照精彩视频福利播放| 午夜视频久久久久久| 91在线码无精品| 日韩欧美一区二区在线视频| 亚洲一区精品在线| 99久精品国产| 国产精品视频第一区| 蜜臀av性久久久久蜜臀aⅴ流畅 | 91麻豆视频网站| 久久久噜噜噜久久中文字幕色伊伊| 亚洲成人免费看| 欧洲视频一区二区| 亚洲精品中文在线| www.在线成人| 国产精品国产三级国产普通话三级| 狠狠色综合日日| 一本大道综合伊人精品热热| 国产精品久久久久久一区二区三区 | www.亚洲人| 国产精品久久久久久久久免费丝袜| 国产成人在线观看| 久久久久久电影| 久久99国产精品尤物| 欧美电影免费观看高清完整版在线观看| 日韩av中文字幕一区二区三区| 7777女厕盗摄久久久| 男人的天堂久久精品| 日韩一区二区在线看| 精品一区二区三区日韩| 久久久久久久电影| 99国产一区二区三精品乱码| 亚洲女厕所小便bbb| 在线一区二区三区四区五区| 国产欧美日韩精品一区| 成人性视频免费网站| 日韩一区在线看| 欧美影院午夜播放| 亚洲一区二区精品视频| 91精品国产综合久久久蜜臀图片 | 中文字幕在线观看不卡| 日本道在线观看一区二区| 午夜视频一区在线观看| 日韩欧美国产一区二区在线播放 | 国内成人免费视频| 欧美精品一区二区在线观看| 99riav久久精品riav| 午夜电影久久久| 日韩久久精品一区| 99视频超级精品| 久久成人免费网| 一区二区高清免费观看影视大全| 日韩免费看的电影| 色噜噜狠狠色综合中国| 国产成a人亚洲精品| 日韩二区在线观看| 中文字幕字幕中文在线中不卡视频| 51午夜精品国产| 一本久久综合亚洲鲁鲁五月天| 国产一级精品在线| 视频一区二区国产| 亚洲精品免费一二三区| 国产欧美精品在线观看| 91精品国产综合久久精品性色| 91亚洲资源网| 成人一区二区三区| 狠狠色丁香婷婷综合| 免费亚洲电影在线| 亚洲综合999| 亚洲视频一区在线| 国产精品美女一区二区三区| 精品国产一区二区亚洲人成毛片| 欧美日韩国产123区| 91国产免费看| 欧美最猛黑人xxxxx猛交| 99久久99久久精品国产片果冻| 国产福利一区二区| 国产一区二区三区蝌蚪| 毛片基地黄久久久久久天堂| 日韩二区在线观看| 日本伊人午夜精品| 免费观看一级欧美片| 视频一区二区国产| 日本伊人午夜精品| 激情文学综合丁香| 国模套图日韩精品一区二区| 激情成人综合网| 国产精品正在播放| 国产aⅴ综合色| 成人午夜视频免费看| youjizz久久| 一本到不卡精品视频在线观看| 91国偷自产一区二区三区观看| 色综合久久久久久久| 在线观看国产91| 欧美三级韩国三级日本三斤| 欧美挠脚心视频网站| 欧美日韩高清不卡| 日韩女同互慰一区二区| 久久综合九色综合久久久精品综合| 久久久久久久久蜜桃| 欧美国产精品一区二区| 国产精品九色蝌蚪自拍| 亚洲综合免费观看高清完整版在线 | 偷拍亚洲欧洲综合| 美女视频一区二区| 国产成人精品影视| xnxx国产精品| 国产精品进线69影院| 亚洲成av人片www| 国产真实精品久久二三区| 成人黄色小视频| 在线观看日韩精品| 精品久久免费看| 亚洲人亚洲人成电影网站色| 亚洲成av人片在线观看无码| 国产一区二区三区电影在线观看| 成人短视频下载| 欧美肥胖老妇做爰| 国产日产欧美一区二区视频| 亚洲精品视频自拍| 久久99精品视频| 91香蕉视频在线| 欧美成人官网二区| 亚洲色图制服诱惑 | 日日夜夜免费精品| 成人一级视频在线观看| 91精品在线免费| 国产精品久久久久久久久图文区| 日韩中文字幕区一区有砖一区| 国产精品一区免费视频| 欧美午夜精品久久久久久超碰 | 91一区二区在线观看| 日韩欧美的一区二区| 亚洲黄色尤物视频| 国产成a人亚洲精| 日韩视频一区二区三区| 亚洲欧美国产77777| 国产美女久久久久| 制服丝袜av成人在线看| 综合久久综合久久| 国内久久婷婷综合| 91 com成人网| 亚洲色图20p| 成人高清视频免费观看| 亚洲婷婷在线视频| 精品一区二区三区av| 欧美精品在欧美一区二区少妇 | 久久精品亚洲麻豆av一区二区| 一区二区三区美女| av亚洲产国偷v产偷v自拍| 久久亚洲综合色| 免费观看在线色综合| 欧美日韩高清在线播放| 亚洲综合自拍偷拍| 91蝌蚪porny九色| 国产精品午夜在线| 国产激情精品久久久第一区二区| 日韩丝袜美女视频| 日韩不卡一区二区| 欧美一区二区网站| 午夜精品久久久久久久久 | 91美女精品福利| 国产精品久久久一本精品| 国产成人免费视频精品含羞草妖精 | 亚洲综合在线免费观看| 色狠狠一区二区三区香蕉| 亚洲欧洲av一区二区三区久久| 国产成人av影院| 国产精品情趣视频| 国产99一区视频免费| 中文字幕人成不卡一区| 91偷拍与自偷拍精品| 亚洲精品日韩综合观看成人91|