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

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

?? 3c509.c

?? 內核是系統的心臟
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* 3c509.c: A 3c509 EtherLink3 ethernet driver for linux. */
/*
	Written 1993 by Donald Becker.

	Copyright 1993 United States Government as represented by the
	Director, National Security Agency.	 This software may be used and
	distributed according to the terms of the GNU Public License,
	incorporated herein by reference.
	
	This driver is for the 3Com EtherLinkIII series.

	The author may be reached as becker@super.org or
	C/O Supercomputing Research Ctr., 17100 Science Dr., Bowie MD 20715
*/

static char *version = "3c509.c:pl15k 3/5/94 becker@super.org\n";

#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/string.h>
#include <linux/interrupt.h>
#include <linux/ptrace.h>
#include <linux/errno.h>
#include <linux/in.h>
#include <linux/malloc.h>
#include <linux/ioport.h>
#include <asm/bitops.h>
#include <asm/io.h>

#include "dev.h"
#include "eth.h"
#include "skbuff.h"
#include "arp.h"

#ifndef HAVE_ALLOC_SKB
#define alloc_skb(size, priority) (struct sk_buff *) kmalloc(size,priority)
#endif


#ifdef EL3_DEBUG
int el3_debug = EL3_DEBUG;
#else
int el3_debug = 2;
#endif

/* To minimize the size of the driver source I only define operating
   constants if they are used several times.  You'll need the manual
   if you want to understand driver details. */
/* Offsets from base I/O address. */
#define EL3_DATA 0x00
#define EL3_CMD 0x0e
#define EL3_STATUS 0x0e
#define ID_PORT 0x100
#define	 EEPROM_READ 0x80

#define EL3WINDOW(win_num) outw(0x0800+(win_num), ioaddr + EL3_CMD)

/* Register window 1 offsets, the window used in normal operation. */
#define TX_FIFO		0x00
#define RX_FIFO		0x00
#define RX_STATUS 	0x08
#define TX_STATUS 	0x0B
#define TX_FREE		0x0C		/* Remaining free bytes in Tx buffer. */

#define WN4_MEDIA	0x0A		/* Window 4: Various transceiver/media bits. */
#define  MEDIA_TP	0x00C0		/* Enable link beat and jabber for 10baseT. */

struct el3_private {
	struct enet_statistics stats;
};

static ushort id_read_eeprom(int index);
static ushort read_eeprom(short ioaddr, int index);
static int el3_open(struct device *dev);
static int el3_start_xmit(struct sk_buff *skb, struct device *dev);
static void el3_interrupt(int reg_ptr);
static void update_stats(int addr, struct device *dev);
static struct enet_statistics *el3_get_stats(struct device *dev);
static int el3_rx(struct device *dev);
static int el3_close(struct device *dev);
#ifdef HAVE_MULTICAST
static void set_multicast_list(struct device *dev, int num_addrs, void *addrs);
#endif



