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

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

?? 3c509.c

?? <Linux1.0核心游記>電子書+書后源碼+Linux1.0源碼
?? 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_DEBUGint el3_debug = EL3_DEBUG;#elseint 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_MULTICASTstatic 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 intel3_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 intel3_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一区二区三区免费野_久草精品视频
色综合视频在线观看| 精品理论电影在线观看| 亚洲午夜羞羞片| 欧美日韩一区二区电影| 日韩黄色免费电影| 欧美一区二区视频在线观看 | 亚洲国产成人porn| 欧美欧美欧美欧美| 美女视频黄免费的久久| 久久色中文字幕| jlzzjlzz亚洲女人18| 亚洲黄色尤物视频| 欧美一区二区三区在线观看| 经典一区二区三区| 1000精品久久久久久久久| 91福利小视频| 蜜桃视频一区二区三区在线观看| www欧美成人18+| av午夜精品一区二区三区| 夜夜夜精品看看| 日韩三级视频在线观看| 大陆成人av片| 亚洲国产视频网站| 欧美tk—视频vk| 99久久久国产精品免费蜜臀| 亚洲成人免费视| 2020国产精品自拍| 91免费小视频| 美脚の诱脚舐め脚责91| 中文字幕不卡在线| 欧美日韩精品一区二区三区| 韩国欧美国产1区| 亚洲欧美偷拍卡通变态| 欧美一级欧美一级在线播放| 岛国精品在线观看| 午夜欧美2019年伦理| 久久久久国产免费免费| 欧美亚洲一区二区在线观看| 久热成人在线视频| 亚洲欧洲国产日韩| 日韩一区二区电影| 99热精品国产| 日韩成人一级片| 中文字幕欧美国产| 欧美精品免费视频| 成人av在线网站| 欧美a级理论片| 亚洲欧美日韩国产综合| 欧美α欧美αv大片| 色94色欧美sute亚洲线路一ni| 奇米影视一区二区三区| 亚洲欧洲韩国日本视频| 精品国产亚洲在线| 欧美唯美清纯偷拍| 国产很黄免费观看久久| 午夜国产精品影院在线观看| 国产精品欧美一区二区三区| 制服.丝袜.亚洲.中文.综合| bt欧美亚洲午夜电影天堂| 美女国产一区二区| 一区二区三区四区高清精品免费观看| 精品久久久久久久久久久久久久久| 色综合久久88色综合天天6| 国产一区二区三区日韩| 天堂成人国产精品一区| 亚洲色图在线视频| 久久一区二区三区国产精品| 精品视频一区二区三区免费| 不卡欧美aaaaa| 国产一区三区三区| 日韩国产精品久久久| 亚洲精品国产一区二区精华液| 久久免费视频色| 欧美一级日韩免费不卡| 色诱亚洲精品久久久久久| 国产一区二区不卡| 男人的天堂久久精品| 亚洲国产婷婷综合在线精品| 亚洲色图.com| 欧美国产精品久久| 久久综合一区二区| 欧美一区二区三区不卡| 欧美午夜精品一区二区蜜桃| 99精品欧美一区二区三区小说 | 亚洲国产一区二区视频| 亚洲四区在线观看| 日本一区二区三区在线观看| 精品国产不卡一区二区三区| 91精品国产综合久久精品麻豆| 91黄色小视频| 色综合天天综合| 99久久99精品久久久久久| 丁香婷婷综合五月| 国产高清成人在线| 国产露脸91国语对白| 久久国产三级精品| 免费观看30秒视频久久| 日日骚欧美日韩| 无吗不卡中文字幕| 一区二区三区欧美| 一区二区三区在线视频观看| 日韩毛片视频在线看| 亚洲欧美综合另类在线卡通| 国产精品麻豆久久久| 中文一区二区在线观看| 国产欧美精品一区二区色综合朱莉 | 久久人人97超碰com| 精品国产乱子伦一区| 精品91自产拍在线观看一区| 欧美不卡激情三级在线观看| 精品精品国产高清a毛片牛牛| 日韩免费成人网| 精品美女被调教视频大全网站| 欧美电影免费观看高清完整版| 欧美大胆一级视频| 26uuu久久综合| 国产日韩欧美一区二区三区综合| 国产性色一区二区| 中文字幕欧美区| 亚洲天堂中文字幕| 夜夜嗨av一区二区三区四季av| 亚洲国产精品影院| 日韩精品1区2区3区| 美女一区二区三区在线观看| 国模无码大尺度一区二区三区| 国产成人精品aa毛片| 成人激情免费视频| 91精品91久久久中77777| 欧美在线观看18| 欧美一区二区啪啪| 久久欧美一区二区| 亚洲日本va午夜在线电影| 亚洲一区在线观看网站| 日韩精品福利网| 激情综合网激情| 成人自拍视频在线| 色婷婷综合激情| 欧美男男青年gay1069videost| 日韩一区二区免费高清| 国产人伦精品一区二区| 亚洲欧洲制服丝袜| 日韩精品免费专区| 国产河南妇女毛片精品久久久| 91麻豆成人久久精品二区三区| 欧美三区在线观看| 欧美大胆人体bbbb| 亚洲青青青在线视频| 天涯成人国产亚洲精品一区av| 极品少妇一区二区| 99久久久久久| 日韩一二三区不卡| 国产精品拍天天在线| 午夜精彩视频在线观看不卡| 国产一区二区调教| 色就色 综合激情| 日韩欧美成人激情| 亚洲欧洲国产专区| 日本不卡123| 国产成人av电影在线观看| 在线一区二区三区四区五区| 日韩亚洲欧美成人一区| 国产精品国产三级国产专播品爱网| 亚洲福利一区二区三区| 国产老肥熟一区二区三区| 在线看日韩精品电影| 久久这里只有精品首页| 亚洲最大成人网4388xx| 99国产精品久久久| 成人午夜在线视频| 欧美人狂配大交3d怪物一区| 国产欧美久久久精品影院| 婷婷亚洲久悠悠色悠在线播放| 国产成人三级在线观看| 欧美日韩亚洲综合一区二区三区 | 亚洲精品一区二区在线观看| 亚洲私人影院在线观看| 久久精品国产99国产| 日本久久精品电影| 久久精品这里都是精品| 性感美女极品91精品| av在线这里只有精品| 欧美成人在线直播| 亚洲影视资源网| 欧美经典三级视频一区二区三区| 成人免费一区二区三区视频| 裸体在线国模精品偷拍| 在线观看亚洲一区| 中文字幕精品在线不卡| 免费成人av资源网| 91黄视频在线观看| 国产精品久久久久aaaa| 精品一区二区在线观看| 欧美日韩一级二级| 亚洲人吸女人奶水| 国产成人亚洲精品青草天美| 日韩午夜电影av| 亚洲成a人片综合在线| 91在线丨porny丨国产| 国产亚洲欧美中文| 裸体在线国模精品偷拍|