Annotation of Gnu-Mach/i386/i386at/gpl/linux/net/depca.c, revision 1.1

1.1     ! root        1: /*  depca.c: A DIGITAL DEPCA  & EtherWORKS ethernet driver for linux.
        !             2: 
        !             3:     Written 1994, 1995 by David C. Davies.
        !             4: 
        !             5: 
        !             6:                       Copyright 1994 David C. Davies
        !             7:                                   and 
        !             8:                         United States Government
        !             9:         (as represented by the Director, National Security Agency).  
        !            10: 
        !            11:                Copyright 1995  Digital Equipment Corporation.
        !            12: 
        !            13: 
        !            14:     This software may be used and distributed according to the terms of
        !            15:     the GNU Public License, incorporated herein by reference.
        !            16: 
        !            17:     This driver is written for the Digital Equipment Corporation series
        !            18:     of DEPCA and EtherWORKS ethernet cards:
        !            19: 
        !            20:         DEPCA       (the original)
        !            21:        DE100
        !            22:        DE101
        !            23:        DE200 Turbo
        !            24:        DE201 Turbo
        !            25:        DE202 Turbo (TP BNC)
        !            26:        DE210
        !            27:        DE422       (EISA)
        !            28: 
        !            29:     The  driver has been tested on DE100, DE200 and DE202 cards  in  a
        !            30:     relatively busy network. The DE422 has been tested a little.
        !            31: 
        !            32:     This  driver will NOT work   for the DE203,  DE204  and DE205 series  of
        !            33:     cards,  since they have  a  new custom ASIC in   place of the AMD  LANCE
        !            34:     chip.  See the 'ewrk3.c'   driver in the  Linux  source tree for running
        !            35:     those cards.
        !            36: 
        !            37:     I have benchmarked the driver with a  DE100 at 595kB/s to (542kB/s from)
        !            38:     a DECstation 5000/200.
        !            39: 
        !            40:     The   author   may    be   reached  at    [email protected]   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.