int el3_probe(struct device *dev)
{
	short lrs_state = 0xff, i;
	ushort ioaddr, irq, if_port;
	short *phys_addr = (short *)dev->dev_addr;
	static int current_tag = 0;

	/* First check for a board on the EISA bus. */
	if (EISA_bus) {
		for (ioaddr = 0x1000; ioaddr < 0x9000; ioaddr += 0x1000) {
			if (inw(ioaddr) != 0x6d50)
				continue;

			irq = inw(ioaddr + 8) >> 12;
			if_port = inw(ioaddr + 6)>>14;
			for (i = 0; i < 3; i++)
				phys_addr[i] = htons(read_eeprom(ioaddr, i));

			/* Restore the "Manufacturer ID" to the EEPROM read register. */
			/* The manual says to restore "Product ID" (reg. 3). !???! */
			read_eeprom(ioaddr, 7);

			/* Was the EISA code an add-on hack?  Nahhhhh... */
			goto found;
		}
	}

#ifdef CONFIG_MCA
	if (MCA_bus) {
		mca_adaptor_select_mode(1);
		for (i = 0; i < 8; i++)
			if ((mca_adaptor_id(i) | 1) == 0x627c) {
				ioaddr = mca_pos_base_addr(i);
				irq = inw(ioaddr + 8) >> 12;
				if_port = inw(ioaddr + 6)>>14;
				for (i = 0; i < 3; i++)
					phys_addr[i] = htons(read_eeprom(ioaddr, i));

				mca_adaptor_select_mode(0);
				goto found;
			}
		mca_adaptor_select_mode(0);

	}
#endif	  

	/* Send the ID sequence to the ID_PORT. */
	outb(0x00, ID_PORT);
	outb(0x00, ID_PORT);
	for(i = 0; i < 255; i++) {
		outb(lrs_state, ID_PORT);
		lrs_state <<= 1;
		lrs_state = lrs_state & 0x100 ? lrs_state ^ 0xcf : lrs_state;
	}

	/* For the first probe, clear all board's tag registers. */
	if (current_tag == 0)
		outb(0xd0, ID_PORT);
	else				/* Otherwise kill off already-found boards. */
		outb(0xd8, ID_PORT);

	if (id_read_eeprom(7) != 0x6d50) {
		return -ENODEV;
	}

	/* Read in EEPROM data, which does contention-select.
	   Only the lowest address board will stay "on-line".
	   3Com got the byte order backwards. */
	for (i = 0; i < 3; i++) {
		phys_addr[i] = htons(id_read_eeprom(i));
	}

	{
		unsigned short iobase = id_read_eeprom(8);
		if_port = iobase >> 14;
		ioaddr = 0x200 + ((iobase & 0x1f) << 4);
	}
	irq = id_read_eeprom(9) >> 12;

	/* The current Space.c structure makes it difficult to have more
	   than one adaptor initialized.  Send me email if you have a need for
	   multiple adaptors, and we'll work out something.	 -becker@super.org */
	if (dev->base_addr != 0
		&&	dev->base_addr != (unsigned short)ioaddr) {
		return -ENODEV;
	}

	/* Set the adaptor tag so that the next card can be found. */
	outb(0xd0 + ++current_tag, ID_PORT);

	/* Activate the adaptor at the EEPROM location. */
	outb(0xff, ID_PORT);

	EL3WINDOW(0);
	if (inw(ioaddr) != 0x6d50)
		return -ENODEV;

 found:
	dev->base_addr = ioaddr;
	dev->irq = irq;
	dev->if_port = if_port;
	snarf_region(dev->base_addr, 16);

	{
		char *if_names[] = {"10baseT", "AUI", "undefined", "BNC"};
		printk("%s: 3c509 at %#3.3x tag %d, %s port, address ",
			   dev->name, dev->base_addr, current_tag, if_names[dev->if_port]);
	}

	/* Read in the station address. */
	for (i = 0; i < 6; i++)
		printk(" %2.2x", dev->dev_addr[i]);
	printk(", IRQ %d.\n", dev->irq);

	/* Make up a EL3-specific-data structure. */
	dev->priv = kmalloc(sizeof(struct el3_private), GFP_KERNEL);
	memset(dev->priv, 0, sizeof(struct el3_private));

	if (el3_debug > 0)
		printk(version);

	/* The EL3-specific entries in the device structure. */
	dev->open = &el3_open;
	dev->hard_start_xmit = &el3_start_xmit;
	dev->stop = &el3_close;
	dev->get_stats = &el3_get_stats;
#ifdef HAVE_MULTICAST
		dev->set_multicast_list = &set_multicast_list;
#endif

	/* Fill in the generic fields of the device structure. */
	for (i = 0; i < DEV_NUMBUFFS; i++)
		dev->buffs[i] = NULL;

	dev->hard_header	= eth_header;
	dev->add_arp		= eth_add_arp;
	dev->queue_xmit		= dev_queue_xmit;
	dev->rebuild_header = eth_rebuild_header;
	dev->type_trans		= eth_type_trans;

	dev->type			= ARPHRD_ETHER;
	dev->hard_header_len = ETH_HLEN;
	dev->mtu			= 1500; /* eth_mtu */
	dev->addr_len		= ETH_ALEN;
	for (i = 0; i < ETH_ALEN; i++) {
		dev->broadcast[i]=0xff;
	}

	/* New-style flags. */
	dev->flags			= IFF_BROADCAST;
	dev->family			= AF_INET;
	dev->pa_addr		= 0;
	dev->pa_brdaddr		= 0;
	dev->pa_mask		= 0;
	dev->pa_alen		= sizeof(unsigned long);

	return 0;
}

/* Read a word from the EEPROM using the regular EEPROM access register.
   Assume that we are in register window zero.
 */
static ushort read_eeprom(short ioaddr, int index)
{
	int timer;

	outw(EEPROM_READ + index, ioaddr + 10);
	/* Pause for at least 162 us. for the read to take place. */
	for (timer = 0; timer < 162*4 + 400; timer++)
		SLOW_DOWN_IO;
	return inw(ioaddr + 12);
}

/* Read a word from the EEPROM when in the ISA ID probe state. */
static ushort id_read_eeprom(int index)
{
	int timer, bit, word = 0;
	
	/* Issue read command, and pause for at least 162 us. for it to complete.
	   Assume extra-fast 16Mhz bus. */
	outb(EEPROM_READ + index, ID_PORT);

	/* This should really be done by looking at one of the timer channels. */
	for (timer = 0; timer < 162*4 + 400; timer++)
		SLOW_DOWN_IO;

	for (bit = 15; bit >= 0; bit--)
		word = (word << 1) + (inb(ID_PORT) & 0x01);
		
	if (el3_debug > 3)
		printk("  3c509 EEPROM word %d %#4.4x.\n", index, word);

	return word;
}



