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

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

?? at1700.c

?? LINUX1.0源代碼,代碼條理清晰
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* at1700.c: A network device driver for  the Allied Telesis AT1700.

   Written 1993 by Donald Becker.  This is a alpha test limited release.
   This version may only be used and distributed according to the terms of the
   GNU Public License, incorporated herein by reference.

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

   This is a device driver for the Allied Telesis AT1700, which is a
   straight-foward Fujitsu MB86965 implementation.
*/

static char *version =
	"at1700.c:v0.06 3/3/94  Donald Becker (becker@super.org)\n";

#include <linux/config.h>

/*
  Sources:
    The Fujitsu MB86695 datasheet.

	After this driver was written, ATI provided their EEPROM configuration
	code header file.  Thanks to Gerry Sockins of ATI.
*/

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

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

#ifndef HAVE_AUTOIRQ
/* From auto_irq.c, in ioport.h for later versions. */
extern void autoirq_setup(int waittime);
extern int autoirq_report(int waittime);
/* The map from IRQ number (as passed to the interrupt handler) to
   'struct device'. */
extern struct device *irq2dev_map[16];
#endif

#ifndef HAVE_ALLOC_SKB
#define alloc_skb(size, priority) (struct sk_buff *) kmalloc(size,priority)
#define kfree_skbmem(addr, size) kfree_s(addr,size);
#endif

/* use 0 for production, 1 for verification, >2 for debug */
#ifndef NET_DEBUG
#define NET_DEBUG 2
#endif
static unsigned int net_debug = NET_DEBUG;

typedef unsigned char uchar;

/* Information that need to be kept for each board. */
struct net_local {
	struct enet_statistics stats;
	long open_time;				/* Useless example local info. */
	uint tx_started:1;			/* Number of packet on the Tx queue. */
	uchar tx_queue;				/* Number of packet on the Tx queue. */
	ushort tx_queue_len;		/* Current length of the Tx queue. */
};


/* Offsets from the base address. */
#define STATUS			0
#define TX_STATUS		0
#define RX_STATUS		1
#define TX_INTR			2		/* Bit-mapped interrupt enable registers. */
#define RX_INTR			3
#define TX_MODE			4
#define RX_MODE			5
#define CONFIG_0		6		/* Misc. configuration settings. */
#define CONFIG_1		7
/* Run-time register bank 2 definitions. */
#define DATAPORT		8		/* Word-wide DMA or programmed-I/O dataport. */
#define TX_START		10
#define MODE13			13
#define EEPROM_Ctrl 	16
#define EEPROM_Data 	17

/*  EEPROM_Ctrl bits. */
#define EE_SHIFT_CLK	0x40	/* EEPROM shift clock, in reg. 16. */
#define EE_CS			0x20	/* EEPROM chip select, in reg. 16. */
#define EE_DATA_WRITE	0x80	/* EEPROM chip data in, in reg. 17. */
#define EE_DATA_READ	0x80	/* EEPROM chip data out, in reg. 17. */

/* Delay between EEPROM clock transitions. */
#define eeprom_delay()	do { int _i = 40; while (--_i > 0) { __SLOW_DOWN_IO; }} while (0)

/* The EEPROM commands include the alway-set leading bit. */
#define EE_WRITE_CMD	(5 << 6)
#define EE_READ_CMD		(6 << 6)
#define EE_ERASE_CMD	(7 << 6)


/* Index to functions, as function prototypes. */

extern int at1700_probe(struct device *dev);

static int at1700_probe1(struct device *dev, short ioaddr);
static int read_eeprom(int ioaddr, int location);
static int net_open(struct device *dev);
static int	net_send_packet(struct sk_buff *skb, struct device *dev);
static void net_interrupt(int reg_ptr);
static void net_rx(struct device *dev);
static int net_close(struct device *dev);
static struct enet_statistics *net_get_stats(struct device *dev);
#ifdef HAVE_MULTICAST
static void set_multicast_list(struct device *dev, int num_addrs, void *addrs);
#endif


/* Check for a network adaptor of this type, and return '0' iff one exists.
   If dev->base_addr == 0, probe all likely locations.
   If dev->base_addr == 1, always return failure.
   If dev->base_addr == 2, alloate space for the device and return success
   (detachable devices only).
   */
