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

unix.superglobalmegacorp.com

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