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

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

?? cardbus.c

?? Linux內核源代碼 為壓縮文件 是<<Linux內核>>一書中的源代碼
?? C
字號:
/*======================================================================      Cardbus device configuration        cardbus.c 1.63 1999/11/08 20:47:02    The contents of this file are subject to the Mozilla Public    License Version 1.1 (the "License"); you may not use this file    except in compliance with the License. You may obtain a copy of    the License at http://www.mozilla.org/MPL/    Software distributed under the License is distributed on an "AS    IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or    implied. See the License for the specific language governing    rights and limitations under the License.    The initial developer of the original code is David A. Hinds    <dhinds@pcmcia.sourceforge.org>.  Portions created by David A. Hinds    are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.    Alternatively, the contents of this file may be used under the    terms of the GNU Public License version 2 (the "GPL"), in which    case the provisions of the GPL are applicable instead of the    above.  If you wish to allow the use of your version of this file    only under the terms of the GPL and not to allow others to use    your version of this file under the MPL, indicate your decision    by deleting the provisions above and replace them with the notice    and other provisions required by the GPL.  If you do not delete    the provisions above, a recipient may use your version of this    file under either the MPL or the GPL.        These routines handle allocating resources for Cardbus cards, as    well as setting up and shutting down Cardbus sockets.  They are    called from cs.c in response to Request/ReleaseConfiguration and    Request/ReleaseIO calls.======================================================================*//* * This file is going away.  Cardbus handling has been re-written to be * more of a PCI bridge thing, and the PCI code basically does all the * resource handling. This has wrappers to make the rest of the PCMCIA * subsystem not notice that it's not here any more. * *		Linus, Jan 2000 */#define __NO_VERSION__#include <linux/module.h>#include <linux/kernel.h>#include <linux/string.h>#include <linux/malloc.h>#include <linux/mm.h>#include <linux/pci.h>#include <linux/ioport.h>#include <asm/irq.h>#include <asm/io.h>#define IN_CARD_SERVICES#include <pcmcia/version.h>#include <pcmcia/cs_types.h>#include <pcmcia/ss.h>#include <pcmcia/cs.h>#include <pcmcia/bulkmem.h>#include <pcmcia/cistpl.h>#include "cs_internal.h"#include "rsrc_mgr.h"#ifdef PCMCIA_DEBUGstatic int pc_debug = PCMCIA_DEBUG;#endif/*====================================================================*/#define FIND_FIRST_BIT(n)	((n) - ((n) & ((n)-1)))#define pci_readb		pci_read_config_byte#define pci_writeb		pci_write_config_byte#define pci_readw		pci_read_config_word#define pci_writew		pci_write_config_word#define pci_readl		pci_read_config_dword#define pci_writel		pci_write_config_dword/* Offsets in the Expansion ROM Image Header */#define ROM_SIGNATURE		0x0000	/* 2 bytes */#define ROM_DATA_PTR		0x0018	/* 2 bytes *//* Offsets in the CardBus PC Card Data Structure */#define PCDATA_SIGNATURE	0x0000	/* 4 bytes */#define PCDATA_VPD_PTR		0x0008	/* 2 bytes */#define PCDATA_LENGTH		0x000a	/* 2 bytes */#define PCDATA_REVISION		0x000c#define PCDATA_IMAGE_SZ		0x0010	/* 2 bytes */#define PCDATA_ROM_LEVEL	0x0012	/* 2 bytes */#define PCDATA_CODE_TYPE	0x0014#define PCDATA_INDICATOR	0x0015typedef struct cb_config_t {	struct pci_dev dev;} cb_config_t;/*=====================================================================    Expansion ROM's have a special layout, and pointers specify an    image number and an offset within that image.  xlate_rom_addr()    converts an image/offset address to an absolute offset from the    ROM's base address.    =====================================================================*/static u_int xlate_rom_addr(u_char * b, u_int addr){	u_int img = 0, ofs = 0, sz;	u_short data;	while ((readb(b) == 0x55) && (readb(b + 1) == 0xaa)) {		if (img == (addr >> 28))			return (addr & 0x0fffffff) + ofs;		data = readb(b + ROM_DATA_PTR) + (readb(b + ROM_DATA_PTR + 1) << 8);		sz = 512 * (readb(b + data + PCDATA_IMAGE_SZ) +			    (readb(b + data + PCDATA_IMAGE_SZ + 1) << 8));		if ((sz == 0) || (readb(b + data + PCDATA_INDICATOR) & 0x80))			break;		b += sz;		ofs += sz;		img++;	}	return 0;}/*=====================================================================    These are similar to setup_cis_mem and release_cis_mem for 16-bit    cards.  The "result" that is used externally is the cb_cis_virt    pointer in the socket_info_t structure.    =====================================================================*/void cb_release_cis_mem(socket_info_t * s){	if (s->cb_cis_virt) {		DEBUG(1, "cs: cb_release_cis_mem()\n");		iounmap(s->cb_cis_virt);		s->cb_cis_virt = NULL;		s->cb_cis_res = 0;	}}static int cb_setup_cis_mem(socket_info_t * s, struct pci_dev *dev, struct resource *res){	unsigned int start, size;	if (res == s->cb_cis_res)		return 0;	if (s->cb_cis_res)		cb_release_cis_mem(s);	start = res->start;	size = res->end - start + 1;	s->cb_cis_virt = ioremap(start, size);	if (!s->cb_cis_virt)		return -1;	s->cb_cis_res = res;	return 0;}/*=====================================================================    This is used by the CIS processing code to read CIS information    from a CardBus device.    =====================================================================*/void read_cb_mem(socket_info_t * s, u_char fn, int space,		 u_int addr, u_int len, void *ptr){	struct pci_dev *dev;	struct resource *res;	DEBUG(3, "cs: read_cb_mem(%d, %#x, %u)\n", space, addr, len);	if (!s->cb_config)		goto fail;	dev = &s->cb_config[fn].dev;	/* Config space? */	if (space == 0) {		if (addr + len > 0x100)			goto fail;		for (; len; addr++, ptr++, len--)			pci_readb(dev, addr, (u_char *) ptr);		return;	}	res = dev->resource + space - 1;	if (!res->flags)		goto fail;	if (cb_setup_cis_mem(s, dev, res) != 0)		goto fail;	if (space == 7) {		addr = xlate_rom_addr(s->cb_cis_virt, addr);		if (addr == 0)			goto fail;	}	if (addr + len > res->end - res->start)		goto fail;	memcpy_fromio(ptr, s->cb_cis_virt + addr, len);	return;fail:	memset(ptr, 0xff, len);	return;}/*=====================================================================    cb_alloc() and cb_free() allocate and free the kernel data    structures for a Cardbus device, and handle the lowest level PCI    device setup issues.    =====================================================================*/int cb_alloc(socket_info_t * s){	struct pci_bus *bus;	struct pci_dev tmp;	u_short vend, v, dev;	u_char i, hdr, fn;	cb_config_t *c;	int irq;	bus = s->cap.cb_dev->subordinate;	memset(&tmp, 0, sizeof(tmp));	tmp.bus = bus;	tmp.sysdata = bus->sysdata;	tmp.devfn = 0;	pci_readw(&tmp, PCI_VENDOR_ID, &vend);	pci_readw(&tmp, PCI_DEVICE_ID, &dev);	printk(KERN_INFO "cs: cb_alloc(bus %d): vendor 0x%04x, "	       "device 0x%04x\n", bus->number, vend, dev);	pci_readb(&tmp, PCI_HEADER_TYPE, &hdr);	fn = 1;	if (hdr & 0x80) {		do {			tmp.devfn = fn;			if (pci_readw(&tmp, PCI_VENDOR_ID, &v) || !v || v == 0xffff)				break;			fn++;		} while (fn < 8);	}	s->functions = fn;	c = kmalloc(fn * sizeof(struct cb_config_t), GFP_ATOMIC);	if (!c)		return CS_OUT_OF_RESOURCE;	memset(c, 0, fn * sizeof(struct cb_config_t));	irq = s->cap.pci_irq;	for (i = 0; i < fn; i++) {		struct pci_dev *dev = &c[i].dev;		u8 irq_pin;		int r;		dev->bus = bus;		dev->sysdata = bus->sysdata;		dev->devfn = i;		dev->vendor = vend;		pci_readw(dev, PCI_DEVICE_ID, &dev->device);		dev->hdr_type = hdr & 0x7f;		pci_setup_device(dev);		/* FIXME: Do we need to enable the expansion ROM? */		for (r = 0; r < 7; r++) {			struct resource *res = dev->resource + r;			if (res->flags)				pci_assign_resource(dev, r);		}		pci_enable_device(dev); /* XXX check return */		/* Does this function have an interrupt at all? */		pci_readb(dev, PCI_INTERRUPT_PIN, &irq_pin);		if (irq_pin) {			dev->irq = irq;			pci_writeb(dev, PCI_INTERRUPT_LINE, irq);		}		pci_insert_device(dev, bus);	}	s->cb_config = c;	s->irq.AssignedIRQ = irq;	return CS_SUCCESS;}void cb_free(socket_info_t * s){	cb_config_t *c = s->cb_config;	if (c) {		int i;		s->cb_config = NULL;		for (i = 0 ; i < s->functions ; i++)			pci_remove_device(&c[i].dev);		kfree(c);		printk(KERN_INFO "cs: cb_free(bus %d)\n", s->cap.cb_dev->subordinate->number);	}}/*=====================================================================    cb_config() has the job of allocating all system resources that    a Cardbus card requires.  Rather than using the CIS (which seems    to not always be present), it treats the card as an ordinary PCI    device, and probes the base address registers to determine each    function's IO and memory space needs.    It is called from the RequestIO card service.    ======================================================================*/int cb_config(socket_info_t * s){	return CS_SUCCESS;}/*======================================================================    cb_release() releases all the system resources (IO and memory    space, and interrupt) committed for a Cardbus card by a prior call    to cb_config().    It is called from the ReleaseIO() service.    ======================================================================*/void cb_release(socket_info_t * s){	DEBUG(0, "cs: cb_release(bus %d)\n", s->cap.cb_dev->subordinate->number);}/*=====================================================================    cb_enable() has the job of configuring a socket for a Cardbus    card, and initializing the card's PCI configuration registers.    It first sets up the Cardbus bridge windows, for IO and memory    accesses.  Then, it initializes each card function's base address    registers, interrupt line register, and command register.    It is called as part of the RequestConfiguration card service.    It should be called after a previous call to cb_config() (via the    RequestIO service).    ======================================================================*/void cb_enable(socket_info_t * s){	struct pci_dev *dev;	u_char i;	DEBUG(0, "cs: cb_enable(bus %d)\n", s->cap.cb_dev->subordinate->number);	/* Configure bridge */	cb_release_cis_mem(s);	/* Set up PCI interrupt and command registers */	for (i = 0; i < s->functions; i++) {		dev = &s->cb_config[i].dev;		pci_writeb(dev, PCI_COMMAND, PCI_COMMAND_MASTER |			   PCI_COMMAND_IO | PCI_COMMAND_MEMORY);		pci_writeb(dev, PCI_CACHE_LINE_SIZE, L1_CACHE_BYTES / 4);	}	if (s->irq.AssignedIRQ) {		for (i = 0; i < s->functions; i++) {			dev = &s->cb_config[i].dev;			pci_writeb(dev, PCI_INTERRUPT_LINE, s->irq.AssignedIRQ);		}		s->socket.io_irq = s->irq.AssignedIRQ;		s->ss_entry->set_socket(s->sock, &s->socket);	}}/*======================================================================    cb_disable() unconfigures a Cardbus card previously set up by    cb_enable().    It is called from the ReleaseConfiguration service.    ======================================================================*/void cb_disable(socket_info_t * s){	DEBUG(0, "cs: cb_disable(bus %d)\n", s->cap.cb_dev->subordinate->number);	/* Turn off bridge windows */	cb_release_cis_mem(s);}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区在线看| 亚洲美女免费在线| 欧美日韩国产在线观看| jiyouzz国产精品久久| 黑人精品欧美一区二区蜜桃 | 国产在线国偷精品免费看| 午夜激情综合网| 午夜亚洲福利老司机| 日本特黄久久久高潮| 日本欧美一区二区三区乱码| 亚洲图片欧美视频| 日韩精品亚洲专区| 精品一区二区精品| 国产精品伊人色| 成人av资源下载| 91丨九色丨黑人外教| 欧美性受xxxx| 欧美精品视频www在线观看| 91精品国产乱码久久蜜臀| 日韩色视频在线观看| 久久先锋影音av鲁色资源| 欧美国产精品一区二区三区| 亚洲视频免费观看| 亚洲福利视频三区| 婷婷国产在线综合| 久久精品国产第一区二区三区| 另类小说欧美激情| 国产精品一区二区免费不卡 | 精品视频免费在线| 日韩一二在线观看| 2021中文字幕一区亚洲| 亚洲欧洲成人精品av97| 亚洲第一成人在线| 日本不卡不码高清免费观看| 国产一区二区在线电影| 99久久精品国产毛片| 精品视频一区三区九区| 91精品国产综合久久久蜜臀粉嫩 | 欧美激情一区二区三区不卡| 亚洲人一二三区| 麻豆91在线播放| 成人午夜电影网站| 欧美日韩精品一区视频| 国产亚洲成av人在线观看导航| 1000精品久久久久久久久| 美洲天堂一区二卡三卡四卡视频| 99精品欧美一区二区蜜桃免费| 日韩亚洲国产中文字幕欧美| 日韩一区在线看| 国产永久精品大片wwwapp | 男男gaygay亚洲| 99久久99久久精品免费观看| 欧美一级午夜免费电影| 亚洲精品免费电影| 另类小说视频一区二区| 欧美午夜在线一二页| 日本一区二区高清| 琪琪久久久久日韩精品| 91免费国产在线观看| 国产欧美日韩不卡| 另类小说一区二区三区| 欧美日韩精品三区| 国产精品国产三级国产aⅴ入口| 日韩av在线免费观看不卡| 91福利视频网站| 亚洲少妇中出一区| 972aa.com艺术欧美| 国产三级三级三级精品8ⅰ区| 日本aⅴ精品一区二区三区| 欧洲精品一区二区三区在线观看| 国产精品久久久久久久久果冻传媒| 老司机精品视频在线| 精品视频999| 亚洲午夜在线电影| 欧美专区在线观看一区| 亚洲美女免费视频| 91蜜桃网址入口| 亚洲自拍偷拍麻豆| 日本韩国视频一区二区| 亚洲欧洲精品一区二区三区| 91在线国产观看| 亚洲精品少妇30p| 欧美特级限制片免费在线观看| 亚洲免费视频成人| 色哟哟一区二区在线观看| 亚洲免费在线观看视频| 色综合久久久久久久久| 中文字幕不卡在线观看| 91麻豆国产福利精品| 日韩伦理电影网| 欧洲亚洲国产日韩| 青青草原综合久久大伊人精品优势| 欧美电影一区二区| 日韩高清一级片| 久久综合中文字幕| 成人永久免费视频| 一区二区三区在线影院| 欧美日韩久久久一区| 日本视频一区二区| 久久精品人人爽人人爽| 91视视频在线观看入口直接观看www| 亚洲尤物在线视频观看| 欧美日韩一区二区在线观看| 蓝色福利精品导航| 综合分类小说区另类春色亚洲小说欧美| 色妹子一区二区| 奇米精品一区二区三区在线观看一| 久久精品亚洲精品国产欧美kt∨| 91网站在线播放| 免费成人在线视频观看| 国产欧美一区二区精品仙草咪| 色国产综合视频| 精品一区二区三区不卡| 亚洲色欲色欲www| 欧美成人精品高清在线播放 | 手机精品视频在线观看| 精品国产制服丝袜高跟| 91麻豆精品在线观看| 精品系列免费在线观看| 亚洲精品成人a在线观看| 精品少妇一区二区三区日产乱码 | 在线视频综合导航| 精品一区二区免费视频| 亚洲综合男人的天堂| 国产拍揄自揄精品视频麻豆| 欧美精品自拍偷拍| 97精品久久久久中文字幕| 另类人妖一区二区av| 一区二区免费看| 中文字幕中文在线不卡住| 精品国产99国产精品| 91国产福利在线| k8久久久一区二区三区| 国产一区二区伦理片| 日本午夜一区二区| 一区二区在线观看av| 亚洲国产成人私人影院tom| 日韩免费视频一区| 欧美精品久久久久久久多人混战 | 欧美日韩国产成人在线免费| 国产91对白在线观看九色| 精品夜夜嗨av一区二区三区| 奇米影视一区二区三区| 午夜不卡av在线| 亚洲欧美日韩国产成人精品影院| 国产日产欧美精品一区二区三区| 欧美一区二区在线看| 色综合久久综合| 制服.丝袜.亚洲.中文.综合| 欧美日韩另类国产亚洲欧美一级| 97精品久久久午夜一区二区三区 | 色偷偷一区二区三区| av电影在线观看不卡| 成人性色生活片| 盗摄精品av一区二区三区| 精品一区精品二区高清| 日韩电影免费在线看| 午夜视频一区二区| 男人的j进女人的j一区| 日韩中文字幕区一区有砖一区| 亚洲午夜久久久久久久久久久| 亚洲欧美综合网| 亚洲色图色小说| 亚洲一区二区在线免费观看视频 | 欧美岛国在线观看| 精品粉嫩超白一线天av| 久久久久久久久久电影| 国产精品私人影院| 国产欧美日韩激情| 亚洲手机成人高清视频| 亚洲综合区在线| 日韩av成人高清| 免费国产亚洲视频| 韩国成人在线视频| 国产成人精品亚洲午夜麻豆| 高清国产一区二区| 99亚偷拍自图区亚洲| 欧美日韩日日摸| 精品黑人一区二区三区久久 | 色综合色狠狠综合色| 风流少妇一区二区| 欧美视频在线观看一区二区| 欧美不卡视频一区| 日韩欧美亚洲一区二区| 久久蜜桃av一区精品变态类天堂 | 日本一不卡视频| 国产精品66部| 91在线精品一区二区三区| 51久久夜色精品国产麻豆| 久久精品人人做人人爽人人 | 欧美一区二区三区在线观看| 欧美电影免费观看高清完整版在线| 国产精品毛片久久久久久| 无码av免费一区二区三区试看 | 91麻豆精品国产综合久久久久久| 日韩欧美国产精品| 亚洲黄一区二区三区| 麻豆视频一区二区| 91在线国产福利| 国产视频一区二区三区在线观看|