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

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

?? depca.c

?? 內核是系統的心臟
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*  depca.c: A DIGITAL DEPCA ethernet driver for linux.

    Written 1994 by David C. Davies.

    Copyright 1994 David C. Davies and 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 written for the Digital Equipment Corporation series
    of DEPCA ethernet cards:

    	DE100 DEPCA
	DE200 DEPCA Turbo
	DE202 DEPCA Turbo (TP BNC)
	DE210 DEPCA

    The driver has been tested on DE100 and DE20x cards in a relatively busy 
    network.

    The author may be reached as davies@wanton.enet.dec.com or
    Digital Equipment Corporation, 146 Main Street, Maynard MA 01754.

    =========================================================================
    The driver was based on the 'lance.c' driver from Donald Becker which is
    included with the standard driver distribution for linux. Modifications
    were made to most routines and the hardware recognition routines were
    written from scratch. Primary references used were:

    1) Lance.c code in /linux/drivers/net/
    2) "Ethernet/IEEE 802.3 Family. 1992 World Network Data Book/Handbook",
       AMD, 1992 [(800) 222-9323].
    3) "Am79C90 CMOS Local Area Network Controller for Ethernet (C-LANCE)",
       AMD, Pub. #17881, May 1993.
    4) "Am79C960 PCnet-ISA(tm), Single-Chip Ethernet Controller for ISA",
       AMD, Pub. #16907, May 1992
    5) "DEC EtherWORKS LC Ethernet Controller Owners Manual",
       Digital Equipment corporation, 1990, Pub. #EK-DE100-OM.003
    6) "DEC EtherWORKS Turbo Ethernet Controller Owners Manual",
       Digital Equipment corporation, 1990, Pub. #EK-DE200-OM.003
    7) "DEPCA Hardware Reference Manual", Pub. #EK-DEPCA-PR
       Digital Equipment Corporation, 1989
    8) "DEC EtherWORKS Turbo_(TP BNC) Ethernet Controller Owners Manual",
       Digital Equipment corporation, 1991, Pub. #EK-DE202-OM.001
    
    Peter Bauer's depca.c (V0.5) was referred to when debugging this driver.
    The hash filter code was  derived from Reference  3 and has been  tested
    only to the extent that the Table  A-1, page A-7,  was confirmed to fill
    the   filter bit   positions  correctly.  Hash   filtering  is  not  yet
    implemented in the current driver set.

    The  DE200 series boards have   on-board 64kB RAM  for  use as a  shared
    memory network buffer. Only  the DE100 cards  make  use of a  2kB buffer
    mode  which has not  been implemented in  this driver (only the 32kB and
    64kB modes are supported).

    At the  most only 2 DEPCA  cards can be supported  because there is only
    provision for two I/O base addresses on the cards (0x300 and 0x200). The
    base  address is  'autoprobed' by  looking  for  the self  test PROM and
    detecting the  card name.  The shared memory  base address is decoded by
    'autoprobing' the Ethernet PROM address information. The second DEPCA is
    detected and information placed  in the base_addr  variable of the  next
    device  structure   (which is created    if  necessary),  thus  enabling
    ethif_probe initialization for the device.

    ************************************************************************

    NOTE: If you are using two  DEPCAs, it is important  that you assign the
    base memory addresses  correctly.  The driver  autoprobes I/O 0x300 then
    0x200.  The base memory  address for the  first device must be less than
    that of the second so that the auto probe will  correctly assign the I/O
    and  memory addresses on  the same card.  I can't  think of  a way to do
    this unambiguously at the moment, since there is nothing on the cards to
    tie I/O and memory information together.

    I   am unable to test    2 DEPCAs together for   now,   so this code  is
    unchecked. All reports, good or bad, are welcome.

    ************************************************************************

    The board IRQ  setting must be  at  an unused  IRQ  which is auto-probed
    using   Donald Becker's   autoprobe   routines. DE100   board IRQs   are
    {2,3,4,5,7}, whereas  the DE200 is at  {5,9,10,11,15}. Note that IRQ2 is
    really IRQ9 in machines with 16 IRQ lines.

    No 16MB memory  limitation should exist with this  driver as DMA is  not
    used and the common memory area is in low memory on the network card (my
    current system has 20MB and I've not had problems yet).

    The DE203,  DE204  and DE205 cards  may  also work  with this driver  (I
    haven't tested  them so I don't  know). If you have  one of these cards,
    place the name in the DEPCA_SIGNATURE string  around line 160, recompile
    the kernel and reboot. Check if the card  is recognised and works - mail
    me if so, so that I can add it into the list of supported cards!

    TO DO:
    ------

    1. Implement the 2k buffer mode - does anyone need it??

    Revision History
    ----------------

    Version   Date        Description
  
      0.1   25-jan-94     Initial writing
      0.2   27-jan-94     Added LANCE TX buffer chaining
      0.3    1-feb-94     Added multiple DEPCA support
      0.31   4-feb-94     Added DE202 recognition
      0.32  19-feb-94     Tidy up. Improve multi-DEPCA support.

    =========================================================================
*/

static char *version = "depca.c:v0.32 2/19/94 davies@wanton.enet.dec.com\n";

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

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

#ifdef DEPCA_DEBUG
int depca_debug = DEPCA_DEBUG;
#else
int depca_debug = 1;
#endif

#ifndef DEPCA_IRQ
/*#define DEPCA_IRQ	{5,9,10,11,15,0}*/
#define DEPCA_IRQ	5
#endif

#ifndef PROBE_LENGTH
#define PROBE_LENGTH    32
#endif

#ifndef PROBE_SEQUENCE
#define PROBE_SEQUENCE "FF0055AAFF0055AA"
#endif

#ifndef DEPCA_SIGNATURE
#define DEPCA_SIGNATURE {"DEPCA","DE100","DE200","DE202","DE210",""}
#define DEPCA_NAME_LENGTH 8
#endif

#ifndef DEPCA_RAM_BASE_ADDRESSES
#define DEPCA_RAM_BASE_ADDRESSES {0xc0000,0xd0000,0xe0000,0x00000}
#endif
static short mem_chkd = 0;               /* holds which base addrs have been */
					 /* checked, for multi-DEPCA case */

#ifndef DEPCA_IO_PORTS
#define DEPCA_IO_PORTS {0x300, 0x200, 0}
#endif

#ifndef DEPCA_TOTAL_SIZE
#define DEPCA_TOTAL_SIZE 0x10
#endif

#ifndef MAX_NUM_DEPCAS
#define MAX_NUM_DEPCAS 2
#endif

/*
** Set the number of Tx and Rx buffers. 
*/
#ifndef DEPCA_BUFFER_LOG_SZ
#define RING_SIZE	16              /* 16 buffers */
#else
#define RING_SIZE	(1 << (DEPCA_BUFFERS_LOG_SZ))
#endif  /* DEPCA_BUFFER_LOG_SZ */

#define PKT_BUF_SZ	1544            /* Buffer size for each Tx/Rx buffer */
#define PKT_SZ   	1514            /* Maximum ethernet packet length */
#define DAT_SZ   	1500            /* Maximum ethernet data length */
#define PKT_HDR_LEN     14              /* Addresses and data length info */

#ifdef HAVE_MULTICAST
#ifndef CRC_POLYNOMIAL
#define CRC_POLYNOMIAL 0x04c11db7       /* Ethernet CRC polynomial */
#endif /* CRC_POLYNOMIAL */
#endif /* HAVE_MULTICAST */

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

/*
** The DEPCA Rx and Tx ring descriptors. 
*/
struct depca_rx_head {
    long base;
    short buf_length;		/* This length is negative 2's complement! */
    short msg_length;		/* This length is "normal". */
};

struct depca_tx_head {
    long base;
    short length;		/* This length is negative 2's complement! */
    short misc;                 /* Errors and TDR info */
};

struct depca_ring_info {
};

/*
** The Lance initialization block, described in databook, in common memory.
*/
struct depca_init {
    unsigned short mode;	/* Mode register */
    unsigned char phys_addr[ETH_ALEN];	/* Physical ethernet address */
    unsigned short filter[4];	/* Multicast filter. */
    unsigned long rx_ring;     	/* Rx ring base pointer & ring length */
    unsigned long tx_ring;	/* Tx ring base pointer & ring length */
};

struct depca_private {
    char devname[8];            /* Not used */
    struct depca_rx_head *rx_ring; /* Pointer to start of RX descriptor ring */
    struct depca_tx_head *tx_ring; /* Pointer to start of TX descriptor ring */
    struct depca_init	init_block;/* Initialization block */
    long dma_buffs;		/* Start address of Rx and Tx buffers. */
    int	cur_rx, cur_tx;		/* The next free ring entry */
    int dirty_rx, dirty_tx;	/* The ring entries to be free()ed. */
    int dma;
    struct enet_statistics stats;
    char old_depca;
    short ringSize;             /* ring size based on available memory */
    short rmask;                /* modulus mask based on ring size */
    long rlen;                  /* log2(ringSize) for the descriptors */
};

/*
** Public Functions
*/
static int depca_open(struct device *dev);
static int depca_start_xmit(struct sk_buff *skb, struct device *dev);
static void depca_interrupt(int reg_ptr);
static int depca_close(struct device *dev);
static struct enet_statistics *depca_get_stats(struct device *dev);
#ifdef HAVE_MULTICAST
static void set_multicast_list(struct device *dev, int num_addrs, void *addrs);
#endif

/*
** Private functions
*/
static int depca_probe1(struct device *dev, short ioaddr);
static void depca_init_ring(struct device *dev);
static int depca_rx(struct device *dev);
static int depca_tx(struct device *dev);

static void LoadCSRs(struct device *dev);
static int InitRestartDepca(struct device *dev);
static char *DepcaSignature(unsigned long mem_addr);
static int DevicePresent(short ioaddr);
#ifdef HAVE_MULTICAST
static void SetMulticastFilter(int num_addrs, char *addrs, char *multicast_table);
#endif

static int num_depcas = 0, num_eth = 0;;

/*
** Miscellaneous defines...
*/
#define STOP_DEPCA \
    outw(CSR0, DEPCA_ADDR);\
    outw(STOP, DEPCA_DATA)



int depca_probe(struct device *dev)
{
    int *port, ports[] = DEPCA_IO_PORTS;
    int base_addr = dev->base_addr;
    int status;
    struct device *eth0 = (struct device *) NULL;

    if (base_addr > 0x1ff) {	      /* Check a single specified location. */
		status = depca_probe1(dev, base_addr);
    } else if (base_addr > 0) {	      /* Don't probe at all. */
		status = -ENXIO;
    } else {                          /* First probe for the DEPCA test */
                                      /* pattern in ROM */

      for (status = -ENODEV, port = &ports[0]; 
	                    *port && (num_depcas < MAX_NUM_DEPCAS); port++) {
	int ioaddr = *port;

#ifdef HAVE_PORTRESERVE
	if (check_region(ioaddr, DEPCA_TOTAL_SIZE))
	    continue;
#endif
	if (DevicePresent(DEPCA_PROM) == 0) {
	  if (num_depcas > 0) {        /* only gets here in autoprobe */

	    /*
	    ** Check the device structures for an end of list or unused device
	    */
	    while (dev->next != (struct device *)NULL) {
	      if (dev->next->base_addr == 0xffe0) break;
	      dev = dev->next;         /* walk through eth device list */
	      num_eth++;               /* increment eth device number */
	    }

	    /*
	    ** If no more device structures, malloc one up. If memory could
	    ** not be allocated, print an error message.
	    ** 
	    */
	    if (dev->next == (struct device *)NULL) {
	      dev->next = (struct device *)kmalloc(sizeof(struct device) + 8,
                                                                  GFP_KERNEL);
	    } else {
	      printk("eth%d: Device not initialised, insufficient memory\n",
		                                                      num_eth);
	    }

	    /*
	    ** If the memory was allocated, point to the new memory area
	    ** and initialize it (name, I/O address, next device (NULL) and
	    ** initialisation probe routine).
	    */
	    if ((dev->next != (struct device *)NULL) &&
		(num_eth > 0) && (num_eth < 9999)) {
	      dev = dev->next;         /* point to the new device */
	      dev->name = (char *)(dev + sizeof(struct device));
	      sprintf(dev->name,"eth%d", num_eth); /* New device name */
	      dev->base_addr = ioaddr; /* assign the io address */
	      dev->next = (struct device *)NULL; /* mark the end of list */
	      dev->init = &depca_probe;/* initialisation routine */
	    }
	  } else {
	    eth0 = dev;                /* remember the first device */
	    status = depca_probe1(dev, ioaddr);
	  }
	  num_depcas++;
	  num_eth++;
	}
      }
      if (eth0) dev = eth0;             /* restore the first device */
    }

    if (status) dev->base_addr = base_addr;

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

static int
depca_probe1(struct device *dev, short ioaddr)
{
    struct depca_private *lp;
    int i,j, status=0;
    unsigned long mem_start, mem_base[] = DEPCA_RAM_BASE_ADDRESSES;
    char *name=(char *)NULL;
    int nicsr, offset;


    /*
    ** Stop the DEPCA. Enable the DBR ROM. Disable interrupts and remote boot
    */
    STOP_DEPCA;

    nicsr = inw(DEPCA_NICSR);
    nicsr = ((nicsr & ~SHE & ~RBE & ~IEN) | IM);
    outw(nicsr, DEPCA_NICSR);

    if (inw(DEPCA_DATA) == STOP) {

    /* Now find out what kind of DEPCA we have. The DE100 uses a different
    ** addressing scheme for some registers compared to the DE2xx series.
    ** Note that a base address location is marked as checked if no DEPCA is
    ** there or one is found (when the search is immediately terminated). This
    ** shortens the search time a little for multiple DEPCAs.
    */

      for (j = 0, i = 0; mem_base[i] && (j == 0);) {
	if (((mem_chkd >> i) & 0x01) == 0) { /* has the memory been checked? */
	  name = DepcaSignature(mem_base[i]);/* check for a DEPCA here */
	  mem_chkd |= (0x01 << i);           /* mark location checked */
	  if (*name != (char)NULL) {         /* one found? */
	    j = 1;                           /* set exit flag */
	  } else {
	    i++;                             /* increment search index */
	  }
	}
      }

      if (*name != (char)NULL) {          /* found a DEPCA device */
	mem_start = mem_base[i];
	dev->base_addr = ioaddr;

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

      /* There is a 32 byte station address PROM at DEPCA_PROM address.
	 The first six bytes are the station address. They can be read
	 directly since the signature search set up the ROM address 
	 counter correctly just before this function.

	 For the DE100 we have to be careful about which port is used to
	 read the ROM info.
      */

	if (strstr(name,"DE100")!=(char *)NULL) {
	  j = 1;
	} else {
	  j = 0;
	}

	printk("ethernet address ");
	for (i = 0; i < ETH_ALEN - 1; i++) { /* get the ethernet address */
	  printk("%2.2x:", dev->dev_addr[i] = inb(DEPCA_PROM + j));
	}
	printk("%2.2x", dev->dev_addr[i] = inb(DEPCA_PROM + j));

	for (;i<32;i++) {                /* leave ROM counter in known state */
	  j=inb(DEPCA_PROM);
	}

#ifdef HAVE_PORTRESERVE
	snarf_region(ioaddr, DEPCA_TOTAL_SIZE);
#endif

	/* 
	 ** Determine the base address for the DEPCA RAM from the NI-CSR
	 ** and make up a DEPCA-specific-data structure. 
        */

	if (nicsr & BUF) {
	  offset = 0x8000;              /* 32kbyte RAM */
	  nicsr &= ~BS;                 /* DEPCA RAM in top 32k */
	  printk(",\n      with 32kB RAM");
	} else {
	  offset = 0x0000;              /* 64kbyte RAM */
	  printk(",\n      with 64kB RAM");
	}

	mem_start += offset;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本美女视频一区二区| 国产精品小仙女| 久久在线观看免费| 色综合久久久久久久久| 日产国产高清一区二区三区| 中文字幕一区二区三区蜜月| 日韩欧美一级精品久久| 色综合天天综合网天天看片| 九色porny丨国产精品| 亚洲一区二区av在线| 国产嫩草影院久久久久| 日韩女同互慰一区二区| 欧美日韩一区高清| 91麻豆高清视频| 国产成人av电影免费在线观看| 日韩国产欧美视频| 一区二区免费在线播放| 中文字幕国产一区二区| 精品久久久久一区二区国产| 666欧美在线视频| 一本久久精品一区二区| 成人18视频日本| 久久国产综合精品| 日韩精品一二区| 亚洲高清不卡在线| 亚洲自拍偷拍欧美| 一区二区高清在线| 亚洲欧美日韩中文字幕一区二区三区| 久久久www免费人成精品| 日韩一区二区不卡| 日韩三级伦理片妻子的秘密按摩| 欧美挠脚心视频网站| 欧美日韩高清一区二区不卡 | 99久久精品99国产精品 | 国产一区二区三区免费播放 | 日韩vs国产vs欧美| 亚洲国产视频一区| 毛片不卡一区二区| 日韩福利电影在线观看| 五月婷婷另类国产| 性感美女久久精品| 欧美a级理论片| 日本亚洲天堂网| 精品在线你懂的| 国产综合久久久久影院| 国产精品一二二区| 成人综合日日夜夜| av色综合久久天堂av综合| 成人爱爱电影网址| 91啪在线观看| 欧美日韩亚洲国产综合| 666欧美在线视频| 日韩一区二区三区三四区视频在线观看| 日韩一区二区三区在线视频| 欧美r级在线观看| 久久精品欧美日韩精品| 国产精品美日韩| 成人欧美一区二区三区视频网页| 亚洲视频一区二区在线观看| 亚洲制服欧美中文字幕中文字幕| 亚洲成年人网站在线观看| 免费一级欧美片在线观看| 精品夜夜嗨av一区二区三区| 成人一区二区三区中文字幕| 92精品国产成人观看免费| 在线免费观看不卡av| 91精品国产黑色紧身裤美女| 久久综合国产精品| 中文字幕一区二区三区乱码在线| 亚洲午夜精品网| 日本不卡一二三| 国产成人精品综合在线观看| 色婷婷综合久久久久中文一区二区| 欧美少妇一区二区| 精品国产91久久久久久久妲己| 欧美国产在线观看| 亚洲一区免费在线观看| 久久er99精品| 一本久久a久久精品亚洲| 日韩一区二区三区在线| 日韩一区在线免费观看| 视频在线观看91| 国产成人av影院| 欧美日韩国产大片| 日本一区二区在线不卡| 亚洲精品中文在线影院| 精品一区二区综合| 欧美影院一区二区三区| 久久久精品蜜桃| 日韩精品亚洲一区| 91社区在线播放| 久久一留热品黄| 午夜欧美电影在线观看| 波多野结衣精品在线| 日韩欧美成人激情| 亚洲一区中文日韩| 国产成人综合视频| 日韩女优av电影在线观看| 一区二区三区四区在线| 国产精品一区二区不卡| 91精品免费在线观看| 成人欧美一区二区三区1314| 精品制服美女久久| 欧美丰满一区二区免费视频| 亚洲视频免费观看| 韩国欧美国产1区| 欧美理论片在线| 亚洲美女屁股眼交| 国产成人精品综合在线观看| 日韩欧美激情一区| 调教+趴+乳夹+国产+精品| 91麻豆精东视频| 国产精品色呦呦| 国产精品一卡二卡| 精品久久久久久亚洲综合网| 午夜精品久久久久久久| 在线亚洲高清视频| 亚洲欧洲另类国产综合| 国产精品自拍av| 精品国产乱码久久久久久闺蜜| 婷婷久久综合九色国产成人 | 国产亚洲视频系列| 麻豆91精品视频| 91精品国模一区二区三区| 亚洲一线二线三线视频| 在线视频欧美精品| 一区二区三区在线观看视频| 91原创在线视频| 国产精品国产三级国产有无不卡 | 色婷婷综合久色| 亚洲欧洲日产国产综合网| www.色精品| 成人欧美一区二区三区小说| 97国产一区二区| 亚洲视频综合在线| 色菇凉天天综合网| 亚洲欧美另类小说视频| 91污在线观看| 亚洲乱码国产乱码精品精小说| 99久久综合国产精品| 国产精品久久久久影视| 99久久婷婷国产综合精品| 国产精品久久影院| 91丨porny丨在线| 亚洲黄色片在线观看| 日本久久一区二区三区| 亚洲国产sm捆绑调教视频 | 99久久精品国产导航| 亚洲欧美日韩系列| 欧美色倩网站大全免费| 亚洲高清在线精品| 日韩亚洲欧美一区二区三区| 久久99国产精品免费| 久久久91精品国产一区二区精品| 成人av在线播放网址| 亚洲精品国久久99热| 精品污污网站免费看| 蜜臀久久99精品久久久画质超高清| 欧美电影免费提供在线观看| 国产福利91精品一区| 亚洲伦理在线精品| 911国产精品| 韩国av一区二区三区在线观看| 欧美国产日韩精品免费观看| 色综合激情五月| 日韩国产高清在线| 久久婷婷色综合| 91丝袜呻吟高潮美腿白嫩在线观看| 亚洲电影在线免费观看| 日韩精品一区在线| 不卡视频在线观看| 亚洲成人精品一区| 久久久777精品电影网影网 | 人禽交欧美网站| 久久久国产精华| 欧美色窝79yyyycom| 精品一区二区日韩| 亚洲视频精选在线| 日韩三级免费观看| 91欧美一区二区| 六月婷婷色综合| 国产精品久久国产精麻豆99网站 | 日韩欧美国产一区二区在线播放| 国产乱码一区二区三区| 一区二区三区四区国产精品| 26uuu亚洲综合色欧美 | 欧美日韩亚洲综合一区| 国产成人在线观看免费网站| 亚洲成人免费电影| 国产精品美女一区二区在线观看| 91精品国产综合久久婷婷香蕉| 99视频一区二区三区| 经典三级在线一区| 亚洲综合一区二区三区| 国产丝袜美腿一区二区三区| 欧美一区二区视频网站| 色婷婷久久99综合精品jk白丝| 国产精品一区一区三区| 丝袜亚洲另类丝袜在线| 中文字幕一区二区三区av|