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

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

?? plx9052-26.c

?? 關于linux中pci驅動的一些代碼,實現了一些功能
?? 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;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产区在线观看成人精品| 久久久九九九九| 国产乱码字幕精品高清av| 久久99久久久欧美国产| 国产综合久久久久影院| 99久久99久久久精品齐齐| 在线精品视频免费观看| 日韩三区在线观看| 日本一区二区三区免费乱视频| 国内精品伊人久久久久影院对白| 2022国产精品视频| 国产精品国产a级| 日韩黄色在线观看| 国产馆精品极品| 欧美日韩国产高清一区| 日本一区二区成人| 六月丁香综合在线视频| 久久综合九色综合97婷婷| 欧美日韩国产美女| 免播放器亚洲一区| 色婷婷激情综合| 精品国产三级电影在线观看| 亚洲图片你懂的| 国产一区二区免费看| 欧美日韩精品一区二区三区蜜桃| 日韩高清在线观看| 在线观看欧美精品| 免费观看久久久4p| 国产欧美精品一区二区色综合| 色综合av在线| 国精品**一区二区三区在线蜜桃| 亚洲蜜臀av乱码久久精品| 国产精品一区二区久激情瑜伽| 亚洲日本在线观看| 欧美一区二区三区白人| 天使萌一区二区三区免费观看| 久久色中文字幕| 欧美性xxxxxxxx| 亚洲一区在线电影| 91蜜桃在线免费视频| 17c精品麻豆一区二区免费| 国产露脸91国语对白| 亚洲一卡二卡三卡四卡五卡| wwwwxxxxx欧美| 欧美日韩国产片| 91极品美女在线| 亚洲h在线观看| 欧美日韩精品欧美日韩精品一| 国产一区不卡在线| 丝袜美腿亚洲综合| 亚洲乱码中文字幕| 欧美精品九九99久久| 日韩在线a电影| 国产精品视频yy9299一区| 国产成人午夜精品影院观看视频 | 日韩欧美一区二区在线视频| 亚洲一级不卡视频| 国产视频一区二区在线观看| 国产精品123| 美腿丝袜亚洲色图| 久久久久久久久久久久电影| 欧美视频自拍偷拍| 91无套直看片红桃| 成人丝袜高跟foot| 国产视频在线观看一区二区三区| 日韩一级视频免费观看在线| 欧美精品一级二级三级| 欧美三级电影网| 伦理电影国产精品| 亚洲1区2区3区视频| 亚洲蜜臀av乱码久久精品蜜桃| 中文字幕制服丝袜一区二区三区 | 久久久久一区二区三区四区| 欧美一区二区三区不卡| 日韩午夜精品电影| 日韩欧美综合在线| 日韩免费电影一区| 欧美成人bangbros| 97久久久精品综合88久久| 国产成人一级电影| 成人深夜福利app| 波波电影院一区二区三区| 亚洲男人的天堂在线观看| 国产精品乱码人人做人人爱 | 亚洲午夜电影网| 国产喷白浆一区二区三区| 欧美精品一区二区不卡| 久久亚洲精品国产精品紫薇| 久久综合一区二区| 三级精品在线观看| 午夜一区二区三区视频| 久久综合九色综合欧美亚洲| 欧美成人乱码一区二区三区| 久久免费电影网| 亚洲国产精品成人综合色在线婷婷 | 91麻豆精品在线观看| 91色.com| 欧美喷水一区二区| 精品日韩一区二区三区| 国产欧美日韩不卡| 国产精品国产三级国产| 亚洲激情第一区| 三级影片在线观看欧美日韩一区二区| 美洲天堂一区二卡三卡四卡视频| 国产毛片精品视频| 波多野结衣中文字幕一区| 青青草成人在线观看| 捆绑紧缚一区二区三区视频| 国产成人免费网站| 91丝袜美女网| 日韩欧美你懂的| 中文字幕高清一区| 一区二区三区四区不卡在线| 国产精品麻豆一区二区| 一区二区三区不卡在线观看| 秋霞午夜av一区二区三区| 国产高清精品在线| 欧美伊人久久久久久久久影院| 欧美不卡123| 亚洲女人的天堂| 奇米亚洲午夜久久精品| 成人国产电影网| 欧美一区二区三区免费大片| 国产精品国产三级国产普通话三级| 亚洲国产va精品久久久不卡综合| 国产在线日韩欧美| 色偷偷一区二区三区| 91精品在线免费观看| 4438x成人网最大色成网站| 国产亚洲成aⅴ人片在线观看 | 同产精品九九九| 国产白丝网站精品污在线入口| 国产一区二区免费看| 色爱区综合激月婷婷| 久久久久久麻豆| 亚洲综合成人在线视频| 国内精品久久久久影院薰衣草 | 色婷婷综合中文久久一本| 日韩一级大片在线观看| 亚洲女人的天堂| 成人美女在线视频| 日韩欧美国产高清| 亚洲国产视频a| 色综合久久综合| 国产欧美一区二区三区沐欲| 视频一区免费在线观看| 色拍拍在线精品视频8848| 中文字幕精品一区二区三区精品| 韩国一区二区在线观看| 欧美久久久久久久久久| 亚洲欧洲中文日韩久久av乱码| 国产精品一区在线观看你懂的| 日韩午夜激情免费电影| 三级成人在线视频| 欧美日韩一区二区三区在线| 亚洲人成网站在线| 大白屁股一区二区视频| 欧美成人伊人久久综合网| 日韩福利电影在线| 欧美午夜精品一区二区蜜桃| 一区二区三区在线视频免费观看| 99久久er热在这里只有精品66| 国产精品视频第一区| 大白屁股一区二区视频| 欧美高清在线精品一区| 国产成人综合亚洲91猫咪| 久久一二三国产| 国产成人亚洲精品狼色在线| 欧美韩国一区二区| 丁香一区二区三区| 欧美激情艳妇裸体舞| 成人综合婷婷国产精品久久蜜臀| 国产午夜精品久久久久久免费视| 国产呦精品一区二区三区网站| 日韩精品影音先锋| 激情文学综合丁香| 精品国产乱码久久久久久浪潮| 韩国欧美国产1区| 欧美国产精品v| 99久久99久久精品免费看蜜桃| 亚洲精品国产a| 欧美久久久久久蜜桃| 欧美bbbbb| 国产无人区一区二区三区| 粉嫩aⅴ一区二区三区四区五区 | 欧美一区二区三区白人 | 成人久久18免费网站麻豆 | 色婷婷综合久久久中文字幕| 亚洲麻豆国产自偷在线| 欧美三级视频在线| 国产亚洲短视频| 国产激情一区二区三区四区| 久久久精品免费观看| 成人免费视频app| 亚洲欧美日韩电影| 欧美剧情片在线观看| 久久99精品国产| 国产成人激情av| 日韩一区在线播放| 欧美日韩亚洲另类|