static int
el3_open(struct device *dev)
{
	int ioaddr = dev->base_addr;
	int i;

	if (request_irq(dev->irq, &el3_interrupt)) {
		return -EAGAIN;
	}

	EL3WINDOW(0);
	if (el3_debug > 3)
		printk("%s: Opening, IRQ %d	 status@%x %4.4x.\n", dev->name,
			   dev->irq, ioaddr + EL3_STATUS, inw(ioaddr + EL3_STATUS));

	/* Activate board: this is probably unnecessary. */
	outw(0x0001, ioaddr + 4);

	irq2dev_map[dev->irq] = dev;

	/* Set the IRQ line. */
	outw((dev->irq << 12) | 0x0f00, ioaddr + 8);

	/* Set the station address in window 2 each time opened. */
	EL3WINDOW(2);

	for (i = 0; i < 6; i++)
		outb(dev->dev_addr[i], ioaddr + i);

	if (dev->if_port == 3)
		/* Start the thinnet transceiver. We should really wait 50ms...*/
		outw(0x1000, ioaddr + EL3_CMD);
	else if (dev->if_port == 0) {
		/* 10baseT interface, enabled link beat and jabber check. */
		EL3WINDOW(4);
		outw(inw(ioaddr + WN4_MEDIA) | MEDIA_TP, ioaddr + WN4_MEDIA);
	}

	/* Switch to register set 1 for normal use. */
	EL3WINDOW(1);

	outw(0x8005, ioaddr + EL3_CMD); /* Accept b-case and phys addr only. */
	outw(0xA800, ioaddr + EL3_CMD); /* Turn on statistics. */
	outw(0x2000, ioaddr + EL3_CMD); /* Enable the receiver. */
	outw(0x4800, ioaddr + EL3_CMD); /* Enable transmitter. */
	outw(0x78ff, ioaddr + EL3_CMD); /* Allow all status bits to be seen. */
	dev->interrupt = 0;
	dev->tbusy = 0;
	dev->start = 1;
	outw(0x7098, ioaddr + EL3_CMD); /* Set interrupt mask. */

	if (el3_debug > 3)
		printk("%s: Opened 3c509  IRQ %d  status %4.4x.\n",
			   dev->name, dev->irq, inw(ioaddr + EL3_STATUS));

	return 0;					/* Always succeed */
}

