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

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

?? pciehp_pci.c

?? h內核
?? 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一区二区三区免费野_久草精品视频
91国产成人在线| 国产精品456| 欧美日韩色一区| 亚洲成av人影院在线观看网| 91.com视频| 久久99久久99小草精品免视看| 日韩欧美在线网站| 国产精品一级片在线观看| 国产精品人妖ts系列视频| 一本一道综合狠狠老| 亚欧色一区w666天堂| 精品国产成人在线影院| 成人ar影院免费观看视频| 亚洲综合色婷婷| 日韩一级精品视频在线观看| 粉嫩av一区二区三区| 亚洲一区二区在线播放相泽| 欧美一区二区精品在线| 国产激情一区二区三区| 亚洲午夜成aⅴ人片| 日韩丝袜美女视频| a亚洲天堂av| 日本亚洲视频在线| 国产精品每日更新在线播放网址| 91成人在线观看喷潮| 激情六月婷婷久久| 成人欧美一区二区三区视频网页| 欧美日韩国产一级二级| 国产成人在线看| 亚洲一区二区黄色| 久久免费偷拍视频| 欧美三级日韩三级国产三级| 国产一区二区在线观看免费| 亚洲欧美另类久久久精品2019| 日韩欧美一区在线| 欧美性猛片xxxx免费看久爱| 国产不卡在线一区| 亚洲r级在线视频| 最新热久久免费视频| 日韩精品一区二区三区在线| 色综合久久久久综合| 极品美女销魂一区二区三区免费| 亚洲色图欧洲色图| 久久久国际精品| 欧美日韩免费观看一区二区三区 | 亚洲成人在线观看视频| 国产视频在线观看一区二区三区 | 亚洲久本草在线中文字幕| 精品美女被调教视频大全网站| 色婷婷精品久久二区二区蜜臂av| 国产在线不卡一区| 老色鬼精品视频在线观看播放| 亚洲另类春色校园小说| 国产精品情趣视频| 精品久久久久久亚洲综合网| 欧美日韩黄色影视| 在线视频中文字幕一区二区| 成人丝袜18视频在线观看| 精品一区二区综合| 免费久久99精品国产| 同产精品九九九| 亚洲大尺度视频在线观看| 亚洲天堂中文字幕| 国产精品家庭影院| 国产欧美一区二区三区沐欲| 欧美成人一级视频| 精品国内二区三区| 精品福利一区二区三区| 精品久久久久久久人人人人传媒| 欧美一区二区三区在线观看| 在线不卡免费欧美| 欧美人妖巨大在线| 欧美精品欧美精品系列| 欧美三级电影在线观看| 欧美性受xxxx| 欧美丰满少妇xxxxx高潮对白| 在线一区二区三区四区五区| 色婷婷精品大视频在线蜜桃视频| 97久久人人超碰| 99久久久国产精品| 在线观看亚洲精品视频| 欧美日韩国产bt| 91精品国产综合久久婷婷香蕉| 欧美精品日韩一区| 精品久久久久久综合日本欧美| 久久综合中文字幕| 久久综合九色综合欧美亚洲| 久久你懂得1024| 一区精品在线播放| 一区二区三区在线播放| 亚洲成av人片一区二区梦乃| 青青草国产精品97视觉盛宴| 久久99精品久久久久久 | 成人黄页在线观看| 99久久精品免费观看| 欧美在线free| 欧美一区二区三区四区五区| 精品免费国产一区二区三区四区| 久久综合狠狠综合久久综合88| 久久精品视频在线免费观看| 日韩一区中文字幕| 午夜视频在线观看一区| 激情偷乱视频一区二区三区| 粉嫩av一区二区三区在线播放| 色婷婷av一区| 欧美一区二区三区成人| 国产欧美一区二区精品性 | 亚洲v中文字幕| 久久国产免费看| 97久久精品人人做人人爽50路| 欧美性一级生活| 2020国产精品自拍| 一区二区三区免费网站| 激情综合网最新| 色素色在线综合| 日韩免费高清电影| 亚洲视频在线观看三级| 男女视频一区二区| av亚洲精华国产精华精华| 4438x亚洲最大成人网| 欧美国产激情二区三区| 成人短视频下载| 91精品国产高清一区二区三区蜜臀| 国产欧美一区二区精品仙草咪| 亚洲高清免费在线| eeuss国产一区二区三区| 日韩精品一区二区三区蜜臀 | 91精品国产91久久久久久一区二区| 欧美国产欧美综合| 日本vs亚洲vs韩国一区三区二区| 成人激情开心网| 欧美电视剧免费全集观看| 一区二区三区在线观看动漫 | 一区二区三区国产精华| 国产精品99久久久久久久女警| 欧美猛男gaygay网站| 国产精品国产成人国产三级 | 亚洲综合丝袜美腿| 成人动漫视频在线| 精品国产123| 日本不卡高清视频| 欧美日韩中文字幕精品| 中文字幕一区二区三区四区不卡 | 日本一不卡视频| 欧美色老头old∨ideo| 国产精品国产精品国产专区不片| 韩国三级中文字幕hd久久精品| 欧美日韩免费观看一区三区| 亚洲乱码中文字幕综合| k8久久久一区二区三区| 久久精品人人做| 国产一区 二区| 欧美成人aa大片| 久久99精品视频| 91精品欧美久久久久久动漫 | 亚洲精品一区二区三区四区高清| 午夜电影一区二区三区| 欧美无乱码久久久免费午夜一区| 最新高清无码专区| 成人av资源下载| 亚洲你懂的在线视频| 99re热这里只有精品视频| 国产精品毛片无遮挡高清| 成人国产亚洲欧美成人综合网| 久久久久久一二三区| 韩国成人在线视频| 久久久欧美精品sm网站| 国产高清在线精品| 国产视频一区二区在线观看| 国产麻豆精品视频| 国产精品免费看片| 91视频免费播放| 亚洲精品日韩一| 欧美区视频在线观看| 日本在线不卡视频| 精品日韩99亚洲| 国产成人av一区二区| 国产欧美1区2区3区| 色综合中文字幕| 亚洲一区欧美一区| 欧美一区二区日韩一区二区| 麻豆极品一区二区三区| 国产亚洲欧美激情| av亚洲精华国产精华| 亚洲国产成人av网| 欧美一级在线视频| 国产成人免费在线观看| 日韩美女久久久| 欧美日韩在线播放三区四区| 美女脱光内衣内裤视频久久影院| 国产色婷婷亚洲99精品小说| 99久久综合99久久综合网站| 亚洲综合丁香婷婷六月香| 欧美精品电影在线播放| 国产一本一道久久香蕉| 亚洲欧美日韩国产一区二区三区 | 国产欧美综合在线观看第十页| 99综合电影在线视频| 亚洲高清免费观看| 精品日产卡一卡二卡麻豆|