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

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

?? es3210.c

?? linux和2410結合開發 用他可以生成2410所需的zImage文件
?? C
字號:
/*	es3210.c	Linux driver for Racal-Interlan ES3210 EISA Network Adapter	Copyright (C) 1996, Paul Gortmaker.	This software may be used and distributed according to the terms	of the GNU General Public License, incorporated herein by reference.	Information and Code Sources:	1) The existing myriad of Linux 8390 drivers written by Donald Becker.	2) Once again Russ Nelson's asm packet driver provided additional info.	3) Info for getting IRQ and sh-mem gleaned from the EISA cfg files.	   Too bad it doesn't work -- see below.	The ES3210 is an EISA shared memory NS8390 implementation. Note	that all memory copies to/from the board must be 32bit transfers.	Which rules out using eth_io_copy_and_sum() in this driver.	Apparently there are two slightly different revisions of the	card, since there are two distinct EISA cfg files (!rii0101.cfg	and !rii0102.cfg) One has media select in the cfg file and the	other doesn't. Hopefully this will work with either.	That is about all I can tell you about it, having never actually	even seen one of these cards. :)  Try http://www.interlan.com	if you want more info.	Thanks go to Mark Salazar for testing v0.02 of this driver.	Bugs, to-fix, etc:	1) The EISA cfg ports that are *supposed* to have the IRQ and shared	   mem values just read 0xff all the time. Hrrmpf. Apparently the	   same happens with the packet driver as the code for reading	   these registers is disabled there. In the meantime, boot with:	   ether=<IRQ>,0,0x<shared_mem_addr>,eth0 to override the IRQ and	   shared memory detection. (The i/o port detection is okay.)	2) Module support currently untested. Probably works though.*/static const char version[] =	"es3210.c: Driver revision v0.03, 14/09/96\n";#include <linux/module.h>#include <linux/kernel.h>#include <linux/sched.h>#include <linux/errno.h>#include <linux/string.h>#include <linux/init.h>#include <asm/io.h>#include <asm/system.h>#include <linux/netdevice.h>#include <linux/etherdevice.h>#include "8390.h"int es_probe(struct net_device *dev);static int es_probe1(struct net_device *dev, int ioaddr);static int es_open(struct net_device *dev);static int es_close(struct net_device *dev);static void es_reset_8390(struct net_device *dev);static void es_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page);static void es_block_input(struct net_device *dev, int count, struct sk_buff *skb, int ring_offset);static void es_block_output(struct net_device *dev, int count, const unsigned char *buf, int start_page);#define ES_START_PG	0x00    /* First page of TX buffer		*/#define ES_STOP_PG	0x40    /* Last page +1 of RX ring		*/#define ES_IO_EXTENT	0x37	/* The cfg file says 0xc90 -> 0xcc7	*/#define ES_ID_PORT	0xc80	/* Same for all EISA cards 		*/#define ES_SA_PROM	0xc90	/* Start of e'net addr.			*/#define ES_RESET_PORT	0xc84	/* From the packet driver source	*/#define ES_NIC_OFFSET	0xca0	/* Hello, the 8390 is *here*		*/#define ES_ADDR0	0x02	/* 3 byte vendor prefix			*/#define ES_ADDR1	0x07#define ES_ADDR2	0x01/* * Two card revisions. EISA ID's are always rev. minor, rev. major,, and * then the three vendor letters stored in 5 bits each, with an "a" = 1. * For eg: "rii" = 10010 01001 01001 = 0x4929, which is how the EISA * config utility determines automagically what config file(s) to use. */#define ES_EISA_ID1	0x01012949	/* !rii0101.cfg 		*/#define ES_EISA_ID2	0x02012949	/* !rii0102.cfg 		*/#define ES_CFG1		0xcc0	/* IOPORT(1) --> IOPORT(6) in cfg file	*/#define ES_CFG2		0xcc1#define ES_CFG3		0xcc2#define ES_CFG4		0xcc3#define ES_CFG5		0xcc4#define ES_CFG6		0xc84	/* NB: 0xc84 is also "reset" port.	*//* *	You can OR any of the following bits together and assign it *	to ES_DEBUG to get verbose driver info during operation. *	Some of these don't do anything yet. */#define ES_D_PROBE	0x01#define ES_D_RX_PKT	0x02#define ES_D_TX_PKT	0x04#define ED_D_IRQ	0x08#define ES_DEBUG	0static unsigned char lo_irq_map[] __initdata = {3, 4, 5, 6, 7, 9, 10};static unsigned char hi_irq_map[] __initdata = {11, 12, 0, 14, 0, 0, 0, 15};/* *	Probe for the card. The best way is to read the EISA ID if it *	is known. Then we check the prefix of the station address *	PROM for a match against the Racal-Interlan assigned value. */int __init es_probe(struct net_device *dev){	unsigned short ioaddr = dev->base_addr;	SET_MODULE_OWNER(dev);	if (ioaddr > 0x1ff)		/* Check a single specified location. */		return es_probe1(dev, ioaddr);	else if (ioaddr > 0)		/* Don't probe at all. */		return -ENXIO;	if (!EISA_bus) {#if ES_DEBUG & ES_D_PROBE		printk("es3210.c: Not EISA bus. Not probing high ports.\n");#endif		return -ENXIO;	}	/* EISA spec allows for up to 16 slots, but 8 is typical. */	for (ioaddr = 0x1000; ioaddr < 0x9000; ioaddr += 0x1000)		if (es_probe1(dev, ioaddr) == 0)			return 0;	return -ENODEV;}static int __init es_probe1(struct net_device *dev, int ioaddr){	int i, retval;	unsigned long eisa_id;	if (!request_region(ioaddr + ES_SA_PROM, ES_IO_EXTENT, "es3210"))		return -ENODEV;#if ES_DEBUG & ES_D_PROBE	printk("es3210.c: probe at %#x, ID %#8x\n", ioaddr, inl(ioaddr + ES_ID_PORT));	printk("es3210.c: config regs: %#x %#x %#x %#x %#x %#x\n",		inb(ioaddr + ES_CFG1), inb(ioaddr + ES_CFG2), inb(ioaddr + ES_CFG3),		inb(ioaddr + ES_CFG4), inb(ioaddr + ES_CFG5), inb(ioaddr + ES_CFG6));#endif/*	Check the EISA ID of the card. */	eisa_id = inl(ioaddr + ES_ID_PORT);	if ((eisa_id != ES_EISA_ID1) && (eisa_id != ES_EISA_ID2)) {		retval = -ENODEV;		goto out;	}/*	Check the Racal vendor ID as well. */	if (inb(ioaddr + ES_SA_PROM + 0) != ES_ADDR0		|| inb(ioaddr + ES_SA_PROM + 1) != ES_ADDR1		|| inb(ioaddr + ES_SA_PROM + 2) != ES_ADDR2 ) {		printk("es3210.c: card not found");		for(i = 0; i < ETHER_ADDR_LEN; i++)			printk(" %02x", inb(ioaddr + ES_SA_PROM + i));		printk(" (invalid prefix).\n");		retval = -ENODEV;		goto out;	}	printk("es3210.c: ES3210 rev. %ld at %#x, node", eisa_id>>24, ioaddr);	for(i = 0; i < ETHER_ADDR_LEN; i++)		printk(" %02x", (dev->dev_addr[i] = inb(ioaddr + ES_SA_PROM + i)));	/* Snarf the interrupt now. */	if (dev->irq == 0) {		unsigned char hi_irq = inb(ioaddr + ES_CFG2) & 0x07;		unsigned char lo_irq = inb(ioaddr + ES_CFG1) & 0xfe;		if (hi_irq != 0) {			dev->irq = hi_irq_map[hi_irq - 1];		} else {			int i = 0;			while (lo_irq > (1<<i)) i++;			dev->irq = lo_irq_map[i];		}		printk(" using IRQ %d", dev->irq);#if ES_DEBUG & ES_D_PROBE		printk("es3210.c: hi_irq %#x, lo_irq %#x, dev->irq = %d\n",					hi_irq, lo_irq, dev->irq);#endif	} else {		if (dev->irq == 2)			dev->irq = 9;			/* Doh! */		printk(" assigning IRQ %d", dev->irq);	}	if (request_irq(dev->irq, ei_interrupt, 0, "es3210", dev)) {		printk (" unable to get IRQ %d.\n", dev->irq);		retval = -EAGAIN;		goto out;	}	if (dev->mem_start == 0) {		unsigned char mem_enabled = inb(ioaddr + ES_CFG2) & 0xc0;		unsigned char mem_bits = inb(ioaddr + ES_CFG3) & 0x07;		if (mem_enabled != 0x80) {			printk(" shared mem disabled - giving up\n");			retval = -ENXIO;			goto out1;		}		dev->mem_start = 0xC0000 + mem_bits*0x4000;		printk(" using ");	} else {		printk(" assigning ");	}	dev->mem_end = dev->rmem_end = dev->mem_start		+ (ES_STOP_PG - ES_START_PG)*256;	dev->rmem_start = dev->mem_start + TX_PAGES*256;	printk("mem %#lx-%#lx\n", dev->mem_start, dev->mem_end-1);	/* Allocate dev->priv and fill in 8390 specific dev fields. */	if (ethdev_init(dev)) {		printk (" unable to allocate memory for dev->priv.\n");		retval = -ENOMEM;		goto out1;	}#if ES_DEBUG & ES_D_PROBE	if (inb(ioaddr + ES_CFG5))		printk("es3210: Warning - DMA channel enabled, but not used here.\n");#endif	/* Note, point at the 8390, and not the card... */	dev->base_addr = ioaddr + ES_NIC_OFFSET;	ei_status.name = "ES3210";	ei_status.tx_start_page = ES_START_PG;	ei_status.rx_start_page = ES_START_PG + TX_PAGES;	ei_status.stop_page = ES_STOP_PG;	ei_status.word16 = 1;	if (ei_debug > 0)		printk(version);	ei_status.reset_8390 = &es_reset_8390;	ei_status.block_input = &es_block_input;	ei_status.block_output = &es_block_output;	ei_status.get_8390_hdr = &es_get_8390_hdr;	dev->open = &es_open;	dev->stop = &es_close;	NS8390_init(dev, 0);	return 0;out1:	free_irq(dev->irq, dev);out:	release_region(ioaddr + ES_SA_PROM, ES_IO_EXTENT);	return retval;}/* *	Reset as per the packet driver method. Judging by the EISA cfg *	file, this just toggles the "Board Enable" bits (bit 2 and 0). */static void es_reset_8390(struct net_device *dev){	unsigned short ioaddr = dev->base_addr;	unsigned long end;	outb(0x04, ioaddr + ES_RESET_PORT);	if (ei_debug > 1) printk("%s: resetting the ES3210...", dev->name);	end = jiffies + 2*HZ/100;        while ((signed)(end - jiffies) > 0) continue;	ei_status.txing = 0;	outb(0x01, ioaddr + ES_RESET_PORT);	if (ei_debug > 1) printk("reset done\n");	return;}/* *	Note: In the following three functions is the implicit assumption *	that the associated memcpy will only use "rep; movsl" as long as *	we keep the counts as some multiple of doublewords. This is a *	requirement of the hardware, and also prevents us from using *	eth_io_copy_and_sum() since we can't guarantee it will limit *	itself to doubleword access. *//* *	Grab the 8390 specific header. Similar to the block_input routine, but *	we don't need to be concerned with ring wrap as the header will be at *	the start of a page, so we optimize accordingly. (A single doubleword.) */static voides_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page){	unsigned long hdr_start = dev->mem_start + ((ring_page - ES_START_PG)<<8);	isa_memcpy_fromio(hdr, hdr_start, sizeof(struct e8390_pkt_hdr));	hdr->count = (hdr->count + 3) & ~3;     /* Round up allocation. */}/* *	Block input and output are easy on shared memory ethercards, the only *	complication is when the ring buffer wraps. The count will already *	be rounded up to a doubleword value via es_get_8390_hdr() above. */static void es_block_input(struct net_device *dev, int count, struct sk_buff *skb,						  int ring_offset){	unsigned long xfer_start = dev->mem_start + ring_offset - (ES_START_PG<<8);	if (xfer_start + count > dev->rmem_end) {		/* Packet wraps over end of ring buffer. */		int semi_count = dev->rmem_end - xfer_start;		isa_memcpy_fromio(skb->data, xfer_start, semi_count);		count -= semi_count;		isa_memcpy_fromio(skb->data + semi_count, dev->rmem_start, count);	} else {		/* Packet is in one chunk. */		isa_eth_io_copy_and_sum(skb, xfer_start, count, 0);	}}static void es_block_output(struct net_device *dev, int count,				const unsigned char *buf, int start_page){	unsigned long shmem = dev->mem_start + ((start_page - ES_START_PG)<<8);	count = (count + 3) & ~3;     /* Round up to doubleword */	isa_memcpy_toio(shmem, buf, count);}static int es_open(struct net_device *dev){	ei_open(dev);	return 0;}static int es_close(struct net_device *dev){	if (ei_debug > 1)		printk("%s: Shutting down ethercard.\n", dev->name);	ei_close(dev);	return 0;}#ifdef MODULE#define MAX_ES_CARDS	4	/* Max number of ES3210 cards per module */#define NAMELEN		8	/* # of chars for storing dev->name */static struct net_device dev_es3210[MAX_ES_CARDS];static int io[MAX_ES_CARDS];static int irq[MAX_ES_CARDS];static int mem[MAX_ES_CARDS];MODULE_PARM(io, "1-" __MODULE_STRING(MAX_ES_CARDS) "i");MODULE_PARM(irq, "1-" __MODULE_STRING(MAX_ES_CARDS) "i");MODULE_PARM(mem, "1-" __MODULE_STRING(MAX_ES_CARDS) "i");MODULE_PARM_DESC(io, "ES3210 I/O base address(es)");MODULE_PARM_DESC(irq, "ES3210 IRQ number(s)");MODULE_PARM_DESC(mem, "ES3210 memory base address(es)");intinit_module(void){	int this_dev, found = 0;	for (this_dev = 0; this_dev < MAX_ES_CARDS; this_dev++) {		struct net_device *dev = &dev_es3210[this_dev];		dev->irq = irq[this_dev];		dev->base_addr = io[this_dev];		dev->mem_start = mem[this_dev];		/* Currently ignored by driver */		dev->init = es_probe;		/* Default is to only install one card. */		if (io[this_dev] == 0 && this_dev != 0) break;		if (register_netdev(dev) != 0) {			printk(KERN_WARNING "es3210.c: No es3210 card found (i/o = 0x%x).\n", io[this_dev]);			if (found != 0) {	/* Got at least one. */				return 0;			}			return -ENXIO;		}		found++;	}	return 0;}voidcleanup_module(void){	int this_dev;	for (this_dev = 0; this_dev < MAX_ES_CARDS; this_dev++) {		struct net_device *dev = &dev_es3210[this_dev];		if (dev->priv != NULL) {			void *priv = dev->priv;			free_irq(dev->irq, dev);			release_region(dev->base_addr, ES_IO_EXTENT);			unregister_netdev(dev);			kfree(priv);		}	}}#endif /* MODULE */MODULE_LICENSE("GPL");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本不卡一区二区| 日本女优在线视频一区二区| 亚洲四区在线观看| 亚洲综合一区二区| 蜜臀va亚洲va欧美va天堂| 精品一二三四区| 国产成人在线免费观看| 成人精品国产一区二区4080| 91蝌蚪porny九色| 91麻豆精品久久久久蜜臀| 精品国产乱码久久久久久图片| 国产亚洲欧美色| 亚洲国产精品自拍| 国模娜娜一区二区三区| 91一区二区三区在线播放| 欧美日韩国产成人在线免费| 国产欧美日韩不卡| 日韩精品免费视频人成| 91在线视频免费观看| 欧美成人a在线| 亚洲va在线va天堂| 一本色道久久综合亚洲精品按摩 | 欧美亚洲综合久久| 亚洲第一成人在线| 99久久精品国产导航| 精品国产乱码91久久久久久网站| 一区二区三区中文在线观看| 国产成人午夜精品影院观看视频 | 91热门视频在线观看| 久久先锋影音av鲁色资源| 日韩精品欧美精品| 欧美日韩精品欧美日韩精品| 一区二区三区.www| 91久久奴性调教| 亚洲成人在线免费| 欧美日韩在线播放| 视频精品一区二区| 2021国产精品久久精品| 精品一区二区久久| 中文字幕欧美国产| caoporn国产一区二区| 不卡视频在线看| 一区二区三区精品| 91精品国产一区二区| 国产一区二区免费看| 日本一区二区成人| 色av成人天堂桃色av| 亚洲线精品一区二区三区八戒| 欧美高清视频不卡网| 精品亚洲欧美一区| 亚洲精品国产a| 久久亚洲欧美国产精品乐播| 不卡的av电影| 日韩在线一二三区| 日本一区二区三区在线观看| 色吊一区二区三区| 国产乱子轮精品视频| 亚洲福利视频一区| 国产欧美综合在线| 91精品福利在线一区二区三区 | 国产视频在线观看一区二区三区| 色综合天天综合狠狠| 久久99国产乱子伦精品免费| 一区二区三区在线播| 久久欧美中文字幕| 日韩一区二区三区在线观看| 99天天综合性| 丁香六月综合激情| 久久电影网站中文字幕| 伊人色综合久久天天人手人婷| 日本一区二区成人| 国产日韩欧美一区二区三区乱码 | 欧美性猛片xxxx免费看久爱| 国产成人一区二区精品非洲| 免费在线观看精品| 精品影视av免费| 午夜精品久久久久| 亚洲综合免费观看高清完整版在线| 国产日韩精品一区二区三区| www国产精品av| 亚洲国产精品精华液ab| 亚洲色大成网站www久久九九| 久久久电影一区二区三区| 精品久久国产97色综合| 久久九九久精品国产免费直播| 久久久蜜桃精品| 国产精品另类一区| 亚洲蜜臀av乱码久久精品| 亚洲欧洲av在线| 亚洲成av人在线观看| 亚洲成a人v欧美综合天堂| 免费在线一区观看| www.日韩大片| 91精品国产综合久久久久| 精品国产免费一区二区三区四区 | 日韩精品中午字幕| 国产精品区一区二区三区| 五月激情六月综合| 成人黄色大片在线观看| 欧美高清www午色夜在线视频| 欧美大尺度电影在线| 中文字幕在线一区二区三区| 水野朝阳av一区二区三区| 精品无人码麻豆乱码1区2区| 不卡的电影网站| 日韩欧美视频一区| 一区二区免费在线| 国产寡妇亲子伦一区二区| 91精品久久久久久久91蜜桃| 1024成人网| 国产精品911| 久久久美女毛片| 国产一区二区三区久久久| 91蜜桃在线观看| 日本一二三不卡| 国产呦精品一区二区三区网站| 欧美日本精品一区二区三区| 亚洲自拍偷拍麻豆| 色综合中文字幕国产| 国产亚洲欧美激情| 黄色精品一二区| 久久综合九色综合久久久精品综合 | 亚洲人成在线播放网站岛国 | 精品裸体舞一区二区三区| 亚洲电影一区二区| 91福利社在线观看| 亚洲精选视频在线| 欧美中文字幕一二三区视频| 亚洲欧美一区二区三区极速播放| 国产成人精品网址| 国产精品久久毛片a| 成人激情免费电影网址| 亚洲欧美经典视频| 色综合久久中文综合久久牛| 一级特黄大欧美久久久| 91精品国产欧美一区二区成人| 亚洲成人自拍网| 久久综合资源网| 成人黄色国产精品网站大全在线免费观看 | 亚洲国产精品久久艾草纯爱| 91精品国产综合久久久久久久| 蜜臀91精品一区二区三区| 国产视频一区在线播放| 欧美日韩日日摸| 成人av在线资源| 免费在线观看成人| 亚洲欧美日韩国产综合在线| 欧美电影免费观看高清完整版在 | 日本在线播放一区二区三区| 欧美极品少妇xxxxⅹ高跟鞋| 在线亚洲一区观看| 国产精品系列在线观看| 一卡二卡三卡日韩欧美| 久久精品无码一区二区三区| 一本大道综合伊人精品热热| 日本大胆欧美人术艺术动态 | 国产伦精品一区二区三区免费| 一区二区三区影院| 国产精品美女久久久久久久| 欧美肥妇毛茸茸| 色偷偷久久一区二区三区| 国产91露脸合集magnet| 狠狠色丁香婷综合久久| 天堂午夜影视日韩欧美一区二区| 最新国产精品久久精品| 国产三级精品三级| 久久精品亚洲精品国产欧美| 精品国产三级a在线观看| 日韩一区二区三区在线| 7777精品伊人久久久大香线蕉的 | 午夜视频在线观看一区| 亚洲丝袜自拍清纯另类| 国产精品狼人久久影院观看方式| 国产女人aaa级久久久级| 久久蜜桃av一区二区天堂| a在线播放不卡| 成人综合日日夜夜| 日韩精品一区二区三区三区免费 | 欧美亚洲国产怡红院影院| 欧美妇女性影城| 国产午夜精品一区二区| 国产精品久久久久久久裸模| 午夜精品久久久久久久久 | 国产精品理伦片| 美女www一区二区| 国产91精品精华液一区二区三区 | 激情六月婷婷久久| 91.成人天堂一区| 亚洲视频一二三区| 国产成人综合在线| 777亚洲妇女| 亚洲.国产.中文慕字在线| 成人激情综合网站| 精品福利一二区| 久久精品久久99精品久久| 色域天天综合网| 亚洲一区在线视频观看| 91蝌蚪porny九色| 一区二区三区四区在线免费观看 | 久久99久久精品|