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

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

?? 3c507.c

?? LINUX1.0源代碼,代碼條理清晰
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* 3c507.c: An EtherLink16 device driver for Linux. */
/*
	Written 1993 by Donald Becker.
	Copyright 1993 United States Government as represented by the Director,
	National Security Agency.  This software may only be used and distributed
	according to the terms of the GNU Public License as modified by SRC,
	incorported herein by reference.

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

	Thanks go to jennings@Montrouge.SMR.slb.com ( Patrick Jennings)
	and jrs@world.std.com (Rick Sladkey) for testing and bugfixes.
	Mark Salazar <leslie@access.digex.net> made the changes for cards with
	only 16K packet buffers.

	Things remaining to do:
	Verify that the tx and rx buffers don't have fencepost errors.
	Move the theory of operation and memory map documentation.
	The statistics need to be updated correctly.
*/

static char *version =
	"3c507.c:v0.99-15f 2/17/94 Donald Becker (becker@super.org)\n";

#include <linux/config.h>

/*
  Sources:
	This driver wouldn't have been written with the availability of the
	Crynwr driver source code.	It provided a known-working implementation
	that filled in the gaping holes of the Intel documention.  Three cheers
	for Russ Nelson.

	Intel Microcommunications Databook, Vol. 1, 1990. It provides just enough
	info that the casual reader might think that it documents the i82586.
*/

#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 <asm/system.h>
#include <asm/bitops.h>
#include <asm/io.h>
#include <asm/dma.h>
#include <errno.h>
#include <memory.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)
#define kfree_skbmem(addr, size) kfree_s(addr,size);
#else
#include <linux/malloc.h>
#endif

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

/*
  			Details of the i82586.

   You'll really need the databook to understand the details of this part,
   but the outline is that the i82586 has two seperate processing units.
   Both are started from a list of three configuration tables, of which only
   the last, the System Control Block (SCB), is used after reset-time.  The SCB
   has the following fileds:
		Status word
		Command word
		Tx/Command block addr.
		Rx block addr.
   The command word accepts the following controls for the Tx and Rx units:
  */

#define	 CUC_START	 0x0100
#define	 CUC_RESUME	 0x0200
#define	 CUC_SUSPEND 0x0300
#define	 RX_START	 0x0010
#define	 RX_RESUME	 0x0020
#define	 RX_SUSPEND	 0x0030

/* The Rx unit uses a list of frame descriptors and a list of data buffer
   descriptors.  We use full-sized (1518 byte) data buffers, so there is
   a one-to-one pairing of frame descriptors to buffer descriptors.

   The Tx ("command") unit executes a list of commands that look like:
		Status word		Written by the 82586 when the command is done.
		Command word	Command in lower 3 bits, post-command action in upper 3
		Link word		The address of the next command.
		Parameters		(as needed).

	Some definitions related to the Command Word are:
 */
#define CMD_EOL		0x8000			/* The last command of the list, stop. */
#define CMD_SUSP	0x4000			/* Suspend after doing cmd. */
#define CMD_INTR	0x2000			/* Interrupt after doing cmd. */

enum commands {
	CmdNOp = 0, CmdSASetup = 1, CmdConfigure = 2, CmdMulticastList = 3,
	CmdTx = 4, CmdTDR = 5, CmdDump = 6, CmdDiagnose = 7};

/* Information that need to be kept for each board. */
struct net_local {
	struct enet_statistics stats;
	int last_restart;
	ushort rx_head;
	ushort rx_tail;
	ushort tx_head;
	ushort tx_cmd_link;
	ushort tx_reap;
};

/*
  		Details of the EtherLink16 Implementation
  The 3c507 is a generic shared-memory i82586 implementation.
  The host can map 16K, 32K, 48K, or 64K of the 64K memory into
  0x0[CD][08]0000, or all 64K into 0xF[02468]0000.
  */

/* Offsets from the base I/O address. */
#define	SA_DATA		0	/* Station address data, or 3Com signature. */
#define MISC_CTRL	6	/* Switch the SA_DATA banks, and bus config bits. */
#define RESET_IRQ	10	/* Reset the latched IRQ line. */
#define SIGNAL_CA	11	/* Frob the 82586 Channel Attention line. */
#define ROM_CONFIG	13
#define MEM_CONFIG	14
#define IRQ_CONFIG	15

