Annotation of Gnu-Mach/linux/src/drivers/net/depca.c, revision 1.1

1.1     ! root        1: /*  depca.c: A DIGITAL DEPCA  & EtherWORKS ethernet driver for linux.
        !             2: 
        !             3:     Written 1994, 1995 by David C. Davies.
        !             4: 
        !             5: 
        !             6:                       Copyright 1994 David C. Davies
        !             7:                                   and 
        !             8:                         United States Government
        !             9:         (as represented by the Director, National Security Agency).  
        !            10: 
        !            11:                Copyright 1995  Digital Equipment Corporation.
        !            12: 
        !            13: 
        !            14:     This software may be used and distributed according to the terms of
        !            15:     the GNU Public License, incorporated herein by reference.
        !            16: 
        !            17:     This driver is written for the Digital Equipment Corporation series
        !            18:     of DEPCA and EtherWORKS ethernet cards:
        !            19: 
        !            20:         DEPCA       (the original)
        !            21:        DE100
        !            22:        DE101
        !            23:        DE200 Turbo
        !            24:        DE201 Turbo
        !            25:        DE202 Turbo (TP BNC)
        !            26:        DE210
        !            27:        DE422       (EISA)
        !            28: 
        !            29:     The  driver has been tested on DE100, DE200 and DE202 cards  in  a
        !            30:     relatively busy network. The DE422 has been tested a little.
        !            31: 
        !            32:     This  driver will NOT work   for the DE203,  DE204  and DE205 series  of
        !            33:     cards,  since they have  a  new custom ASIC in   place of the AMD  LANCE
        !            34:     chip.  See the 'ewrk3.c'   driver in the  Linux  source tree for running
        !            35:     those cards.
        !            36: 
        !            37:     I have benchmarked the driver with a  DE100 at 595kB/s to (542kB/s from)
        !            38:     a DECstation 5000/200.
        !            39: 
        !            40:     The author may be reached at [email protected]
        !            41: 
        !            42:     =========================================================================
        !            43: 
        !            44:     The  driver was originally based  on   the 'lance.c' driver from  Donald
        !            45:     Becker   which  is included with  the  standard  driver distribution for
        !            46:     linux.  V0.4  is  a complete  re-write  with only  the kernel  interface
        !            47:     remaining from the original code.
        !            48: 
        !            49:     1) Lance.c code in /linux/drivers/net/
        !            50:     2) "Ethernet/IEEE 802.3 Family. 1992 World Network Data Book/Handbook",
        !            51:        AMD, 1992 [(800) 222-9323].
        !            52:     3) "Am79C90 CMOS Local Area Network Controller for Ethernet (C-LANCE)",
        !            53:        AMD, Pub. #17881, May 1993.
        !            54:     4) "Am79C960 PCnet-ISA(tm), Single-Chip Ethernet Controller for ISA",
        !            55:        AMD, Pub. #16907, May 1992
        !            56:     5) "DEC EtherWORKS LC Ethernet Controller Owners Manual",
        !            57:        Digital Equipment corporation, 1990, Pub. #EK-DE100-OM.003
        !            58:     6) "DEC EtherWORKS Turbo Ethernet Controller Owners Manual",
        !            59:        Digital Equipment corporation, 1990, Pub. #EK-DE200-OM.003
        !            60:     7) "DEPCA Hardware Reference Manual", Pub. #EK-DEPCA-PR
        !            61:        Digital Equipment Corporation, 1989
        !            62:     8) "DEC EtherWORKS Turbo_(TP BNC) Ethernet Controller Owners Manual",
        !            63:        Digital Equipment corporation, 1991, Pub. #EK-DE202-OM.001
        !            64:     
        !            65: 
        !            66:     Peter Bauer's depca.c (V0.5) was referred to when debugging V0.1 of this
        !            67:     driver.
        !            68: 
        !            69:     The original DEPCA  card requires that the  ethernet ROM address counter
        !            70:     be enabled to count and has an 8 bit NICSR.  The ROM counter enabling is
        !            71:     only  done when a  0x08 is read as the  first address octet (to minimise
        !            72:     the chances  of writing over some  other hardware's  I/O register).  The
        !            73:     NICSR accesses   have been changed  to  byte accesses  for all the cards
        !            74:     supported by this driver, since there is only one  useful bit in the MSB
        !            75:     (remote boot timeout) and it  is not used.  Also, there  is a maximum of
        !            76:     only 48kB network  RAM for this  card.  My thanks  to Torbjorn Lindh for
        !            77:     help debugging all this (and holding my feet to  the fire until I got it
        !            78:     right).
        !            79: 
        !            80:     The DE200  series  boards have  on-board 64kB  RAM for  use  as a shared
        !            81:     memory network  buffer. Only the DE100  cards make use  of a  2kB buffer
        !            82:     mode which has not  been implemented in  this driver (only the 32kB  and
        !            83:     64kB modes are supported [16kB/48kB for the original DEPCA]).
        !            84: 
        !            85:     At the most only 2 DEPCA cards can  be supported on  the ISA bus because
        !            86:     there is only provision  for two I/O base addresses  on each card (0x300
        !            87:     and 0x200). The I/O address is detected by searching for a byte sequence
        !            88:     in the Ethernet station address PROM at the expected I/O address for the
        !            89:     Ethernet  PROM.   The shared memory  base   address  is 'autoprobed'  by
        !            90:     looking  for the self  test PROM  and detecting the  card name.   When a
        !            91:     second  DEPCA is  detected,  information  is   placed in the   base_addr
        !            92:     variable of the  next device structure (which  is created if necessary),
        !            93:     thus  enabling ethif_probe  initialization  for the device.  More than 2
        !            94:     EISA cards can  be  supported, but  care will  be  needed assigning  the
        !            95:     shared memory to ensure that each slot has the  correct IRQ, I/O address
        !            96:     and shared memory address assigned.
        !            97: 
        !            98:     ************************************************************************
        !            99: 
        !           100:     NOTE: If you are using two  ISA DEPCAs, it is  important that you assign
        !           101:     the base memory addresses correctly.   The  driver autoprobes I/O  0x300
        !           102:     then 0x200.  The  base memory address for  the first device must be less
        !           103:     than that of the second so that the auto probe will correctly assign the
        !           104:     I/O and memory addresses on the same card.  I can't think of a way to do
        !           105:     this unambiguously at the moment, since there is nothing on the cards to
        !           106:     tie I/O and memory information together.
        !           107: 
        !           108:     I am unable  to  test  2 cards   together for now,    so this  code   is
        !           109:     unchecked. All reports, good or bad, are welcome.
        !           110: 
        !           111:     ************************************************************************
        !           112: 
        !           113:     The board IRQ   setting must be  at an  unused IRQ which  is auto-probed
        !           114:     using Donald Becker's autoprobe routines. DEPCA and DE100 board IRQs are
        !           115:     {2,3,4,5,7}, whereas the  DE200 is at {5,9,10,11,15}.  Note that IRQ2 is
        !           116:     really IRQ9 in machines with 16 IRQ lines.
        !           117: 
        !           118:     No 16MB memory  limitation should exist with this  driver as DMA is  not
        !           119:     used and the common memory area is in low memory on the network card (my
        !           120:     current system has 20MB and I've not had problems yet).
        !           121: 
        !           122:     The ability to load this driver as a loadable module has been added. To
        !           123:     utilise this ability, you have to do <8 things:
        !           124: 
        !           125:     0) have a copy of the loadable modules code installed on your system.
        !           126:     1) copy depca.c from the  /linux/drivers/net directory to your favourite
        !           127:     temporary directory.
        !           128:     2) if you wish, edit the  source code near  line 1530 to reflect the I/O
        !           129:     address and IRQ you're using (see also 5).
        !           130:     3) compile  depca.c, but include -DMODULE in  the command line to ensure
        !           131:     that the correct bits are compiled (see end of source code).
        !           132:     4) if you are wanting to add a new  card, goto 5. Otherwise, recompile a
        !           133:     kernel with the depca configuration turned off and reboot.
        !           134:     5) insmod depca.o [irq=7] [io=0x200] [mem=0xd0000] [adapter_name=DE100]
        !           135:        [Alan Cox: Changed the code to allow command line irq/io assignments]
        !           136:        [Dave Davies: Changed the code to allow command line mem/name
        !           137:                                                                 assignments]
        !           138:     6) run the net startup bits for your eth?? interface manually 
        !           139:     (usually /etc/rc.inet[12] at boot time). 
        !           140:     7) enjoy!
        !           141: 
        !           142:     Note that autoprobing is not allowed in loadable modules - the system is
        !           143:     already up and running and you're messing with interrupts.
        !           144: 
        !           145:     To unload a module, turn off the associated interface 
        !           146:     'ifconfig eth?? down' then 'rmmod depca'.
        !           147: 
        !           148:     To assign a base memory address for the shared memory  when running as a
        !           149:     loadable module, see 5 above.  To include the adapter  name (if you have
        !           150:     no PROM  but know the card name)  also see 5  above. Note that this last
        !           151:     option  will not work  with kernel  built-in  depca's. 
        !           152: 
        !           153:     The shared memory assignment for a loadable module  makes sense to avoid
        !           154:     the 'memory autoprobe' picking the wrong shared memory  (for the case of
        !           155:     2 depca's in a PC).
        !           156: 
        !           157: 
        !           158:     TO DO:
        !           159:     ------
        !           160: 
        !           161: 
        !           162:     Revision History
        !           163:     ----------------
        !           164: 
        !           165:     Version   Date        Description
        !           166:   
        !           167:       0.1     25-jan-94   Initial writing.
        !           168:       0.2     27-jan-94   Added LANCE TX hardware buffer chaining.
        !           169:       0.3      1-feb-94   Added multiple DEPCA support.
        !           170:       0.31     4-feb-94   Added DE202 recognition.
        !           171:       0.32    19-feb-94   Tidy up. Improve multi-DEPCA support.
        !           172:       0.33    25-feb-94   Fix DEPCA ethernet ROM counter enable.
        !           173:                           Add jabber packet fix from [email protected]
        !           174:                          and [email protected]
        !           175:       0.34     7-mar-94   Fix DEPCA max network memory RAM & NICSR access.
        !           176:       0.35     8-mar-94   Added DE201 recognition. Tidied up.
        !           177:       0.351   30-apr-94   Added EISA support. Added DE422 recognition.
        !           178:       0.36    16-may-94   DE422 fix released.
        !           179:       0.37    22-jul-94   Added MODULE support
        !           180:       0.38    15-aug-94   Added DBR ROM switch in depca_close(). 
        !           181:                           Multi DEPCA bug fix.
        !           182:       0.38axp 15-sep-94   Special version for Alpha AXP Linux V1.0.
        !           183:       0.381   12-dec-94   Added DE101 recognition, fix multicast bug.
        !           184:       0.382    9-feb-95   Fix recognition bug reported by <[email protected]>.
        !           185:       0.383   22-feb-95   Fix for conflict with VESA SCSI reported by
        !           186:                           <[email protected]>
        !           187:       0.384   17-mar-95   Fix a ring full bug reported by <[email protected]>
        !           188:       0.385    3-apr-95   Fix a recognition bug reported by 
        !           189:                                                 <[email protected]>
        !           190:       0.386   21-apr-95   Fix the last fix...sorry, must be galloping senility
        !           191:       0.40    25-May-95   Rewrite for portability & updated.
        !           192:                           ALPHA support from <[email protected]>
        !           193:       0.41    26-Jun-95   Added verify_area() calls in depca_ioctl() from
        !           194:                           suggestion by <[email protected]>
        !           195:       0.42    27-Dec-95   Add 'mem' shared memory assignment for loadable 
        !           196:                           modules.
        !           197:                           Add 'adapter_name' for loadable modules when no PROM.
        !           198:                          Both above from a suggestion by 
        !           199:                          <[email protected]>.
        !           200:                          Add new multicasting code.
        !           201:       0.421   22-Apr-96          Fix alloc_device() bug <[email protected]>
        !           202:       0.422   29-Apr-96          Fix depca_hw_init() bug <[email protected]>
        !           203:       0.423    7-Jun-96   Fix module load bug <[email protected]>
        !           204:       0.43    16-Aug-96   Update alloc_device() to conform to de4x5.c
        !           205: 
        !           206:     =========================================================================
        !           207: */
        !           208: 
        !           209: static const char *version = "depca.c:v0.43 96/8/16 [email protected]\n";
        !           210: 
        !           211: #include <linux/module.h>
        !           212: 
        !           213: #include <linux/kernel.h>
        !           214: #include <linux/sched.h>
        !           215: #include <linux/string.h>
        !           216: #include <linux/ptrace.h>
        !           217: #include <linux/errno.h>
        !           218: #include <linux/ioport.h>
        !           219: #include <linux/malloc.h>
        !           220: #include <linux/interrupt.h>
        !           221: #include <linux/delay.h>
        !           222: #include <asm/segment.h>
        !           223: #include <asm/bitops.h>
        !           224: #include <asm/io.h>
        !           225: #include <asm/dma.h>
        !           226: 
        !           227: #include <linux/netdevice.h>
        !           228: #include <linux/etherdevice.h>
        !           229: #include <linux/skbuff.h>
        !           230: 
        !           231: #include <linux/time.h>
        !           232: #include <linux/types.h>
        !           233: #include <linux/unistd.h>
        !           234: #include <linux/ctype.h>
        !           235: 
        !           236: #include "depca.h"
        !           237: 
        !           238: #ifdef DEPCA_DEBUG
        !           239: static int depca_debug = DEPCA_DEBUG;
        !           240: #else
        !           241: static int depca_debug = 1;
        !           242: #endif
        !           243: 
        !           244: #define DEPCA_NDA 0xffe0            /* No Device Address */
        !           245: 
        !           246: /*
        !           247: ** Ethernet PROM defines
        !           248: */
        !           249: #define PROBE_LENGTH    32
        !           250: #define ETH_PROM_SIG    0xAA5500FFUL
        !           251: 
        !           252: /*
        !           253: ** Set the number of Tx and Rx buffers. Ensure that the memory requested
        !           254: ** here is <= to the amount of shared memory set up by the board switches.
        !           255: ** The number of descriptors MUST BE A POWER OF 2.
        !           256: **
        !           257: ** total_memory = NUM_RX_DESC*(8+RX_BUFF_SZ) + NUM_TX_DESC*(8+TX_BUFF_SZ)
        !           258: */
        !           259: #define NUM_RX_DESC     8               /* Number of RX descriptors */
        !           260: #define NUM_TX_DESC     8               /* Number of TX descriptors */
        !           261: #define RX_BUFF_SZ     1536            /* Buffer size for each Rx buffer */
        !           262: #define TX_BUFF_SZ     1536            /* Buffer size for each Tx buffer */
        !           263: 
        !           264: #define CRC_POLYNOMIAL_BE 0x04c11db7UL  /* Ethernet CRC, big endian */
        !           265: #define CRC_POLYNOMIAL_LE 0xedb88320UL  /* Ethernet CRC, little endian */
        !           266: 
        !           267: /*
        !           268: ** EISA bus defines
        !           269: */
        !           270: #define DEPCA_EISA_IO_PORTS 0x0c00       /* I/O port base address, slot 0 */
        !           271: #define MAX_EISA_SLOTS 16
        !           272: #define EISA_SLOT_INC 0x1000
        !           273: 
        !           274: /*
        !           275: ** ISA Bus defines
        !           276: */
        !           277: #define DEPCA_RAM_BASE_ADDRESSES {0xc0000,0xd0000,0xe0000,0x00000}
        !           278: #define DEPCA_IO_PORTS {0x300, 0x200, 0}
        !           279: #define DEPCA_TOTAL_SIZE 0x10
        !           280: static short mem_chkd = 0;
        !           281: 
        !           282: /*
        !           283: ** Name <-> Adapter mapping
        !           284: */
        !           285: #define DEPCA_SIGNATURE {"DEPCA",\
        !           286:                         "DE100","DE101",\
        !           287:                          "DE200","DE201","DE202",\
        !           288:                         "DE210",\
        !           289:                          "DE422",\
        !           290:                          ""}
        !           291: static enum {DEPCA, de100, de101, de200, de201, de202, de210, de422, unknown} adapter;
        !           292: 
        !           293: /*
        !           294: ** Miscellaneous info...
        !           295: */
        !           296: #define DEPCA_STRLEN 16
        !           297: #define MAX_NUM_DEPCAS 2
        !           298: 
        !           299: /*
        !           300: ** Memory Alignment. Each descriptor is 4 longwords long. To force a
        !           301: ** particular alignment on the TX descriptor, adjust DESC_SKIP_LEN and
        !           302: ** DESC_ALIGN. ALIGN aligns the start address of the private memory area
        !           303: ** and hence the RX descriptor ring's first entry. 
        !           304: */
        !           305: #define ALIGN4      ((u_long)4 - 1)       /* 1 longword align */
        !           306: #define ALIGN8      ((u_long)8 - 1)       /* 2 longword (quadword) align */
        !           307: #define ALIGN         ALIGN8              /* Keep the LANCE happy... */
        !           308: 
        !           309: /*
        !           310: ** The DEPCA Rx and Tx ring descriptors. 
        !           311: */
        !           312: struct depca_rx_desc {
        !           313:     volatile s32 base;
        !           314:     s16 buf_length;            /* This length is negative 2's complement! */
        !           315:     s16 msg_length;            /* This length is "normal". */
        !           316: };
        !           317: 
        !           318: struct depca_tx_desc {
        !           319:     volatile s32 base;
        !           320:     s16 length;                        /* This length is negative 2's complement! */
        !           321:     s16 misc;                   /* Errors and TDR info */
        !           322: };
        !           323: 
        !           324: #define LA_MASK 0x0000ffff      /* LANCE address mask for mapping network RAM
        !           325:                                   to LANCE memory address space */
        !           326: 
        !           327: /*
        !           328: ** The Lance initialization block, described in databook, in common memory.
        !           329: */
        !           330: struct depca_init {
        !           331:     u16 mode;                  /* Mode register */
        !           332:     u8  phys_addr[ETH_ALEN];   /* Physical ethernet address */
        !           333:     u8  mcast_table[8];                /* Multicast Hash Table. */
        !           334:     u32 rx_ring;               /* Rx ring base pointer & ring length */
        !           335:     u32 tx_ring;               /* Tx ring base pointer & ring length */
        !           336: };
        !           337: 
        !           338: #define DEPCA_PKT_STAT_SZ 16
        !           339: #define DEPCA_PKT_BIN_SZ  128                /* Should be >=100 unless you
        !           340:                                                 increase DEPCA_PKT_STAT_SZ */
        !           341: struct depca_private {
        !           342:     char devname[DEPCA_STRLEN];    /* Device Product String                  */
        !           343:     char adapter_name[DEPCA_STRLEN];/* /proc/ioports string                  */
        !           344:     char adapter;                  /* Adapter type                           */
        !           345:     struct depca_rx_desc *rx_ring; /* Pointer to start of RX descriptor ring */
        !           346:     struct depca_tx_desc *tx_ring; /* Pointer to start of TX descriptor ring */
        !           347:     struct depca_init  init_block;/* Shadow Initialization block            */
        !           348:     char *rx_memcpy[NUM_RX_DESC];  /* CPU virt address of sh'd memory buffs  */
        !           349:     char *tx_memcpy[NUM_TX_DESC];  /* CPU virt address of sh'd memory buffs  */
        !           350:     u_long bus_offset;             /* (E)ISA bus address offset vs LANCE     */
        !           351:     u_long sh_mem;                /* Physical start addr of shared mem area */
        !           352:     u_long dma_buffs;             /* LANCE Rx and Tx buffers start address. */
        !           353:     int        rx_new, tx_new;            /* The next free ring entry               */
        !           354:     int rx_old, tx_old;                   /* The ring entries to be free()ed.       */
        !           355:     struct enet_statistics stats;
        !           356:     struct {                       /* Private stats counters                 */
        !           357:        u32 bins[DEPCA_PKT_STAT_SZ];
        !           358:        u32 unicast;
        !           359:        u32 multicast;
        !           360:        u32 broadcast;
        !           361:        u32 excessive_collisions;
        !           362:        u32 tx_underruns;
        !           363:        u32 excessive_underruns;
        !           364:     } pktStats;
        !           365:     int txRingMask;                /* TX ring mask                           */
        !           366:     int rxRingMask;                /* RX ring mask                           */
        !           367:     s32 rx_rlen;                   /* log2(rxRingMask+1) for the descriptors */
        !           368:     s32 tx_rlen;                   /* log2(txRingMask+1) for the descriptors */
        !           369: };
        !           370: 
        !           371: /*
        !           372: ** The transmit ring full condition is described by the tx_old and tx_new
        !           373: ** pointers by:
        !           374: **    tx_old            = tx_new    Empty ring
        !           375: **    tx_old            = tx_new+1  Full ring
        !           376: **    tx_old+txRingMask = tx_new    Full ring  (wrapped condition)
        !           377: */
        !           378: #define TX_BUFFS_AVAIL ((lp->tx_old<=lp->tx_new)?\
        !           379:                         lp->tx_old+lp->txRingMask-lp->tx_new:\
        !           380:                          lp->tx_old               -lp->tx_new-1)
        !           381: 
        !           382: /*
        !           383: ** Public Functions
        !           384: */
        !           385: static int    depca_open(struct device *dev);
        !           386: static int    depca_start_xmit(struct sk_buff *skb, struct device *dev);
        !           387: static void   depca_interrupt(int irq, void *dev_id, struct pt_regs * regs);
        !           388: static int    depca_close(struct device *dev);
        !           389: static int    depca_ioctl(struct device *dev, struct ifreq *rq, int cmd);
        !           390: static struct enet_statistics *depca_get_stats(struct device *dev);
        !           391: static void   set_multicast_list(struct device *dev);
        !           392: 
        !           393: /*
        !           394: ** Private functions
        !           395: */
        !           396: static int    depca_hw_init(struct device *dev, u_long ioaddr);
        !           397: static void   depca_init_ring(struct device *dev);
        !           398: static int    depca_rx(struct device *dev);
        !           399: static int    depca_tx(struct device *dev);
        !           400: 
        !           401: static void   LoadCSRs(struct device *dev);
        !           402: static int    InitRestartDepca(struct device *dev);
        !           403: static void   DepcaSignature(char *name, u_long paddr);
        !           404: static int    DevicePresent(u_long ioaddr);
        !           405: static int    get_hw_addr(struct device *dev);
        !           406: static int    EISA_signature(char *name, s32 eisa_id);
        !           407: static void   SetMulticastFilter(struct device *dev);
        !           408: static void   isa_probe(struct device *dev, u_long iobase);
        !           409: static void   eisa_probe(struct device *dev, u_long iobase);
        !           410: static struct device *alloc_device(struct device *dev, u_long iobase);
        !           411: static int    depca_dev_index(char *s);
        !           412: static struct device *insert_device(struct device *dev, u_long iobase, int (*init)(struct device *));
        !           413: static int    load_packet(struct device *dev, struct sk_buff *skb);
        !           414: static void   depca_dbg_open(struct device *dev);
        !           415: 
        !           416: #ifdef MODULE
        !           417: int           init_module(void);
        !           418: void          cleanup_module(void);
        !           419: static int    autoprobed = 1, loading_module = 1;
        !           420: # else
        !           421: static u_char de1xx_irq[] = {2,3,4,5,7,9,0};
        !           422: static u_char de2xx_irq[] = {5,9,10,11,15,0};
        !           423: static u_char de422_irq[] = {5,9,10,11,0};
        !           424: static u_char *depca_irq;
        !           425: static int    autoprobed = 0, loading_module = 0;
        !           426: #endif /* MODULE */
        !           427: 
        !           428: static char   name[DEPCA_STRLEN];
        !           429: static int    num_depcas = 0, num_eth = 0;
        !           430: static int    mem=0;                       /* For loadable module assignment
        !           431:                                               use insmod mem=0x????? .... */
        !           432: static char   *adapter_name = '\0';        /* If no PROM when loadable module
        !           433:                                              use insmod adapter_name=DE??? ...
        !           434:                                           */
        !           435: /*
        !           436: ** Miscellaneous defines...
        !           437: */
        !           438: #define STOP_DEPCA \
        !           439:     outw(CSR0, DEPCA_ADDR);\
        !           440:     outw(STOP, DEPCA_DATA)
        !           441: 
        !           442: 
        !           443: 
        !           444: int depca_probe(struct device *dev)
        !           445: {
        !           446:   int tmp = num_depcas, status = -ENODEV;
        !           447:   u_long iobase = dev->base_addr;
        !           448: 
        !           449:   if ((iobase == 0) && loading_module){
        !           450:     printk("Autoprobing is not supported when loading a module based driver.\n");
        !           451:     status = -EIO;
        !           452:   } else {
        !           453:     isa_probe(dev, iobase);
        !           454:     eisa_probe(dev, iobase);
        !           455: 
        !           456:     if ((tmp == num_depcas) && (iobase != 0) && loading_module) {
        !           457:       printk("%s: depca_probe() cannot find device at 0x%04lx.\n", dev->name, 
        !           458:                                                                       iobase);
        !           459:     }
        !           460: 
        !           461:     /*
        !           462:     ** Walk the device list to check that at least one device
        !           463:     ** initialised OK
        !           464:     */
        !           465:     for (; (dev->priv == NULL) && (dev->next != NULL); dev = dev->next);
        !           466: 
        !           467:     if (dev->priv) status = 0;
        !           468:     if (iobase == 0) autoprobed = 1;
        !           469:   }
        !           470: 
        !           471:   return status;
        !           472: }
        !           473: 
        !           474: static int
        !           475: depca_hw_init(struct device *dev, u_long ioaddr)
        !           476: {
        !           477:   struct depca_private *lp;
        !           478:   int i, j, offset, netRAM, mem_len, status=0;
        !           479:   s16 nicsr;
        !           480:   u_long mem_start=0, mem_base[] = DEPCA_RAM_BASE_ADDRESSES;
        !           481: 
        !           482:   STOP_DEPCA;
        !           483: 
        !           484:   nicsr = inb(DEPCA_NICSR);
        !           485:   nicsr = ((nicsr & ~SHE & ~RBE & ~IEN) | IM);
        !           486:   outb(nicsr, DEPCA_NICSR);
        !           487: 
        !           488:   if (inw(DEPCA_DATA) == STOP) {
        !           489:     do {
        !           490:       strcpy(name, (adapter_name ? adapter_name : ""));
        !           491:       mem_start = (mem ? mem & 0xf0000 : mem_base[mem_chkd++]);
        !           492:       DepcaSignature(name, mem_start);
        !           493:     } while (!mem && mem_base[mem_chkd] && (adapter == unknown));
        !           494: 
        !           495:     if ((adapter != unknown) && mem_start) {        /* found a DEPCA device */
        !           496:       dev->base_addr = ioaddr;
        !           497: 
        !           498:       if ((ioaddr&0x0fff)==DEPCA_EISA_IO_PORTS) {/* EISA slot address */
        !           499:        printk("%s: %s at 0x%04lx (EISA slot %d)", 
        !           500:                            dev->name, name, ioaddr, (int)((ioaddr>>12)&0x0f));
        !           501:       } else {                             /* ISA port address */
        !           502:        printk("%s: %s at 0x%04lx", dev->name, name, ioaddr);
        !           503:       }
        !           504: 
        !           505:       printk(", h/w address ");
        !           506:       status = get_hw_addr(dev);
        !           507:       for (i=0; i<ETH_ALEN - 1; i++) { /* get the ethernet address */
        !           508:        printk("%2.2x:", dev->dev_addr[i]);
        !           509:       }
        !           510:       printk("%2.2x", dev->dev_addr[i]);
        !           511: 
        !           512:       if (status == 0) {
        !           513:        /* Set up the maximum amount of network RAM(kB) */
        !           514:        netRAM = ((adapter != DEPCA) ? 64 : 48);
        !           515:        if ((nicsr & _128KB) && (adapter == de422)) netRAM = 128;
        !           516:        offset = 0x0000;
        !           517: 
        !           518:        /* Shared Memory Base Address */ 
        !           519:        if (nicsr & BUF) {
        !           520:          offset = 0x8000;              /* 32kbyte RAM offset*/
        !           521:          nicsr &= ~BS;                 /* DEPCA RAM in top 32k */
        !           522:          netRAM -= 32;
        !           523:        }
        !           524:        mem_start += offset;            /* (E)ISA start address */
        !           525:        if ((mem_len = (NUM_RX_DESC*(sizeof(struct depca_rx_desc)+RX_BUFF_SZ) +
        !           526:                        NUM_TX_DESC*(sizeof(struct depca_tx_desc)+TX_BUFF_SZ) +
        !           527:                        sizeof(struct depca_init))) <=
        !           528:            (netRAM<<10)) {
        !           529:          printk(",\n      has %dkB RAM at 0x%.5lx", netRAM, mem_start);
        !           530: 
        !           531:          /* Enable the shadow RAM. */
        !           532:          if (adapter != DEPCA) {
        !           533:            nicsr |= SHE;
        !           534:            outb(nicsr, DEPCA_NICSR);
        !           535:          }
        !           536:  
        !           537:          /* Define the device private memory */
        !           538:          dev->priv = (void *) kmalloc(sizeof(struct depca_private), GFP_KERNEL);
        !           539:          if (dev->priv == NULL)
        !           540:            return -ENOMEM;
        !           541:          lp = (struct depca_private *)dev->priv;
        !           542:          memset((char *)dev->priv, 0, sizeof(struct depca_private));
        !           543:          lp->adapter = adapter;
        !           544:          sprintf(lp->adapter_name,"%s (%s)", name, dev->name);
        !           545:          request_region(ioaddr, DEPCA_TOTAL_SIZE, lp->adapter_name);
        !           546: 
        !           547:          /* Initialisation Block */
        !           548:          lp->sh_mem = mem_start;
        !           549:          mem_start += sizeof(struct depca_init);
        !           550: 
        !           551:          /* Tx & Rx descriptors (aligned to a quadword boundary) */
        !           552:          mem_start = (mem_start + ALIGN) & ~ALIGN;
        !           553:          lp->rx_ring = (struct depca_rx_desc *)mem_start;
        !           554: 
        !           555:          mem_start += (sizeof(struct depca_rx_desc) * NUM_RX_DESC);
        !           556:          lp->tx_ring = (struct depca_tx_desc *)mem_start;
        !           557: 
        !           558:          mem_start += (sizeof(struct depca_tx_desc) * NUM_TX_DESC);
        !           559:          lp->bus_offset = mem_start & 0x00ff0000;
        !           560:          mem_start &= LA_MASK;           /* LANCE re-mapped start address */
        !           561: 
        !           562:          lp->dma_buffs = mem_start;
        !           563: 
        !           564:          /* Finish initialising the ring information. */
        !           565:          lp->rxRingMask = NUM_RX_DESC - 1;
        !           566:          lp->txRingMask = NUM_TX_DESC - 1;
        !           567: 
        !           568:          /* Calculate Tx/Rx RLEN size for the descriptors. */
        !           569:          for (i=0, j = lp->rxRingMask; j>0; i++) {
        !           570:            j >>= 1;
        !           571:          }
        !           572:          lp->rx_rlen = (s32)(i << 29);
        !           573:          for (i=0, j = lp->txRingMask; j>0; i++) {
        !           574:            j >>= 1;
        !           575:          }
        !           576:          lp->tx_rlen = (s32)(i << 29);
        !           577: 
        !           578:          /* Load the initialisation block */
        !           579:          depca_init_ring(dev);
        !           580: 
        !           581:          /* Initialise the control and status registers */
        !           582:          LoadCSRs(dev);
        !           583: 
        !           584:          /* Enable DEPCA board interrupts for autoprobing */
        !           585:          nicsr = ((nicsr & ~IM)|IEN);
        !           586:          outb(nicsr, DEPCA_NICSR);
        !           587: 
        !           588:          /* To auto-IRQ we enable the initialization-done and DMA err,
        !           589:             interrupts. For now we will always get a DMA error. */
        !           590:          if (dev->irq < 2) {
        !           591: #ifndef MODULE
        !           592:            unsigned char irqnum;
        !           593:            autoirq_setup(0);
        !           594:            
        !           595:            /* Assign the correct irq list */
        !           596:            switch (lp->adapter) {
        !           597:            case DEPCA:
        !           598:            case de100:
        !           599:            case de101:
        !           600:              depca_irq = de1xx_irq;
        !           601:              break;
        !           602:            case de200:
        !           603:            case de201:
        !           604:            case de202:
        !           605:            case de210:
        !           606:              depca_irq = de2xx_irq;
        !           607:              break;
        !           608:            case de422:
        !           609:              depca_irq = de422_irq;
        !           610:              break;
        !           611:            }
        !           612: 
        !           613:            /* Trigger an initialization just for the interrupt. */
        !           614:            outw(INEA | INIT, DEPCA_DATA);
        !           615:          
        !           616:            irqnum = autoirq_report(1);
        !           617:            if (!irqnum) {
        !           618:              printk(" and failed to detect IRQ line.\n");
        !           619:              status = -ENXIO;
        !           620:            } else {
        !           621:              for (dev->irq=0,i=0; (depca_irq[i]) && (!dev->irq); i++) {
        !           622:                if (irqnum == depca_irq[i]) {
        !           623:                  dev->irq = irqnum;
        !           624:                  printk(" and uses IRQ%d.\n", dev->irq);
        !           625:                }
        !           626:              }
        !           627:              
        !           628:              if (!dev->irq) {
        !           629:                printk(" but incorrect IRQ line detected.\n");
        !           630:                status = -ENXIO;
        !           631:              }
        !           632:            }
        !           633: #endif /* MODULE */
        !           634:          } else {
        !           635:            printk(" and assigned IRQ%d.\n", dev->irq);
        !           636:          }
        !           637:          if (status) release_region(ioaddr, DEPCA_TOTAL_SIZE);
        !           638:        } else {
        !           639:          printk(",\n      requests %dkB RAM: only %dkB is available!\n", 
        !           640:                                                        (mem_len>>10), netRAM);
        !           641:          status = -ENXIO;
        !           642:        }
        !           643:       } else {
        !           644:        printk("      which has an Ethernet PROM CRC error.\n");
        !           645:        status = -ENXIO;
        !           646:       }
        !           647:     } else {
        !           648:       status = -ENXIO;
        !           649:     }
        !           650:     if (!status) {
        !           651:       if (depca_debug > 1) {
        !           652:        printk(version);
        !           653:       }
        !           654: 
        !           655:       /* The DEPCA-specific entries in the device structure. */
        !           656:       dev->open = &depca_open;
        !           657:       dev->hard_start_xmit = &depca_start_xmit;
        !           658:       dev->stop = &depca_close;
        !           659:       dev->get_stats = &depca_get_stats;
        !           660:       dev->set_multicast_list = &set_multicast_list;
        !           661:       dev->do_ioctl = &depca_ioctl;
        !           662: 
        !           663:       dev->mem_start = 0;
        !           664:        
        !           665:       /* Fill in the generic field of the device structure. */
        !           666:       ether_setup(dev);
        !           667:     } else {                           /* Incorrectly initialised hardware */
        !           668:       if (dev->priv) {
        !           669:        kfree_s(dev->priv, sizeof(struct depca_private));
        !           670:        dev->priv = NULL;
        !           671:       }
        !           672:     }
        !           673:   } else {
        !           674:     status = -ENXIO;
        !           675:   }
        !           676: 
        !           677:   return status;
        !           678: }
        !           679: 
        !           680: 
        !           681: static int
        !           682: depca_open(struct device *dev)
        !           683: {
        !           684:   struct depca_private *lp = (struct depca_private *)dev->priv;
        !           685:   u_long ioaddr = dev->base_addr;
        !           686:   s16 nicsr;
        !           687:   int status = 0;
        !           688: 
        !           689:   irq2dev_map[dev->irq] = dev;
        !           690:   STOP_DEPCA;
        !           691:   nicsr = inb(DEPCA_NICSR);
        !           692: 
        !           693:   /* Make sure the shadow RAM is enabled */
        !           694:   if (adapter != DEPCA) {
        !           695:     nicsr |= SHE;
        !           696:     outb(nicsr, DEPCA_NICSR);
        !           697:   }
        !           698: 
        !           699:   /* Re-initialize the DEPCA... */
        !           700:   depca_init_ring(dev);
        !           701:   LoadCSRs(dev);
        !           702: 
        !           703:   depca_dbg_open(dev);
        !           704: 
        !           705:   if (request_irq(dev->irq, &depca_interrupt, 0, lp->adapter_name, NULL)) {
        !           706:     printk("depca_open(): Requested IRQ%d is busy\n",dev->irq);
        !           707:     status = -EAGAIN;
        !           708:   } else {
        !           709: 
        !           710:     /* Enable DEPCA board interrupts and turn off LED */
        !           711:     nicsr = ((nicsr & ~IM & ~LED)|IEN);
        !           712:     outb(nicsr, DEPCA_NICSR);
        !           713:     outw(CSR0,DEPCA_ADDR);
        !           714:     
        !           715:     dev->tbusy = 0;                         
        !           716:     dev->interrupt = 0;
        !           717:     dev->start = 1;
        !           718:     
        !           719:     status = InitRestartDepca(dev);
        !           720: 
        !           721:     if (depca_debug > 1){
        !           722:       printk("CSR0: 0x%4.4x\n",inw(DEPCA_DATA));
        !           723:       printk("nicsr: 0x%02x\n",inb(DEPCA_NICSR));
        !           724:     }
        !           725:   }
        !           726: 
        !           727:   MOD_INC_USE_COUNT;
        !           728:   
        !           729:   return status;
        !           730: }
        !           731: 
        !           732: /* Initialize the lance Rx and Tx descriptor rings. */
        !           733: static void
        !           734: depca_init_ring(struct device *dev)
        !           735: {
        !           736:   struct depca_private *lp = (struct depca_private *)dev->priv;
        !           737:   u_int i;
        !           738:   u_long p;
        !           739: 
        !           740:   /* Lock out other processes whilst setting up the hardware */
        !           741:   set_bit(0, (void *)&dev->tbusy);
        !           742: 
        !           743:   lp->rx_new = lp->tx_new = 0;
        !           744:   lp->rx_old = lp->tx_old = 0;
        !           745: 
        !           746:   /* Initialize the base addresses and length of each buffer in the ring */
        !           747:   for (i = 0; i <= lp->rxRingMask; i++) {
        !           748:     writel((p=lp->dma_buffs+i*RX_BUFF_SZ) | R_OWN, &lp->rx_ring[i].base);
        !           749:     writew(-RX_BUFF_SZ, &lp->rx_ring[i].buf_length);
        !           750:     lp->rx_memcpy[i]=(char *)(p+lp->bus_offset);
        !           751:   }
        !           752:   for (i = 0; i <= lp->txRingMask; i++) {
        !           753:     writel((p=lp->dma_buffs+(i+lp->txRingMask+1)*TX_BUFF_SZ) & 0x00ffffff,
        !           754:                                                         &lp->tx_ring[i].base);
        !           755:     lp->tx_memcpy[i]=(char *)(p+lp->bus_offset);
        !           756:   }
        !           757: 
        !           758:   /* Set up the initialization block */
        !           759:   lp->init_block.rx_ring = ((u32)((u_long)lp->rx_ring)&LA_MASK) | lp->rx_rlen;
        !           760:   lp->init_block.tx_ring = ((u32)((u_long)lp->tx_ring)&LA_MASK) | lp->tx_rlen;
        !           761: 
        !           762:   SetMulticastFilter(dev);
        !           763: 
        !           764:   for (i = 0; i < ETH_ALEN; i++) {
        !           765:     lp->init_block.phys_addr[i] = dev->dev_addr[i];
        !           766:   }
        !           767: 
        !           768:   lp->init_block.mode = 0x0000;            /* Enable the Tx and Rx */
        !           769: 
        !           770:   return;
        !           771: }
        !           772: 
        !           773: /* 
        !           774: ** Writes a socket buffer to TX descriptor ring and starts transmission 
        !           775: */
        !           776: static int
        !           777: depca_start_xmit(struct sk_buff *skb, struct device *dev)
        !           778: {
        !           779:   struct depca_private *lp = (struct depca_private *)dev->priv;
        !           780:   u_long ioaddr = dev->base_addr;
        !           781:   int status = 0;
        !           782: 
        !           783:   /* Transmitter timeout, serious problems. */
        !           784:   if (dev->tbusy) {
        !           785:     int tickssofar = jiffies - dev->trans_start;
        !           786:     if (tickssofar < 1*HZ) {
        !           787:       status = -1;
        !           788:     } else {
        !           789:       printk("%s: transmit timed out, status %04x, resetting.\n",
        !           790:             dev->name, inw(DEPCA_DATA));
        !           791:        
        !           792:       STOP_DEPCA;
        !           793:       depca_init_ring(dev);
        !           794:       LoadCSRs(dev);
        !           795:       dev->interrupt = UNMASK_INTERRUPTS;
        !           796:       dev->start = 1;
        !           797:       dev->tbusy=0;
        !           798:       dev->trans_start = jiffies;
        !           799:       InitRestartDepca(dev);
        !           800:       dev_kfree_skb(skb, FREE_WRITE);
        !           801:     }
        !           802:     return status;
        !           803:   } else if (skb == NULL) {
        !           804:     dev_tint(dev);
        !           805:   } else if (skb->len > 0) {
        !           806:     /* Enforce 1 process per h/w access */
        !           807:     if (set_bit(0, (void*)&dev->tbusy) != 0) {
        !           808:       printk("%s: Transmitter access conflict.\n", dev->name);
        !           809:       status = -1;
        !           810:     } else {
        !           811:       if (TX_BUFFS_AVAIL) {                    /* Fill in a Tx ring entry */
        !           812:        status = load_packet(dev, skb);
        !           813: 
        !           814:        if (!status) {
        !           815:          /* Trigger an immediate send demand. */
        !           816:          outw(CSR0, DEPCA_ADDR);
        !           817:          outw(INEA | TDMD, DEPCA_DATA);
        !           818:          
        !           819:          dev->trans_start = jiffies;
        !           820:          dev_kfree_skb(skb, FREE_WRITE);
        !           821:        }
        !           822:        if (TX_BUFFS_AVAIL) {
        !           823:          dev->tbusy=0;
        !           824:        }  
        !           825:       } else {
        !           826:        status = -1;
        !           827:       }
        !           828:     }
        !           829:   }
        !           830:   
        !           831:   return status;
        !           832: }
        !           833: 
        !           834: /*
        !           835: ** The DEPCA interrupt handler. 
        !           836: */
        !           837: static void
        !           838: depca_interrupt(int irq, void *dev_id, struct pt_regs * regs)
        !           839: {
        !           840:   struct device *dev = (struct device *)(irq2dev_map[irq]);
        !           841:   struct depca_private *lp;
        !           842:   s16 csr0, nicsr;
        !           843:   u_long ioaddr;
        !           844: 
        !           845:   if (dev == NULL) {
        !           846:     printk ("depca_interrupt(): irq %d for unknown device.\n", irq);
        !           847:   } else {
        !           848:     lp = (struct depca_private *)dev->priv;
        !           849:     ioaddr = dev->base_addr;
        !           850:     
        !           851:     if (dev->interrupt)
        !           852:       printk("%s: Re-entering the interrupt handler.\n", dev->name);
        !           853: 
        !           854:     dev->interrupt = MASK_INTERRUPTS;
        !           855: 
        !           856:     /* mask the DEPCA board interrupts and turn on the LED */
        !           857:     nicsr = inb(DEPCA_NICSR);
        !           858:     nicsr |= (IM|LED);
        !           859:     outb(nicsr, DEPCA_NICSR);
        !           860: 
        !           861:     outw(CSR0, DEPCA_ADDR);
        !           862:     csr0 = inw(DEPCA_DATA);
        !           863: 
        !           864:     /* Acknowledge all of the current interrupt sources ASAP. */
        !           865:     outw(csr0 & INTE, DEPCA_DATA);
        !           866: 
        !           867:     if (csr0 & RINT)                  /* Rx interrupt (packet arrived) */
        !           868:       depca_rx(dev);
        !           869: 
        !           870:     if (csr0 & TINT)                  /* Tx interrupt (packet sent) */
        !           871:       depca_tx(dev);
        !           872: 
        !           873:     if ((TX_BUFFS_AVAIL >= 0) && dev->tbusy) { /* any resources available? */
        !           874:       dev->tbusy = 0;                  /* clear TX busy flag */
        !           875:       mark_bh(NET_BH);
        !           876:     }
        !           877: 
        !           878:     /* Unmask the DEPCA board interrupts and turn off the LED */
        !           879:     nicsr = (nicsr & ~IM & ~LED);
        !           880:     outb(nicsr, DEPCA_NICSR);
        !           881: 
        !           882:     dev->interrupt = UNMASK_INTERRUPTS;
        !           883:   }
        !           884: 
        !           885:   return;
        !           886: }
        !           887: 
        !           888: static int
        !           889: depca_rx(struct device *dev)
        !           890: {
        !           891:   struct depca_private *lp = (struct depca_private *)dev->priv;
        !           892:   int i, entry;
        !           893:   s32 status;
        !           894: 
        !           895:   for (entry=lp->rx_new; 
        !           896:        !(readl(&lp->rx_ring[entry].base) & R_OWN);
        !           897:        entry=lp->rx_new){
        !           898:     status = readl(&lp->rx_ring[entry].base) >> 16 ;
        !           899:     if (status & R_STP) {                      /* Remember start of frame */
        !           900:       lp->rx_old = entry;
        !           901:     }
        !           902:     if (status & R_ENP) {                      /* Valid frame status */
        !           903:       if (status & R_ERR) {                   /* There was an error. */
        !           904:        lp->stats.rx_errors++;                 /* Update the error stats. */
        !           905:        if (status & R_FRAM) lp->stats.rx_frame_errors++;
        !           906:        if (status & R_OFLO) lp->stats.rx_over_errors++;
        !           907:        if (status & R_CRC)  lp->stats.rx_crc_errors++;
        !           908:        if (status & R_BUFF) lp->stats.rx_fifo_errors++;
        !           909:       } else { 
        !           910:        short len, pkt_len = readw(&lp->rx_ring[entry].msg_length);
        !           911:        struct sk_buff *skb;
        !           912: 
        !           913:        skb = dev_alloc_skb(pkt_len+2);
        !           914:        if (skb != NULL) {
        !           915:          unsigned char *buf;
        !           916:          skb_reserve(skb,2);               /* 16 byte align the IP header */
        !           917:          buf = skb_put(skb,pkt_len);
        !           918:          skb->dev = dev;
        !           919:          if (entry < lp->rx_old) {         /* Wrapped buffer */
        !           920:            len = (lp->rxRingMask - lp->rx_old + 1) * RX_BUFF_SZ;
        !           921:            memcpy_fromio(buf, lp->rx_memcpy[lp->rx_old], len);
        !           922:            memcpy_fromio(buf + len, lp->rx_memcpy[0], pkt_len-len);
        !           923:          } else {                          /* Linear buffer */
        !           924:            memcpy_fromio(buf, lp->rx_memcpy[lp->rx_old], pkt_len);
        !           925:          }
        !           926: 
        !           927:          /* 
        !           928:          ** Notify the upper protocol layers that there is another 
        !           929:          ** packet to handle
        !           930:          */
        !           931:          skb->protocol=eth_type_trans(skb,dev);
        !           932:          netif_rx(skb);
        !           933:  
        !           934:          /*
        !           935:          ** Update stats
        !           936:          */
        !           937:          lp->stats.rx_packets++;
        !           938:          for (i=1; i<DEPCA_PKT_STAT_SZ-1; i++) {
        !           939:            if (pkt_len < (i*DEPCA_PKT_BIN_SZ)) {
        !           940:              lp->pktStats.bins[i]++;
        !           941:              i = DEPCA_PKT_STAT_SZ;
        !           942:            }
        !           943:          }
        !           944:          if (buf[0] & 0x01) {              /* Multicast/Broadcast */
        !           945:            if ((*(s16 *)&buf[0] == -1) &&
        !           946:                (*(s16 *)&buf[2] == -1) &&
        !           947:                (*(s16 *)&buf[4] == -1)) {
        !           948:              lp->pktStats.broadcast++;
        !           949:            } else {
        !           950:              lp->pktStats.multicast++;
        !           951:            }
        !           952:          } else if ((*(s16 *)&buf[0] == *(s16 *)&dev->dev_addr[0]) &&
        !           953:                     (*(s16 *)&buf[2] == *(s16 *)&dev->dev_addr[2]) &&
        !           954:                     (*(s16 *)&buf[4] == *(s16 *)&dev->dev_addr[4])) {
        !           955:            lp->pktStats.unicast++;
        !           956:          }
        !           957:          
        !           958:          lp->pktStats.bins[0]++;           /* Duplicates stats.rx_packets */
        !           959:          if (lp->pktStats.bins[0] == 0) {  /* Reset counters */
        !           960:            memset((char *)&lp->pktStats, 0, sizeof(lp->pktStats));
        !           961:          }
        !           962:        } else {
        !           963:          printk("%s: Memory squeeze, deferring packet.\n", dev->name);
        !           964:          lp->stats.rx_dropped++;       /* Really, deferred. */
        !           965:          break;
        !           966:        }
        !           967:       }
        !           968:       /* Change buffer ownership for this last frame, back to the adapter */
        !           969:       for (; lp->rx_old!=entry; lp->rx_old=(++lp->rx_old)&lp->rxRingMask) {
        !           970:        writel(readl(&lp->rx_ring[lp->rx_old].base) | R_OWN, 
        !           971:                                                &lp->rx_ring[lp->rx_old].base);
        !           972:       }
        !           973:       writel(readl(&lp->rx_ring[entry].base) | R_OWN, &lp->rx_ring[entry].base);
        !           974:     }
        !           975: 
        !           976:     /*
        !           977:     ** Update entry information
        !           978:     */
        !           979:     lp->rx_new = (++lp->rx_new) & lp->rxRingMask;
        !           980:     }
        !           981: 
        !           982:     return 0;
        !           983: }
        !           984: 
        !           985: /*
        !           986: ** Buffer sent - check for buffer errors.
        !           987: */
        !           988: static int
        !           989: depca_tx(struct device *dev)
        !           990: {
        !           991:   struct depca_private *lp = (struct depca_private *)dev->priv;
        !           992:   int entry;
        !           993:   s32 status;
        !           994:   u_long ioaddr = dev->base_addr;
        !           995: 
        !           996:   for (entry = lp->tx_old; entry != lp->tx_new; entry = lp->tx_old) {
        !           997:     status = readl(&lp->tx_ring[entry].base) >> 16 ;
        !           998: 
        !           999:     if (status < 0) {                          /* Packet not yet sent! */
        !          1000:       break;
        !          1001:     } else if (status & T_ERR) {               /* An error occurred. */
        !          1002:       status = readl(&lp->tx_ring[entry].misc);
        !          1003:       lp->stats.tx_errors++;
        !          1004:       if (status & TMD3_RTRY) lp->stats.tx_aborted_errors++;
        !          1005:       if (status & TMD3_LCAR) lp->stats.tx_carrier_errors++;
        !          1006:       if (status & TMD3_LCOL) lp->stats.tx_window_errors++;
        !          1007:       if (status & TMD3_UFLO) lp->stats.tx_fifo_errors++;
        !          1008:       if (status & (TMD3_BUFF | TMD3_UFLO)) {
        !          1009:        /* Trigger an immediate send demand. */
        !          1010:        outw(CSR0, DEPCA_ADDR);
        !          1011:        outw(INEA | TDMD, DEPCA_DATA);
        !          1012:       }
        !          1013:     } else if (status & (T_MORE | T_ONE)) {
        !          1014:       lp->stats.collisions++;
        !          1015:     } else {
        !          1016:       lp->stats.tx_packets++;
        !          1017:     }
        !          1018: 
        !          1019:     /* Update all the pointers */
        !          1020:     lp->tx_old = (++lp->tx_old) & lp->txRingMask;
        !          1021:   }
        !          1022: 
        !          1023:   return 0;
        !          1024: }
        !          1025: 
        !          1026: static int
        !          1027: depca_close(struct device *dev)
        !          1028: {
        !          1029:   struct depca_private *lp = (struct depca_private *)dev->priv;
        !          1030:   s16 nicsr;
        !          1031:   u_long ioaddr = dev->base_addr;
        !          1032: 
        !          1033:   dev->start = 0;
        !          1034:   dev->tbusy = 1;
        !          1035: 
        !          1036:   outw(CSR0, DEPCA_ADDR);
        !          1037: 
        !          1038:   if (depca_debug > 1) {
        !          1039:     printk("%s: Shutting down ethercard, status was %2.2x.\n",
        !          1040:           dev->name, inw(DEPCA_DATA));
        !          1041:   }
        !          1042: 
        !          1043:   /* 
        !          1044:   ** We stop the DEPCA here -- it occasionally polls
        !          1045:   ** memory if we don't. 
        !          1046:   */
        !          1047:   outw(STOP, DEPCA_DATA);
        !          1048: 
        !          1049:   /*
        !          1050:   ** Give back the ROM in case the user wants to go to DOS
        !          1051:   */
        !          1052:   if (lp->adapter != DEPCA) {
        !          1053:     nicsr = inb(DEPCA_NICSR);
        !          1054:     nicsr &= ~SHE;
        !          1055:     outb(nicsr, DEPCA_NICSR);
        !          1056:   }
        !          1057: 
        !          1058:   /*
        !          1059:   ** Free the associated irq
        !          1060:   */
        !          1061:   free_irq(dev->irq, NULL);
        !          1062:   irq2dev_map[dev->irq] = NULL;
        !          1063: 
        !          1064:   MOD_DEC_USE_COUNT;
        !          1065: 
        !          1066:   return 0;
        !          1067: }
        !          1068: 
        !          1069: static void LoadCSRs(struct device *dev)
        !          1070: {
        !          1071:   struct depca_private *lp = (struct depca_private *)dev->priv;
        !          1072:   u_long ioaddr = dev->base_addr;
        !          1073: 
        !          1074:   outw(CSR1, DEPCA_ADDR);                /* initialisation block address LSW */
        !          1075:   outw((u16)(lp->sh_mem & LA_MASK), DEPCA_DATA);
        !          1076:   outw(CSR2, DEPCA_ADDR);                /* initialisation block address MSW */
        !          1077:   outw((u16)((lp->sh_mem & LA_MASK) >> 16), DEPCA_DATA);
        !          1078:   outw(CSR3, DEPCA_ADDR);                /* ALE control */
        !          1079:   outw(ACON, DEPCA_DATA);
        !          1080: 
        !          1081:   outw(CSR0, DEPCA_ADDR);                /* Point back to CSR0 */
        !          1082: 
        !          1083:   return;
        !          1084: }
        !          1085: 
        !          1086: static int InitRestartDepca(struct device *dev)
        !          1087: {
        !          1088:   struct depca_private *lp = (struct depca_private *)dev->priv;
        !          1089:   u_long ioaddr = dev->base_addr;
        !          1090:   int i, status=0;
        !          1091: 
        !          1092:   /* Copy the shadow init_block to shared memory */
        !          1093:   memcpy_toio((char *)lp->sh_mem, &lp->init_block, sizeof(struct depca_init));
        !          1094: 
        !          1095:   outw(CSR0, DEPCA_ADDR);                /* point back to CSR0 */
        !          1096:   outw(INIT, DEPCA_DATA);                /* initialize DEPCA */
        !          1097: 
        !          1098:   /* wait for lance to complete initialisation */
        !          1099:   for (i=0;(i<100) && !(inw(DEPCA_DATA) & IDON); i++); 
        !          1100: 
        !          1101:   if (i!=100) {
        !          1102:     /* clear IDON by writing a "1", enable interrupts and start lance */
        !          1103:     outw(IDON | INEA | STRT, DEPCA_DATA);
        !          1104:     if (depca_debug > 2) {
        !          1105:       printk("%s: DEPCA open after %d ticks, init block 0x%08lx csr0 %4.4x.\n",
        !          1106:             dev->name, i, lp->sh_mem, inw(DEPCA_DATA));
        !          1107:     }
        !          1108:   } else {
        !          1109:     printk("%s: DEPCA unopen after %d ticks, init block 0x%08lx csr0 %4.4x.\n",
        !          1110:             dev->name, i, lp->sh_mem, inw(DEPCA_DATA));
        !          1111:     status = -1;
        !          1112:   }
        !          1113: 
        !          1114:   return status;
        !          1115: }
        !          1116: 
        !          1117: static struct enet_statistics *
        !          1118: depca_get_stats(struct device *dev)
        !          1119: {
        !          1120:     struct depca_private *lp = (struct depca_private *)dev->priv;
        !          1121: 
        !          1122:     /* Null body since there is no framing error counter */
        !          1123: 
        !          1124:     return &lp->stats;
        !          1125: }
        !          1126: 
        !          1127: /*
        !          1128: ** Set or clear the multicast filter for this adaptor.
        !          1129: */
        !          1130: static void
        !          1131: set_multicast_list(struct device *dev)
        !          1132: {
        !          1133:   struct depca_private *lp = (struct depca_private *)dev->priv;
        !          1134:   u_long ioaddr = dev->base_addr;
        !          1135:   
        !          1136:   if (irq2dev_map[dev->irq] != NULL) {
        !          1137:     while(dev->tbusy);                /* Stop ring access */
        !          1138:     set_bit(0, (void*)&dev->tbusy);
        !          1139:     while(lp->tx_old != lp->tx_new);  /* Wait for the ring to empty */
        !          1140: 
        !          1141:     STOP_DEPCA;                       /* Temporarily stop the depca.  */
        !          1142:     depca_init_ring(dev);             /* Initialize the descriptor rings */
        !          1143: 
        !          1144:     if (dev->flags & IFF_PROMISC) {   /* Set promiscuous mode */
        !          1145:       lp->init_block.mode |= PROM;
        !          1146:     } else {
        !          1147:       SetMulticastFilter(dev);
        !          1148:       lp->init_block.mode &= ~PROM;   /* Unset promiscuous mode */
        !          1149:     }
        !          1150: 
        !          1151:     LoadCSRs(dev);                    /* Reload CSR3 */
        !          1152:     InitRestartDepca(dev);            /* Resume normal operation. */
        !          1153:     dev->tbusy = 0;                   /* Unlock the TX ring */
        !          1154:   }
        !          1155: }
        !          1156: 
        !          1157: /*
        !          1158: ** Calculate the hash code and update the logical address filter
        !          1159: ** from a list of ethernet multicast addresses.
        !          1160: ** Big endian crc one liner is mine, all mine, ha ha ha ha!
        !          1161: ** LANCE calculates its hash codes big endian.
        !          1162: */
        !          1163: static void SetMulticastFilter(struct device *dev)
        !          1164: {
        !          1165:   struct depca_private *lp = (struct depca_private *)dev->priv;
        !          1166:   struct dev_mc_list *dmi=dev->mc_list;
        !          1167:   char *addrs;
        !          1168:   int i, j, bit, byte;
        !          1169:   u16 hashcode;
        !          1170:   s32 crc, poly = CRC_POLYNOMIAL_BE;
        !          1171: 
        !          1172:   if (dev->flags & IFF_ALLMULTI) {         /* Set all multicast bits */
        !          1173:     for (i=0; i<(HASH_TABLE_LEN>>3); i++) {
        !          1174:       lp->init_block.mcast_table[i] = (char)0xff;
        !          1175:     }
        !          1176:   } else {
        !          1177:     for (i=0; i<(HASH_TABLE_LEN>>3); i++){ /* Clear the multicast table */
        !          1178:       lp->init_block.mcast_table[i]=0;
        !          1179:     }
        !          1180:                                            /* Add multicast addresses */
        !          1181:     for (i=0;i<dev->mc_count;i++) {        /* for each address in the list */
        !          1182:       addrs=dmi->dmi_addr;
        !          1183:       dmi=dmi->next;
        !          1184:       if ((*addrs & 0x01) == 1) {          /* multicast address? */ 
        !          1185:        crc = 0xffffffff;                  /* init CRC for each address */
        !          1186:        for (byte=0;byte<ETH_ALEN;byte++) {/* for each address byte */
        !          1187:                                           /* process each address bit */ 
        !          1188:          for (bit = *addrs++,j=0;j<8;j++, bit>>=1) {
        !          1189:            crc = (crc << 1) ^ ((((crc<0?1:0) ^ bit) & 0x01) ? poly : 0);
        !          1190:          }
        !          1191:        }
        !          1192:        hashcode = (crc & 1);              /* hashcode is 6 LSb of CRC ... */
        !          1193:        for (j=0;j<5;j++) {                /* ... in reverse order. */
        !          1194:          hashcode = (hashcode << 1) | ((crc>>=1) & 1);
        !          1195:        }                                      
        !          1196:        
        !          1197:        
        !          1198:        byte = hashcode >> 3;              /* bit[3-5] -> byte in filter */
        !          1199:        bit = 1 << (hashcode & 0x07);      /* bit[0-2] -> bit in byte */
        !          1200:        lp->init_block.mcast_table[byte] |= bit;
        !          1201:       }
        !          1202:     }
        !          1203:   }
        !          1204: 
        !          1205:   return;
        !          1206: }
        !          1207: 
        !          1208: /*
        !          1209: ** ISA bus I/O device probe
        !          1210: */
        !          1211: static void isa_probe(struct device *dev, u_long ioaddr)
        !          1212: {
        !          1213:   int i = num_depcas, maxSlots;
        !          1214:   s32 ports[] = DEPCA_IO_PORTS;
        !          1215: 
        !          1216:   if (!ioaddr && autoprobed) return ;          /* Been here before ! */
        !          1217:   if (ioaddr > 0x400) return;                  /* EISA Address */
        !          1218:   if (i >= MAX_NUM_DEPCAS) return;             /* Too many ISA adapters */
        !          1219: 
        !          1220:   if (ioaddr == 0) {                           /* Autoprobing */
        !          1221:     maxSlots = MAX_NUM_DEPCAS;
        !          1222:   } else {                                     /* Probe a specific location */
        !          1223:     ports[i] = ioaddr;
        !          1224:     maxSlots = i + 1;
        !          1225:   }
        !          1226: 
        !          1227:   for (; (i<maxSlots) && (dev!=NULL) && ports[i]; i++) {
        !          1228:     if (DevicePresent(ports[i]) == 0) { 
        !          1229:       if (check_region(ports[i], DEPCA_TOTAL_SIZE) == 0) {
        !          1230:        if ((dev = alloc_device(dev, ports[i])) != NULL) {
        !          1231:          if (depca_hw_init(dev, ports[i]) == 0) {
        !          1232:            num_depcas++;
        !          1233:          }
        !          1234:          num_eth++;
        !          1235:        }
        !          1236:       } else if (autoprobed) {
        !          1237:        printk("%s: region already allocated at 0x%04x.\n", dev->name,ports[i]);
        !          1238:       }
        !          1239:     }
        !          1240:   }
        !          1241: 
        !          1242:   return;
        !          1243: }
        !          1244: 
        !          1245: /*
        !          1246: ** EISA bus I/O device probe. Probe from slot 1 since slot 0 is usually
        !          1247: ** the motherboard. Upto 15 EISA devices are supported.
        !          1248: */
        !          1249: static void eisa_probe(struct device *dev, u_long ioaddr)
        !          1250: {
        !          1251:   int i, maxSlots;
        !          1252:   u_long iobase;
        !          1253:   char name[DEPCA_STRLEN];
        !          1254: 
        !          1255:   if (!ioaddr && autoprobed) return ;            /* Been here before ! */
        !          1256:   if ((ioaddr < 0x400) && (ioaddr > 0)) return;  /* ISA Address */
        !          1257: 
        !          1258:   if (ioaddr == 0) {                           /* Autoprobing */
        !          1259:     iobase = EISA_SLOT_INC;                    /* Get the first slot address */
        !          1260:     i = 1;
        !          1261:     maxSlots = MAX_EISA_SLOTS;
        !          1262:   } else {                                     /* Probe a specific location */
        !          1263:     iobase = ioaddr;
        !          1264:     i = (ioaddr >> 12);
        !          1265:     maxSlots = i + 1;
        !          1266:   }
        !          1267:   if ((iobase & 0x0fff) == 0) iobase += DEPCA_EISA_IO_PORTS;
        !          1268: 
        !          1269:   for (; (i<maxSlots) && (dev!=NULL); i++, iobase+=EISA_SLOT_INC) {
        !          1270:     if (EISA_signature(name, EISA_ID)) {
        !          1271:       if (DevicePresent(iobase) == 0) { 
        !          1272:        if (check_region(iobase, DEPCA_TOTAL_SIZE) == 0) {
        !          1273:          if ((dev = alloc_device(dev, iobase)) != NULL) {
        !          1274:            if (depca_hw_init(dev, iobase) == 0) {
        !          1275:              num_depcas++;
        !          1276:            }
        !          1277:            num_eth++;
        !          1278:          }
        !          1279:        } else if (autoprobed) {
        !          1280:          printk("%s: region already allocated at 0x%04lx.\n",dev->name,iobase);
        !          1281:        }
        !          1282:       }
        !          1283:     }
        !          1284:   }
        !          1285: 
        !          1286:   return;
        !          1287: }
        !          1288: 
        !          1289: /*
        !          1290: ** Search the entire 'eth' device list for a fixed probe. If a match isn't
        !          1291: ** found then check for an autoprobe or unused device location. If they
        !          1292: ** are not available then insert a new device structure at the end of
        !          1293: ** the current list.
        !          1294: */
        !          1295: static struct device *
        !          1296: alloc_device(struct device *dev, u_long iobase)
        !          1297: {
        !          1298:     struct device *adev = NULL;
        !          1299:     int fixed = 0, new_dev = 0;
        !          1300: 
        !          1301:     num_eth = depca_dev_index(dev->name);
        !          1302:     if (loading_module) return dev;
        !          1303:     
        !          1304:     while (1) {
        !          1305:        if (((dev->base_addr == DEPCA_NDA) || (dev->base_addr==0)) && !adev) {
        !          1306:            adev=dev;
        !          1307:        } else if ((dev->priv == NULL) && (dev->base_addr==iobase)) {
        !          1308:            fixed = 1;
        !          1309:        } else {
        !          1310:            if (dev->next == NULL) {
        !          1311:                new_dev = 1;
        !          1312:            } else if (strncmp(dev->next->name, "eth", 3) != 0) {
        !          1313:                new_dev = 1;
        !          1314:            }
        !          1315:        }
        !          1316:        if ((dev->next == NULL) || new_dev || fixed) break;
        !          1317:        dev = dev->next;
        !          1318:        num_eth++;
        !          1319:     }
        !          1320:     if (adev && !fixed) {
        !          1321:        dev = adev;
        !          1322:        num_eth = depca_dev_index(dev->name);
        !          1323:        new_dev = 0;
        !          1324:     }
        !          1325: 
        !          1326:     if (((dev->next == NULL) &&  
        !          1327:        ((dev->base_addr != DEPCA_NDA) && (dev->base_addr != 0)) && !fixed) ||
        !          1328:        new_dev) {
        !          1329:        num_eth++;                         /* New device */
        !          1330:        dev = insert_device(dev, iobase, depca_probe);
        !          1331:     }
        !          1332:     
        !          1333:     return dev;
        !          1334: }
        !          1335: 
        !          1336: /*
        !          1337: ** If at end of eth device list and can't use current entry, malloc
        !          1338: ** one up. If memory could not be allocated, print an error message.
        !          1339: */
        !          1340: static struct device *
        !          1341: insert_device(struct device *dev, u_long iobase, int (*init)(struct device *))
        !          1342: {
        !          1343:     struct device *new;
        !          1344: 
        !          1345:     new = (struct device *)kmalloc(sizeof(struct device)+8, GFP_KERNEL);
        !          1346:     if (new == NULL) {
        !          1347:        printk("eth%d: Device not initialised, insufficient memory\n",num_eth);
        !          1348:        return NULL;
        !          1349:     } else {
        !          1350:        new->next = dev->next;
        !          1351:        dev->next = new;
        !          1352:        dev = dev->next;               /* point to the new device */
        !          1353:        dev->name = (char *)(dev + 1);
        !          1354:        if (num_eth > 9999) {
        !          1355:            sprintf(dev->name,"eth????");/* New device name */
        !          1356:        } else {
        !          1357:            sprintf(dev->name,"eth%d", num_eth);/* New device name */
        !          1358:        }
        !          1359:        dev->base_addr = iobase;       /* assign the io address */
        !          1360:        dev->init = init;              /* initialisation routine */
        !          1361:     }
        !          1362: 
        !          1363:     return dev;
        !          1364: }
        !          1365: 
        !          1366: static int
        !          1367: depca_dev_index(char *s)
        !          1368: {
        !          1369:     int i=0, j=0;
        !          1370: 
        !          1371:     for (;*s; s++) {
        !          1372:        if (isdigit(*s)) {
        !          1373:            j=1;
        !          1374:            i = (i * 10) + (*s - '0');
        !          1375:        } else if (j) break;
        !          1376:     }
        !          1377: 
        !          1378:     return i;
        !          1379: }
        !          1380: 
        !          1381: /*
        !          1382: ** Look for a particular board name in the on-board Remote Diagnostics
        !          1383: ** and Boot (readb) ROM. This will also give us a clue to the network RAM
        !          1384: ** base address.
        !          1385: */
        !          1386: static void DepcaSignature(char *name, u_long paddr)
        !          1387: {
        !          1388:   u_int i,j,k;
        !          1389:   const char *signatures[] = DEPCA_SIGNATURE;
        !          1390:   char tmpstr[16];
        !          1391: 
        !          1392:   /* Copy the first 16 bytes of ROM */
        !          1393:   for (i=0;i<16;i++) {
        !          1394:     tmpstr[i] = readb(paddr+0xc000+i);
        !          1395:   }
        !          1396: 
        !          1397:   /* Check if PROM contains a valid string */
        !          1398:   for (i=0;*signatures[i]!='\0';i++) {
        !          1399:     for (j=0,k=0;j<16 && k<strlen(signatures[i]);j++) {
        !          1400:       if (signatures[i][k] == tmpstr[j]) {              /* track signature */
        !          1401:        k++;
        !          1402:       } else {                     /* lost signature; begin search again */
        !          1403:        k=0;
        !          1404:       }
        !          1405:     }
        !          1406:     if (k == strlen(signatures[i])) break;
        !          1407:   }
        !          1408: 
        !          1409:   /* Check if name string is valid, provided there's no PROM */
        !          1410:   if (*name && (i == unknown)) {
        !          1411:     for (i=0;*signatures[i]!='\0';i++) {
        !          1412:       if (strcmp(name,signatures[i]) == 0) break;
        !          1413:     }
        !          1414:   }
        !          1415: 
        !          1416:   /* Update search results */
        !          1417:   strcpy(name,signatures[i]);
        !          1418:   adapter = i;
        !          1419: 
        !          1420:   return;
        !          1421: }
        !          1422: 
        !          1423: /*
        !          1424: ** Look for a special sequence in the Ethernet station address PROM that
        !          1425: ** is common across all DEPCA products. Note that the original DEPCA needs
        !          1426: ** its ROM address counter to be initialized and enabled. Only enable
        !          1427: ** if the first address octet is a 0x08 - this minimises the chances of
        !          1428: ** messing around with some other hardware, but it assumes that this DEPCA
        !          1429: ** card initialized itself correctly.
        !          1430: ** 
        !          1431: ** Search the Ethernet address ROM for the signature. Since the ROM address
        !          1432: ** counter can start at an arbitrary point, the search must include the entire
        !          1433: ** probe sequence length plus the (length_of_the_signature - 1).
        !          1434: ** Stop the search IMMEDIATELY after the signature is found so that the
        !          1435: ** PROM address counter is correctly positioned at the start of the
        !          1436: ** ethernet address for later read out.
        !          1437: */
        !          1438: static int DevicePresent(u_long ioaddr)
        !          1439: {
        !          1440:   union {
        !          1441:     struct {
        !          1442:       u32 a;
        !          1443:       u32 b;
        !          1444:     } llsig;
        !          1445:     char Sig[sizeof(u32) << 1];
        !          1446:   } dev;
        !          1447:   short sigLength=0;
        !          1448:   s8 data;
        !          1449:   s16 nicsr;
        !          1450:   int i, j, status = 0;
        !          1451: 
        !          1452:   data = inb(DEPCA_PROM);                /* clear counter on DEPCA */
        !          1453:   data = inb(DEPCA_PROM);                /* read data */
        !          1454: 
        !          1455:   if (data == 0x08) {                    /* Enable counter on DEPCA */
        !          1456:     nicsr = inb(DEPCA_NICSR);
        !          1457:     nicsr |= AAC;
        !          1458:     outb(nicsr, DEPCA_NICSR);
        !          1459:   }
        !          1460:   
        !          1461:   dev.llsig.a = ETH_PROM_SIG;
        !          1462:   dev.llsig.b = ETH_PROM_SIG;
        !          1463:   sigLength = sizeof(u32) << 1;
        !          1464: 
        !          1465:   for (i=0,j=0;j<sigLength && i<PROBE_LENGTH+sigLength-1;i++) {
        !          1466:     data = inb(DEPCA_PROM);
        !          1467:     if (dev.Sig[j] == data) {    /* track signature */
        !          1468:       j++;
        !          1469:     } else {                     /* lost signature; begin search again */
        !          1470:       if (data == dev.Sig[0]) {  /* rare case.... */
        !          1471:        j=1;
        !          1472:       } else {
        !          1473:        j=0;
        !          1474:       }
        !          1475:     }
        !          1476:   }
        !          1477: 
        !          1478:   if (j!=sigLength) {
        !          1479:     status = -ENODEV;           /* search failed */
        !          1480:   }
        !          1481: 
        !          1482:   return status;
        !          1483: }
        !          1484: 
        !          1485: /*
        !          1486: ** The DE100 and DE101 PROM accesses were made non-standard for some bizarre
        !          1487: ** reason: access the upper half of the PROM with x=0; access the lower half
        !          1488: ** with x=1.
        !          1489: */
        !          1490: static int get_hw_addr(struct device *dev)
        !          1491: {
        !          1492:   u_long ioaddr = dev->base_addr;
        !          1493:   int i, k, tmp, status = 0;
        !          1494:   u_short j, x, chksum;
        !          1495: 
        !          1496:   x = (((adapter == de100) || (adapter == de101)) ? 1 : 0);
        !          1497: 
        !          1498:   for (i=0,k=0,j=0;j<3;j++) {
        !          1499:     k <<= 1 ;
        !          1500:     if (k > 0xffff) k-=0xffff;
        !          1501: 
        !          1502:     k += (u_char) (tmp = inb(DEPCA_PROM + x));
        !          1503:     dev->dev_addr[i++] = (u_char) tmp;
        !          1504:     k += (u_short) ((tmp = inb(DEPCA_PROM + x)) << 8);
        !          1505:     dev->dev_addr[i++] = (u_char) tmp;
        !          1506: 
        !          1507:     if (k > 0xffff) k-=0xffff;
        !          1508:   }
        !          1509:   if (k == 0xffff) k=0;
        !          1510: 
        !          1511:   chksum = (u_char) inb(DEPCA_PROM + x);
        !          1512:   chksum |= (u_short) (inb(DEPCA_PROM + x) << 8);
        !          1513:   if (k != chksum) status = -1;
        !          1514: 
        !          1515:   return status;
        !          1516: }
        !          1517: 
        !          1518: /*
        !          1519: ** Load a packet into the shared memory
        !          1520: */
        !          1521: static int load_packet(struct device *dev, struct sk_buff *skb)
        !          1522: {
        !          1523:   struct depca_private *lp = (struct depca_private *)dev->priv;
        !          1524:   int i, entry, end, len, status = 0;
        !          1525: 
        !          1526:   entry = lp->tx_new;                                 /* Ring around buffer number. */
        !          1527:   end = (entry + (skb->len - 1) / TX_BUFF_SZ) & lp->txRingMask;
        !          1528:   if (!(readl(&lp->tx_ring[end].base) & T_OWN)) {/* Enough room? */
        !          1529:     /* 
        !          1530:     ** Caution: the write order is important here... don't set up the
        !          1531:     ** ownership rights until all the other information is in place.
        !          1532:     */
        !          1533:     if (end < entry) {                         /* wrapped buffer */
        !          1534:       len = (lp->txRingMask - entry + 1) * TX_BUFF_SZ;
        !          1535:       memcpy_toio(lp->tx_memcpy[entry], skb->data, len);
        !          1536:       memcpy_toio(lp->tx_memcpy[0], skb->data + len, skb->len - len);
        !          1537:     } else {                                   /* linear buffer */
        !          1538:       memcpy_toio(lp->tx_memcpy[entry], skb->data, skb->len);
        !          1539:     }
        !          1540: 
        !          1541:     /* set up the buffer descriptors */
        !          1542:     len = (skb->len < ETH_ZLEN) ? ETH_ZLEN : skb->len;
        !          1543:     for (i = entry; i != end; i = (++i) & lp->txRingMask) {
        !          1544:                                                /* clean out flags */
        !          1545:       writel(readl(&lp->tx_ring[i].base) & ~T_FLAGS, &lp->tx_ring[i].base);
        !          1546:       writew(0x0000, &lp->tx_ring[i].misc);    /* clears other error flags */
        !          1547:       writew(-TX_BUFF_SZ, &lp->tx_ring[i].length);/* packet length in buffer */
        !          1548:       len -= TX_BUFF_SZ;
        !          1549:     }
        !          1550:                                                /* clean out flags */
        !          1551:     writel(readl(&lp->tx_ring[end].base) & ~T_FLAGS, &lp->tx_ring[end].base);
        !          1552:     writew(0x0000, &lp->tx_ring[end].misc);    /* clears other error flags */
        !          1553:     writew(-len, &lp->tx_ring[end].length);    /* packet length in last buff */
        !          1554: 
        !          1555:                                                /* start of packet */
        !          1556:     writel(readl(&lp->tx_ring[entry].base) | T_STP, &lp->tx_ring[entry].base);
        !          1557:                                                /* end of packet */
        !          1558:     writel(readl(&lp->tx_ring[end].base) | T_ENP, &lp->tx_ring[end].base);
        !          1559: 
        !          1560:     for (i=end; i!=entry; --i) {
        !          1561:                                                /* ownership of packet */
        !          1562:       writel(readl(&lp->tx_ring[i].base) | T_OWN, &lp->tx_ring[i].base);
        !          1563:       if (i == 0) i=lp->txRingMask+1;
        !          1564:     }   
        !          1565:     writel(readl(&lp->tx_ring[entry].base) | T_OWN, &lp->tx_ring[entry].base);
        !          1566:  
        !          1567:     lp->tx_new = (++end) & lp->txRingMask;     /* update current pointers */
        !          1568:   } else {
        !          1569:     status = -1;
        !          1570:   }
        !          1571: 
        !          1572:   return status;
        !          1573: }
        !          1574: 
        !          1575: /*
        !          1576: ** Look for a particular board name in the EISA configuration space
        !          1577: */
        !          1578: static int EISA_signature(char *name, s32 eisa_id)
        !          1579: {
        !          1580:   u_int i;
        !          1581:   const char *signatures[] = DEPCA_SIGNATURE;
        !          1582:   char ManCode[DEPCA_STRLEN];
        !          1583:   union {
        !          1584:     s32 ID;
        !          1585:     char Id[4];
        !          1586:   } Eisa;
        !          1587:   int status = 0;
        !          1588: 
        !          1589:   *name = '\0';
        !          1590:   Eisa.ID = inl(eisa_id);
        !          1591: 
        !          1592:   ManCode[0]=(((Eisa.Id[0]>>2)&0x1f)+0x40);
        !          1593:   ManCode[1]=(((Eisa.Id[1]&0xe0)>>5)+((Eisa.Id[0]&0x03)<<3)+0x40);
        !          1594:   ManCode[2]=(((Eisa.Id[2]>>4)&0x0f)+0x30);
        !          1595:   ManCode[3]=(( Eisa.Id[2]&0x0f)+0x30);
        !          1596:   ManCode[4]=(((Eisa.Id[3]>>4)&0x0f)+0x30);
        !          1597:   ManCode[5]='\0';
        !          1598: 
        !          1599:   for (i=0;(*signatures[i] != '\0') && (*name == '\0');i++) {
        !          1600:     if (strstr(ManCode, signatures[i]) != NULL) {
        !          1601:       strcpy(name,ManCode);
        !          1602:       status = 1;
        !          1603:     }
        !          1604:   }
        !          1605: 
        !          1606:   return status;
        !          1607: }
        !          1608: 
        !          1609: static void depca_dbg_open(struct device *dev)
        !          1610: {
        !          1611:   struct depca_private *lp = (struct depca_private *)dev->priv;
        !          1612:   u_long ioaddr = dev->base_addr;
        !          1613:   struct depca_init *p = (struct depca_init *)lp->sh_mem;
        !          1614:   int i; 
        !          1615: 
        !          1616:   if (depca_debug > 1){
        !          1617:     /* Copy the shadow init_block to shared memory */
        !          1618:     memcpy_toio((char *)lp->sh_mem,&lp->init_block,sizeof(struct depca_init));
        !          1619: 
        !          1620:     printk("%s: depca open with irq %d\n",dev->name,dev->irq);
        !          1621:     printk("Descriptor head addresses:\n");
        !          1622:     printk("\t0x%lx  0x%lx\n",(u_long)lp->rx_ring, (u_long)lp->tx_ring);
        !          1623:     printk("Descriptor addresses:\nRX: ");
        !          1624:     for (i=0;i<lp->rxRingMask;i++){
        !          1625:       if (i < 3) {
        !          1626:        printk("0x%8.8lx ", (long) &lp->rx_ring[i].base);
        !          1627:       }
        !          1628:     }
        !          1629:     printk("...0x%8.8lx\n", (long) &lp->rx_ring[i].base);
        !          1630:     printk("TX: ");
        !          1631:     for (i=0;i<lp->txRingMask;i++){
        !          1632:       if (i < 3) {
        !          1633:        printk("0x%8.8lx ", (long) &lp->tx_ring[i].base);
        !          1634:       }
        !          1635:     }
        !          1636:     printk("...0x%8.8lx\n", (long) &lp->tx_ring[i].base);
        !          1637:     printk("\nDescriptor buffers:\nRX: ");
        !          1638:     for (i=0;i<lp->rxRingMask;i++){
        !          1639:       if (i < 3) {
        !          1640:        printk("0x%8.8x  ", readl(&lp->rx_ring[i].base));
        !          1641:       }
        !          1642:     }
        !          1643:     printk("...0x%8.8x\n", readl(&lp->rx_ring[i].base));
        !          1644:     printk("TX: ");
        !          1645:     for (i=0;i<lp->txRingMask;i++){
        !          1646:       if (i < 3) {
        !          1647:        printk("0x%8.8x  ", readl(&lp->tx_ring[i].base));
        !          1648:       }
        !          1649:     }
        !          1650:     printk("...0x%8.8x\n", readl(&lp->tx_ring[i].base));
        !          1651:     printk("Initialisation block at 0x%8.8lx\n",lp->sh_mem);
        !          1652:     printk("\tmode: 0x%4.4x\n",readw(&p->mode));
        !          1653:     printk("\tphysical address: ");
        !          1654:     for (i=0;i<ETH_ALEN-1;i++){
        !          1655:       printk("%2.2x:",(u_char)readb(&p->phys_addr[i]));
        !          1656:     }
        !          1657:     printk("%2.2x\n",(u_char)readb(&p->phys_addr[i]));
        !          1658:     printk("\tmulticast hash table: ");
        !          1659:     for (i=0;i<(HASH_TABLE_LEN >> 3)-1;i++){
        !          1660:       printk("%2.2x:",(u_char)readb(&p->mcast_table[i]));
        !          1661:     }
        !          1662:     printk("%2.2x\n",(u_char)readb(&p->mcast_table[i]));
        !          1663:     printk("\trx_ring at: 0x%8.8x\n",readl(&p->rx_ring));
        !          1664:     printk("\ttx_ring at: 0x%8.8x\n",readl(&p->tx_ring));
        !          1665:     printk("dma_buffs: 0x%8.8lx\n",lp->dma_buffs);
        !          1666:     printk("Ring size:\nRX: %d  Log2(rxRingMask): 0x%8.8x\n", 
        !          1667:           (int)lp->rxRingMask + 1, 
        !          1668:           lp->rx_rlen);
        !          1669:     printk("TX: %d  Log2(txRingMask): 0x%8.8x\n", 
        !          1670:           (int)lp->txRingMask + 1, 
        !          1671:           lp->tx_rlen);
        !          1672:     outw(CSR2,DEPCA_ADDR);
        !          1673:     printk("CSR2&1: 0x%4.4x",inw(DEPCA_DATA));
        !          1674:     outw(CSR1,DEPCA_ADDR);
        !          1675:     printk("%4.4x\n",inw(DEPCA_DATA));
        !          1676:     outw(CSR3,DEPCA_ADDR);
        !          1677:     printk("CSR3: 0x%4.4x\n",inw(DEPCA_DATA));
        !          1678:   }
        !          1679: 
        !          1680:   return;
        !          1681: }
        !          1682: 
        !          1683: /*
        !          1684: ** Perform IOCTL call functions here. Some are privileged operations and the
        !          1685: ** effective uid is checked in those cases.
        !          1686: ** All MCA IOCTLs will not work here and are for testing purposes only.
        !          1687: */
        !          1688: static int depca_ioctl(struct device *dev, struct ifreq *rq, int cmd)
        !          1689: {
        !          1690:   struct depca_private *lp = (struct depca_private *)dev->priv;
        !          1691:   struct depca_ioctl *ioc = (struct depca_ioctl *) &rq->ifr_data;
        !          1692:   int i, status = 0;
        !          1693:   u_long ioaddr = dev->base_addr;
        !          1694:   union {
        !          1695:     u8  addr[(HASH_TABLE_LEN * ETH_ALEN)];
        !          1696:     u16 sval[(HASH_TABLE_LEN * ETH_ALEN) >> 1];
        !          1697:     u32 lval[(HASH_TABLE_LEN * ETH_ALEN) >> 2];
        !          1698:   } tmp;
        !          1699: 
        !          1700:   switch(ioc->cmd) {
        !          1701:   case DEPCA_GET_HWADDR:             /* Get the hardware address */
        !          1702:     for (i=0; i<ETH_ALEN; i++) {
        !          1703:       tmp.addr[i] = dev->dev_addr[i];
        !          1704:     }
        !          1705:     ioc->len = ETH_ALEN;
        !          1706:     if (!(status = verify_area(VERIFY_WRITE, (void *)ioc->data, ioc->len))) {
        !          1707:       memcpy_tofs(ioc->data, tmp.addr, ioc->len);
        !          1708:     }
        !          1709: 
        !          1710:     break;
        !          1711:   case DEPCA_SET_HWADDR:             /* Set the hardware address */
        !          1712:     if (suser()) {
        !          1713:       if (!(status = verify_area(VERIFY_READ, (void *)ioc->data, ETH_ALEN))) {
        !          1714:        memcpy_fromfs(tmp.addr,ioc->data,ETH_ALEN);
        !          1715:        for (i=0; i<ETH_ALEN; i++) {
        !          1716:          dev->dev_addr[i] = tmp.addr[i];
        !          1717:        }
        !          1718:        while(dev->tbusy);              /* Stop ring access */
        !          1719:        set_bit(0, (void*)&dev->tbusy);
        !          1720:        while(lp->tx_old != lp->tx_new);/* Wait for the ring to empty */
        !          1721: 
        !          1722:        STOP_DEPCA;                     /* Temporarily stop the depca.  */
        !          1723:        depca_init_ring(dev);           /* Initialize the descriptor rings */
        !          1724:        LoadCSRs(dev);                  /* Reload CSR3 */
        !          1725:        InitRestartDepca(dev);          /* Resume normal operation. */
        !          1726:        dev->tbusy = 0;                 /* Unlock the TX ring */
        !          1727:       }
        !          1728:     } else {
        !          1729:       status = -EPERM;
        !          1730:     }
        !          1731: 
        !          1732:     break;
        !          1733:   case DEPCA_SET_PROM:               /* Set Promiscuous Mode */
        !          1734:     if (suser()) {
        !          1735:       while(dev->tbusy);                /* Stop ring access */
        !          1736:       set_bit(0, (void*)&dev->tbusy);
        !          1737:       while(lp->tx_old != lp->tx_new);  /* Wait for the ring to empty */
        !          1738: 
        !          1739:       STOP_DEPCA;                       /* Temporarily stop the depca.  */
        !          1740:       depca_init_ring(dev);             /* Initialize the descriptor rings */
        !          1741:       lp->init_block.mode |= PROM;      /* Set promiscuous mode */
        !          1742: 
        !          1743:       LoadCSRs(dev);                    /* Reload CSR3 */
        !          1744:       InitRestartDepca(dev);            /* Resume normal operation. */
        !          1745:       dev->tbusy = 0;                   /* Unlock the TX ring */
        !          1746:     } else {
        !          1747:       status = -EPERM;
        !          1748:     }
        !          1749: 
        !          1750:     break;
        !          1751:   case DEPCA_CLR_PROM:               /* Clear Promiscuous Mode */
        !          1752:     if (suser()) {
        !          1753:       while(dev->tbusy);                /* Stop ring access */
        !          1754:       set_bit(0, (void*)&dev->tbusy);
        !          1755:       while(lp->tx_old != lp->tx_new);  /* Wait for the ring to empty */
        !          1756: 
        !          1757:       STOP_DEPCA;                       /* Temporarily stop the depca.  */
        !          1758:       depca_init_ring(dev);             /* Initialize the descriptor rings */
        !          1759:       lp->init_block.mode &= ~PROM;     /* Clear promiscuous mode */
        !          1760: 
        !          1761:       LoadCSRs(dev);                    /* Reload CSR3 */
        !          1762:       InitRestartDepca(dev);            /* Resume normal operation. */
        !          1763:       dev->tbusy = 0;                   /* Unlock the TX ring */
        !          1764:     } else {
        !          1765:       status = -EPERM;
        !          1766:     }
        !          1767: 
        !          1768:     break;
        !          1769:   case DEPCA_SAY_BOO:                /* Say "Boo!" to the kernel log file */
        !          1770:     printk("%s: Boo!\n", dev->name);
        !          1771: 
        !          1772:     break;
        !          1773:   case DEPCA_GET_MCA:                /* Get the multicast address table */
        !          1774:     ioc->len = (HASH_TABLE_LEN >> 3);
        !          1775:     if (!(status = verify_area(VERIFY_WRITE, ioc->data, ioc->len))) {
        !          1776:       memcpy_tofs(ioc->data, lp->init_block.mcast_table, ioc->len); 
        !          1777:     }
        !          1778: 
        !          1779:     break;
        !          1780:   case DEPCA_SET_MCA:                /* Set a multicast address */
        !          1781:     if (suser()) {
        !          1782:       if (!(status=verify_area(VERIFY_READ, ioc->data, ETH_ALEN*ioc->len))) {
        !          1783:        memcpy_fromfs(tmp.addr, ioc->data, ETH_ALEN * ioc->len);
        !          1784:        set_multicast_list(dev);
        !          1785:       }
        !          1786:     } else {
        !          1787:       status = -EPERM;
        !          1788:     }
        !          1789: 
        !          1790:     break;
        !          1791:   case DEPCA_CLR_MCA:                /* Clear all multicast addresses */
        !          1792:     if (suser()) {
        !          1793:       set_multicast_list(dev);
        !          1794:     } else {
        !          1795:       status = -EPERM;
        !          1796:     }
        !          1797: 
        !          1798:     break;
        !          1799:   case DEPCA_MCA_EN:                 /* Enable pass all multicast addressing */
        !          1800:     if (suser()) {
        !          1801:       set_multicast_list(dev);
        !          1802:     } else {
        !          1803:       status = -EPERM;
        !          1804:     }
        !          1805: 
        !          1806:     break;
        !          1807:   case DEPCA_GET_STATS:              /* Get the driver statistics */
        !          1808:     cli();
        !          1809:     ioc->len = sizeof(lp->pktStats);
        !          1810:     if (!(status=verify_area(VERIFY_WRITE, ioc->data, ioc->len))) {
        !          1811:       memcpy_tofs(ioc->data, &lp->pktStats, ioc->len); 
        !          1812:     }
        !          1813:     sti();
        !          1814: 
        !          1815:     break;
        !          1816:   case DEPCA_CLR_STATS:              /* Zero out the driver statistics */
        !          1817:     if (suser()) {
        !          1818:       cli();
        !          1819:       memset(&lp->pktStats, 0, sizeof(lp->pktStats));
        !          1820:       sti();
        !          1821:     } else {
        !          1822:       status = -EPERM;
        !          1823:     }
        !          1824: 
        !          1825:     break;
        !          1826:   case DEPCA_GET_REG:                /* Get the DEPCA Registers */
        !          1827:     i=0;
        !          1828:     tmp.sval[i++] = inw(DEPCA_NICSR);
        !          1829:     outw(CSR0, DEPCA_ADDR);              /* status register */
        !          1830:     tmp.sval[i++] = inw(DEPCA_DATA);
        !          1831:     memcpy(&tmp.sval[i], &lp->init_block, sizeof(struct depca_init));
        !          1832:     ioc->len = i+sizeof(struct depca_init);
        !          1833:     if (!(status=verify_area(VERIFY_WRITE, ioc->data, ioc->len))) {
        !          1834:       memcpy_tofs(ioc->data, tmp.addr, ioc->len);
        !          1835:     }
        !          1836: 
        !          1837:     break;
        !          1838:   default:
        !          1839:     status = -EOPNOTSUPP;
        !          1840:   }
        !          1841: 
        !          1842:   return status;
        !          1843: }
        !          1844: 
        !          1845: #ifdef MODULE
        !          1846: static char devicename[9] = { 0, };
        !          1847: static struct device thisDepca = {
        !          1848:   devicename,  /* device name is inserted by /linux/drivers/net/net_init.c */
        !          1849:   0, 0, 0, 0,
        !          1850:   0x200, 7,    /* I/O address, IRQ */
        !          1851:   0, 0, 0, NULL, depca_probe };
        !          1852: 
        !          1853: static int irq=7;      /* EDIT THESE LINE FOR YOUR CONFIGURATION */
        !          1854: static int io=0x200;    /* Or use the irq= io= options to insmod */
        !          1855: 
        !          1856: /* See depca_probe() for autoprobe messages when a module */   
        !          1857: int
        !          1858: init_module(void)
        !          1859: {
        !          1860:   thisDepca.irq=irq;
        !          1861:   thisDepca.base_addr=io;
        !          1862: 
        !          1863:   if (register_netdev(&thisDepca) != 0)
        !          1864:     return -EIO;
        !          1865: 
        !          1866:   return 0;
        !          1867: }
        !          1868: 
        !          1869: void
        !          1870: cleanup_module(void)
        !          1871: {
        !          1872:   if (thisDepca.priv) {
        !          1873:     kfree(thisDepca.priv);
        !          1874:     thisDepca.priv = NULL;
        !          1875:   }
        !          1876:   thisDepca.irq=0;
        !          1877: 
        !          1878:   unregister_netdev(&thisDepca);
        !          1879:   release_region(thisDepca.base_addr, DEPCA_TOTAL_SIZE);
        !          1880: }
        !          1881: #endif /* MODULE */
        !          1882: 
        !          1883: 
        !          1884: /*
        !          1885:  * Local variables:
        !          1886:  *  compile-command: "gcc -D__KERNEL__ -I/linux/include -Wall -Wstrict-prototypes -fomit-frame-pointer -fno-strength-reduce -malign-loops=2 -malign-jumps=2 -malign-functions=2 -O2 -m486 -c depca.c"
        !          1887:  *
        !          1888:  *  compile-command: "gcc -D__KERNEL__ -DMODULE -I/linux/include -Wall -Wstrict-prototypes -fomit-frame-pointer -fno-strength-reduce -malign-loops=2 -malign-jumps=2 -malign-functions=2 -O2 -m486 -c depca.c"
        !          1889:  * End:
        !          1890:  */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.