int
at1700_probe(struct device *dev)
{
	short ports[] = {0x300, 0x280, 0x380, 0x320, 0x340, 0x260, 0x2a0, 0x240, 0};
	short *port, base_addr = dev->base_addr;

	if (base_addr > 0x1ff)		/* Check a single specified location. */
		return at1700_probe1(dev, base_addr);
	else if (base_addr > 0)		/* Don't probe at all. */
		return ENXIO;

	for (port = &ports[0]; *port; port++) {
		int ioaddr = *port;
		if (check_region(ioaddr, 32))
			continue;
		if (at1700_probe1(dev, ioaddr) == 0)
			return 0;
	}

	return ENODEV;
}

/* The Fujitsu datasheet suggests that the NIC be probed for by checking its
   "signature", the default bit pattern after a reset.  This *doesn't* work --
   there is no way to reset the bus interface without a complete power-cycle!

   It turns out that ATI came to the same conclusion I did: the only thing
   that can be done is checking a few bits and then diving right into an
   EEPROM read. */

int at1700_probe1(struct device *dev, short ioaddr)
{
	unsigned short signature[4]         = {0xffff, 0xffff, 0x7ff7, 0xff5f};
	unsigned short signature_invalid[4] = {0xffff, 0xffff, 0x7ff7, 0xdf0f};
	char irqmap[8] = {3, 4, 5, 9, 10, 11, 14, 15};
	unsigned short *station_address = (unsigned short *)dev->dev_addr;
	unsigned int i, irq;

	/* Resetting the chip doesn't reset the ISA interface, so don't bother.
	   That means we have to be careful with the register values we probe for.
	   */
	for (i = 0; i < 4; i++)
		if ((inw(ioaddr + 2*i) | signature_invalid[i]) != signature[i]) {
			if (net_debug > 2)
				printk("AT1700 signature match failed at %d (%04x vs. %04x)\n",
					   i, inw(ioaddr + 2*i), signature[i]);
			return -ENODEV;
		}
	if (read_eeprom(ioaddr, 4) != 0x0000
		|| read_eeprom(ioaddr, 5) & 0x00ff != 0x00F4)
		return -ENODEV;

	/* Grab the region so that we can find another board if the IRQ request
	   fails. */
	snarf_region(ioaddr, 32);

	irq = irqmap[(read_eeprom(ioaddr, 12)&0x04)
				 | (read_eeprom(ioaddr, 0)>>14)];

	/* Snarf the interrupt vector now. */
	if (request_irq(irq, &net_interrupt)) {
		printk ("AT1700 found at %#3x, but it's unusable due to a conflict on"
				"IRQ %d.\n", ioaddr, irq);
		return EAGAIN;
	}

	printk("%s: AT1700 found at %#3x, IRQ %d, address ", dev->name,
		   ioaddr, irq);

	dev->base_addr = ioaddr;
	dev->irq = irq;
	irq2dev_map[irq] = dev;

	for(i = 0; i < 3; i++) {
		unsigned short eeprom_val = read_eeprom(ioaddr, 4+i);
		printk("%04x", eeprom_val);
		station_address[i] = ntohs(eeprom_val);
	}

	/* The EEPROM word 12 bit 0x0400 means use regular 100 ohm 10baseT signals,
	   rather than 150 ohm shielded twisted pair compansation.
	   0x0000 == auto-sense the interface
	   0x0800 == use TP interface
	   0x1800 == use coax interface
	   */
	{
		char *porttype[] = {"auto-sense", "10baseT", "auto-sense", "10base2"};
		ushort setup_value = read_eeprom(ioaddr, 12);

		dev->if_port = setup_value >> 8;
		printk(" %s interface (%04x).\n", porttype[(dev->if_port>>3) & 3],
			   setup_value);
	}

	/* Set the station address in bank zero. */
	outb(0xe0, ioaddr + 7);
	for (i = 0; i < 6; i++)
		outb(dev->dev_addr[i], ioaddr + 8 + i);

	/* Switch to bank 1 and set the multicast table to accept none. */
	outb(0xe4, ioaddr + 7);
	for (i = 0; i < 8; i++)
		outb(0x00, ioaddr + 8 + i);

	/* Set the configuration register 0 to 32K 100ns. byte-wide memory, 16 bit
	   bus access, two 4K Tx queues, and disabled Tx and Rx. */
	outb(0xda, ioaddr + CONFIG_0);

	/* Switch to bank 2 and lock our I/O address. */
	outb(0xe8, ioaddr + 7);
	outb(dev->if_port, MODE13);

	/* Power-down the chip.  Aren't we green! */
	outb(0x00, ioaddr + CONFIG_1);

	if (net_debug)
		printk(version);

	/* Initialize the device structure. */
	dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
	memset(dev->priv, 0, sizeof(struct net_local));

	dev->open		= net_open;
	dev->stop		= net_close;
	dev->hard_start_xmit = net_send_packet;
	dev->get_stats	= net_get_stats;
#ifdef HAVE_MULTICAST
	dev->set_multicast_list = &set_multicast_list;
#endif

	/* Fill in the fields of the device structure with ethernet-generic values.
	   This should be in a common file instead of per-driver.  */
	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;
}