/* The ID port is used at boot-time to locate the ethercard. */
#define ID_PORT		0x100

/* Offsets to registers in the mailbox (SCB). */
#define iSCB_STATUS	0x8
#define iSCB_CMD		0xA
#define iSCB_CBL		0xC	/* Command BLock offset. */
#define iSCB_RFA		0xE	/* Rx Frame Area offset. */

/*  Since the 3c507 maps the shared memory window so that the last byte is
	at 82586 address FFFF, the first byte is at 82586 address 0, 16K, 32K, or
	48K cooresponding to window sizes of 64K, 48K, 32K and 16K respectively. 
	We can account for this be setting the 'SBC Base' entry in the ISCP table
	below for all the 16 bit offset addresses, and also adding the 'SCB Base'
	value to all 24 bit physical addresses (in the SCP table and the TX and RX
	Buffer Descriptors).
					-Mark	
	*/
#define SCB_BASE		((unsigned)64*1024 - (dev->mem_end - dev->mem_start))
 
/*
  What follows in 'init_words[]' is the "program" that is downloaded to the
  82586 memory.	 It's mostly tables and command blocks, and starts at the
  reset address 0xfffff6.  This is designed to be similar to the EtherExpress,
  thus the unusual location of the SCB at 0x0008.

  Even with the additional "don't care" values, doing it this way takes less
  program space than initializing the individual tables, and I feel it's much
  cleaner.

  The databook is particularly useless for the first two structures, I had
  to use the Crynwr driver as an example.

   The memory setup is as follows:
   */

#define CONFIG_CMD	0x0018
#define SET_SA_CMD	0x0024
#define SA_OFFSET	0x002A
#define IDLELOOP	0x30
#define TDR_CMD		0x38
#define TDR_TIME	0x3C
#define DUMP_CMD	0x40
#define DIAG_CMD	0x48
#define SET_MC_CMD	0x4E
#define DUMP_DATA	0x56	/* A 170 byte buffer for dump and Set-MC into. */

#define TX_BUF_START	0x0100
#define NUM_TX_BUFS 	4
#define TX_BUF_SIZE 	(1518+14+20+16) /* packet+header+TBD */

#define RX_BUF_START	0x2000
#define RX_BUF_SIZE 	(1518+14+18)	/* packet+header+RBD */
#define RX_BUF_END		(dev->mem_end - dev->mem_start)

/*
  That's it: only 86 bytes to set up the beast, including every extra
  command available.  The 170 byte buffer at DUMP_DATA is shared between the
  Dump command (called only by the diagnostic program) and the SetMulticastList
  command. 

  To complete the memory setup you only have to write the station address at
  SA_OFFSET and create the Tx & Rx buffer lists.

  The Tx command chain and buffer list is setup as follows:
  A Tx command table, with the data buffer pointing to...
  A Tx data buffer descriptor.  The packet is in a single buffer, rather than
	chaining together several smaller buffers.
  A NoOp command, which initially points to itself,
  And the packet data.

  A transmit is done by filling in the Tx command table and data buffer,
  re-writing the NoOp command, and finally changing the offset of the last
  command to point to the current Tx command.  When the Tx command is finished,
  it jumps to the NoOp, when it loops until the next Tx command changes the
  "link offset" in the NoOp.  This way the 82586 never has to go through the
  slow restart sequence.

  The Rx buffer list is set up in the obvious ring structure.  We have enough
  memory (and low enough interrupt latency) that we can avoid the complicated
  Rx buffer linked lists by alway associating a full-size Rx data buffer with
  each Rx data frame.

  I current use four transmit buffers starting at TX_BUF_START (0x0100), and
  use the rest of memory, from RX_BUF_START to RX_BUF_END, for Rx buffers.

  */

