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

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

?? pciehp_pci.c

?? Linux Kernel 2.6.9 for OMAP1710
?? 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;	dbg("%s: bus/dev/func = %x/%x/%x\n", __FUNCTION__, func->bus,				func->device, func->function);	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);		}	}	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)					return rc;			}	/* End of IF */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产欧美1区2区3区| 精品国产一区二区精华| 久久国产三级精品| 亚洲欧洲一区二区在线播放| 91精品国产综合久久久蜜臀粉嫩| 国产日韩欧美一区二区三区乱码| 色一区在线观看| 韩国精品在线观看| 久久亚洲精华国产精华液| 麻豆精品视频在线观看| 亚洲欧洲日产国产综合网| 成人avav影音| 精品一区二区三区免费毛片爱| 欧美一级黄色录像| 国产在线一区观看| 丝袜诱惑亚洲看片| 一区二区视频在线| 欧美国产乱子伦| 欧美大片在线观看| 国产很黄免费观看久久| 日本不卡123| 亚洲精品欧美激情| 日韩一区二区三区精品视频| 一本到不卡免费一区二区| 国产一区视频在线看| 这里只有精品免费| 精品综合久久久久久8888| 久久久99久久| 日韩欧美一区在线观看| 欧美日韩精品专区| 国产呦萝稀缺另类资源| 青娱乐精品视频| 国产欧美日韩亚州综合| 精品国产一二三| 欧美一卡二卡在线观看| 欧美人妖巨大在线| 国产麻豆精品一区二区| 亚洲男同性视频| 亚洲欧洲99久久| 欧美一区二区女人| 成人精品视频网站| 首页国产欧美久久| 香港成人在线视频| 中文无字幕一区二区三区| 色94色欧美sute亚洲线路二| 91亚洲资源网| 99热国产精品| 麻豆视频观看网址久久| 国产日韩欧美精品一区| 欧美三区在线视频| 精品污污网站免费看| 在线电影院国产精品| 91精品啪在线观看国产60岁| 7777精品伊人久久久大香线蕉经典版下载| 欧美日韩久久久久久| 国产91丝袜在线观看| 成人午夜激情视频| fc2成人免费人成在线观看播放| eeuss鲁片一区二区三区| www..com久久爱| 国产做a爰片久久毛片 | 麻豆极品一区二区三区| 国产精品久久久久久久久免费相片 | 天天爽夜夜爽夜夜爽精品视频| 亚洲二区视频在线| 欧美aⅴ一区二区三区视频| 国产免费久久精品| 1区2区3区欧美| 亚洲国产成人精品视频| 蜜桃av一区二区在线观看| 国产精品一区一区三区| 99精品在线免费| 国产风韵犹存在线视精品| 日韩电影在线一区| 极品销魂美女一区二区三区| 亚洲v中文字幕| 亚洲女同一区二区| 日韩精品一区第一页| 激情文学综合插| 成人免费观看视频| 欧美理论在线播放| 欧美亚洲动漫精品| 精品少妇一区二区三区日产乱码| 欧美日韩一本到| 91小视频在线免费看| 国产大陆精品国产| 色欧美88888久久久久久影院| 欧美色图12p| 久久久综合精品| 亚洲激情综合网| 亚洲欧美激情在线| 蜜桃视频一区二区三区在线观看| 日韩精品电影在线| 国产不卡视频一区二区三区| 国产精品99久久久久久久女警| 国内外精品视频| 欧美在线观看视频一区二区| www久久久久| 精品久久国产老人久久综合| 悠悠色在线精品| 国产高清精品在线| 国产精品1区2区| 欧美性猛交xxxx乱大交退制版| 色播五月激情综合网| 欧美成人一区二区三区片免费| 亚洲另类在线制服丝袜| 国产成人精品亚洲日本在线桃色 | 欧美日韩免费不卡视频一区二区三区| 精品捆绑美女sm三区| 亚洲国产精品麻豆| 日韩一区二区三区电影在线观看| 宅男在线国产精品| 亚洲精品成人在线| 成人动漫一区二区三区| 日韩欧美不卡在线观看视频| 亚洲成av人片一区二区| 精品在线你懂的| 成人国产电影网| 久久久不卡影院| 久久精品国产澳门| 欧美久久久久久蜜桃| 亚洲一区二区三区视频在线| 男女男精品视频网| 欧美午夜视频网站| 一区二区三区免费网站| 99精品黄色片免费大全| 国产精品色在线| 日韩黄色一级片| 国产精品亚洲综合一区在线观看| 日韩精品中午字幕| 免费在线一区观看| 91精品国产麻豆国产自产在线 | av激情综合网| 欧美激情综合在线| 国产成人免费9x9x人网站视频| 久久综合成人精品亚洲另类欧美 | 美女被吸乳得到大胸91| 69成人精品免费视频| 国产亚洲精品精华液| 一区二区三区色| 91久久线看在观草草青青| 精品国产露脸精彩对白| 久久国产麻豆精品| 精品欧美一区二区三区精品久久| 成人欧美一区二区三区1314| 不卡av免费在线观看| 日韩一区二区视频| 久88久久88久久久| 欧美中文字幕一区二区三区亚洲| 亚洲人精品午夜| 在线观看区一区二| 日韩精品国产精品| 久久女同精品一区二区| 国内国产精品久久| 欧美色综合影院| 中文字幕第一区第二区| 波多野结衣在线aⅴ中文字幕不卡| 91精品国产综合久久久久久久| 午夜精品福利视频网站| 欧美一区在线视频| 亚洲一二三区在线观看| 欧美一区二区在线免费播放| 日本在线不卡一区| 国产午夜精品美女毛片视频| 九一九一国产精品| 亚洲国产精品二十页| 91色在线porny| 亚洲福利视频一区| 精品久久久久香蕉网| av日韩在线网站| 日本一二三不卡| 欧美丝袜丝交足nylons| 成人免费视频在线观看| 粉嫩欧美一区二区三区高清影视| 亚洲免费在线播放| 成人a免费在线看| 久久久久国色av免费看影院| 91在线你懂得| 日本视频中文字幕一区二区三区| 欧美自拍偷拍午夜视频| 久久99久久精品欧美| 国产精品久99| 欧美人伦禁忌dvd放荡欲情| 亚洲国产综合色| 在线精品亚洲一区二区不卡| 麻豆成人久久精品二区三区小说| 在线成人av影院| 日韩精品成人一区二区在线| 欧美韩国一区二区| 欧美蜜桃一区二区三区| 懂色一区二区三区免费观看| 亚洲va国产天堂va久久en| 国产午夜精品久久| 国产不卡视频一区| 中文字幕av不卡| 日韩精品最新网址| 欧美亚洲日本国产| 春色校园综合激情亚洲| 免费精品视频在线| 欧美精品一区男女天堂|