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

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

?? pciehp_pci.c

?? h內(nèi)核
?? 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>, <dely.l.sy@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一区二区三区免费野_久草精品视频
日本一区二区免费在线| 国产精品久99| www.性欧美| 青草国产精品久久久久久| 国产日韩欧美麻豆| 欧美精品在线观看一区二区| 成人动漫视频在线| 久色婷婷小香蕉久久| 夜夜精品视频一区二区| 亚洲国产高清在线观看视频| 日韩午夜激情视频| 欧美日韩一区在线| 91在线观看污| 国产99久久久国产精品免费看| 日本欧美在线看| 亚洲自拍欧美精品| 亚洲色欲色欲www| 国产亚洲精品7777| 亚洲精品一区二区三区蜜桃下载| 欧美日韩成人一区二区| 91一区一区三区| 波多野结衣中文字幕一区二区三区| 麻豆精品一区二区av白丝在线| 亚洲综合免费观看高清在线观看| 中文字幕日本乱码精品影院| 国产无一区二区| 久久―日本道色综合久久 | 欧美影院一区二区| 色综合天天综合给合国产| 国产成a人亚洲| 国产成人一区二区精品非洲| 激情小说欧美图片| 激情久久五月天| 久久9热精品视频| 精品亚洲aⅴ乱码一区二区三区| 日韩高清在线观看| 日本亚洲视频在线| 免费成人在线视频观看| 日韩国产成人精品| 久久av老司机精品网站导航| 玖玖九九国产精品| 国产一区二区在线电影| 国产成人亚洲综合色影视| 国产一区二区三区美女| 国产成人三级在线观看| 岛国精品在线观看| www.欧美色图| 日本韩国欧美在线| 欧美网站大全在线观看| 欧美日韩欧美一区二区| 555夜色666亚洲国产免| 日韩一区二区在线观看视频播放| 日韩三级伦理片妻子的秘密按摩| 欧美一区二区免费视频| 欧美大片免费久久精品三p| 337p粉嫩大胆噜噜噜噜噜91av | 午夜久久久影院| 日韩电影一区二区三区| 免费不卡在线视频| 国产一二三精品| 久久综合色婷婷| 国产精品不卡在线| 亚洲成人自拍网| 丝袜a∨在线一区二区三区不卡| 蜜臀国产一区二区三区在线播放| 国产老女人精品毛片久久| 97se亚洲国产综合在线| 欧美伦理电影网| 精品动漫一区二区三区在线观看| 国产午夜精品福利| 亚洲自拍欧美精品| 国产乱国产乱300精品| 91玉足脚交白嫩脚丫在线播放| 欧美色偷偷大香| 久久久久久久久久久黄色| ...xxx性欧美| 日韩国产欧美在线播放| 成人午夜免费电影| 欧美日韩国产免费| 久久婷婷国产综合国色天香| 亚洲欧洲综合另类| 精品一区二区三区在线播放视频| 成人免费观看男女羞羞视频| 欧美日韩国产色站一区二区三区| 亚洲精品一区二区三区影院| 国产精品毛片无遮挡高清| 三级不卡在线观看| 成人国产精品免费观看动漫| 6080国产精品一区二区| 国产精品美日韩| 蜜桃精品在线观看| 91色porny蝌蚪| 2024国产精品| 天天综合网天天综合色| 成人av电影在线播放| 日韩亚洲欧美在线| 亚洲精品成人精品456| 国产精品一线二线三线精华| 欧美日韩一区二区在线观看| 欧美激情一区二区三区全黄| 麻豆精品在线播放| 欧美日韩精品电影| 日韩理论片在线| 国产凹凸在线观看一区二区| 日韩久久精品一区| 亚洲国产视频在线| 色香蕉久久蜜桃| 国产精品青草久久| 国产在线精品一区二区| 91精品国产综合久久蜜臀| 亚洲在线观看免费视频| 99国产精品久久久| 国产日韩欧美在线一区| 久久99久国产精品黄毛片色诱| 欧美视频一区二区| 一区二区免费看| 色老头久久综合| 亚洲视频一二三区| 成a人片亚洲日本久久| 国产欧美综合在线观看第十页| 精品一区二区在线视频| 欧美一区二区在线播放| 天堂成人国产精品一区| 欧美亚洲国产一区二区三区va| 亚洲天堂久久久久久久| 99久久亚洲一区二区三区青草| 国产视频在线观看一区二区三区| 免费成人美女在线观看.| 欧美一区在线视频| 欧美亚洲动漫精品| 亚洲免费观看高清在线观看| 92国产精品观看| 亚洲视频资源在线| 99久久亚洲一区二区三区青草| 最新欧美精品一区二区三区| 不卡欧美aaaaa| 最近日韩中文字幕| 972aa.com艺术欧美| 一区二区三区精品视频在线| 日本韩国欧美在线| 亚洲成人免费在线| 欧美一区二区三区视频在线| 日韩电影一二三区| 精品99一区二区| 国产成人日日夜夜| 亚洲欧洲制服丝袜| 欧美性色黄大片手机版| 性久久久久久久久久久久| 欧美一区二区三区四区久久| 久久精品99国产精品日本| 久久综合精品国产一区二区三区| 国产九色精品成人porny | 午夜激情一区二区| 制服视频三区第一页精品| 日本美女一区二区三区视频| 精品国产一二三| 成人永久aaa| 亚洲国产精品影院| 精品久久久久久久人人人人传媒| 国产成人精品影院| 亚洲欧洲综合另类| 日韩一区二区三区在线视频| 国产传媒欧美日韩成人| 亚洲码国产岛国毛片在线| 欧美久久久久免费| 国产成人免费视频| 亚洲综合一二三区| 欧美videos大乳护士334| 成人小视频在线观看| 亚洲国产精品久久人人爱| 精品国产青草久久久久福利| 成人激情动漫在线观看| 午夜电影久久久| 欧美国产日产图区| 欧美高清性hdvideosex| 国产成人av资源| 亚洲福利一二三区| 久久久久99精品国产片| 欧美主播一区二区三区美女| 韩国毛片一区二区三区| 一区二区三区欧美久久| 26uuu亚洲综合色| 欧美亚洲国产bt| 国产不卡免费视频| 日本在线不卡视频一二三区| 最新热久久免费视频| 欧美成人高清电影在线| 色欧美日韩亚洲| 另类中文字幕网| 一区二区三区加勒比av| 久久精品夜夜夜夜久久| 欧美色国产精品| 99久久国产综合精品色伊| 蜜臀av亚洲一区中文字幕| 亚洲黄一区二区三区| 亚洲国产精品传媒在线观看| 欧美顶级少妇做爰| 色综合天天性综合| 国产传媒一区在线| 美国一区二区三区在线播放|