unsigned short init_words[] = {
	/*	System Configuration Pointer (SCP). */
	0x0000,					/* Set bus size to 16 bits. */
	0,0,					/* pad words. */
	0x0000,0x0000,			/* ISCP phys addr, set in init_82586_mem(). */

	/*	Intermediate System Configuration Pointer (ISCP). */
	0x0001,					/* Status word that's cleared when init is done. */
	0x0008,0,0,				/* SCB offset, (skip, skip) */

	/* System Control Block (SCB). */
	0,0xf000|RX_START|CUC_START,	/* SCB status and cmd. */
	CONFIG_CMD,				/* Command list pointer, points to Configure. */
	RX_BUF_START,				/* Rx block list. */
	0,0,0,0,				/* Error count: CRC, align, buffer, overrun. */

	/* 0x0018: Configure command.  Change to put MAC data with packet. */
	0, CmdConfigure,		/* Status, command.		*/
	SET_SA_CMD,				/* Next command is Set Station Addr. */
	0x0804,					/* "4" bytes of config data, 8 byte FIFO. */
	0x2e40,					/* Magic values, including MAC data location. */
	0,						/* Unused pad word. */

	/* 0x0024: Setup station address command. */
	0, CmdSASetup,
	SET_MC_CMD,				/* Next command. */
	0xaa00,0xb000,0x0bad,	/* Station address (to be filled in) */

	/* 0x0030: NOP, looping back to itself.	 Point to first Tx buffer to Tx. */
	0, CmdNOp, IDLELOOP, 0 /* pad */,

	/* 0x0038: A unused Time-Domain Reflectometer command. */
	0, CmdTDR, IDLELOOP, 0,

	/* 0x0040: An unused Dump State command. */
	0, CmdDump, IDLELOOP, DUMP_DATA,

	/* 0x0048: An unused Diagnose command. */
	0, CmdDiagnose, IDLELOOP,

	/* 0x004E: An empty set-multicast-list command. */
	0, CmdMulticastList, IDLELOOP, 0,
};

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

extern int el16_probe(struct device *dev);	/* Called from Space.c */

static int	el16_probe1(struct device *dev, short ioaddr);
static int	el16_open(struct device *dev);
static int	el16_send_packet(struct sk_buff *skb, struct device *dev);
static void	el16_interrupt(int reg_ptr);
static void el16_rx(struct device *dev);
static int	el16_close(struct device *dev);
static struct enet_statistics *el16_get_stats(struct device *dev);

static void hardware_send_packet(struct device *dev, void *buf, short length);
void init_82586_mem(struct device *dev);


/* 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, (detachable devices only) alloate space for the
	device and return success.
	*/
int
el16_probe(struct device *dev)
{
	/* Don't probe all settable addresses, 0x[23][0-F]0, just common ones. */
	int *port, ports[] = {0x300, 0x320, 0x340, 0x280, 0};
	int base_addr = dev->base_addr;
	ushort lrs_state = 0xff, i;

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

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

	for (port = &ports[0]; *port; port++) {
		short ioaddr = *port;
#if 0
		/* This is my original code. */
		if (inb(ioaddr) == '*' && inb(ioaddr+1) == '3'
			&& inb(ioaddr+2) == 'C' && inb(ioaddr+3) == 'O'
			&& el16_probe1(dev, *port) == 0)
			return 0;
#else
	/* This is code from jennings@Montrouge.SMR.slb.com, done so that
	   the string can be printed out. */
		char res[5];
		res[0] = inb(ioaddr); res[1] = inb(ioaddr+1);
		res[2] = inb(ioaddr+2); res[3] = inb(ioaddr+3);
		res[4] = 0;
		if (res[0] == '*' && res[1] == '3'
			&& res[2] == 'C' && res[3] == 'O'
			&& el16_probe1(dev, *port) == 0)
		  return 0;
#endif
	}

	return ENODEV;			/* ENODEV would be more accurate. */
}