static int
el3_start_xmit(struct sk_buff *skb, struct device *dev)
{
	struct el3_private *lp = (struct el3_private *)dev->priv;
	int ioaddr = dev->base_addr;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一本到一区二区三区| 亚洲午夜av在线| 人人狠狠综合久久亚洲| 99re在线精品| 欧美韩日一区二区三区四区| 蜜臀av性久久久久av蜜臀妖精| 99久久国产免费看| 国产精品毛片久久久久久久| 青青草97国产精品免费观看无弹窗版| 一本大道av一区二区在线播放| 久久久久久亚洲综合影院红桃| 精品一区二区成人精品| 日韩一级片在线播放| 日韩精品亚洲专区| 欧美日韩久久久| 日韩va欧美va亚洲va久久| 欧美日韩成人在线一区| 亚洲成人资源网| 欧美一区二区三区婷婷月色| 丝袜美腿成人在线| 日韩午夜在线播放| 激情综合网天天干| 国产婷婷一区二区| 99视频在线精品| 亚洲高清中文字幕| 日韩欧美不卡一区| 国产成人鲁色资源国产91色综| 国产女人aaa级久久久级| av在线综合网| 亚洲bt欧美bt精品777| 欧美一级片在线| 国产成人自拍网| 亚洲精品久久久久久国产精华液| 欧美亚洲动漫精品| 久久99精品久久久久| 国产欧美一区二区三区在线老狼| 99精品视频在线播放观看| 亚洲一区二三区| 久久这里只有精品首页| 91在线精品一区二区| 日韩av在线免费观看不卡| 欧美国产日产图区| 91精品国产色综合久久不卡蜜臀 | 日韩欧美一区在线观看| 国产成人鲁色资源国产91色综| 亚洲精品国产精品乱码不99| 日韩一区二区三区免费观看| 成人av免费在线播放| 美女网站色91| 亚洲一区日韩精品中文字幕| 国产女人18水真多18精品一级做| 欧美日韩精品高清| 成人精品一区二区三区四区 | 99在线精品视频| 麻豆精品蜜桃视频网站| 夜夜精品视频一区二区| 国产精品视频免费| 日韩一区二区精品在线观看| 欧洲精品中文字幕| 99久久精品免费看国产| 高清视频一区二区| 久久99国产精品免费网站| 亚洲成国产人片在线观看| 最近日韩中文字幕| 中文字幕一区日韩精品欧美| 精品国产网站在线观看| 欧美成人高清电影在线| 欧美精品v日韩精品v韩国精品v| 972aa.com艺术欧美| 99久久久国产精品| a亚洲天堂av| 不卡一区二区在线| 97久久精品人人做人人爽| 国产成人丝袜美腿| 高清国产午夜精品久久久久久| 国产综合久久久久久久久久久久| 理论电影国产精品| 久久超碰97人人做人人爱| 久久电影网站中文字幕| 国产精品综合网| 99久久久无码国产精品| 色婷婷国产精品综合在线观看| 91视频在线观看免费| 色吧成人激情小说| 欧美日韩激情一区二区三区| 日韩一级免费观看| 久久久久高清精品| 亚洲色图丝袜美腿| 亚洲国产精品久久久男人的天堂| 免费高清视频精品| 风间由美性色一区二区三区| 色综合久久久久久久| 欧美人狂配大交3d怪物一区| 日韩欧美123| 国产精品二三区| 日韩高清欧美激情| 国产乱对白刺激视频不卡| 99久久精品免费| 日韩视频免费观看高清完整版| 欧美激情综合五月色丁香小说| 亚洲美女区一区| 国产精品一线二线三线精华| 色视频一区二区| 国产色爱av资源综合区| 亚洲国产色一区| 国产精品系列在线观看| 欧美色图片你懂的| 欧美激情一区二区三区在线| 亚洲国产精品视频| 91影院在线观看| 久久久久久久久久看片| 亚洲123区在线观看| 波多野结衣在线aⅴ中文字幕不卡| 91.xcao| 一区二区三区四区不卡在线| 国产成人av电影在线观看| 制服丝袜中文字幕一区| 亚洲一区二区三区视频在线| 成人午夜激情影院| 亚洲精品在线免费播放| 日本视频中文字幕一区二区三区| 91美女在线看| 中文字幕亚洲区| 成人av资源在线| 国产精品久久久久久久久动漫 | 亚洲精品免费在线播放| av在线不卡网| 国产精品免费看片| 成人美女视频在线观看| 欧美激情中文字幕一区二区| 国产东北露脸精品视频| 成人黄色综合网站| 色婷婷综合激情| 久久这里都是精品| 久久精品国产第一区二区三区| 欧美色图在线观看| 婷婷久久综合九色综合绿巨人| 欧洲激情一区二区| 午夜视频一区在线观看| 欧美日韩免费观看一区三区| 亚洲bt欧美bt精品777| 91精品国产综合久久久久久久久久 | 国产精品毛片大码女人| 国产69精品久久久久777| 最新中文字幕一区二区三区| 91高清在线观看| 日韩avvvv在线播放| 久久日韩粉嫩一区二区三区| 成人免费三级在线| 一区二区三区国产精品| 欧美一区二区女人| 国产69精品一区二区亚洲孕妇| 中文字幕一区二区三区不卡| 欧美日韩综合不卡| 国产乱人伦偷精品视频不卡| 亚洲欧美国产77777| 欧美日本一区二区三区四区| 国产精品综合av一区二区国产馆| 国产精品久久久一区麻豆最新章节| 欧美熟乱第一页| 从欧美一区二区三区| 婷婷久久综合九色综合伊人色| 久久这里都是精品| 欧美三级日韩在线| 成人精品电影在线观看| 日本aⅴ亚洲精品中文乱码| 国产精品视频第一区| 日韩写真欧美这视频| 一本久道中文字幕精品亚洲嫩| 极品少妇xxxx精品少妇偷拍| 亚洲品质自拍视频| 欧美韩国日本不卡| 欧美成人性战久久| 欧美一区二区三区性视频| 色综合视频在线观看| 成人爽a毛片一区二区免费| 免费观看久久久4p| 婷婷综合在线观看| 亚洲高清免费一级二级三级| 中文字幕亚洲电影| 国产欧美日韩另类视频免费观看| 日韩午夜在线影院| 欧美电影在哪看比较好| 99精品偷自拍| a级精品国产片在线观看| 成人午夜激情在线| 成人午夜激情影院| 成人一区二区三区| 成人激情免费网站| 成人中文字幕在线| a在线欧美一区| 色成年激情久久综合| 日本高清视频一区二区| 欧亚洲嫩模精品一区三区| 色婷婷国产精品综合在线观看| 91黄视频在线| 91久久精品网| 欧美一区二区三区视频| 日韩欧美在线不卡| 久久人人爽爽爽人久久久|