static int read_eeprom(int ioaddr, int location)
{
	int i;
	unsigned short retval = 0;
	short ee_addr = ioaddr + EEPROM_Ctrl;
	short ee_daddr = ioaddr + EEPROM_Data;
	int read_cmd = location | EE_READ_CMD;
	short ctrl_val = EE_CS;
	
	outb(ctrl_val, ee_addr);
	
	/* Shift the read command bits out. */
	for (i = 9; i >= 0; i--) {
		short dataval = (read_cmd & (1 << i)) ? EE_DATA_WRITE : 0;
		outb(dataval, ee_daddr);
		outb(EE_CS | EE_SHIFT_CLK, ee_addr);	/* EEPROM clock tick. */
		eeprom_delay();
		outb(EE_CS, ee_addr);	/* Finish EEPROM a clock tick. */
		eeprom_delay();
	}
	outb(EE_CS, ee_addr);
	
	for (i = 16; i > 0; i--) {
		outb(EE_CS | EE_SHIFT_CLK, ee_addr);
		eeprom_delay();
		retval = (retval << 1) | ((inb(ee_daddr) & EE_DATA_READ) ? 1 : 0);
		outb(EE_CS, ee_addr);
		eeprom_delay();
	}

	/* Terminate the EEPROM access. */
	ctrl_val &= ~EE_CS;
	outb(ctrl_val | EE_SHIFT_CLK, ee_addr);
	eeprom_delay();
	outb(ctrl_val, ee_addr);
	eeprom_delay();
	return retval;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产欧美日韩在线观看| 一区二区三区在线免费观看| 一本色道久久加勒比精品| 日韩电影免费一区| 国产精品区一区二区三区| 日韩视频免费观看高清在线视频| 丁香桃色午夜亚洲一区二区三区| 天天综合天天综合色| 国产精品欧美经典| 精品国产网站在线观看| 欧美日韩在线直播| 97se狠狠狠综合亚洲狠狠| 极品销魂美女一区二区三区| 亚洲成人高清在线| 一区二区三区在线视频免费 | 国产日韩欧美一区二区三区乱码| 欧美精品久久一区二区三区| 91在线视频官网| 成人高清视频在线观看| 国产精品 欧美精品| 久久精品国产免费看久久精品| 亚洲超碰精品一区二区| 亚洲综合一区二区三区| 亚洲乱码一区二区三区在线观看| 国产日韩影视精品| 久久一区二区三区四区| 26uuu国产日韩综合| 日韩欧美亚洲另类制服综合在线| 欧美日韩激情一区二区三区| 欧美性色欧美a在线播放| 成人av电影免费观看| 成人激情校园春色| 国产99一区视频免费| 国产乱码精品一区二区三区忘忧草| 蜜桃一区二区三区在线观看| 美女mm1313爽爽久久久蜜臀| 日本女优在线视频一区二区| 日韩高清不卡一区二区| 日韩av在线播放中文字幕| 亚洲h精品动漫在线观看| 国产91富婆露脸刺激对白| 国产综合久久久久久鬼色| 国产一区二区三区四区五区入口| 久久99国产精品免费| 国产一区二区三区综合| 国内久久精品视频| 国产91精品免费| av激情成人网| 欧美主播一区二区三区| 欧美日本免费一区二区三区| 欧美高清精品3d| 精品国产露脸精彩对白| 久久天天做天天爱综合色| 国产亚洲精品7777| 最新国产精品久久精品| 亚洲欧洲另类国产综合| 亚洲国产sm捆绑调教视频| 日本在线观看不卡视频| 国产乱码精品一区二区三区av| 国产成人精品亚洲777人妖| 91亚洲精品乱码久久久久久蜜桃| 91成人在线免费观看| 欧美久久久久久蜜桃| 欧美v日韩v国产v| 国产精品视频观看| 亚洲成人av资源| 久久99久久久久| 岛国一区二区在线观看| 91精品福利在线| 精品日产卡一卡二卡麻豆| 国产女人18毛片水真多成人如厕 | 亚洲乱码国产乱码精品精小说 | 麻豆高清免费国产一区| 国产99精品在线观看| 91毛片在线观看| 日韩欧美黄色影院| 国产精品国产馆在线真实露脸| 婷婷久久综合九色综合绿巨人| 国产一区二区三区在线观看免费 | 美女视频网站黄色亚洲| 成人动漫av在线| 欧美久久久久久久久中文字幕| 日韩欧美一级二级| 亚洲女人小视频在线观看| 蜜臀av性久久久久蜜臀aⅴ| 99视频国产精品| 日韩欧美一区二区三区在线| 亚洲色欲色欲www| 精品一区二区三区在线播放| 91毛片在线观看| 久久久久久久av麻豆果冻| 一级精品视频在线观看宜春院| 激情久久五月天| 欧美日韩国产小视频在线观看| 国产日韩欧美精品在线| 日韩中文欧美在线| 不卡欧美aaaaa| 日韩一区二区电影在线| 亚洲精品高清在线观看| 国产精品亚洲专一区二区三区| 精品污污网站免费看| 国产精品网站导航| 国产综合久久久久久鬼色| 欧美日本国产视频| 亚洲精品一二三| 国产成人在线观看免费网站| 日韩一区二区电影在线| 亚洲午夜久久久久久久久电影院| 成人美女在线观看| 久久无码av三级| 同产精品九九九| 色噜噜夜夜夜综合网| 国产精品美女久久久久久2018| 久久国产精品99久久人人澡| 欧美日本韩国一区| 一区二区三区四区在线播放| 99久久久久免费精品国产| 久久日韩粉嫩一区二区三区| 日本欧美久久久久免费播放网| 欧美亚洲动漫精品| 一区二区三区精品在线| 91亚洲精品一区二区乱码| 国产精品久久毛片a| 岛国一区二区在线观看| 久久久激情视频| 国产精品亚洲第一区在线暖暖韩国| 日韩小视频在线观看专区| 日日夜夜精品视频免费| 欧美人成免费网站| 亚洲不卡av一区二区三区| 欧美三日本三级三级在线播放| 樱桃国产成人精品视频| 欧洲人成人精品| 亚洲午夜激情网页| 在线观看日韩电影| 亚洲综合丁香婷婷六月香| 欧美伊人久久大香线蕉综合69| 亚洲一区在线观看免费 | 欧美日韩国产综合一区二区| 午夜影院久久久| 欧美一区二区三区日韩| 蜜桃久久久久久| 久久五月婷婷丁香社区| 成人一区二区三区视频在线观看| 国产欧美日韩在线看| 9i在线看片成人免费| 一区二区三区鲁丝不卡| 欧美日韩国产经典色站一区二区三区| 午夜在线成人av| 欧美大黄免费观看| 国产精品12区| 亚洲视频在线一区观看| 欧美图片一区二区三区| 日韩不卡一二三区| 久久这里只有精品视频网| 成人免费不卡视频| 亚洲影院久久精品| 日韩欧美成人一区二区| 国产ts人妖一区二区| 最新中文字幕一区二区三区| 欧美日韩一二三区| 精品一区二区三区欧美| 国产精品视频你懂的| 91片黄在线观看| 日韩高清在线不卡| 国产日韩欧美a| 在线亚洲人成电影网站色www| 天天操天天干天天综合网| 精品av综合导航| 99r精品视频| 日韩av电影天堂| 国产欧美一区二区精品婷婷| 91国产成人在线| 国内精品嫩模私拍在线| 亚洲老妇xxxxxx| 精品久久久久久久久久久院品网 | 亚洲视频每日更新| 91精品国产综合久久精品图片| 国产精品 日产精品 欧美精品| 亚洲一区视频在线观看视频| 欧美成人在线直播| 91热门视频在线观看| 美女一区二区在线观看| 亚洲情趣在线观看| 欧美不卡在线视频| 在线观看视频91| 懂色av一区二区三区免费看| 日日欢夜夜爽一区| 国产精品成人免费精品自在线观看| 91精品国产一区二区人妖| 成人h动漫精品一区二区| 日本视频免费一区| 亚洲日本一区二区三区| 日韩午夜精品电影| 欧美专区亚洲专区| 国产aⅴ综合色| 久久99精品国产麻豆婷婷 | 亚洲一区二区三区四区五区中文| 精品国产乱码久久久久久蜜臀| 日本丶国产丶欧美色综合|