int el16_probe1(struct device *dev, short ioaddr)
{
	int i, irq, irqval;

	printk("%s: 3c507 at %#x,", dev->name, ioaddr);

	/* We should make a few more checks here, like the first three octets of
	   the S.A. for the manufactor's code. */ 

	irq = inb(ioaddr + IRQ_CONFIG) & 0x0f;

	irqval = request_irq(irq, &el16_interrupt);
	if (irqval) {
		printk ("unable to get IRQ %d (irqval=%d).\n", irq, irqval);
		return EAGAIN;
	}
	
	/* We've committed to using the board, and can start filling in *dev. */
	snarf_region(ioaddr, 16);
	dev->base_addr = ioaddr;

	outb(0x01, ioaddr + MISC_CTRL);
	for (i = 0; i < 6; i++) {
		dev->dev_addr[i] = inb(ioaddr + i);
		printk(" %02x", dev->dev_addr[i]);
	}

	if ((dev->mem_start & 0xf) > 0)
		net_debug = dev->mem_start & 7;

#ifdef MEM_BASE
	dev->mem_start = MEM_BASE;
	dev->mem_end = dev->mem_start + 0x10000;
#else
	{
		int base;
		int size;
		char mem_config = inb(ioaddr + MEM_CONFIG);
		if (mem_config & 0x20) {
			size = 64*1024;
			base = 0xf00000 + (mem_config & 0x08 ? 0x080000
							   : ((mem_config & 3) << 17));
		} else {
			size = ((mem_config & 3) + 1) << 14;
			base = 0x0c0000 + ( (mem_config & 0x18) << 12);
		}
		dev->mem_start = base;
		dev->mem_end = base + size;
	}
#endif

	dev->if_port = (inb(ioaddr + ROM_CONFIG) & 0x80) ? 1 : 0;
	dev->irq = inb(ioaddr + IRQ_CONFIG) & 0x0f;

	printk(", IRQ %d, %sternal xcvr, memory %#lx-%#lx.\n", dev->irq,
		   dev->if_port ? "ex" : "in", dev->mem_start, dev->mem_end-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		= el16_open;
	dev->stop		= el16_close;
	dev->hard_start_xmit = el16_send_packet;
	dev->get_stats	= el16_get_stats;

	/* 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
el16_open(struct device *dev)
{
	irq2dev_map[dev->irq] = dev;

	/* Initialize the 82586 memory and start it. */
	init_82586_mem(dev);

	dev->tbusy = 0;
	dev->interrupt = 0;
	dev->start = 1;
	return 0;
}

static int

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一卡二卡三卡| 亚洲精品一二三| 中文字幕二三区不卡| 亚洲另类中文字| 另类的小说在线视频另类成人小视频在线 | 国产欧美精品一区二区色综合朱莉| 国产日产欧美一区| 亚洲色图19p| 久久精品国产免费| 91丝袜国产在线播放| 日韩久久久精品| 一区二区在线观看免费视频播放| 精品写真视频在线观看| 91视频免费播放| 欧美一区二区三区在线观看| 亚洲视频图片小说| 精品在线视频一区| 色www精品视频在线观看| 欧美va日韩va| 亚洲成人精品在线观看| 高清av一区二区| 欧美xxxx在线观看| 天天综合日日夜夜精品| 成人app在线观看| 精品国产乱码久久久久久浪潮| 亚洲成人在线免费| 在线欧美日韩精品| 国产精品嫩草久久久久| 麻豆精品精品国产自在97香蕉| 欧美三级资源在线| 悠悠色在线精品| 99麻豆久久久国产精品免费| 精品国产免费一区二区三区香蕉| 亚洲精品国产精品乱码不99| jlzzjlzz国产精品久久| 久久天天做天天爱综合色| 亚洲二区在线观看| 在线亚洲一区二区| 亚洲人亚洲人成电影网站色| 国产精品91一区二区| 精品sm捆绑视频| 久色婷婷小香蕉久久| 91精品国产免费| 日韩va欧美va亚洲va久久| 51精品视频一区二区三区| 亚洲在线观看免费视频| 欧美亚洲一区三区| 亚洲福利视频一区二区| 欧美日韩不卡一区| 午夜精品久久久久久久99水蜜桃 | 男人操女人的视频在线观看欧美| 91年精品国产| 一区二区三区在线看| 91成人在线精品| 亚洲综合在线免费观看| 欧美自拍偷拍一区| 亚洲男人的天堂在线aⅴ视频| 一本久久a久久精品亚洲| 国产精品美女视频| 99久久精品免费精品国产| 欧美激情一区二区| 97se亚洲国产综合自在线 | 久久综合九色综合欧美就去吻 | 97精品久久久午夜一区二区三区 | 亚洲bdsm女犯bdsm网站| 在线综合亚洲欧美在线视频 | 综合自拍亚洲综合图不卡区| 色综合天天综合在线视频| 亚洲精品国产精品乱码不99| 欧美区视频在线观看| 91久久人澡人人添人人爽欧美| 亚洲女与黑人做爰| 精品婷婷伊人一区三区三| 日本在线不卡视频| 久久精品一区二区三区不卡牛牛| 盗摄精品av一区二区三区| 一区二区三区日韩欧美| 欧美一级二级三级蜜桃| 高清日韩电视剧大全免费| 一区二区三区 在线观看视频| 91精品国产综合久久精品性色| 捆绑调教美女网站视频一区| 国产精品色在线观看| 在线观看91视频| 国产一区二区中文字幕| 亚洲精品日韩一| 久久综合久久久久88| 色菇凉天天综合网| 国产乱淫av一区二区三区| 亚洲免费观看高清完整版在线| 日韩欧美在线一区二区三区| 成人黄色免费短视频| 亚洲不卡在线观看| 精品国内二区三区| 色综合久久六月婷婷中文字幕| 裸体在线国模精品偷拍| 中文成人av在线| 日韩三级视频在线看| 91免费精品国自产拍在线不卡| 精品一区二区三区久久| 香蕉av福利精品导航| 国产午夜亚洲精品羞羞网站| 欧美色男人天堂| 成人av网在线| 久久99久久久久| 亚洲国产sm捆绑调教视频| 日本一区二区久久| www精品美女久久久tv| 欧美三级视频在线| 色综合亚洲欧洲| 大白屁股一区二区视频| 久久99热这里只有精品| 欧美aaaaaa午夜精品| 亚洲国产欧美在线| 亚洲精品视频观看| 国产精品动漫网站| 中文久久乱码一区二区| www激情久久| 精品国产91洋老外米糕| 69久久夜色精品国产69蝌蚪网 | 久久国产乱子精品免费女| 日韩你懂的在线播放| 欧美男女性生活在线直播观看| 91碰在线视频| 91亚洲精品一区二区乱码| 成人av午夜电影| av在线播放不卡| 不卡的电影网站| 99精品黄色片免费大全| 99精品久久免费看蜜臀剧情介绍| caoporm超碰国产精品| 成人免费视频网站在线观看| 国产盗摄精品一区二区三区在线| 久久成人av少妇免费| 国产一区二区三区免费| 国产精品资源在线| 国产91丝袜在线观看| 风间由美性色一区二区三区| av亚洲精华国产精华精华| 成人av在线播放网址| 色av成人天堂桃色av| 欧美视频一区在线观看| 欧美高清精品3d| 精品av久久707| 日本一区二区在线不卡| www精品美女久久久tv| 日韩精品中午字幕| 久久精品视频网| 成人欧美一区二区三区白人 | 国产精品久久久一本精品| 中文字幕一区视频| 1024成人网| 大桥未久av一区二区三区中文| bt7086福利一区国产| 丁香桃色午夜亚洲一区二区三区| 99视频一区二区| 欧美一区二区福利在线| 国产亚洲自拍一区| 亚洲一区在线观看免费观看电影高清| 日韩国产欧美在线观看| 国产成人精品aa毛片| 欧美日韩三级一区二区| 国产欧美日韩在线| 亚洲韩国精品一区| 丁香激情综合五月| 日韩欧美123| 亚洲在线视频一区| 成年人网站91| 欧美成人艳星乳罩| 亚洲va欧美va人人爽| 成人激情动漫在线观看| 精品三级av在线| 亚洲aⅴ怡春院| 91在线高清观看| 久久精品男人天堂av| 日韩电影一区二区三区四区| 91美女精品福利| 欧美极品xxx| 国产一区视频导航| 欧美一区二区福利视频| 夜夜嗨av一区二区三区网页| 国产aⅴ精品一区二区三区色成熟| 欧美精选午夜久久久乱码6080| 日韩毛片高清在线播放| 国产 日韩 欧美大片| 欧美xingq一区二区| 日韩国产欧美在线视频| 欧美日韩不卡视频| 亚洲国产视频网站| 91成人在线精品| 亚洲美女屁股眼交| 99久久国产综合色|国产精品| 久久久99精品免费观看不卡| 国产综合色视频| 精品国产露脸精彩对白| 蜜桃久久av一区| 日韩精品专区在线影院观看| 老鸭窝一区二区久久精品| 日韩欧美黄色影院| 美女视频一区在线观看|