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

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

?? at1700.c

?? 內核是系統的心臟
?? 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一区二区三区免费野_久草精品视频
精品在线免费视频| 欧美日本视频在线| 午夜精品久久久久久不卡8050| 日韩欧美国产综合一区| 成人av电影免费在线播放| 图片区小说区区亚洲影院| 国产精品萝li| ww久久中文字幕| 欧美群妇大交群的观看方式| 成人激情电影免费在线观看| 激情综合网最新| 日韩精品福利网| 一区二区三区欧美亚洲| 日本一区免费视频| 精品少妇一区二区三区在线播放| 欧美在线观看一二区| www.日韩在线| 成人午夜大片免费观看| 精品一区二区三区欧美| 爽好久久久欧美精品| 亚洲尤物视频在线| 亚洲美女视频在线观看| 中文字幕+乱码+中文字幕一区| 日韩一二三区不卡| 欧美一区二区三区四区高清| 精品视频一区二区三区免费| 一本色道综合亚洲| 91免费在线播放| 粗大黑人巨茎大战欧美成人| 国产成人免费高清| 国产精品一区二区果冻传媒| 激情欧美一区二区| 国产在线一区二区综合免费视频| 另类综合日韩欧美亚洲| 久久99久国产精品黄毛片色诱| 蜜臀精品久久久久久蜜臀| 人人狠狠综合久久亚洲| 免费成人在线观看视频| 久久草av在线| 国产麻豆91精品| 国产91色综合久久免费分享| 国产成人亚洲精品狼色在线| 国产69精品一区二区亚洲孕妇| 成人综合婷婷国产精品久久蜜臀| 国产精品一区二区果冻传媒| 成人午夜免费视频| 91免费版在线看| 欧美日韩中文精品| 欧美一区二区美女| 欧美精品一区二区三区蜜臀| 久久精品视频网| 国产精品福利一区二区| 亚洲精品老司机| 日日嗨av一区二区三区四区| 男女视频一区二区| 国产黄色精品视频| 91视频国产观看| 欧美精品亚洲二区| 久久亚洲精品小早川怜子| 欧美国产国产综合| 亚洲综合在线观看视频| 秋霞国产午夜精品免费视频| 韩国精品在线观看| 波多野结衣视频一区| 欧美日韩精品一区二区三区蜜桃| 欧美大片顶级少妇| 国产精品入口麻豆原神| 亚洲午夜免费电影| 精品一区二区三区在线播放视频| 处破女av一区二区| 欧美日韩久久久| 国产丝袜美腿一区二区三区| 亚洲图片激情小说| 久久aⅴ国产欧美74aaa| 91香蕉视频黄| 欧美va亚洲va| 亚洲精品成a人| 国产一区高清在线| 欧美在线一二三四区| 久久亚洲精品国产精品紫薇 | 中文字幕一区二区三| 亚洲国产日韩综合久久精品| 国产老女人精品毛片久久| 色综合夜色一区| 日韩一级片网站| 亚洲精品中文字幕乱码三区| 日产精品久久久久久久性色| 成人高清av在线| 日韩一区二区三区电影在线观看| 国产精品家庭影院| 免费成人av在线播放| 99re8在线精品视频免费播放| 91精品国产色综合久久不卡电影 | 蜜臀av一区二区在线免费观看| 国产传媒欧美日韩成人| 欧美日本韩国一区二区三区视频 | 国产精品一二三区在线| 欧美三区在线视频| 国产精品日产欧美久久久久| 蜜臀av性久久久久蜜臀aⅴ流畅| 色乱码一区二区三区88| 久久一区二区视频| 蜜桃视频第一区免费观看| 色素色在线综合| 欧美激情一区二区三区蜜桃视频| 日韩和欧美的一区| 在线观看视频一区二区欧美日韩| 久久精品在线免费观看| 美女视频网站久久| 欧美日韩久久久| 一区二区三区.www| av电影在线观看一区| 国产亚洲精品7777| 激情五月播播久久久精品| 91精品福利在线一区二区三区| 亚洲精品伦理在线| av在线综合网| 国产精品天干天干在线综合| 精品无码三级在线观看视频| 日韩一区二区中文字幕| 亚洲风情在线资源站| 色欧美片视频在线观看在线视频| 国产精品久久久久久久午夜片| 国产精品2024| 国产亚洲成aⅴ人片在线观看| 久久se精品一区精品二区| 欧美一区二区三区的| 日韩国产欧美一区二区三区| 欧美男生操女生| 日韩成人一级大片| 日韩欧美一级特黄在线播放| 肉丝袜脚交视频一区二区| 欧美群妇大交群的观看方式| 午夜精品久久久久久久99水蜜桃| 欧美日韩在线电影| 偷拍一区二区三区| 欧美老肥妇做.爰bbww| 亚洲精品福利视频网站| 色先锋aa成人| 亚洲一线二线三线久久久| 欧美日韩综合一区| 日韩精品91亚洲二区在线观看| 91精品国产手机| 久久成人羞羞网站| 国产亚洲精品aa| 91免费在线视频观看| 亚洲资源在线观看| 一本在线高清不卡dvd| 亚洲主播在线播放| 欧美一区日韩一区| 经典三级在线一区| 国产精品久久久久久久久免费丝袜| av资源网一区| 亚洲成人福利片| 精品久久一二三区| 处破女av一区二区| 亚洲一级二级在线| 日韩欧美不卡在线观看视频| 国产成人超碰人人澡人人澡| 亚洲日穴在线视频| 777xxx欧美| 国产99久久久国产精品潘金网站| 国产精品入口麻豆原神| 欧洲人成人精品| 裸体在线国模精品偷拍| 国产精品美女久久久久久久网站| 色婷婷激情久久| 美脚の诱脚舐め脚责91 | 成人一区二区三区视频 | 日本网站在线观看一区二区三区| 欧美videofree性高清杂交| 成人午夜免费视频| 天天综合色天天综合| 久久精品人人爽人人爽| 在线中文字幕不卡| 国产在线不卡视频| 亚洲一区在线播放| 国产性天天综合网| 欧美日韩国产小视频| 国产精品一品视频| 亚洲成人一区二区| 中国色在线观看另类| 欧美精品在线视频| 成人av综合在线| 六月丁香综合在线视频| 亚洲精品乱码久久久久久日本蜜臀| 精品国产一区二区三区av性色| 91久久精品日日躁夜夜躁欧美| 久久99精品久久久| 一区二区三区在线视频播放| 欧美精品一区二区三区高清aⅴ| 色婷婷av久久久久久久| 国产酒店精品激情| 青娱乐精品在线视频| 亚洲男人天堂一区| 国产午夜精品福利| 欧美一区二区免费视频| 91福利视频网站| 99久久久久久99| 国产美女在线观看一区|