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

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

?? plx9052-26.c

?? 關(guān)于linux中pci驅(qū)動的一些代碼,實現(xiàn)了一些功能
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*======================================================================    Device driver for PLX9052 PCI-to-PCMCIA bridges.    Version 0.1.5.    (C) 2003 Pavel Roskin <proski@gnu.org>    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.    Alternatively, the contents of this file may be used under the    terms of the GNU General 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.======================================================================*/#include <linux/module.h>#include <linux/init.h>#include <linux/config.h>#include <linux/types.h>#include <linux/fcntl.h>#include <linux/string.h>#include <linux/kernel.h>#include <linux/errno.h>#include <linux/timer.h>#include <linux/sched.h>#include <linux/slab.h>#include <linux/pci.h>#include <linux/interrupt.h>#include <linux/ioport.h>#include <linux/delay.h>#include <linux/spinlock.h>#include <linux/workqueue.h>#include <linux/version.h>#include <asm/irq.h>#include <asm/io.h>#include <asm/bitops.h>#include <asm/system.h>#include <pcmcia/version.h>#include <pcmcia/cs_types.h>#include <pcmcia/ss.h>#include <pcmcia/cs.h>/*====================================================================*//* Module parameters */MODULE_AUTHOR("Pavel Roskin <proski@gnu.org>");MODULE_DESCRIPTION("PLX9052 PCMCIA socket driver");MODULE_LICENSE("Dual MPL/GPL");/*====================================================================*/#define DEVICE_NAME "plx9052"#define PLX_IOWIN_MIN	0x04	/* Minimal I/O window */#define PLX_IOWIN_MAX	0x1000	/* Maximal I/O window */#define PLX_MEMWIN_MIN	0x10	/* Minimal memory window */#define PLX_MEMWIN_MAX	0x80000	/* Maximal memory window */#define PLX_CIS_START	0x03000000	/* Start of CIS in PLX local memory *//* * PLX9052 has 4 local address spaces. * The driver allocates them dynamically. */#define PLX_AREAS	4	/* Number of local address spaces (areas) */#define PLX_AREA_USED	0x20	/* Area is used */#define PLX_AREA_IO	0x10	/* Area is used for I/O window */#define PLX_AREA_MAP_MASK	0x0f	/* Map number *//* PCI base address for corresponding local address space */#define PLX_PCI_BASE(x)	(PCI_BASE_ADDRESS_2 + (x << 2))/* PLX9052 registers *//* Local address space range (0 <= x < PLX_AREAS) */#define PLX_LASRR(x)	(0x00 + (x << 2))#define PLX_LASRR_IO	1	/* Range is used as I/O space */#define PLX_LAS_MEMMASK	0x0ffffff0	/* Mask for memory address lines */#define PLX_LAS_IOMASK	0x0ffffffc	/* Mask for I/O address lines *//* Local address space base address (0 <= x < PLX_AREAS) */#define PLX_LASBA(x)	(0x14 + (x << 2))#define PLX_LASBA_DISABLE 0	/* Disable address decoding */#define PLX_LASBA_ENABLE  1	/* Enable address decoding *//* Local address space bus region descriptors (0 <= x < PLX_AREAS) */#define PLX_LASBRD(x)	(0x28 + (x << 2))#define PLX_LASBRD_WIDTH_MASK	0x00c00000#define PLX_LASBRD_WIDTH_8	0x00000000#define PLX_LASBRD_WIDTH_16	0x00400000#define PLX_LASBRD_WIDTH_32	0x00800000#define PLX_LASBRD_WS_MASK	0x003fffc0#define PLX_LASBRD_WS0		0x00000000#define PLX_LASBRD_WS1		0x0010a840/* Chip select base address (0 <= x < PLX_AREAS) */#define PLX_CSBASE(x)	(0x3c + (x << 2))#define PLX_CSBASE_ENABLE	1#define PLX_INTCSR	0x4c	/* Interrupt Control and Status Register */#define PLX_INT1_ENABLE	0x40	/* Interrupt 1 Enable bit */#define PLX_INT1_ACTIVE	0x04	/* Interrupt 1 Active bit */#define PLX_CNTRL	0x50	/* Control register */#define PLX_CNTRL_RESET	0x40000000	/* Reset local bus */#ifdef __IN_PCMCIA_PACKAGE__socket_state_t dead_socket = {	0, SS_DETECT, 0, 0, 0};#endifstruct plx9052_socket {	void (*handler) (void *info, u_int events);	void *info;	socket_state_t state;	struct pci_dev *pdev;	struct pcmcia_socket socket;	/* PCI resource 1, PLX9052 registers */	unsigned int plxctl_addr;	unsigned int plxctl_len;	/* should be 0x80 */	/* PCI resource 2, mapped to PCMCIA memory space */	unsigned long mem_phys;	unsigned long mem_len;	/* should be 0x1000 */	u8 *mem_virt;	char area_used[PLX_AREAS];	/* Used local address spaces */	/* Event processing */	u_int event;	spinlock_t event_lock;	struct work_struct event_work;};/* Forward declarations */static void plx9052_close(struct pci_dev *pdev);static int plx9052_set_socket(struct pcmcia_socket *sock,			      socket_state_t * state);/* Check that an area is size-aligned. * Return 0 for good areas, -1 for bad ones.  */static int plx9052_align_check(u32 base, u32 len){	int power = 0;	int l = len;	if (!len)		return -1;	while (l >>= 1)		power++;	if (len != (1 << power))		return -1;	if (base & ((1 << power) - 1))		return -1;	return 0;}static inline void plx9052_outl(struct plx9052_socket *socket, u32 val,				ioaddr_t addr){	outl_p(val, socket->plxctl_addr + addr);}static inline u32 plx9052_inl(struct plx9052_socket *socket, ioaddr_t addr){	return inl_p(socket->plxctl_addr + addr);}static inline void plx9052_enable_irq(struct plx9052_socket *socket){	u32 reg;	reg = plx9052_inl(socket, PLX_INTCSR);	if (!(reg & PLX_INT1_ENABLE)) {		reg |= PLX_INT1_ENABLE;		plx9052_outl(socket, reg, PLX_INTCSR);	}}static inline void plx9052_disable_irq(struct plx9052_socket *socket){	u32 reg;	reg = plx9052_inl(socket, PLX_INTCSR);	if (reg & PLX_INT1_ENABLE) {		reg &= ~PLX_INT1_ENABLE;		plx9052_outl(socket, reg, PLX_INTCSR);	}}static inline int plx9052_irq_active(struct plx9052_socket *socket){	u32 reg;	reg = plx9052_inl(socket, PLX_INTCSR);	return (reg & PLX_INT1_ACTIVE);}/* Hack - determine card presence by the first byte of CIS */static inline int plx9052_card_present(struct plx9052_socket *socket){	return (((volatile u8 *) socket->mem_virt)[0] == 1);}static void plx9052_event(struct plx9052_socket *socket){	u_int event;	if (!socket->handler)		return;	spin_lock_irq(&socket->event_lock);	event = socket->event;	socket->event = 0;	spin_unlock_irq(&socket->event_lock);	if (!event)		return;	/* To make sure it'socket an insertion, wait 1 second before CIS is ready.	 * If the card is currently active, report ejection immediately.  */	if (!(socket->state.flags & SS_OUTPUT_ENA)) {		current->state = TASK_INTERRUPTIBLE;		schedule_timeout(HZ);	}	socket->handler(socket->info, event);	if (!(socket->state.flags & SS_RESET))		plx9052_enable_irq(socket);}static int plx9052_get_area(struct plx9052_socket *socket, int is_io,			    int map){	int i;	/* Area 0 is used internally for CIS */	for (i = 1; i < PLX_AREAS; i++) {		if (!socket->area_used[i]) {			socket->area_used[i] = PLX_AREA_USED | map			    | (is_io ? PLX_AREA_IO : 0);			return i;		}	}	return -1;}static void plx9052_disable_areas(struct plx9052_socket *socket, int is_io,				  int map){	int i;	int type = PLX_AREA_USED | map | (is_io ? PLX_AREA_IO : 0);	/* Note that there may be more than one area for the map */	for (i = 1; i < PLX_AREAS; i++) {		if (socket->area_used[i] == type) {			socket->area_used[i] = 0;			plx9052_outl(socket, PLX_LASBA_DISABLE,				     PLX_LASBA(i));		}	}}/* program a size-aligned area */static int plx9052_program_area(struct plx9052_socket *socket, int is_io,				int map, unsigned long sysbase,				unsigned long syslen, u32 cardbase,				unsigned int flags){	u32 brd;	u32 mask;	int area;	area = plx9052_get_area(socket, is_io, map);	if (area < 0) {		printk(KERN_ERR "No free areas left\n");		return -EINVAL;	}	pci_write_config_dword(socket->pdev, PLX_PCI_BASE(area),			       sysbase | is_io);	mask = ~(syslen - 1);	if (is_io)		mask = (mask & PLX_LAS_IOMASK) | PLX_LASRR_IO;	else		mask &= PLX_LAS_MEMMASK;	brd = plx9052_inl(socket, PLX_LASBRD(area));	brd &= ~PLX_LASBRD_WIDTH_MASK;	if (flags & MAP_16BIT)		brd |= PLX_LASBRD_WIDTH_16;	brd &= ~PLX_LASBRD_WS_MASK;	if (!(flags & MAP_0WS))		brd |= PLX_LASBRD_WS1;	plx9052_outl(socket, brd, PLX_LASBRD(area));	plx9052_outl(socket, mask, PLX_LASRR(area));	plx9052_outl(socket, cardbase | PLX_LASBA_ENABLE, PLX_LASBA(area));	return 0;}static int plx9052_init(struct pcmcia_socket *sock){	struct plx9052_socket *socket =	    container_of(sock, struct plx9052_socket, socket);#if 0	/* Dump all registers */	int i;	for (i = 0; i < 0x20; i++) {		printk("%08x ", plx9052_inl(socket, i << 2));		if ((i & 7) == 7)			printk("\n");	}#endif	/* Area 0 is used to access CIS from the driver */	plx9052_outl(socket, PLX_LASBA_ENABLE | PLX_CIS_START,		     PLX_LASBA(0));	socket->area_used[0] = 1;	plx9052_outl(socket,		     PLX_CIS_START | (PLX_MEMWIN_MAX >> 1) |		     PLX_CSBASE_ENABLE, PLX_CSBASE(0));	plx9052_outl(socket, (PLX_IOWIN_MAX >> 1) | PLX_CSBASE_ENABLE,		     PLX_CSBASE(1));	plx9052_enable_irq(socket);	socket->state.csc_mask |= SS_DETECT;	return 0;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品电影一区二区| 一区二区免费在线| 91蝌蚪porny| 蜜臀91精品一区二区三区| 亚洲国产成人在线| 欧美一卡二卡三卡四卡| 91浏览器入口在线观看| 精品一区二区三区av| 一区二区三区在线免费观看| 久久久久久久久久久99999| 欧美日韩亚州综合| a在线欧美一区| 韩国视频一区二区| 秋霞成人午夜伦在线观看| 国产精品成人免费在线| 欧美mv和日韩mv国产网站| 在线观看亚洲一区| 成人小视频在线| 国精产品一区一区三区mba桃花| 久久精品国产成人一区二区三区| 欧美一级二级三级乱码| 精品一二线国产| 国产精品久久久久一区| 日韩欧美资源站| 色综合咪咪久久| 精品一区二区三区视频在线观看 | 精品sm捆绑视频| 91丨porny丨国产入口| 色婷婷av一区| 成人午夜大片免费观看| 狠狠色丁香婷婷综合| 欧美韩日一区二区三区四区| 欧美在线啊v一区| 成人精品国产福利| 激情五月激情综合网| 日本视频免费一区| 日韩电影一区二区三区四区| 午夜欧美在线一二页| 亚洲伊人伊色伊影伊综合网| 日韩理论电影院| 一区二区在线免费| 亚洲自拍都市欧美小说| 亚洲午夜私人影院| 亚洲mv在线观看| 性久久久久久久久| 日韩电影在线一区二区三区| 日本欧美在线观看| 美女视频网站久久| 精彩视频一区二区三区| 国产在线精品免费av| 国产成人鲁色资源国产91色综| 从欧美一区二区三区| 成人av先锋影音| 91亚洲国产成人精品一区二三| 91免费视频大全| 欧美日韩视频第一区| 91精品国产综合久久精品图片| 欧美一区二区三区色| 亚洲精品一区二区三区香蕉| 国产欧美日韩在线视频| 中文字幕视频一区二区三区久| 亚洲欧美日韩综合aⅴ视频| 一级日本不卡的影视| 日韩成人伦理电影在线观看| 久久超级碰视频| 成人禁用看黄a在线| 一本到一区二区三区| 欧美日韩国产大片| 久久久午夜精品理论片中文字幕| 国产精品传媒视频| 日韩精品五月天| 国产成人在线视频免费播放| 91蜜桃视频在线| 欧美一二三四在线| 中文字幕日韩av资源站| 日日噜噜夜夜狠狠视频欧美人| 精东粉嫩av免费一区二区三区| 99久久99久久综合| 日韩午夜av电影| 国产精品高清亚洲| 日本大胆欧美人术艺术动态| 国产成人精品综合在线观看| 91福利资源站| 久久久久久久综合狠狠综合| 一区二区三区免费看视频| 黄色资源网久久资源365| 91老司机福利 在线| 精品人在线二区三区| 亚洲男人的天堂一区二区| 精品一区二区三区蜜桃| 欧美午夜精品一区二区三区| 久久久久久久久久美女| 天天操天天色综合| 成人91在线观看| 精品久久国产字幕高潮| 亚洲无人区一区| 波多野结衣欧美| 2021久久国产精品不只是精品| 亚洲精品国产成人久久av盗摄| 国模一区二区三区白浆| 欧美三级韩国三级日本一级| 中文字幕av一区 二区| 麻豆国产精品777777在线| 欧美视频在线观看一区| 国产精品二区一区二区aⅴ污介绍| 视频在线观看一区二区三区| av福利精品导航| 久久香蕉国产线看观看99| 日韩制服丝袜av| 欧美综合视频在线观看| 自拍av一区二区三区| 国产91丝袜在线播放| 欧美va亚洲va在线观看蝴蝶网| 午夜伦理一区二区| 色网站国产精品| 国产精品久久久一本精品 | 成人av电影免费在线播放| 欧美一区二区免费| 亚洲一区二区三区四区在线观看 | 日本美女视频一区二区| 欧美视频中文字幕| 伊人性伊人情综合网| 国产69精品久久777的优势| 欧美成人猛片aaaaaaa| 日韩制服丝袜先锋影音| 欧美日韩不卡在线| 亚洲一区在线免费观看| 日本久久电影网| 一区二区三区中文字幕精品精品 | 一区免费观看视频| 成人免费毛片嘿嘿连载视频| 久久综合久久综合亚洲| 国精产品一区一区三区mba桃花 | 成人一道本在线| 欧美高清在线精品一区| 粉嫩13p一区二区三区| 久久青草国产手机看片福利盒子 | 日韩不卡一区二区三区| 91精品国产一区二区三区香蕉 | 日日噜噜夜夜狠狠视频欧美人| 欧美日韩国产另类一区| 日韩精品国产精品| 91精品一区二区三区久久久久久 | 国产一区二区三区久久悠悠色av| 日韩精品一区二区三区在线播放 | 美女视频一区二区三区| 欧美sm极限捆绑bd| 国产乱子伦视频一区二区三区| 久久亚洲影视婷婷| 国产成人午夜视频| 国产精品乱码一区二区三区软件| 成熟亚洲日本毛茸茸凸凹| 中文av字幕一区| 91蜜桃网址入口| 亚洲午夜精品一区二区三区他趣| 欧美男女性生活在线直播观看| 日韩电影在线看| 国产亚洲精久久久久久| av电影一区二区| 亚洲韩国精品一区| 日韩一级片网址| 粉嫩av一区二区三区在线播放 | 天天综合天天做天天综合| 日韩精品一区二区三区三区免费| 精品无人码麻豆乱码1区2区| 欧美国产在线观看| 欧美性色综合网| 激情六月婷婷综合| 亚洲老司机在线| 欧美一区二区三区日韩| 国产成人在线色| 亚洲国产日韩综合久久精品| 91精选在线观看| av不卡免费电影| 丝袜美腿高跟呻吟高潮一区| 国产欧美一区二区精品性色| 91官网在线免费观看| 狠狠色丁香九九婷婷综合五月| 日韩毛片视频在线看| 91精品国产91久久久久久一区二区| 国产伦精品一区二区三区在线观看 | 亚洲成人tv网| 久久久久久99精品| 精品视频在线免费观看| 高清成人在线观看| 午夜电影一区二区三区| 欧美国产精品中文字幕| 在线电影一区二区三区| 懂色av一区二区夜夜嗨| 亚洲国产成人高清精品| 中文字幕av一区二区三区 | 亚洲欧美日韩中文播放 | 色综合久久久久久久久久久| 美女高潮久久久| 亚洲一卡二卡三卡四卡五卡| 国产欧美综合在线| 91麻豆精品国产91久久久久久 | 日韩午夜中文字幕| 欧美亚洲动漫精品| 成人精品gif动图一区|