Annotation of Gnu-Mach/i386/i386at/gpl/linux/net/de4x5.c, revision 1.1.1.1

1.1       root        1: /*  de4x5.c: A DIGITAL DE425/DE434/DE435/DE500 ethernet driver for Linux.
                      2: 
                      3:     Copyright 1994, 1995 Digital Equipment Corporation.
                      4: 
                      5:     This software may be used and distributed according to the terms of
                      6:     the GNU Public License, incorporated herein by reference.
                      7: 
                      8:     This driver is written for the Digital Equipment Corporation series
                      9:     of EtherWORKS ethernet cards:
                     10: 
                     11:        DE425 TP/COAX EISA
                     12:        DE434 TP PCI
                     13:        DE435 TP/COAX/AUI PCI
                     14:        DE500 10/100 PCI Fasternet
                     15: 
                     16:     The driver has been tested on a relatively busy network using the DE425,
                     17:     DE434, DE435 and DE500 cards and benchmarked with 'ttcp': it transferred
                     18:     16M of data to a DECstation 5000/200 as follows:
                     19: 
                     20:                 TCP           UDP
                     21:              TX     RX     TX     RX
                     22:     DE425   1030k  997k   1170k  1128k
                     23:     DE434   1063k  995k   1170k  1125k
                     24:     DE435   1063k  995k   1170k  1125k
                     25:     DE500   1063k  998k   1170k  1125k  in 10Mb/s mode
                     26: 
                     27:     All  values are typical (in   kBytes/sec) from a  sample  of 4 for  each
                     28:     measurement. Their error is +/-20k on a quiet (private) network and also
                     29:     depend on what load the CPU has.
                     30: 
                     31:     The author may    be  reached as [email protected]  or   Digital
                     32:     Equipment Corporation, 550 King Street, Littleton MA 01460.
                     33: 
                     34:     =========================================================================
                     35:     This driver has been written  substantially  from scratch, although  its
                     36:     inheritance of style and stack interface from 'ewrk3.c' and in turn from
                     37:     Donald Becker's 'lance.c' should be obvious.
                     38: 
                     39:     Upto 15 EISA cards can be supported under this driver, limited primarily
                     40:     by the available IRQ lines.  I have  checked different configurations of
                     41:     multiple depca, EtherWORKS 3 cards and de4x5 cards and  have not found a
                     42:     problem yet (provided you have at least depca.c v0.38) ...
                     43: 
                     44:     PCI support  has been added  to allow the  driver to work with the DE434
                     45:     and  DE435 cards. The I/O  accesses  are a  bit of a   kludge due to the
                     46:     differences  in the  EISA and PCI    CSR address offsets  from the  base
                     47:     address.
                     48: 
                     49:     The ability to load  this driver as a loadable  module has been included
                     50:     and  used extensively during the  driver development (to save those long
                     51:     reboot sequences).  Loadable module support under  PCI has been achieved
                     52:     by letting any I/O address less than 0x1000 be assigned as:
                     53: 
                     54:                        0xghh
                     55: 
                     56:     where g is the bus number (usually 0 until the BIOS's get fixed)
                     57:          hh is the device number (max is 32 per bus).
                     58: 
                     59:     Essentially, the I/O address and IRQ information  are ignored and filled
                     60:     in later by  the PCI BIOS   during the PCI  probe.  Note  that the board
                     61:     should be in the system at boot time so that its I/O address and IRQ are
                     62:     allocated by the PCI BIOS automatically. The special case of device 0 on
                     63:     bus 0  is  not allowed  as  the probe  will think   you're autoprobing a
                     64:     module.
                     65: 
                     66:     To utilise this ability, you have to do 8 things:
                     67: 
                     68:     0) have a copy of the loadable modules code installed on your system.
                     69:     1) copy de4x5.c from the  /linux/drivers/net directory to your favourite
                     70:     temporary directory.
                     71:     2) edit the  source code near  line 2762 to reflect  the I/O address and
                     72:     IRQ you're using, or assign these when loading by:
                     73: 
                     74:                    insmod de4x5.o irq=x io=y
                     75: 
                     76:     3) compile  de4x5.c, but include -DMODULE in  the command line to ensure
                     77:     that the correct bits are compiled (see end of source code).
                     78:     4) if you are wanting to add a new  card, goto 5. Otherwise, recompile a
                     79:     kernel with the de4x5 configuration turned off and reboot.
                     80:     5) insmod de4x5.o
                     81:     6) run the net startup bits for your new eth?? interface manually 
                     82:     (usually /etc/rc.inet[12] at boot time). 
                     83:     7) enjoy!
                     84: 
                     85:     Note that autoprobing is not allowed in loadable modules - the system is
                     86:     already up and running and you're messing with interrupts.
                     87: 
                     88:     To unload a module, turn off the associated interface 
                     89:     'ifconfig eth?? down' then 'rmmod de4x5'.
                     90: 
                     91:     Automedia detection is included so that in  principal you can disconnect
                     92:     from, e.g.  TP, reconnect  to BNC  and  things will still work  (after a
                     93:     pause whilst the   driver figures out   where its media went).  My tests
                     94:     using ping showed that it appears to work....
                     95: 
                     96:     A compile time  switch to allow  Znyx  recognition has been  added. This
                     97:     "feature" is in no way supported nor tested  in this driver and the user
                     98:     may use it at his/her sole discretion.  I have had 2 conflicting reports
                     99:     that  my driver  will or   won't  work with   Znyx. Try Donald  Becker's
                    100:     'tulip.c' if this driver doesn't work for  you. I will not be supporting
                    101:     Znyx cards since I have no information on them  and can't test them in a
                    102:     system.
                    103: 
                    104:     TO DO:
                    105:     ------
                    106: 
                    107: 
                    108:     Revision History
                    109:     ----------------
                    110: 
                    111:     Version   Date        Description
                    112:   
                    113:       0.1     17-Nov-94   Initial writing. ALPHA code release.
                    114:       0.2     13-Jan-95   Added PCI support for DE435's.
                    115:       0.21    19-Jan-95   Added auto media detection.
                    116:       0.22    10-Feb-95   Fix interrupt handler call <[email protected]>.
                    117:                           Fix recognition bug reported by <[email protected]>.
                    118:                          Add request/release_region code.
                    119:                          Add loadable modules support for PCI.
                    120:                          Clean up loadable modules support.
                    121:       0.23    28-Feb-95   Added DC21041 and DC21140 support. 
                    122:                           Fix missed frame counter value and initialisation.
                    123:                          Fixed EISA probe.
                    124:       0.24    11-Apr-95   Change delay routine to use <linux/udelay>.
                    125:                           Change TX_BUFFS_AVAIL macro.
                    126:                          Change media autodetection to allow manual setting.
                    127:                          Completed DE500 (DC21140) support.
                    128:       0.241   18-Apr-95   Interim release without DE500 Autosense Algorithm.
                    129:       0.242   10-May-95   Minor changes
                    130:       0.30    12-Jun-95   Timer fix for DC21140
                    131:                           Portability changes.
                    132:                          Add ALPHA changes from <[email protected]>.
                    133:                          Add DE500 semi automatic autosense.
                    134:                          Add Link Fail interrupt TP failure detection.
                    135:                          Add timer based link change detection.
                    136:                          Plugged a memory leak in de4x5_queue_pkt().
                    137:       0.31    13-Jun-95   Fixed PCI stuff for 1.3.1
                    138:       0.32    26-Jun-95   Added verify_area() calls in de4x5_ioctl() from
                    139:                           suggestion by <[email protected]>
                    140: 
                    141:     =========================================================================
                    142: */
                    143: 
                    144: static const char *version = "de4x5.c:v0.32 6/26/95 [email protected]\n";
                    145: 
                    146: #include <linux/module.h>
                    147: 
                    148: #include <linux/kernel.h>
                    149: #include <linux/sched.h>
                    150: #include <linux/string.h>
                    151: #include <linux/interrupt.h>
                    152: #include <linux/ptrace.h>
                    153: #include <linux/errno.h>
                    154: #include <linux/ioport.h>
                    155: #include <linux/malloc.h>
                    156: #include <linux/bios32.h>
                    157: #include <linux/pci.h>
                    158: #include <linux/delay.h>
                    159: #include <asm/bitops.h>
                    160: #include <asm/io.h>
                    161: #include <asm/dma.h>
                    162: #include <asm/segment.h>
                    163: 
                    164: #include <linux/netdevice.h>
                    165: #include <linux/etherdevice.h>
                    166: #include <linux/skbuff.h>
                    167: 
                    168: #include <linux/time.h>
                    169: #include <linux/types.h>
                    170: #include <linux/unistd.h>
                    171: 
                    172: #include "de4x5.h"
                    173: 
                    174: #ifdef DE4X5_DEBUG
                    175: static int de4x5_debug = DE4X5_DEBUG;
                    176: #else
                    177: static int de4x5_debug = 1;
                    178: #endif
                    179: 
                    180: #ifdef DE4X5_AUTOSENSE              /* Should be done on a per adapter basis */
                    181: static int de4x5_autosense = DE4X5_AUTOSENSE;
                    182: #else
                    183: static int de4x5_autosense = AUTO;  /* Do auto media/mode sensing */
                    184: #endif
                    185: 
                    186: #ifdef DE4X5_FULL_DUPLEX            /* Should be done on a per adapter basis */
                    187: static s32 de4x5_full_duplex = 1;
                    188: #else
                    189: static s32 de4x5_full_duplex = 0;
                    190: #endif
                    191: 
                    192: #define DE4X5_NDA 0xffe0            /* No Device (I/O) Address */
                    193: 
                    194: /*
                    195: ** Ethernet PROM defines
                    196: */
                    197: #define PROBE_LENGTH    32
                    198: #define ETH_PROM_SIG    0xAA5500FFUL
                    199: 
                    200: /*
                    201: ** Ethernet Info
                    202: */
                    203: #define PKT_BUF_SZ     1536            /* Buffer size for each Tx/Rx buffer */
                    204: #define MAX_PKT_SZ     1514            /* Maximum ethernet packet length */
                    205: #define MAX_DAT_SZ     1500            /* Maximum ethernet data length */
                    206: #define MIN_DAT_SZ     1               /* Minimum ethernet data length */
                    207: #define PKT_HDR_LEN     14              /* Addresses and data length info */
                    208: #define FAKE_FRAME_LEN  (MAX_PKT_SZ + 1)
                    209: #define QUEUE_PKT_TIMEOUT (3*HZ)        /* 3 second timeout */
                    210: 
                    211: 
                    212: #define CRC_POLYNOMIAL_BE 0x04c11db7UL   /* Ethernet CRC, big endian */
                    213: #define CRC_POLYNOMIAL_LE 0xedb88320UL   /* Ethernet CRC, little endian */
                    214: 
                    215: /*
                    216: ** EISA bus defines
                    217: */
                    218: #define DE4X5_EISA_IO_PORTS   0x0c00     /* I/O port base address, slot 0 */
                    219: #define DE4X5_EISA_TOTAL_SIZE 0xfff      /* I/O address extent */
                    220: 
                    221: #define MAX_EISA_SLOTS 16
                    222: #define EISA_SLOT_INC 0x1000
                    223: 
                    224: #define DE4X5_SIGNATURE {"DE425",""}
                    225: #define DE4X5_NAME_LENGTH 8
                    226: 
                    227: /*
                    228: ** PCI Bus defines
                    229: */
                    230: #define PCI_MAX_BUS_NUM 8
                    231: #define DE4X5_PCI_TOTAL_SIZE 0x80        /* I/O address extent */
                    232: #define DE4X5_CLASS_CODE     0x00020000  /* Network controller, Ethernet */
                    233: 
                    234: /*
                    235: ** Memory Alignment. Each descriptor is 4 longwords long. To force a
                    236: ** particular alignment on the TX descriptor, adjust DESC_SKIP_LEN and
                    237: ** DESC_ALIGN. ALIGN aligns the start address of the private memory area
                    238: ** and hence the RX descriptor ring's first entry. 
                    239: */
                    240: #define ALIGN4      ((u_long)4 - 1)    /* 1 longword align */
                    241: #define ALIGN8      ((u_long)8 - 1)    /* 2 longword align */
                    242: #define ALIGN16     ((u_long)16 - 1)   /* 4 longword align */
                    243: #define ALIGN32     ((u_long)32 - 1)   /* 8 longword align */
                    244: #define ALIGN64     ((u_long)64 - 1)   /* 16 longword align */
                    245: #define ALIGN128    ((u_long)128 - 1)  /* 32 longword align */
                    246: 
                    247: #define ALIGN         ALIGN32          /* Keep the DC21040 happy... */
                    248: #define CACHE_ALIGN   CAL_16LONG
                    249: #define DESC_SKIP_LEN DSL_0            /* Must agree with DESC_ALIGN */
                    250: /*#define DESC_ALIGN    u32 dummy[4]; / * Must agree with DESC_SKIP_LEN */
                    251: #define DESC_ALIGN
                    252: 
                    253: #ifdef MACH
                    254: #define IS_NOT_DEC
                    255: #endif
                    256: 
                    257: #ifndef IS_NOT_DEC                     /* See README.de4x5 for using this */
                    258: static int is_not_dec = 0;
                    259: #else
                    260: static int is_not_dec = 1;
                    261: #endif
                    262: 
                    263: /*
                    264: ** DE4X5 IRQ ENABLE/DISABLE
                    265: */
                    266: #define ENABLE_IRQs { \
                    267:     imr |= lp->irq_en;\
                    268:     outl(imr, DE4X5_IMR);                   /* Enable the IRQs */\
                    269: }
                    270: 
                    271: #define DISABLE_IRQs {\
                    272:     imr = inl(DE4X5_IMR);\
                    273:     imr &= ~lp->irq_en;\
                    274:     outl(imr, DE4X5_IMR);                   /* Disable the IRQs */\
                    275: }
                    276: 
                    277: #define UNMASK_IRQs {\
                    278:     imr |= lp->irq_mask;\
                    279:     outl(imr, DE4X5_IMR);                   /* Unmask the IRQs */\
                    280: }
                    281: 
                    282: #define MASK_IRQs {\
                    283:     imr = inl(DE4X5_IMR);\
                    284:     imr &= ~lp->irq_mask;\
                    285:     outl(imr, DE4X5_IMR);                   /* Mask the IRQs */\
                    286: }
                    287: 
                    288: /*
                    289: ** DE4X5 START/STOP
                    290: */
                    291: #define START_DE4X5 {\
                    292:     omr = inl(DE4X5_OMR);\
                    293:     omr |= OMR_ST | OMR_SR;\
                    294:     outl(omr, DE4X5_OMR);                   /* Enable the TX and/or RX */\
                    295: }
                    296: 
                    297: #define STOP_DE4X5 {\
                    298:     omr = inl(DE4X5_OMR);\
                    299:     omr &= ~(OMR_ST|OMR_SR);\
                    300:     outl(omr, DE4X5_OMR);                   /* Disable the TX and/or RX */ \
                    301: }
                    302: 
                    303: /*
                    304: ** DE4X5 SIA RESET
                    305: */
                    306: #define RESET_SIA outl(0, DE4X5_SICR);      /* Reset SIA connectivity regs */
                    307: 
                    308: /*
                    309: ** DE500 AUTOSENSE TIMER INTERVAL (MILLISECS)
                    310: */
                    311: #define DE4X5_AUTOSENSE_MS  250
                    312: 
                    313: /*
                    314: ** SROM Structure
                    315: */
                    316: struct de4x5_srom {
                    317:   char reserved[18];
                    318:   char version;
                    319:   char num_adapters;
                    320:   char ieee_addr[6];
                    321:   char info[100];
                    322:   short chksum;
                    323: };
                    324: 
                    325: /*
                    326: ** DE4X5 Descriptors. Make sure that all the RX buffers are contiguous
                    327: ** and have sizes of both a power of 2 and a multiple of 4.
                    328: ** A size of 256 bytes for each buffer could be chosen because over 90% of
                    329: ** all packets in our network are <256 bytes long and 64 longword alignment
                    330: ** is possible. 1536 showed better 'ttcp' performance. Take your pick. 32 TX
                    331: ** descriptors are needed for machines with an ALPHA CPU.
                    332: */
                    333: #define NUM_RX_DESC 8                        /* Number of RX descriptors */
                    334: #define NUM_TX_DESC 32                       /* Number of TX descriptors */
                    335: #define BUFF_ALLOC_RETRIES 10                /* In case of memory shortage */
                    336: #define RX_BUFF_SZ 1536                      /* Power of 2 for kmalloc and */
                    337:                                              /* Multiple of 4 for DC21040 */
                    338: struct de4x5_desc {
                    339:     volatile s32 status;
                    340:     u32 des1;
                    341:     u32 buf;
                    342:     u32 next;
                    343:     DESC_ALIGN
                    344: };
                    345: 
                    346: /*
                    347: ** The DE4X5 private structure
                    348: */
                    349: #define DE4X5_PKT_STAT_SZ 16
                    350: #define DE4X5_PKT_BIN_SZ  128                /* Should be >=100 unless you
                    351:                                                 increase DE4X5_PKT_STAT_SZ */
                    352: 
                    353: struct de4x5_private {
                    354:     char adapter_name[80];                   /* Adapter name */
                    355:     struct de4x5_desc rx_ring[NUM_RX_DESC];  /* RX descriptor ring */
                    356:     struct de4x5_desc tx_ring[NUM_TX_DESC];  /* TX descriptor ring */
                    357:     struct sk_buff *skb[NUM_TX_DESC];        /* TX skb for freeing when sent */
                    358:     int rx_new, rx_old;                      /* RX descriptor ring pointers */
                    359:     int tx_new, tx_old;                      /* TX descriptor ring pointers */
                    360:     char setup_frame[SETUP_FRAME_LEN];       /* Holds MCA and PA info. */
                    361:     struct enet_statistics stats;            /* Public stats */
                    362:     struct {
                    363:        u_int bins[DE4X5_PKT_STAT_SZ]; /* Private stats counters */
                    364:        u_int unicast;
                    365:        u_int multicast;
                    366:        u_int broadcast;
                    367:        u_int excessive_collisions;
                    368:        u_int tx_underruns;
                    369:        u_int excessive_underruns;
                    370:     } pktStats;
                    371:     char rxRingSize;
                    372:     char txRingSize;
                    373:     int  bus;                                /* EISA or PCI */
                    374:     int  bus_num;                            /* PCI Bus number */
                    375:     int  chipset;                            /* DC21040, DC21041 or DC21140 */
                    376:     s32  irq_mask;                           /* Interrupt Mask (Enable) bits */
                    377:     s32  irq_en;                             /* Summary interrupt bits */
                    378:     int  media;                              /* Media (eg TP), mode (eg 100B)*/
                    379:     int  linkProb;                           /* Possible Link Problem */
                    380:     int  autosense;                          /* Allow/disallow autosensing */
                    381:     int  tx_enable;                          /* Enable descriptor polling */
                    382:     int  lostMedia;                          /* Possibly lost media */
                    383:     int  setup_f;                            /* Setup frame filtering type */
                    384: };
                    385: 
                    386: 
                    387: /*
                    388: ** The transmit ring full condition is described by the tx_old and tx_new
                    389: ** pointers by:
                    390: **    tx_old            = tx_new    Empty ring
                    391: **    tx_old            = tx_new+1  Full ring
                    392: **    tx_old+txRingSize = tx_new+1  Full ring  (wrapped condition)
                    393: */
                    394: #define TX_BUFFS_AVAIL ((lp->tx_old<=lp->tx_new)?\
                    395:                         lp->tx_old+lp->txRingSize-lp->tx_new-1:\
                    396:                          lp->tx_old               -lp->tx_new-1)
                    397: 
                    398: /*
                    399: ** Public Functions
                    400: */
                    401: static int     de4x5_open(struct device *dev);
                    402: static int     de4x5_queue_pkt(struct sk_buff *skb, struct device *dev);
                    403: static void    de4x5_interrupt(int irq, struct pt_regs *regs);
                    404: static int     de4x5_close(struct device *dev);
                    405: static struct  enet_statistics *de4x5_get_stats(struct device *dev);
                    406: static void    set_multicast_list(struct device *dev);
                    407: static int     de4x5_ioctl(struct device *dev, struct ifreq *rq, int cmd);
                    408: 
                    409: /*
                    410: ** Private functions
                    411: */
                    412: static int     de4x5_hw_init(struct device *dev, u_long iobase);
                    413: static int     de4x5_init(struct device *dev);
                    414: static int     de4x5_rx(struct device *dev);
                    415: static int     de4x5_tx(struct device *dev);
                    416: static int     de4x5_ast(struct device *dev);
                    417: 
                    418: static int     autoconf_media(struct device *dev);
                    419: static void    create_packet(struct device *dev, char *frame, int len);
                    420: static void    dce_us_delay(u32 usec);
                    421: static void    dce_ms_delay(u32 msec);
                    422: static void    load_packet(struct device *dev, char *buf, u32 flags, struct sk_buff *skb);
                    423: static void    dc21040_autoconf(struct device *dev);
                    424: static void    dc21041_autoconf(struct device *dev);
                    425: static void    dc21140_autoconf(struct device *dev);
                    426: static int     test_media(struct device *dev, s32 irqs, s32 irq_mask, s32 csr13, s32 csr14, s32 csr15, s32 msec);
                    427: /*static int     test_sym_link(struct device *dev, u32 msec);*/
                    428: static int     ping_media(struct device *dev);
                    429: static void    reset_init_sia(struct device *dev, s32 sicr, s32 strr, s32 sigr);
                    430: static int     test_ans(struct device *dev, s32 irqs, s32 irq_mask, s32 msec);
                    431: static void    load_ms_timer(struct device *dev, u32 msec);
                    432: static int     EISA_signature(char *name, s32 eisa_id);
                    433: static int     DevicePresent(u_long iobase);
                    434: static short   srom_rd(u_long address, u_char offset);
                    435: static void    srom_latch(u_int command, u_long address);
                    436: static void    srom_command(u_int command, u_long address);
                    437: static void    srom_address(u_int command, u_long address, u_char offset);
                    438: static short   srom_data(u_int command, u_long address);
                    439: /*static void    srom_busy(u_int command, u_long address);*/
                    440: static void    sendto_srom(u_int command, u_long addr);
                    441: static int     getfrom_srom(u_long addr);
                    442: static void    SetMulticastFilter(struct device *dev);
                    443: static int     get_hw_addr(struct device *dev);
                    444: 
                    445: static void    eisa_probe(struct device *dev, u_long iobase);
                    446: static void    pci_probe(struct device *dev, u_long iobase);
                    447: static struct  device *alloc_device(struct device *dev, u_long iobase);
                    448: static char    *build_setup_frame(struct device *dev, int mode);
                    449: static void    disable_ast(struct device *dev);
                    450: static void    enable_ast(struct device *dev, u32 time_out);
                    451: static void    kick_tx(struct device *dev);
                    452: 
                    453: #ifdef MODULE
                    454: int  init_module(void);
                    455: void cleanup_module(void);
                    456: static int autoprobed = 1, loading_module = 1;
                    457: # else
                    458: static unsigned char de4x5_irq[] = {5,9,10,11};
                    459: static int autoprobed = 0, loading_module = 0;
                    460: #endif /* MODULE */
                    461: 
                    462: static char name[DE4X5_NAME_LENGTH + 1];
                    463: static int num_de4x5s = 0, num_eth = 0;
                    464: 
                    465: /*
                    466: ** Kludge to get around the fact that the CSR addresses have different
                    467: ** offsets in the PCI and EISA boards. Also note that the ethernet address
                    468: ** PROM is accessed differently.
                    469: */
                    470: static struct bus_type {
                    471:     int bus;
                    472:     int bus_num;
                    473:     int device;
                    474:     int chipset;
                    475:     struct de4x5_srom srom;
                    476:     int autosense;
                    477: } bus;
                    478: 
                    479: /*
                    480: ** Miscellaneous defines...
                    481: */
                    482: #define RESET_DE4X5 {\
                    483:     int i;\
                    484:     i=inl(DE4X5_BMR);\
                    485:     dce_ms_delay(1);\
                    486:     outl(i | BMR_SWR, DE4X5_BMR);\
                    487:     dce_ms_delay(1);\
                    488:     outl(i, DE4X5_BMR);\
                    489:     dce_ms_delay(1);\
                    490:     for (i=0;i<5;i++) {inl(DE4X5_BMR); dce_ms_delay(1);}\
                    491:     dce_ms_delay(1);\
                    492: }
                    493: 
                    494: 
                    495: 
                    496: int de4x5_probe(struct device *dev)
                    497: {
                    498:   int tmp = num_de4x5s, status = -ENODEV;
                    499:   u_long iobase = dev->base_addr;
                    500: 
                    501:   if ((iobase == 0) && loading_module){
                    502:     printk("Autoprobing is not supported when loading a module based driver.\n");
                    503:     status = -EIO;
                    504:   } else {
                    505:     eisa_probe(dev, iobase);
                    506:     pci_probe(dev, iobase);
                    507: 
                    508:     if ((tmp == num_de4x5s) && (iobase != 0) && loading_module) {
                    509:       printk("%s: de4x5_probe() cannot find device at 0x%04lx.\n", dev->name, 
                    510:                                                                       iobase);
                    511:     }
                    512: 
                    513:     /*
                    514:     ** Walk the device list to check that at least one device
                    515:     ** initialised OK
                    516:     */
                    517:     for (; (dev->priv == NULL) && (dev->next != NULL); dev = dev->next);
                    518: 
                    519:     if (dev->priv) status = 0;
                    520:     if (iobase == 0) autoprobed = 1;
                    521:   }
                    522: 
                    523:   return status;
                    524: }
                    525: 
                    526: static int
                    527: de4x5_hw_init(struct device *dev, u_long iobase)
                    528: {
                    529:   struct bus_type *lp = &bus;
                    530:   int tmpbus, tmpchs, i, j, status=0;
                    531:   char *tmp;
                    532: 
                    533:   /* Ensure we're not sleeping */
                    534:   if (lp->chipset == DC21041) {
                    535:     outl(0, PCI_CFDA);
                    536:     dce_ms_delay(10);
                    537:   }
                    538: 
                    539:   RESET_DE4X5;
                    540: 
                    541:   if ((inl(DE4X5_STS) & (STS_TS | STS_RS)) == 0) {
                    542:     /* 
                    543:     ** Now find out what kind of DC21040/DC21041/DC21140 board we have.
                    544:     */
                    545:     if (lp->bus == PCI) {
                    546:       if (!is_not_dec) {
                    547:        if ((lp->chipset == DC21040) || (lp->chipset == DC21041)) {
                    548:          strcpy(name, "DE435");
                    549:        } else if (lp->chipset == DC21140) {
                    550:          strcpy(name, "DE500");                /* Must read the SROM here! */
                    551:        }
                    552:       } else {
                    553:        strcpy(name, "UNKNOWN");
                    554:       }
                    555:     } else {
                    556:       EISA_signature(name, EISA_ID0);
                    557:     }
                    558: 
                    559:     if (*name != '\0') {                         /* found a board signature */
                    560:       dev->base_addr = iobase;
                    561:       if (lp->bus == EISA) {
                    562:        printk("%s: %s at %04lx (EISA slot %ld)", 
                    563:                                dev->name, name, iobase, ((iobase>>12)&0x0f));
                    564:       } else {                                   /* PCI port address */
                    565:        printk("%s: %s at %04lx (PCI bus %d, device %d)", dev->name, name,
                    566:                                              iobase, lp->bus_num, lp->device);
                    567:       }
                    568:        
                    569:       printk(", h/w address ");
                    570:       status = get_hw_addr(dev);
                    571:       for (i = 0; i < ETH_ALEN - 1; i++) {       /* get the ethernet addr. */
                    572:        printk("%2.2x:", dev->dev_addr[i]);
                    573:       }
                    574:       printk("%2.2x,\n", dev->dev_addr[i]);
                    575:       
                    576:       tmpbus = lp->bus;
                    577:       tmpchs = lp->chipset;
                    578: 
                    579:       if (status == 0) {
                    580:        struct de4x5_private *lp;
                    581: 
                    582:        /* 
                    583:        ** Reserve a section of kernel memory for the adapter
                    584:        ** private area and the TX/RX descriptor rings.
                    585:        */
                    586:        dev->priv = (void *) kmalloc(sizeof(struct de4x5_private) + ALIGN, 
                    587:                                                                   GFP_KERNEL);
                    588:        if (dev->priv == NULL)
                    589:                return -ENOMEM;
                    590:        /*
                    591:        ** Align to a longword boundary
                    592:        */
                    593:        dev->priv = (void *)(((u_long)dev->priv + ALIGN) & ~ALIGN);
                    594:        lp = (struct de4x5_private *)dev->priv;
                    595:        memset(dev->priv, 0, sizeof(struct de4x5_private));
                    596:        lp->bus = tmpbus;
                    597:        lp->chipset = tmpchs;
                    598: 
                    599:        /*
                    600:        ** Choose autosensing
                    601:        */
                    602:        if (de4x5_autosense & AUTO) {
                    603:          lp->autosense = AUTO;
                    604:        } else {
                    605:          if (lp->chipset != DC21140) {
                    606:            if ((lp->chipset == DC21040) && (de4x5_autosense & TP_NW)) {
                    607:              de4x5_autosense = TP;
                    608:            }
                    609:            if ((lp->chipset == DC21041) && (de4x5_autosense & BNC_AUI)) {
                    610:              de4x5_autosense = BNC;
                    611:            }
                    612:            lp->autosense = de4x5_autosense & 0x001f;
                    613:          } else {
                    614:            lp->autosense = de4x5_autosense & 0x00c0;
                    615:          }
                    616:        }
                    617: 
                    618:        sprintf(lp->adapter_name,"%s (%s)", name, dev->name);
                    619:        request_region(iobase, (lp->bus == PCI ? DE4X5_PCI_TOTAL_SIZE :
                    620:                                                 DE4X5_EISA_TOTAL_SIZE), 
                    621:                                                 lp->adapter_name);
                    622: 
                    623:        /*
                    624:        ** Allocate contiguous receive buffers, long word aligned. 
                    625:        ** This could be a possible memory leak if the private area
                    626:        ** is ever hosed.
                    627:        */
                    628:        for (tmp=NULL, j=0; (j<BUFF_ALLOC_RETRIES) && (tmp==NULL); j++) {
                    629:          if ((tmp = (void *)kmalloc(RX_BUFF_SZ * NUM_RX_DESC + ALIGN, 
                    630:                                                        GFP_KERNEL)) != NULL) {
                    631:            tmp = (char *)(((u_long) tmp + ALIGN) & ~ALIGN);
                    632:            for (i=0; i<NUM_RX_DESC; i++) {
                    633:              lp->rx_ring[i].status = 0;
                    634:              lp->rx_ring[i].des1 = RX_BUFF_SZ;
                    635:              lp->rx_ring[i].buf = virt_to_bus(tmp + i * RX_BUFF_SZ);
                    636:              lp->rx_ring[i].next = (u32)NULL;
                    637:            }
                    638:            barrier();
                    639:          }
                    640:        }
                    641: 
                    642:        if (tmp != NULL) {
                    643:          lp->rxRingSize = NUM_RX_DESC;
                    644:          lp->txRingSize = NUM_TX_DESC;
                    645:          
                    646:          /* Write the end of list marker to the descriptor lists */
                    647:          lp->rx_ring[lp->rxRingSize - 1].des1 |= RD_RER;
                    648:          lp->tx_ring[lp->txRingSize - 1].des1 |= TD_TER;
                    649: 
                    650:          /* Tell the adapter where the TX/RX rings are located. */
                    651:          outl(virt_to_bus(lp->rx_ring), DE4X5_RRBA);
                    652:          outl(virt_to_bus(lp->tx_ring), DE4X5_TRBA);
                    653: 
                    654:          /* Initialise the IRQ mask and Enable/Disable */
                    655:          lp->irq_mask = IMR_RIM | IMR_TIM | IMR_TUM ;
                    656:          lp->irq_en   = IMR_NIM | IMR_AIM;
                    657: 
                    658:          lp->tx_enable = TRUE;
                    659: 
                    660:          if (dev->irq < 2) {
                    661: #ifndef MODULE
                    662:            unsigned char irqnum;
                    663:            s32 omr;
                    664:            autoirq_setup(0);
                    665:            
                    666:            omr = inl(DE4X5_OMR);
                    667:            outl(IMR_AIM|IMR_RUM, DE4X5_IMR); /* Unmask RUM interrupt */
                    668:            outl(OMR_SR | omr, DE4X5_OMR);    /* Start RX w/no descriptors */
                    669: 
                    670:            irqnum = autoirq_report(1);
                    671:            if (!irqnum) {
                    672:              printk("      and failed to detect IRQ line.\n");
                    673:              status = -ENXIO;
                    674:            } else {
                    675:              for (dev->irq=0,i=0; (i<sizeof(de4x5_irq)) && (!dev->irq); i++) {
                    676:                if (irqnum == de4x5_irq[i]) {
                    677:                  dev->irq = irqnum;
                    678:                  printk("      and uses IRQ%d.\n", dev->irq);
                    679:                }
                    680:              }
                    681:                  
                    682:              if (!dev->irq) {
                    683:                printk("      but incorrect IRQ line detected.\n");
                    684:                status = -ENXIO;
                    685:              }
                    686:            }
                    687:                
                    688:            outl(0, DE4X5_IMR);               /* Re-mask RUM interrupt */
                    689: 
                    690: #endif /* MODULE */
                    691:          } else {
                    692:            printk("      and requires IRQ%d (not probed).\n", dev->irq);
                    693:          }
                    694:        } else {
                    695:          printk("%s: Kernel could not allocate RX buffer memory.\n", 
                    696:                                                                    dev->name);
                    697:          status = -ENXIO;
                    698:        }
                    699:        if (status) release_region(iobase, (lp->bus == PCI ? 
                    700:                                                     DE4X5_PCI_TOTAL_SIZE :
                    701:                                                     DE4X5_EISA_TOTAL_SIZE));
                    702:       } else {
                    703:        printk("      which has an Ethernet PROM CRC error.\n");
                    704:        status = -ENXIO;
                    705:       }
                    706:     } else {
                    707:       status = -ENXIO;
                    708:     }
                    709:   } else {
                    710:     status = -ENXIO;
                    711:   }
                    712:   
                    713:   if (!status) {
                    714:     if (de4x5_debug > 0) {
                    715:       printk(version);
                    716:     }
                    717:     
                    718:     /* The DE4X5-specific entries in the device structure. */
                    719:     dev->open = &de4x5_open;
                    720:     dev->hard_start_xmit = &de4x5_queue_pkt;
                    721:     dev->stop = &de4x5_close;
                    722:     dev->get_stats = &de4x5_get_stats;
                    723:     dev->set_multicast_list = &set_multicast_list;
                    724:     dev->do_ioctl = &de4x5_ioctl;
                    725:     
                    726:     dev->mem_start = 0;
                    727:     
                    728:     /* Fill in the generic field of the device structure. */
                    729:     ether_setup(dev);
                    730: 
                    731:     /* Let the adapter sleep to save power */
                    732:     if (lp->chipset == DC21041) {
                    733:       outl(0, DE4X5_SICR);
                    734:       outl(CFDA_PSM, PCI_CFDA);
                    735:     }
                    736:   } else {                            /* Incorrectly initialised hardware */
                    737:     struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
                    738:     if (lp) {
                    739:       kfree_s(bus_to_virt(lp->rx_ring[0].buf),
                    740:                                            RX_BUFF_SZ * NUM_RX_DESC + ALIGN);
                    741:     }
                    742:     if (dev->priv) {
                    743:       kfree_s(dev->priv, sizeof(struct de4x5_private) + ALIGN);
                    744:       dev->priv = NULL;
                    745:     }
                    746:   }
                    747: 
                    748:   return status;
                    749: }
                    750: 
                    751: 
                    752: static int
                    753: de4x5_open(struct device *dev)
                    754: {
                    755:   struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
                    756:   u_long iobase = dev->base_addr;
                    757:   int i, status = 0;
                    758:   s32 imr, omr, sts;
                    759: 
                    760:   /*
                    761:   ** Wake up the adapter
                    762:   */
                    763:   if (lp->chipset == DC21041) {
                    764:     outl(0, PCI_CFDA);
                    765:     dce_ms_delay(10);
                    766:   }
                    767: 
                    768:   if (request_irq(dev->irq, (void *)de4x5_interrupt, 0, lp->adapter_name)) {
                    769:     printk("de4x5_open(): Requested IRQ%d is busy\n",dev->irq);
                    770:     status = -EAGAIN;
                    771:   } else {
                    772: 
                    773:     irq2dev_map[dev->irq] = dev;
                    774:     /* 
                    775:     ** Re-initialize the DE4X5... 
                    776:     */
                    777:     status = de4x5_init(dev);
                    778: 
                    779:     if (de4x5_debug > 1){
                    780:       printk("%s: de4x5 open with irq %d\n",dev->name,dev->irq);
                    781:       printk("\tphysical address: ");
                    782:       for (i=0;i<6;i++){
                    783:        printk("%2.2x:",(short)dev->dev_addr[i]);
                    784:       }
                    785:       printk("\n");
                    786:       printk("Descriptor head addresses:\n");
                    787:       printk("\t0x%8.8lx  0x%8.8lx\n",(u_long)lp->rx_ring,(u_long)lp->tx_ring);
                    788:       printk("Descriptor addresses:\nRX: ");
                    789:       for (i=0;i<lp->rxRingSize-1;i++){
                    790:        if (i < 3) {
                    791:          printk("0x%8.8lx  ",(u_long)&lp->rx_ring[i].status);
                    792:        }
                    793:       }
                    794:       printk("...0x%8.8lx\n",(u_long)&lp->rx_ring[i].status);
                    795:       printk("TX: ");
                    796:       for (i=0;i<lp->txRingSize-1;i++){
                    797:        if (i < 3) {
                    798:          printk("0x%8.8lx  ", (u_long)&lp->tx_ring[i].status);
                    799:        }
                    800:       }
                    801:       printk("...0x%8.8lx\n", (u_long)&lp->tx_ring[i].status);
                    802:       printk("Descriptor buffers:\nRX: ");
                    803:       for (i=0;i<lp->rxRingSize-1;i++){
                    804:        if (i < 3) {
                    805:          printk("0x%8.8x  ",lp->rx_ring[i].buf);
                    806:        }
                    807:       }
                    808:       printk("...0x%8.8x\n",lp->rx_ring[i].buf);
                    809:       printk("TX: ");
                    810:       for (i=0;i<lp->txRingSize-1;i++){
                    811:        if (i < 3) {
                    812:          printk("0x%8.8x  ", lp->tx_ring[i].buf);
                    813:        }
                    814:       }
                    815:       printk("...0x%8.8x\n", lp->tx_ring[i].buf);
                    816:       printk("Ring size: \nRX: %d\nTX: %d\n", 
                    817:             (short)lp->rxRingSize, 
                    818:             (short)lp->txRingSize); 
                    819:       printk("\tstatus:  %d\n", status);
                    820:     }
                    821: 
                    822:     if (!status) {
                    823:       dev->tbusy = 0;                         
                    824:       dev->start = 1;
                    825:       dev->interrupt = UNMASK_INTERRUPTS;
                    826:       dev->trans_start = jiffies;
                    827: 
                    828:       START_DE4X5;
                    829: 
                    830:       /* Unmask and enable DE4X5 board interrupts */
                    831:       imr = 0;
                    832:       UNMASK_IRQs;
                    833: 
                    834:       /* Reset any pending (stale) interrupts */
                    835:       sts = inl(DE4X5_STS);
                    836:       outl(sts, DE4X5_STS);
                    837: 
                    838:       ENABLE_IRQs;
                    839:     }
                    840:     if (de4x5_debug > 1) {
                    841:       printk("\tsts:  0x%08x\n", inl(DE4X5_STS));
                    842:       printk("\tbmr:  0x%08x\n", inl(DE4X5_BMR));
                    843:       printk("\timr:  0x%08x\n", inl(DE4X5_IMR));
                    844:       printk("\tomr:  0x%08x\n", inl(DE4X5_OMR));
                    845:       printk("\tsisr: 0x%08x\n", inl(DE4X5_SISR));
                    846:       printk("\tsicr: 0x%08x\n", inl(DE4X5_SICR));
                    847:       printk("\tstrr: 0x%08x\n", inl(DE4X5_STRR));
                    848:       printk("\tsigr: 0x%08x\n", inl(DE4X5_SIGR));
                    849:     }
                    850:   }
                    851: 
                    852:   MOD_INC_USE_COUNT;
                    853: 
                    854:   return status;
                    855: }
                    856: 
                    857: /*
                    858: ** Initialize the DE4X5 operating conditions. NB: a chip problem with the
                    859: ** DC21140 requires using perfect filtering mode for that chip. Since I can't
                    860: ** see why I'd want > 14 multicast addresses, I may change all chips to use
                    861: ** the perfect filtering mode. Keep the DMA burst length at 8: there seems
                    862: ** to be data corruption problems if it is larger (UDP errors seen from a
                    863: ** ttcp source).
                    864: */
                    865: static int
                    866: de4x5_init(struct device *dev)
                    867: {  
                    868:   struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
                    869:   u_long iobase = dev->base_addr;
                    870:   int i, j, status = 0;
                    871:   s32 bmr, omr;
                    872: 
                    873:   /* Lock out other processes whilst setting up the hardware */
                    874:   set_bit(0, (void *)&dev->tbusy);
                    875: 
                    876:   RESET_DE4X5;
                    877: 
                    878:   bmr = inl(DE4X5_BMR);
                    879:   bmr |= PBL_8 | DESC_SKIP_LEN | CACHE_ALIGN;
                    880:   outl(bmr, DE4X5_BMR);
                    881: 
                    882:   if (lp->chipset != DC21140) {
                    883:     omr = TR_96;
                    884:     lp->setup_f = HASH_PERF;
                    885:   } else {
                    886:     omr = OMR_SDP | OMR_SF;
                    887:     lp->setup_f = PERFECT;
                    888:   }
                    889:   outl(virt_to_bus(lp->rx_ring), DE4X5_RRBA);
                    890:   outl(virt_to_bus(lp->tx_ring), DE4X5_TRBA);
                    891: 
                    892:   lp->rx_new = lp->rx_old = 0;
                    893:   lp->tx_new = lp->tx_old = 0;
                    894: 
                    895:   for (i = 0; i < lp->rxRingSize; i++) {
                    896:     lp->rx_ring[i].status = R_OWN;
                    897:   }
                    898: 
                    899:   for (i = 0; i < lp->txRingSize; i++) {
                    900:     lp->tx_ring[i].status = 0;
                    901:   }
                    902: 
                    903:   barrier();
                    904: 
                    905:   /* Build the setup frame depending on filtering mode */
                    906:   SetMulticastFilter(dev);
                    907: 
                    908:   if (lp->chipset != DC21140) {
                    909:     load_packet(dev, lp->setup_frame, HASH_F|TD_SET|SETUP_FRAME_LEN, NULL);
                    910:   } else {
                    911:     load_packet(dev, lp->setup_frame, PERFECT_F|TD_SET|SETUP_FRAME_LEN, NULL);
                    912:   }
                    913:   outl(omr|OMR_ST, DE4X5_OMR);
                    914: 
                    915:   /* Poll for completion of setup frame (interrupts are disabled for now) */
                    916:   for (j=0, i=jiffies;(i<=jiffies+HZ/100) && (j==0);) {
                    917:     if (lp->tx_ring[lp->tx_new].status >= 0) j=1;
                    918:   }
                    919:   outl(omr, DE4X5_OMR);                        /* Stop everything! */
                    920: 
                    921:   if (j == 0) {
                    922:     printk("%s: Setup frame timed out, status %08x\n", dev->name, 
                    923:                                                               inl(DE4X5_STS));
                    924:     status = -EIO;
                    925:   }
                    926: 
                    927:   lp->tx_new = (++lp->tx_new) % lp->txRingSize;
                    928:   lp->tx_old = lp->tx_new;
                    929: 
                    930:   /* Autoconfigure the connected port */
                    931:   if (autoconf_media(dev) == 0) {
                    932:     status = -EIO;
                    933:   }
                    934: 
                    935:   return 0;
                    936: }
                    937: 
                    938: /* 
                    939: ** Writes a socket buffer address to the next available transmit descriptor
                    940: */
                    941: static int
                    942: de4x5_queue_pkt(struct sk_buff *skb, struct device *dev)
                    943: {
                    944:   struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
                    945:   u_long iobase = dev->base_addr;
                    946:   int i, status = 0;
                    947:   s32 imr, omr, sts;
                    948: 
                    949:   /*
                    950:   ** Clean out the TX ring asynchronously to interrupts - sometimes the
                    951:   ** interrupts are lost by delayed descriptor status updates relative to
                    952:   ** the irq assertion, especially with a busy PCI bus.
                    953:   */
                    954:   if (set_bit(0, (void*)&dev->tbusy) == 0) {
                    955:     cli();
                    956:     de4x5_tx(dev);
                    957:     dev->tbusy = 0;
                    958:     sti();
                    959:   }
                    960:   
                    961:   /* 
                    962:   ** Transmitter timeout, possibly serious problems.
                    963:   ** The 'lostMedia' threshold accounts for transient errors that
                    964:   ** were noticed when switching media.
                    965:   */
                    966:   if (dev->tbusy || (lp->lostMedia > LOST_MEDIA_THRESHOLD)) {
                    967:     u_long tickssofar = jiffies - dev->trans_start;
                    968:     if ((tickssofar < QUEUE_PKT_TIMEOUT) &&
                    969:        (lp->lostMedia <= LOST_MEDIA_THRESHOLD)) {
                    970:       status = -1;
                    971:     } else {
                    972:       if (de4x5_debug >= 1) {
                    973:        printk("%s: transmit timed out, status %08x, tbusy:%ld, lostMedia:%d tickssofar:%ld, resetting.\n",dev->name, inl(DE4X5_STS), dev->tbusy, lp->lostMedia, tickssofar);
                    974:       }
                    975: 
                    976:       /* Stop and reset the TX and RX... */
                    977:       STOP_DE4X5;
                    978: 
                    979:       /* Re-queue any skb's. */
                    980:       for (i=lp->tx_old; i!=lp->tx_new; i=(++i)%lp->txRingSize) {
                    981:        if (lp->skb[i] != NULL) {
                    982:          if (lp->skb[i]->len != FAKE_FRAME_LEN) {
                    983:            if (lp->tx_ring[i].status == T_OWN) {
                    984:              dev_queue_xmit(lp->skb[i], dev, SOPRI_NORMAL);
                    985:            } else {                               /* already sent */
                    986:              dev_kfree_skb(lp->skb[i], FREE_WRITE);
                    987:            }
                    988:          } else {
                    989:            dev_kfree_skb(lp->skb[i], FREE_WRITE);
                    990:          }
                    991:          lp->skb[i] = NULL;
                    992:        }
                    993:       }
                    994:       if (skb->len != FAKE_FRAME_LEN) {
                    995:        dev_queue_xmit(skb, dev, SOPRI_NORMAL);
                    996:       } else {
                    997:        dev_kfree_skb(skb, FREE_WRITE);
                    998:       }
                    999: 
                   1000:       /* Initialise the hardware */
                   1001:       status = de4x5_init(dev);
                   1002: 
                   1003:       /* Unmask DE4X5 board interrupts */
                   1004:       if (!status) {
                   1005:        /* Start here to clean stale interrupts later */
                   1006:        dev->interrupt = UNMASK_INTERRUPTS;
                   1007:        dev->start = 1;
                   1008:        dev->tbusy = 0;                         
                   1009:        dev->trans_start = jiffies;
                   1010:       
                   1011:        START_DE4X5;
                   1012: 
                   1013:        /* Unmask DE4X5 board interrupts */
                   1014:        imr = 0;
                   1015:        UNMASK_IRQs;
                   1016: 
                   1017:        /* Clear any pending (stale) interrupts */
                   1018:        sts = inl(DE4X5_STS);
                   1019:        outl(sts, DE4X5_STS);
                   1020: 
                   1021:        ENABLE_IRQs;
                   1022:       } else {
                   1023:        printk("%s: hardware initialisation failure, status %08x.\n",
                   1024:                                                    dev->name, inl(DE4X5_STS));
                   1025:       }
                   1026:     }
                   1027:   } else if (skb == NULL) {
                   1028:     dev_tint(dev);
                   1029:   } else if (skb->len == FAKE_FRAME_LEN) {     /* Don't TX a fake frame! */
                   1030:     dev_kfree_skb(skb, FREE_WRITE);
                   1031:   } else if (skb->len > 0) {
                   1032:     /* Enforce 1 process per h/w access */
                   1033:     if (set_bit(0, (void*)&dev->tbusy) != 0) { 
                   1034:       printk("%s: Transmitter access conflict.\n", dev->name);
                   1035:       status = -1;                             /* Re-queue packet */
                   1036:     } else {
                   1037:       cli();
                   1038:       if (TX_BUFFS_AVAIL) {                    /* Fill in a Tx ring entry */
                   1039:        load_packet(dev, skb->data, TD_IC | TD_LS | TD_FS | skb->len, skb);
                   1040:        if (lp->tx_enable) {
                   1041:          outl(POLL_DEMAND, DE4X5_TPD);        /* Start the TX */
                   1042:        }
                   1043: 
                   1044:        lp->tx_new = (++lp->tx_new) % lp->txRingSize; /* Ensure a wrap */
                   1045:        dev->trans_start = jiffies;
                   1046: 
                   1047:        if (TX_BUFFS_AVAIL) {
                   1048:          dev->tbusy = 0;                      /* Another pkt may be queued */
                   1049:        }
                   1050:       } else {                                 /* Ring full - re-queue */
                   1051:        status = -1;
                   1052:       }
                   1053:       sti();
                   1054:     }
                   1055:   }
                   1056: 
                   1057:   return status;
                   1058: }
                   1059: 
                   1060: /*
                   1061: ** The DE4X5 interrupt handler. 
                   1062: ** 
                   1063: ** I/O Read/Writes through intermediate PCI bridges are never 'posted',
                   1064: ** so that the asserted interrupt always has some real data to work with -
                   1065: ** if these I/O accesses are ever changed to memory accesses, ensure the
                   1066: ** STS write is read immediately to complete the transaction if the adapter
                   1067: ** is not on bus 0. Lost interrupts can still occur when the PCI bus load
                   1068: ** is high and descriptor status bits cannot be set before the associated
                   1069: ** interrupt is asserted and this routine entered.
                   1070: */
                   1071: static void
                   1072: de4x5_interrupt(int irq, struct pt_regs *regs)
                   1073: {
                   1074:     struct device *dev = (struct device *)(irq2dev_map[irq]);
                   1075:     struct de4x5_private *lp;
                   1076:     s32 imr, omr, sts;
                   1077:     u_long iobase;
                   1078: 
                   1079:     if (dev == NULL) {
                   1080:        printk ("de4x5_interrupt(): irq %d for unknown device.\n", irq);
                   1081:     } else {
                   1082:       lp = (struct de4x5_private *)dev->priv;
                   1083:       iobase = dev->base_addr;
                   1084: 
                   1085:       if (dev->interrupt)
                   1086:        printk("%s: Re-entering the interrupt handler.\n", dev->name);
                   1087: 
                   1088:       DISABLE_IRQs;                      /* Ensure non re-entrancy */
                   1089:       dev->interrupt = MASK_INTERRUPTS;
                   1090: 
                   1091:       while ((sts = inl(DE4X5_STS)) & lp->irq_mask) { /* Read IRQ status */
                   1092:        outl(sts, DE4X5_STS);            /* Reset the board interrupts */
                   1093: 
                   1094:        if (sts & (STS_RI | STS_RU))     /* Rx interrupt (packet[s] arrived) */
                   1095:          de4x5_rx(dev);
                   1096: 
                   1097:        if (sts & (STS_TI | STS_TU))     /* Tx interrupt (packet sent) */
                   1098:          de4x5_tx(dev); 
                   1099: 
                   1100:        if (sts & STS_TM)                /* Autosense tick */
                   1101:          de4x5_ast(dev);
                   1102: 
                   1103:        if (sts & STS_LNF) {             /* TP Link has failed */
                   1104:          lp->lostMedia = LOST_MEDIA_THRESHOLD + 1;
                   1105:          lp->irq_mask &= ~IMR_LFM;
                   1106:          kick_tx(dev);
                   1107:        }
                   1108: 
                   1109:        if (sts & STS_SE) {              /* Bus Error */
                   1110:          STOP_DE4X5;
                   1111:          printk("%s: Fatal bus error occured, sts=%#8x, device stopped.\n",
                   1112:                                                              dev->name, sts);
                   1113:        }
                   1114:       }
                   1115: 
                   1116:       if (TX_BUFFS_AVAIL && dev->tbusy) {/* Any resources available? */
                   1117:        dev->tbusy = 0;                  /* Clear TX busy flag */
                   1118:        mark_bh(NET_BH);
                   1119:       }
                   1120: 
                   1121:       dev->interrupt = UNMASK_INTERRUPTS;
                   1122:       ENABLE_IRQs;
                   1123:     }
                   1124: 
                   1125:     return;
                   1126: }
                   1127: 
                   1128: static int
                   1129: de4x5_rx(struct device *dev)
                   1130: {
                   1131:   struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
                   1132:   int i, entry;
                   1133:   s32 status;
                   1134:   char *buf;
                   1135: 
                   1136:   for (entry = lp->rx_new; lp->rx_ring[entry].status >= 0;entry = lp->rx_new) {
                   1137:     status = lp->rx_ring[entry].status;
                   1138: 
                   1139:     if (status & RD_FS) {                   /* Remember the start of frame */
                   1140:       lp->rx_old = entry;
                   1141:     }
                   1142: 
                   1143:     if (status & RD_LS) {                   /* Valid frame status */
                   1144:       if (status & RD_ES) {                /* There was an error. */
                   1145:        lp->stats.rx_errors++;              /* Update the error stats. */
                   1146:        if (status & (RD_RF | RD_TL)) lp->stats.rx_frame_errors++;
                   1147:        if (status & RD_CE)           lp->stats.rx_crc_errors++;
                   1148:        if (status & RD_OF)           lp->stats.rx_fifo_errors++;
                   1149:       } else {                              /* A valid frame received */
                   1150:        struct sk_buff *skb;
                   1151:        short pkt_len = (short)(lp->rx_ring[entry].status >> 16) - 4;
                   1152: 
                   1153:        if ((skb = dev_alloc_skb(pkt_len+2)) != NULL) {
                   1154:          skb->dev = dev;
                   1155:        
                   1156:          skb_reserve(skb,2);           /* Align */
                   1157:          if (entry < lp->rx_old) {         /* Wrapped buffer */
                   1158:            short len = (lp->rxRingSize - lp->rx_old) * RX_BUFF_SZ;
                   1159:            memcpy(skb_put(skb,len), bus_to_virt(lp->rx_ring[lp->rx_old].buf), len);
                   1160:            memcpy(skb_put(skb,pkt_len-len), bus_to_virt(lp->rx_ring[0].buf), pkt_len - len);
                   1161:          } else {                          /* Linear buffer */
                   1162:            memcpy(skb_put(skb,pkt_len), bus_to_virt(lp->rx_ring[lp->rx_old].buf), pkt_len);
                   1163:          }
                   1164: 
                   1165:          /* Push up the protocol stack */
                   1166:          skb->protocol=eth_type_trans(skb,dev);
                   1167:          netif_rx(skb);
                   1168: 
                   1169:          /* Update stats */
                   1170:          lp->stats.rx_packets++;
                   1171:          for (i=1; i<DE4X5_PKT_STAT_SZ-1; i++) {
                   1172:            if (pkt_len < (i*DE4X5_PKT_BIN_SZ)) {
                   1173:              lp->pktStats.bins[i]++;
                   1174:              i = DE4X5_PKT_STAT_SZ;
                   1175:            }
                   1176:          }
                   1177:          buf = skb->data;                  /* Look at the dest addr */
                   1178:          if (buf[0] & 0x01) {              /* Multicast/Broadcast */
                   1179:            if ((*(s32 *)&buf[0] == -1) && (*(s16 *)&buf[4] == -1)) {
                   1180:              lp->pktStats.broadcast++;
                   1181:            } else {
                   1182:              lp->pktStats.multicast++;
                   1183:            }
                   1184:          } else if ((*(s32 *)&buf[0] == *(s32 *)&dev->dev_addr[0]) &&
                   1185:                     (*(s16 *)&buf[4] == *(s16 *)&dev->dev_addr[4])) {
                   1186:            lp->pktStats.unicast++;
                   1187:          }
                   1188:          
                   1189:          lp->pktStats.bins[0]++;           /* Duplicates stats.rx_packets */
                   1190:          if (lp->pktStats.bins[0] == 0) {  /* Reset counters */
                   1191:            memset((char *)&lp->pktStats, 0, sizeof(lp->pktStats));
                   1192:          }
                   1193:        } else {
                   1194:          printk("%s: Insufficient memory; nuking packet.\n", dev->name);
                   1195:          lp->stats.rx_dropped++;             /* Really, deferred. */
                   1196:          break;
                   1197:        }
                   1198:       }
                   1199: 
                   1200:       /* Change buffer ownership for this last frame, back to the adapter */
                   1201:       for (; lp->rx_old!=entry; lp->rx_old=(++lp->rx_old)%lp->rxRingSize) {
                   1202:        lp->rx_ring[lp->rx_old].status = R_OWN;
                   1203:        barrier();
                   1204:       }
                   1205:       lp->rx_ring[entry].status = R_OWN;
                   1206:       barrier();
                   1207:     }
                   1208: 
                   1209:     /*
                   1210:     ** Update entry information
                   1211:     */
                   1212:     lp->rx_new = (++lp->rx_new) % lp->rxRingSize;
                   1213:   }
                   1214: 
                   1215:   return 0;
                   1216: }
                   1217: 
                   1218: /*
                   1219: ** Buffer sent - check for TX buffer errors.
                   1220: */
                   1221: static int
                   1222: de4x5_tx(struct device *dev)
                   1223: {
                   1224:   struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
                   1225:   u_long iobase = dev->base_addr;
                   1226:   int entry;
                   1227:   s32 status;
                   1228: 
                   1229:   for (entry = lp->tx_old; entry != lp->tx_new; entry = lp->tx_old) {
                   1230:     status = lp->tx_ring[entry].status;
                   1231:     if (status < 0) {                            /* Buffer not sent yet */
                   1232:       break;
                   1233:     } else if (status & TD_ES) {                 /* An error happened */
                   1234:       lp->stats.tx_errors++; 
                   1235:       if (status & TD_NC)  lp->stats.tx_carrier_errors++;
                   1236:       if (status & TD_LC)  lp->stats.tx_window_errors++;
                   1237:       if (status & TD_UF)  lp->stats.tx_fifo_errors++;
                   1238:       if (status & TD_LC)  lp->stats.collisions++;
                   1239:       if (status & TD_EC)  lp->pktStats.excessive_collisions++;
                   1240:       if (status & TD_DE)  lp->stats.tx_aborted_errors++;
                   1241: 
                   1242:       if ((status != 0x7fffffff) &&              /* Not setup frame */
                   1243:          (status & (TD_LO | TD_NC | TD_EC | TD_LF))) {
                   1244:        lp->lostMedia++;
                   1245:        if (lp->lostMedia > LOST_MEDIA_THRESHOLD) { /* Trip autosense */
                   1246:          kick_tx(dev);
                   1247:        }
                   1248:       } else {
                   1249:        outl(POLL_DEMAND, DE4X5_TPD);            /* Restart a stalled TX */
                   1250:       }
                   1251:     } else {                                     /* Packet sent */
                   1252:       lp->stats.tx_packets++;
                   1253:       lp->lostMedia = 0;                         /* Remove transient problem */
                   1254:     }
                   1255:     /* Free the buffer if it's not a setup frame. */
                   1256:     if (lp->skb[entry] != NULL) {
                   1257:       dev_kfree_skb(lp->skb[entry], FREE_WRITE);
                   1258:       lp->skb[entry] = NULL;
                   1259:     }
                   1260: 
                   1261:     /* Update all the pointers */
                   1262:     lp->tx_old = (++lp->tx_old) % lp->txRingSize;
                   1263:   }
                   1264: 
                   1265:   return 0;
                   1266: }
                   1267: 
                   1268: static int
                   1269: de4x5_ast(struct device *dev)
                   1270: {
                   1271:   struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
                   1272:   u_long iobase = dev->base_addr;
                   1273:   s32 gep;
                   1274: 
                   1275:   disable_ast(dev);
                   1276: 
                   1277:   if (lp->chipset == DC21140) {
                   1278:     gep = inl(DE4X5_GEP);
                   1279:     if (((lp->media == _100Mb) &&  (gep & GEP_SLNK)) ||
                   1280:        ((lp->media == _10Mb)  &&  (gep & GEP_LNP))  ||
                   1281:        ((lp->media == _10Mb)  && !(gep & GEP_SLNK)) ||
                   1282:         (lp->media == NC)) {
                   1283:       if (lp->linkProb || ((lp->media == NC) && (!(gep & GEP_LNP)))) {
                   1284:        lp->lostMedia = LOST_MEDIA_THRESHOLD + 1;
                   1285:        lp->linkProb = 0;
                   1286:        kick_tx(dev);
                   1287:       } else {
                   1288:        switch(lp->media) {
                   1289:        case NC:
                   1290:          lp->linkProb = 0;
                   1291:          enable_ast(dev, DE4X5_AUTOSENSE_MS);
                   1292:          break;
                   1293: 
                   1294:        case _10Mb:
                   1295:          lp->linkProb = 1;                    /* Flag a potential problem */
                   1296:          enable_ast(dev, 1500);
                   1297:          break;
                   1298: 
                   1299:        case _100Mb:
                   1300:          lp->linkProb = 1;                    /* Flag a potential problem */
                   1301:          enable_ast(dev, 4000);
                   1302:          break;
                   1303:        }
                   1304:       }
                   1305:     } else {
                   1306:       lp->linkProb = 0;                        /* Link OK */
                   1307:       enable_ast(dev, DE4X5_AUTOSENSE_MS);
                   1308:     }
                   1309:   }
                   1310: 
                   1311:   return 0;
                   1312: }
                   1313: 
                   1314: static int
                   1315: de4x5_close(struct device *dev)
                   1316: {
                   1317:   struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
                   1318:   u_long iobase = dev->base_addr;
                   1319:   s32 imr, omr;
                   1320: 
                   1321:   dev->start = 0;
                   1322:   dev->tbusy = 1;
                   1323: 
                   1324:   if (de4x5_debug > 1) {
                   1325:     printk("%s: Shutting down ethercard, status was %8.8x.\n",
                   1326:           dev->name, inl(DE4X5_STS));
                   1327:   }
                   1328: 
                   1329:   /* 
                   1330:   ** We stop the DE4X5 here... mask interrupts and stop TX & RX
                   1331:   */
                   1332:   DISABLE_IRQs;
                   1333: 
                   1334:   STOP_DE4X5;
                   1335: 
                   1336:   /*
                   1337:   ** Free the associated irq
                   1338:   */
                   1339:   free_irq(dev->irq);
                   1340:   irq2dev_map[dev->irq] = 0;
                   1341: 
                   1342:   MOD_DEC_USE_COUNT;
                   1343: 
                   1344:   /* Put the adapter to sleep to save power */
                   1345:   if (lp->chipset == DC21041) {
                   1346:     outl(0, DE4X5_SICR);
                   1347:     outl(CFDA_PSM, PCI_CFDA);
                   1348:   }
                   1349: 
                   1350:   return 0;
                   1351: }
                   1352: 
                   1353: static struct enet_statistics *
                   1354: de4x5_get_stats(struct device *dev)
                   1355: {
                   1356:   struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
                   1357:   u_long iobase = dev->base_addr;
                   1358: 
                   1359:   lp->stats.rx_missed_errors = (int) (inl(DE4X5_MFC) & (MFC_OVFL | MFC_CNTR));
                   1360:     
                   1361:   return &lp->stats;
                   1362: }
                   1363: 
                   1364: static void load_packet(struct device *dev, char *buf, u32 flags, struct sk_buff *skb)
                   1365: {
                   1366:   struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
                   1367: 
                   1368:   lp->tx_ring[lp->tx_new].buf = virt_to_bus(buf);
                   1369:   lp->tx_ring[lp->tx_new].des1 &= TD_TER;
                   1370:   lp->tx_ring[lp->tx_new].des1 |= flags;
                   1371:   lp->skb[lp->tx_new] = skb;
                   1372:   barrier();
                   1373:   lp->tx_ring[lp->tx_new].status = T_OWN;
                   1374:   barrier();
                   1375: 
                   1376:   return;
                   1377: }
                   1378: /*
                   1379: ** Set or clear the multicast filter for this adaptor.
                   1380: ** num_addrs == -1     Promiscuous mode, receive all packets - now supported.
                   1381: **                      Can also use the ioctls.
                   1382: ** num_addrs == 0      Normal mode, clear multicast list
                   1383: ** num_addrs > 0       Multicast mode, receive normal and MC packets, and do
                   1384: **                     best-effort filtering.
                   1385: ** num_addrs == HASH_TABLE_LEN
                   1386: **                     Set all multicast bits (pass all multicasts).
                   1387: */
                   1388: static void
                   1389: set_multicast_list(struct device *dev)
                   1390: {
                   1391:   struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
                   1392:   u_long iobase = dev->base_addr;
                   1393: 
                   1394:   /* First, double check that the adapter is open */
                   1395:   if (irq2dev_map[dev->irq] != NULL) {
                   1396:     if (dev->flags & IFF_PROMISC) {         /* set promiscuous mode */
                   1397:       u32 omr;
                   1398:       omr = inl(DE4X5_OMR);
                   1399:       omr |= OMR_PR;
                   1400:       outl(omr, DE4X5_OMR);
                   1401:     } else { 
                   1402:       SetMulticastFilter(dev);
                   1403:       if (lp->setup_f == HASH_PERF) {
                   1404:        load_packet(dev, lp->setup_frame, TD_IC | HASH_F | TD_SET | 
                   1405:                                                        SETUP_FRAME_LEN, NULL);
                   1406:       } else {
                   1407:        load_packet(dev, lp->setup_frame, TD_IC | PERFECT_F | TD_SET | 
                   1408:                                                        SETUP_FRAME_LEN, NULL);
                   1409:       }
                   1410:       
                   1411:       lp->tx_new = (++lp->tx_new) % lp->txRingSize;
                   1412:       outl(POLL_DEMAND, DE4X5_TPD);                /* Start the TX */
                   1413:       dev->trans_start = jiffies;
                   1414:     }
                   1415:   }
                   1416: 
                   1417:   return;
                   1418: }
                   1419: 
                   1420: /*
                   1421: ** Calculate the hash code and update the logical address filter
                   1422: ** from a list of ethernet multicast addresses.
                   1423: ** Little endian crc one liner from Matt Thomas, DEC.
                   1424: */
                   1425: static void SetMulticastFilter(struct device *dev)
                   1426: {
                   1427:   struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
                   1428:   struct dev_mc_list *dmi=dev->mc_list;
                   1429:   u_long iobase = dev->base_addr;
                   1430:   int i, j, bit, byte;
                   1431:   u16 hashcode;
                   1432:   u32 omr, crc, poly = CRC_POLYNOMIAL_LE;
                   1433:   char *pa;
                   1434:   unsigned char *addrs;
                   1435: 
                   1436:   omr = inl(DE4X5_OMR);
                   1437:   omr &= ~OMR_PR;
                   1438:   pa = build_setup_frame(dev, ALL);          /* Build the basic frame */
                   1439: 
                   1440:   if ((dev->flags & IFF_ALLMULTI) || (dev->mc_count > 14)) {
                   1441:     omr |= OMR_PM;                           /* Pass all multicasts */
                   1442:   } else if (lp->setup_f == HASH_PERF) {
                   1443:                                              /* Now update the MCA table */
                   1444:     for (i=0;i<dev->mc_count;i++) {          /* for each address in the list */
                   1445:       addrs=dmi->dmi_addr;
                   1446:       dmi=dmi->next;
                   1447:       if ((*addrs & 0x01) == 1) {            /* multicast address? */ 
                   1448:        crc = 0xffffffff;                    /* init CRC for each address */
                   1449:        for (byte=0;byte<ETH_ALEN;byte++) {  /* for each address byte */
                   1450:                                             /* process each address bit */ 
                   1451:          for (bit = *addrs++,j=0;j<8;j++, bit>>=1) {
                   1452:            crc = (crc >> 1) ^ (((crc ^ bit) & 0x01) ? poly : 0);
                   1453:          }
                   1454:        }
                   1455:        hashcode = crc & HASH_BITS;          /* hashcode is 9 LSb of CRC */
                   1456:        
                   1457:        byte = hashcode >> 3;                /* bit[3-8] -> byte in filter */
                   1458:        bit = 1 << (hashcode & 0x07);        /* bit[0-2] -> bit in byte */
                   1459:        
                   1460:        byte <<= 1;                          /* calc offset into setup frame */
                   1461:        if (byte & 0x02) {
                   1462:          byte -= 1;
                   1463:        }
                   1464:        lp->setup_frame[byte] |= bit;
                   1465:       }
                   1466:     }
                   1467:   } else {                                   /* Perfect filtering */
                   1468:     for (j=0; j<dev->mc_count; j++) {
                   1469:       addrs=dmi->dmi_addr;
                   1470:       dmi=dmi->next;
                   1471:       for (i=0; i<ETH_ALEN; i++) { 
                   1472:        *(pa + (i&1)) = *addrs++;
                   1473:        if (i & 0x01) pa += 4;
                   1474:       }
                   1475:     }
                   1476:   }
                   1477:   outl(omr, DE4X5_OMR);
                   1478: 
                   1479:   return;
                   1480: }
                   1481: 
                   1482: /*
                   1483: ** EISA bus I/O device probe. Probe from slot 1 since slot 0 is usually
                   1484: ** the motherboard. Upto 15 EISA devices are supported.
                   1485: */
                   1486: static void eisa_probe(struct device *dev, u_long ioaddr)
                   1487: {
                   1488:   int i, maxSlots, status;
                   1489:   u_short vendor, device;
                   1490:   s32 cfid;
                   1491:   u_long iobase;
                   1492:   struct bus_type *lp = &bus;
                   1493:   char name[DE4X5_STRLEN];
                   1494: 
                   1495:   if (!ioaddr && autoprobed) return ;            /* Been here before ! */
                   1496:   if ((ioaddr < 0x1000) && (ioaddr > 0)) return; /* PCI MODULE special */
                   1497: 
                   1498:   lp->bus = EISA;
                   1499: 
                   1500:   if (ioaddr == 0) {                     /* Autoprobing */
                   1501:     iobase = EISA_SLOT_INC;              /* Get the first slot address */
                   1502:     i = 1;
                   1503:     maxSlots = MAX_EISA_SLOTS;
                   1504:   } else {                               /* Probe a specific location */
                   1505:     iobase = ioaddr;
                   1506:     i = (ioaddr >> 12);
                   1507:     maxSlots = i + 1;
                   1508:   }
                   1509: 
                   1510:   for (status = -ENODEV; (i<maxSlots) && (dev!=NULL); i++, iobase+=EISA_SLOT_INC) {
                   1511:     if (EISA_signature(name, EISA_ID)) {
                   1512:       cfid = inl(PCI_CFID);
                   1513:       device = (u_short)(cfid >> 16);
                   1514:       vendor = (u_short) cfid;
                   1515: 
                   1516:       lp->bus = EISA;
                   1517:       lp->chipset = device;
                   1518:       if (DevicePresent(EISA_APROM) == 0) { 
                   1519:        /* Write the PCI Configuration Registers */
                   1520:        outl(PCI_COMMAND_IO | PCI_COMMAND_MASTER, PCI_CFCS);
                   1521:        outl(0x00004000, PCI_CFLT);
                   1522:        outl(iobase, PCI_CBIO);
                   1523: 
                   1524:        if (check_region(iobase, DE4X5_EISA_TOTAL_SIZE) == 0) {
                   1525:          if ((dev = alloc_device(dev, iobase)) != NULL) {
                   1526:            if ((status = de4x5_hw_init(dev, iobase)) == 0) {
                   1527:              num_de4x5s++;
                   1528:            }
                   1529:            num_eth++;
                   1530:          }
                   1531:        } else if (autoprobed) {
                   1532:          printk("%s: region already allocated at 0x%04lx.\n", dev->name, iobase);
                   1533:        }
                   1534:       }
                   1535:     }
                   1536:   }
                   1537: 
                   1538:   return;
                   1539: }
                   1540: 
                   1541: /*
                   1542: ** PCI bus I/O device probe
                   1543: ** NB: PCI I/O accesses and Bus Mastering are enabled by the PCI BIOS, not
                   1544: ** the driver. Some PCI BIOS's, pre V2.1, need the slot + features to be
                   1545: ** enabled by the user first in the set up utility. Hence we just check for
                   1546: ** enabled features and silently ignore the card if they're not.
                   1547: **
                   1548: ** STOP PRESS: Some BIOS's __require__ the driver to enable the bus mastering
                   1549: ** bit. Here, check for I/O accesses and then set BM. If you put the card in
                   1550: ** a non BM slot, you're on your own (and complain to the PC vendor that your
                   1551: ** PC doesn't conform to the PCI standard)!
                   1552: */
                   1553: #define PCI_DEVICE    (dev_num << 3)
                   1554: #define PCI_LAST_DEV  32
                   1555: 
                   1556: static void pci_probe(struct device *dev, u_long ioaddr)
                   1557: {
                   1558:   u_char irq;
                   1559:   u_char pb, pbus, dev_num, dnum, dev_fn;
                   1560:   u_short vendor, device, index, status;
                   1561:   u_int class = DE4X5_CLASS_CODE;
                   1562:   u_int iobase;
                   1563:   struct bus_type *lp = &bus;
                   1564: 
                   1565:   if (!ioaddr && autoprobed) return ;        /* Been here before ! */
                   1566: 
                   1567:   if (pcibios_present()) {
                   1568:     lp->bus = PCI;
                   1569: 
                   1570:     if (ioaddr < 0x1000) {
                   1571:       pbus = (u_short)(ioaddr >> 8);
                   1572:       dnum = (u_short)(ioaddr & 0xff);
                   1573:     } else {
                   1574:       pbus = 0;
                   1575:       dnum = 0;
                   1576:     }
                   1577:     
                   1578:     for (index=0; 
                   1579:         (pcibios_find_class(class, index, &pb, &dev_fn)!= PCIBIOS_DEVICE_NOT_FOUND);
                   1580:         index++) {
                   1581:       dev_num = PCI_SLOT(dev_fn);
                   1582: 
                   1583:       if ((!pbus && !dnum) || ((pbus == pb) && (dnum == dev_num))) {
                   1584:        pcibios_read_config_word(pb, PCI_DEVICE, PCI_VENDOR_ID, &vendor);
                   1585:        pcibios_read_config_word(pb, PCI_DEVICE, PCI_DEVICE_ID, &device);
                   1586:        if (is_DC21040 || is_DC21041 || is_DC21140) {
                   1587:          /* Set the device number information */
                   1588:          lp->device = dev_num;
                   1589:          lp->bus_num = pb;
                   1590: 
                   1591:          /* Set the chipset information */
                   1592:          lp->chipset = device;
                   1593: 
                   1594:          /* Get the board I/O address */
                   1595:          pcibios_read_config_dword(pb, PCI_DEVICE, PCI_BASE_ADDRESS_0, &iobase);
                   1596:          iobase &= CBIO_MASK;
                   1597: 
                   1598:          /* Fetch the IRQ to be used */
                   1599:          pcibios_read_config_byte(pb, PCI_DEVICE, PCI_INTERRUPT_LINE, &irq);
                   1600: 
                   1601:          /* Check if I/O accesses and Bus Mastering are enabled */
                   1602:          pcibios_read_config_word(pb, PCI_DEVICE, PCI_COMMAND, &status);
                   1603:          if (status & PCI_COMMAND_IO) {
                   1604:            if (!(status & PCI_COMMAND_MASTER)) {
                   1605:              status |= PCI_COMMAND_MASTER;
                   1606:              pcibios_write_config_word(pb, PCI_DEVICE, PCI_COMMAND, status);
                   1607:              pcibios_read_config_word(pb, PCI_DEVICE, PCI_COMMAND, &status);
                   1608:            }
                   1609:            if (status & PCI_COMMAND_MASTER) {
                   1610:              if ((DevicePresent(DE4X5_APROM) == 0) || is_not_dec) {
                   1611:                if (check_region(iobase, DE4X5_PCI_TOTAL_SIZE) == 0) {
                   1612:                  if ((dev = alloc_device(dev, iobase)) != NULL) {
                   1613:                    dev->irq = irq;
                   1614:                    if ((status = de4x5_hw_init(dev, iobase)) == 0) {
                   1615:                      num_de4x5s++;
                   1616:                    }
                   1617:                    num_eth++;
                   1618:                  }
                   1619:                } else if (autoprobed) {
                   1620:                  printk("%s: region already allocated at 0x%04x.\n", dev->name, (u_short)iobase);
                   1621:                }
                   1622:              }
                   1623:            }
                   1624:          }
                   1625:        }
                   1626:       }
                   1627:     }
                   1628:   }
                   1629: 
                   1630:   return;
                   1631: }
                   1632: 
                   1633: /*
                   1634: ** Allocate the device by pointing to the next available space in the
                   1635: ** device structure. Should one not be available, it is created.
                   1636: */
                   1637: static struct device *alloc_device(struct device *dev, u_long iobase)
                   1638: {
                   1639:   int addAutoProbe = 0;
                   1640:   struct device *tmp = NULL, *ret;
                   1641:   int (*init)(struct device *) = NULL;
                   1642: 
                   1643:   /*
                   1644:   ** Check the device structures for an end of list or unused device
                   1645:   */
                   1646:   if (!loading_module) {
                   1647:     while (dev->next != NULL) {
                   1648:       if ((dev->base_addr == DE4X5_NDA) || (dev->base_addr == 0)) break;
                   1649:       dev = dev->next;                     /* walk through eth device list */
                   1650:       num_eth++;                           /* increment eth device number */
                   1651:     }
                   1652: 
                   1653:     /*
                   1654:     ** If an autoprobe is requested for another device, we must re-insert
                   1655:     ** the request later in the list. Remember the current position first.
                   1656:     */
                   1657:     if ((dev->base_addr == 0) && (num_de4x5s > 0)) {
                   1658:       addAutoProbe++;
                   1659:       tmp = dev->next;                     /* point to the next device */
                   1660:       init = dev->init;                    /* remember the probe function */
                   1661:     }
                   1662: 
                   1663:     /*
                   1664:     ** If at end of list and can't use current entry, malloc one up. 
                   1665:     ** If memory could not be allocated, print an error message.
                   1666:     */
                   1667:     if ((dev->next == NULL) &&  
                   1668:        !((dev->base_addr == DE4X5_NDA) || (dev->base_addr == 0))){
                   1669:       dev->next = (struct device *)kmalloc(sizeof(struct device) + 8,
                   1670:                                           GFP_KERNEL);
                   1671: 
                   1672:       dev = dev->next;                     /* point to the new device */
                   1673:       if (dev == NULL) {
                   1674:        printk("eth%d: Device not initialised, insufficient memory\n",
                   1675:               num_eth);
                   1676:       } else {
                   1677:        /*
                   1678:        ** If the memory was allocated, point to the new memory area
                   1679:        ** and initialize it (name, I/O address, next device (NULL) and
                   1680:        ** initialisation probe routine).
                   1681:        */
                   1682:        dev->name = (char *)(dev + sizeof(struct device));
                   1683:        if (num_eth > 9999) {
                   1684:          sprintf(dev->name,"eth????");    /* New device name */
                   1685:        } else {
                   1686:          sprintf(dev->name,"eth%d", num_eth);/* New device name */
                   1687:        }
                   1688:        dev->base_addr = iobase;           /* assign the io address */
                   1689:        dev->next = NULL;                  /* mark the end of list */
                   1690:        dev->init = &de4x5_probe;          /* initialisation routine */
                   1691:        num_de4x5s++;
                   1692:       }
                   1693:     }
                   1694:     ret = dev;                             /* return current struct, or NULL */
                   1695:   
                   1696:     /*
                   1697:     ** Now figure out what to do with the autoprobe that has to be inserted.
                   1698:     ** Firstly, search the (possibly altered) list for an empty space.
                   1699:     */
                   1700:     if (ret != NULL) {
                   1701:       if (addAutoProbe) {
                   1702:        for (; (tmp->next!=NULL) && (tmp->base_addr!=DE4X5_NDA); tmp=tmp->next);
                   1703: 
                   1704:        /*
                   1705:        ** If no more device structures and can't use the current one, malloc
                   1706:        ** one up. If memory could not be allocated, print an error message.
                   1707:        */
                   1708:        if ((tmp->next == NULL) && !(tmp->base_addr == DE4X5_NDA)) {
                   1709:          tmp->next = (struct device *)kmalloc(sizeof(struct device) + 8,
                   1710:                                               GFP_KERNEL);
                   1711:          tmp = tmp->next;                     /* point to the new device */
                   1712:          if (tmp == NULL) {
                   1713:            printk("%s: Insufficient memory to extend the device list.\n", 
                   1714:                   dev->name);
                   1715:          } else {
                   1716:            /*
                   1717:            ** If the memory was allocated, point to the new memory area
                   1718:            ** and initialize it (name, I/O address, next device (NULL) and
                   1719:            ** initialisation probe routine).
                   1720:            */
                   1721:            tmp->name = (char *)(tmp + sizeof(struct device));
                   1722:            if (num_eth > 9999) {
                   1723:              sprintf(tmp->name,"eth????");       /* New device name */
                   1724:            } else {
                   1725:              sprintf(tmp->name,"eth%d", num_eth);/* New device name */
                   1726:            }
                   1727:            tmp->base_addr = 0;                /* re-insert the io address */
                   1728:            tmp->next = NULL;                  /* mark the end of list */
                   1729:            tmp->init = init;                  /* initialisation routine */
                   1730:          }
                   1731:        } else {                               /* structure already exists */
                   1732:          tmp->base_addr = 0;                  /* re-insert the io address */
                   1733:        }
                   1734:       }
                   1735:     }
                   1736:   } else {
                   1737:     ret = dev;
                   1738:   }
                   1739: 
                   1740:   return ret;
                   1741: }
                   1742: 
                   1743: /*
                   1744: ** Auto configure the media here rather than setting the port at compile
                   1745: ** time. This routine is called by de4x5_init() when a loss of media is
                   1746: ** detected (excessive collisions, loss of carrier, no carrier or link fail
                   1747: ** [TP]) to check whether the user has been sneaky and changed the port on us.
                   1748: */
                   1749: static int autoconf_media(struct device *dev)
                   1750: {
                   1751:   struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
                   1752:   u_long iobase = dev->base_addr;
                   1753: 
                   1754:   lp->tx_enable = YES;
                   1755:   if (de4x5_debug > 0 ) {
                   1756:     if (lp->chipset != DC21140) {
                   1757:       printk("%s: Searching for media... ",dev->name);
                   1758:     } else {
                   1759:       printk("%s: Searching for mode... ",dev->name);
                   1760:     }
                   1761:   }
                   1762: 
                   1763:   if (lp->chipset == DC21040) {
                   1764:     lp->media = (lp->autosense == AUTO ? TP : lp->autosense);
                   1765:     dc21040_autoconf(dev);
                   1766:   } else if (lp->chipset == DC21041) {
                   1767:     lp->media = (lp->autosense == AUTO ? TP_NW : lp->autosense);
                   1768:     dc21041_autoconf(dev);
                   1769:   } else if (lp->chipset == DC21140) {
                   1770:     disable_ast(dev);
                   1771:     lp->media = (lp->autosense == AUTO ? _10Mb : lp->autosense);
                   1772:     dc21140_autoconf(dev);
                   1773:   }
                   1774: 
                   1775:   if (de4x5_debug > 0 ) {
                   1776:     if (lp->chipset != DC21140) {
                   1777:       printk("media is %s\n", (lp->media == NC  ? "unconnected!" :
                   1778:                              (lp->media == TP  ? "TP." :
                   1779:                              (lp->media == ANS ? "TP/Nway." :
                   1780:                              (lp->media == BNC ? "BNC." : 
                   1781:                              (lp->media == AUI ? "AUI." : 
                   1782:                                                  "BNC/AUI."
                   1783:                              ))))));
                   1784:     } else {
                   1785:       printk("mode is %s\n",(lp->media == NC      ? "link down.":
                   1786:                            (lp->media == _100Mb  ? "100Mb/s." :
                   1787:                            (lp->media == _10Mb   ? "10Mb/s." :
                   1788:                                                    "\?\?\?"
                   1789:                            ))));
                   1790:     }
                   1791:   }
                   1792: 
                   1793:   if (lp->media) {
                   1794:     lp->lostMedia = 0;
                   1795:     inl(DE4X5_MFC);                         /* Zero the lost frames counter */
                   1796:     if ((lp->media == TP) || (lp->media == ANS)) {
                   1797:       lp->irq_mask |= IMR_LFM;
                   1798:     }
                   1799:   }
                   1800:   dce_ms_delay(10);
                   1801: 
                   1802:   return (lp->media);
                   1803: }
                   1804: 
                   1805: static void dc21040_autoconf(struct device *dev)
                   1806: {
                   1807:   struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
                   1808:   u_long iobase = dev->base_addr;
                   1809:   int i, linkBad;
                   1810:   s32 sisr = 0, t_3s    = 3000;
                   1811: 
                   1812:   switch (lp->media) {
                   1813:   case TP:
                   1814:     reset_init_sia(dev, 0x8f01, 0xffff, 0x0000);
                   1815:     for (linkBad=1,i=0;(i<t_3s) && linkBad && !(sisr & SISR_NCR);i++) {
                   1816:       if (((sisr = inl(DE4X5_SISR)) & SISR_LKF) == 0) linkBad = 0;
                   1817:       dce_ms_delay(1);
                   1818:     }
                   1819:     if (linkBad && (lp->autosense == AUTO)) {
                   1820:       lp->media = BNC_AUI;
                   1821:       dc21040_autoconf(dev);
                   1822:     }
                   1823:     break;
                   1824: 
                   1825:   case BNC:
                   1826:   case AUI:
                   1827:   case BNC_AUI:
                   1828:     reset_init_sia(dev, 0x8f09, 0x0705, 0x0006);
                   1829:     dce_ms_delay(500);
                   1830:     linkBad = ping_media(dev);
                   1831:     if (linkBad && (lp->autosense == AUTO)) {
                   1832:       lp->media = EXT_SIA;
                   1833:       dc21040_autoconf(dev);
                   1834:     }
                   1835:     break;
                   1836: 
                   1837:   case EXT_SIA:
                   1838:     reset_init_sia(dev, 0x3041, 0x0000, 0x0006);
                   1839:     dce_ms_delay(500);
                   1840:     linkBad = ping_media(dev);
                   1841:     if (linkBad && (lp->autosense == AUTO)) {
                   1842:       lp->media = NC;
                   1843:       dc21040_autoconf(dev);
                   1844:     }
                   1845:     break;
                   1846: 
                   1847:   case NC:
                   1848: #ifndef __alpha__
                   1849:     reset_init_sia(dev, 0x8f01, 0xffff, 0x0000);
                   1850:     break;
                   1851: #else
                   1852:     /* JAE: for Alpha, default to BNC/AUI, *not* TP */
                   1853:     reset_init_sia(dev, 0x8f09, 0x0705, 0x0006);
                   1854: #endif  /* i386 */
                   1855:   }
                   1856: 
                   1857:   return;
                   1858: }
                   1859: 
                   1860: /*
                   1861: ** Autoconfigure the media when using the DC21041. AUI needs to be tested
                   1862: ** before BNC, because the BNC port will indicate activity if it's not
                   1863: ** terminated correctly. The only way to test for that is to place a loopback
                   1864: ** packet onto the network and watch for errors.
                   1865: */
                   1866: static void dc21041_autoconf(struct device *dev)
                   1867: {
                   1868:   struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
                   1869:   u_long iobase = dev->base_addr;
                   1870:   s32 sts, irqs, irq_mask, omr;
                   1871: 
                   1872:   switch (lp->media) {
                   1873:   case TP_NW:
                   1874:     omr = inl(DE4X5_OMR);        /* Set up full duplex for the autonegotiate */
                   1875:     outl(omr | OMR_FD, DE4X5_OMR);
                   1876:     irqs = STS_LNF | STS_LNP;
                   1877:     irq_mask = IMR_LFM | IMR_LPM;
                   1878:     sts = test_media(dev, irqs, irq_mask, 0xef01, 0xffff, 0x0008, 2400);
                   1879:     if (sts & STS_LNP) {
                   1880:       lp->media = ANS;
                   1881:     } else {
                   1882:       lp->media = AUI;
                   1883:     }
                   1884:     dc21041_autoconf(dev);
                   1885:     break;
                   1886: 
                   1887:   case ANS:
                   1888:     irqs = STS_LNP;
                   1889:     irq_mask = IMR_LPM;
                   1890:     sts = test_ans(dev, irqs, irq_mask, 3000);
                   1891:     if (!(sts & STS_LNP) && (lp->autosense == AUTO)) {
                   1892:       lp->media = TP;
                   1893:       dc21041_autoconf(dev);
                   1894:     }
                   1895:     break;
                   1896: 
                   1897:   case TP:
                   1898:     omr = inl(DE4X5_OMR);                      /* Set up half duplex for TP */
                   1899:     outl(omr & ~OMR_FD, DE4X5_OMR);
                   1900:     irqs = STS_LNF | STS_LNP;
                   1901:     irq_mask = IMR_LFM | IMR_LPM;
                   1902:     sts = test_media(dev, irqs, irq_mask, 0xef01, 0xff3f, 0x0008, 2400);
                   1903:     if (!(sts & STS_LNP) && (lp->autosense == AUTO)) {
                   1904:       if (inl(DE4X5_SISR) & SISR_NRA) {    /* Non selected port activity */
                   1905:        lp->media = AUI;
                   1906:       } else {
                   1907:        lp->media = BNC;
                   1908:       }
                   1909:       dc21041_autoconf(dev);
                   1910:     }
                   1911:     break;
                   1912: 
                   1913:   case AUI:
                   1914:     omr = inl(DE4X5_OMR);                      /* Set up half duplex for AUI */
                   1915:     outl(omr & ~OMR_FD, DE4X5_OMR);
                   1916:     irqs = 0;
                   1917:     irq_mask = 0;
                   1918:     sts = test_media(dev, irqs, irq_mask, 0xef09, 0xf7fd, 0x000e, 1000);
                   1919:     if (!(inl(DE4X5_SISR) & SISR_SRA) && (lp->autosense == AUTO)) {
                   1920:       lp->media = BNC;
                   1921:       dc21041_autoconf(dev);
                   1922:     }
                   1923:     break;
                   1924: 
                   1925:   case BNC:
                   1926:     omr = inl(DE4X5_OMR);                      /* Set up half duplex for BNC */
                   1927:     outl(omr & ~OMR_FD, DE4X5_OMR);
                   1928:     irqs = 0;
                   1929:     irq_mask = 0;
                   1930:     sts = test_media(dev, irqs, irq_mask, 0xef09, 0xf7fd, 0x0006, 1000);
                   1931:     if (!(inl(DE4X5_SISR) & SISR_SRA) && (lp->autosense == AUTO)) {
                   1932:       lp->media = NC;
                   1933:     } else {                                   /* Ensure media connected */
                   1934:       if (ping_media(dev)) lp->media = NC;
                   1935:     }
                   1936:     break;
                   1937: 
                   1938:   case NC:
                   1939:     omr = inl(DE4X5_OMR);        /* Set up full duplex for the autonegotiate */
                   1940:     outl(omr | OMR_FD, DE4X5_OMR);
                   1941:     reset_init_sia(dev, 0xef01, 0xffff, 0x0008);/* Initialise the SIA */
                   1942:     break;
                   1943:   }
                   1944: 
                   1945:   return;
                   1946: }
                   1947: 
                   1948: /*
                   1949: ** Reduced feature version (temporary I hope)
                   1950: */
                   1951: static void dc21140_autoconf(struct device *dev)
                   1952: {
                   1953:   struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
                   1954:   u_long iobase = dev->base_addr;
                   1955:   s32 omr;
                   1956: 
                   1957:   switch(lp->media) {
                   1958:   case _100Mb:      /* Set 100Mb/s, MII Port with PCS Function and Scrambler */
                   1959:     omr = (inl(DE4X5_OMR) & ~(OMR_PS | OMR_HBD | OMR_TTM | OMR_PCS | OMR_SCR));
                   1960:     omr |= (de4x5_full_duplex ? OMR_FD : 0);   /* Set up Full Duplex */
                   1961:     outl(omr | OMR_PS | OMR_HBD | OMR_PCS | OMR_SCR, DE4X5_OMR);
                   1962:     outl(GEP_FDXD | GEP_MODE, DE4X5_GEP);
                   1963:     break;
                   1964: 
                   1965:   case _10Mb:       /* Set conventional 10Mb/s ENDEC interface */
                   1966:     omr = (inl(DE4X5_OMR) & ~(OMR_PS | OMR_HBD | OMR_TTM | OMR_PCS | OMR_SCR));
                   1967:     omr |= (de4x5_full_duplex ? OMR_FD : 0);   /* Set up Full Duplex */
                   1968:     outl(omr | OMR_TTM, DE4X5_OMR);
                   1969:     outl(GEP_FDXD, DE4X5_GEP);
                   1970:     break;
                   1971:   }
                   1972: 
                   1973:   return;
                   1974: }
                   1975: 
                   1976: static int
                   1977: test_media(struct device *dev, s32 irqs, s32 irq_mask, s32 csr13, s32 csr14, s32 csr15, s32 msec)
                   1978: {
                   1979:   struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
                   1980:   u_long iobase = dev->base_addr;
                   1981:   s32 sts, time, csr12;
                   1982: 
                   1983:   reset_init_sia(dev, csr13, csr14, csr15);
                   1984: 
                   1985:   /* Set link_fail_inhibit_timer */
                   1986:   load_ms_timer(dev, msec);
                   1987: 
                   1988:   /* clear all pending interrupts */
                   1989:   sts = inl(DE4X5_STS);
                   1990:   outl(sts, DE4X5_STS);
                   1991: 
                   1992:   /* clear csr12 NRA and SRA bits */
                   1993:   csr12 = inl(DE4X5_SISR);
                   1994:   outl(csr12, DE4X5_SISR);
                   1995: 
                   1996:   /* Poll for timeout - timer interrupt doesn't work correctly */
                   1997:   do {
                   1998:     time = inl(DE4X5_GPT) & GPT_VAL;
                   1999:     sts = inl(DE4X5_STS);
                   2000:   } while ((time != 0) && !(sts & irqs));
                   2001: 
                   2002:   sts = inl(DE4X5_STS);
                   2003: 
                   2004:   return sts;
                   2005: }
                   2006: /*
                   2007: static int test_sym_link(struct device *dev, u32 msec)
                   2008: {
                   2009:   struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
                   2010:   u_long iobase = dev->base_addr;
                   2011:   u32 gep, time;
                   2012: 
                   2013:   / * Set link_fail_inhibit_timer * /
                   2014:   load_ms_timer(dev, msec);
                   2015: 
                   2016:   / * Poll for timeout or SYM_LINK=0 * /
                   2017:   do {
                   2018:     time = inl(DE4X5_GPT) & GPT_VAL;
                   2019:     gep = inl(DE4X5_GEP) & (GEP_SLNK | GEP_LNP);
                   2020:   } while ((time > 0) && (gep & GEP_SLNK));
                   2021: 
                   2022:   return gep;
                   2023: }
                   2024: */
                   2025: /*
                   2026: ** Send a packet onto the media and watch for send errors that indicate the
                   2027: ** media is bad or unconnected.
                   2028: */
                   2029: static int ping_media(struct device *dev)
                   2030: {
                   2031:   struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
                   2032:   u_long iobase = dev->base_addr;
                   2033:   int i, entry, linkBad;
                   2034:   s32 omr, t_3s = 4000;
                   2035:   char frame[64];
                   2036: 
                   2037:   create_packet(dev, frame, sizeof(frame));
                   2038: 
                   2039:   entry = lp->tx_new;                        /* Remember the ring position */
                   2040:   load_packet(dev, frame, TD_LS | TD_FS | sizeof(frame),NULL);
                   2041: 
                   2042:   omr = inl(DE4X5_OMR);
                   2043:   outl(omr|OMR_ST, DE4X5_OMR);
                   2044: 
                   2045:   lp->tx_new = (++lp->tx_new) % lp->txRingSize;
                   2046:   lp->tx_old = lp->tx_new;
                   2047: 
                   2048:   /* Poll for completion of frame (interrupts are disabled for now)... */
                   2049:   for (linkBad=1,i=0;(i<t_3s) && linkBad;i++) {
                   2050:     if ((inl(DE4X5_SISR) & SISR_NCR) == 1) break;
                   2051:     if (lp->tx_ring[entry].status >= 0) linkBad=0;
                   2052:     dce_ms_delay(1);
                   2053:   }
                   2054:   outl(omr, DE4X5_OMR); 
                   2055: 
                   2056:   return ((linkBad || (lp->tx_ring[entry].status & TD_ES)) ? 1 : 0);
                   2057: }
                   2058: 
                   2059: /*
                   2060: ** Check the Auto Negotiation State. Return OK when a link pass interrupt
                   2061: ** is received and the auto-negotiation status is NWAY OK.
                   2062: */
                   2063: static int test_ans(struct device *dev, s32 irqs, s32 irq_mask, s32 msec)
                   2064: {
                   2065:   struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
                   2066:   u_long iobase = dev->base_addr;
                   2067:   s32 sts, ans;
                   2068: 
                   2069:   outl(irq_mask, DE4X5_IMR);
                   2070: 
                   2071:   /* Set timeout limit */
                   2072:   load_ms_timer(dev, msec);
                   2073: 
                   2074:   /* clear all pending interrupts */
                   2075:   sts = inl(DE4X5_STS);
                   2076:   outl(sts, DE4X5_STS);
                   2077: 
                   2078:   /* Poll for interrupts */
                   2079:   do {
                   2080:     ans = inl(DE4X5_SISR) & SISR_ANS;
                   2081:     sts = inl(DE4X5_STS);
                   2082:   } while (!(sts & irqs) && (ans ^ ANS_NWOK) != 0);
                   2083: 
                   2084:   return ((sts & STS_LNP) && ((ans ^ ANS_NWOK) == 0) ? STS_LNP : 0);
                   2085: }
                   2086: 
                   2087: /*
                   2088: **
                   2089: */
                   2090: static void reset_init_sia(struct device *dev, s32 sicr, s32 strr, s32 sigr)
                   2091: {
                   2092:   struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
                   2093:   u_long iobase = dev->base_addr;
                   2094: 
                   2095:   RESET_SIA;
                   2096:   outl(sigr, DE4X5_SIGR);
                   2097:   outl(strr, DE4X5_STRR);
                   2098:   outl(sicr, DE4X5_SICR);
                   2099: 
                   2100:   return;
                   2101: }
                   2102: 
                   2103: /*
                   2104: ** Load the timer on the DC21041 and 21140. Max time is 13.42 secs.
                   2105: */
                   2106: static void load_ms_timer(struct device *dev, u32 msec)
                   2107: {
                   2108:   struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
                   2109:   u_long iobase = dev->base_addr;
                   2110:   s32 i = 2048, j;
                   2111: 
                   2112:   if (lp->chipset == DC21140) {
                   2113:     j = inl(DE4X5_OMR);
                   2114:     if ((j & OMR_TTM) && (j & OMR_PS)) {          /* 10Mb/s MII */
                   2115:       i = 8192;
                   2116:     } else if ((~j & OMR_TTM) && (j & OMR_PS)) {  /* 100Mb/s MII */
                   2117:       i = 819;
                   2118:     }
                   2119:   }
                   2120: 
                   2121:   outl((s32)(msec * 10000)/i, DE4X5_GPT);
                   2122: 
                   2123:   return;
                   2124: }
                   2125: 
                   2126: /*
                   2127: ** Create an Ethernet packet with an invalid CRC
                   2128: */
                   2129: static void create_packet(struct device *dev, char *frame, int len)
                   2130: {
                   2131:   int i;
                   2132:   char *buf = frame;
                   2133: 
                   2134:   for (i=0; i<ETH_ALEN; i++) {             /* Use this source address */
                   2135:     *buf++ = dev->dev_addr[i];
                   2136:   }
                   2137:   for (i=0; i<ETH_ALEN; i++) {             /* Use this destination address */
                   2138:     *buf++ = dev->dev_addr[i];
                   2139:   }
                   2140: 
                   2141:   *buf++ = 0;                              /* Packet length (2 bytes) */
                   2142:   *buf++ = 1;
                   2143:   
                   2144:   return;
                   2145: }
                   2146: 
                   2147: /*
                   2148: ** Known delay in microseconds
                   2149: */
                   2150: static void dce_us_delay(u32 usec)
                   2151: {
                   2152:   udelay(usec);
                   2153: 
                   2154:   return;
                   2155: }
                   2156: 
                   2157: /*
                   2158: ** Known delay in milliseconds, in millisecond steps.
                   2159: */
                   2160: static void dce_ms_delay(u32 msec)
                   2161: {
                   2162:   u_int i;
                   2163:   
                   2164:   for (i=0; i<msec; i++) {
                   2165:     dce_us_delay(1000);
                   2166:   }
                   2167: 
                   2168:   return;
                   2169: }
                   2170: 
                   2171: 
                   2172: /*
                   2173: ** Look for a particular board name in the EISA configuration space
                   2174: */
                   2175: static int EISA_signature(char *name, s32 eisa_id)
                   2176: {
                   2177:   u_int i;
                   2178:   const char *signatures[] = DE4X5_SIGNATURE;
                   2179:   char ManCode[DE4X5_STRLEN];
                   2180:   union {
                   2181:     s32 ID;
                   2182:     char Id[4];
                   2183:   } Eisa;
                   2184:   int status = 0;
                   2185: 
                   2186:   *name = '\0';
                   2187:   Eisa.ID = inl(eisa_id);
                   2188: 
                   2189:   ManCode[0]=(((Eisa.Id[0]>>2)&0x1f)+0x40);
                   2190:   ManCode[1]=(((Eisa.Id[1]&0xe0)>>5)+((Eisa.Id[0]&0x03)<<3)+0x40);
                   2191:   ManCode[2]=(((Eisa.Id[2]>>4)&0x0f)+0x30);
                   2192:   ManCode[3]=((Eisa.Id[2]&0x0f)+0x30);
                   2193:   ManCode[4]=(((Eisa.Id[3]>>4)&0x0f)+0x30);
                   2194:   ManCode[5]='\0';
                   2195: 
                   2196:   for (i=0;(*signatures[i] != '\0') && (*name == '\0');i++) {
                   2197:     if (strstr(ManCode, signatures[i]) != NULL) {
                   2198:       strcpy(name,ManCode);
                   2199:       status = 1;
                   2200:     }
                   2201:   }
                   2202: 
                   2203:   return status;                           /* return the device name string */
                   2204: }
                   2205: 
                   2206: /*
                   2207: ** Look for a special sequence in the Ethernet station address PROM that
                   2208: ** is common across all DIGITAL network adapter products.
                   2209: ** 
                   2210: ** Search the Ethernet address ROM for the signature. Since the ROM address
                   2211: ** counter can start at an arbitrary point, the search must include the entire
                   2212: ** probe sequence length plus the (length_of_the_signature - 1).
                   2213: ** Stop the search IMMEDIATELY after the signature is found so that the
                   2214: ** PROM address counter is correctly positioned at the start of the
                   2215: ** ethernet address for later read out.
                   2216: */
                   2217: 
                   2218: static int DevicePresent(u_long aprom_addr)
                   2219: {
                   2220:   union {
                   2221:     struct {
                   2222:       u32 a;
                   2223:       u32 b;
                   2224:     } llsig;
                   2225:     char Sig[sizeof(u32) << 1];
                   2226:   } dev;
                   2227:   char data;
                   2228:   int i, j, tmp, status = 0;
                   2229:   short sigLength;
                   2230:   struct bus_type *lp = &bus;
                   2231: 
                   2232:   dev.llsig.a = ETH_PROM_SIG;
                   2233:   dev.llsig.b = ETH_PROM_SIG;
                   2234:   sigLength = sizeof(u32) << 1;
                   2235: 
                   2236:   if (lp->chipset == DC21040) {
                   2237:     for (i=0,j=0;(j<sigLength) && (i<PROBE_LENGTH+sigLength-1);i++) {
                   2238:       if (lp->bus == PCI) {
                   2239:        while ((tmp = inl(aprom_addr)) < 0);
                   2240:        data = (char)tmp;
                   2241:       } else {
                   2242:        data = inb(aprom_addr);
                   2243:       }
                   2244:       if (dev.Sig[j] == data) {   /* track signature */
                   2245:        j++;
                   2246:       } else {                    /* lost signature; begin search again */
                   2247:        if (data == dev.Sig[0]) {
                   2248:          j=1;
                   2249:        } else {
                   2250:          j=0;
                   2251:        }
                   2252:       }
                   2253:     }
                   2254: 
                   2255:     if (j!=sigLength) {
                   2256:       status = -ENODEV;           /* search failed */
                   2257:     }
                   2258: 
                   2259:   } else {                        /* use new srom */
                   2260:     short *p = (short *)&lp->srom;
                   2261:     for (i=0; i<(sizeof(struct de4x5_srom)>>1); i++) {
                   2262:       *p++ = srom_rd(aprom_addr, i);
                   2263:     }
                   2264:   }
                   2265: 
                   2266:   return status;
                   2267: }
                   2268: 
                   2269: static int get_hw_addr(struct device *dev)
                   2270: {
                   2271:   u_long iobase = dev->base_addr;
                   2272:   int i, k, tmp, status = 0;
                   2273:   u_short j,chksum;
                   2274:   struct bus_type *lp = &bus;
                   2275: 
                   2276:   for (i=0,k=0,j=0;j<3;j++) {
                   2277:     k <<= 1 ;
                   2278:     if (k > 0xffff) k-=0xffff;
                   2279: 
                   2280:     if (lp->bus == PCI) {
                   2281:       if (lp->chipset == DC21040) {
                   2282:        while ((tmp = inl(DE4X5_APROM)) < 0);
                   2283:        k += (u_char) tmp;
                   2284:        dev->dev_addr[i++] = (u_char) tmp;
                   2285:        while ((tmp = inl(DE4X5_APROM)) < 0);
                   2286:        k += (u_short) (tmp << 8);
                   2287:        dev->dev_addr[i++] = (u_char) tmp;
                   2288:       } else {
                   2289:        dev->dev_addr[i] = (u_char) lp->srom.ieee_addr[i]; i++;
                   2290:        dev->dev_addr[i] = (u_char) lp->srom.ieee_addr[i]; i++;
                   2291:       }
                   2292:     } else {
                   2293:       k += (u_char) (tmp = inb(EISA_APROM));
                   2294:       dev->dev_addr[i++] = (u_char) tmp;
                   2295:       k += (u_short) ((tmp = inb(EISA_APROM)) << 8);
                   2296:       dev->dev_addr[i++] = (u_char) tmp;
                   2297:     }
                   2298: 
                   2299:     if (k > 0xffff) k-=0xffff;
                   2300:   }
                   2301:   if (k == 0xffff) k=0;
                   2302: 
                   2303:   if (lp->bus == PCI) {
                   2304:     if (lp->chipset == DC21040) {
                   2305:       while ((tmp = inl(DE4X5_APROM)) < 0);
                   2306:       chksum = (u_char) tmp;
                   2307:       while ((tmp = inl(DE4X5_APROM)) < 0);
                   2308:       chksum |= (u_short) (tmp << 8);
                   2309:       if (k != chksum) status = -1;
                   2310:     }
                   2311:   } else {
                   2312:     chksum = (u_char) inb(EISA_APROM);
                   2313:     chksum |= (u_short) (inb(EISA_APROM) << 8);
                   2314:     if (k != chksum) status = -1;
                   2315:   }
                   2316: 
                   2317: 
                   2318:   return status;
                   2319: }
                   2320: 
                   2321: /*
                   2322: ** SROM Read
                   2323: */
                   2324: static short srom_rd(u_long addr, u_char offset)
                   2325: {
                   2326:   sendto_srom(SROM_RD | SROM_SR, addr);
                   2327: 
                   2328:   srom_latch(SROM_RD | SROM_SR | DT_CS, addr);
                   2329:   srom_command(SROM_RD | SROM_SR | DT_IN | DT_CS, addr);
                   2330:   srom_address(SROM_RD | SROM_SR | DT_CS, addr, offset);
                   2331: 
                   2332:   return srom_data(SROM_RD | SROM_SR | DT_CS, addr);
                   2333: }
                   2334: 
                   2335: static void srom_latch(u_int command, u_long addr)
                   2336: {
                   2337:   sendto_srom(command, addr);
                   2338:   sendto_srom(command | DT_CLK, addr);
                   2339:   sendto_srom(command, addr);
                   2340: 
                   2341:   return;
                   2342: }
                   2343: 
                   2344: static void srom_command(u_int command, u_long addr)
                   2345: {
                   2346:   srom_latch(command, addr);
                   2347:   srom_latch(command, addr);
                   2348:   srom_latch((command & 0x0000ff00) | DT_CS, addr);
                   2349: 
                   2350:   return;
                   2351: }
                   2352: 
                   2353: static void srom_address(u_int command, u_long addr, u_char offset)
                   2354: {
                   2355:   int i;
                   2356:   char a;
                   2357: 
                   2358:   a = (char)(offset << 2);
                   2359:   for (i=0; i<6; i++, a <<= 1) {
                   2360:     srom_latch(command | ((a < 0) ? DT_IN : 0), addr);
                   2361:   }
                   2362:   dce_us_delay(1);
                   2363: 
                   2364:   i = (getfrom_srom(addr) >> 3) & 0x01;
                   2365:   if (i != 0) {
                   2366:     printk("Bad SROM address phase.....\n");
                   2367: /*    printk(".");*/
                   2368:   }
                   2369: 
                   2370:   return;
                   2371: }
                   2372: 
                   2373: static short srom_data(u_int command, u_long addr)
                   2374: {
                   2375:   int i;
                   2376:   short word = 0;
                   2377:   s32 tmp;
                   2378: 
                   2379:   for (i=0; i<16; i++) {
                   2380:     sendto_srom(command  | DT_CLK, addr);
                   2381:     tmp = getfrom_srom(addr);
                   2382:     sendto_srom(command, addr);
                   2383: 
                   2384:     word = (word << 1) | ((tmp >> 3) & 0x01);
                   2385:   }
                   2386: 
                   2387:   sendto_srom(command & 0x0000ff00, addr);
                   2388: 
                   2389:   return word;
                   2390: }
                   2391: 
                   2392: /*
                   2393: static void srom_busy(u_int command, u_long addr)
                   2394: {
                   2395:   sendto_srom((command & 0x0000ff00) | DT_CS, addr);
                   2396: 
                   2397:   while (!((getfrom_srom(addr) >> 3) & 0x01)) {
                   2398:     dce_ms_delay(1);
                   2399:   }
                   2400: 
                   2401:   sendto_srom(command & 0x0000ff00, addr);
                   2402: 
                   2403:   return;
                   2404: }
                   2405: */
                   2406: 
                   2407: static void sendto_srom(u_int command, u_long addr)
                   2408: {
                   2409:   outl(command, addr);
                   2410:   dce_us_delay(1);
                   2411: 
                   2412:   return;
                   2413: }
                   2414: 
                   2415: static int getfrom_srom(u_long addr)
                   2416: {
                   2417:   s32 tmp;
                   2418: 
                   2419:   tmp = inl(addr);
                   2420:   dce_us_delay(1);
                   2421: 
                   2422:   return tmp;
                   2423: }
                   2424: 
                   2425: static char *build_setup_frame(struct device *dev, int mode)
                   2426: {
                   2427:   struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
                   2428:   int i;
                   2429:   char *pa = lp->setup_frame;
                   2430: 
                   2431:   /* Initialise the setup frame */
                   2432:   if (mode == ALL) {
                   2433:     memset(lp->setup_frame, 0, SETUP_FRAME_LEN);
                   2434:   }
                   2435: 
                   2436:   if (lp->setup_f == HASH_PERF) {
                   2437:     for (pa=lp->setup_frame+IMPERF_PA_OFFSET, i=0; i<ETH_ALEN; i++) {
                   2438:       *(pa + i) = dev->dev_addr[i];                 /* Host address */
                   2439:       if (i & 0x01) pa += 2;
                   2440:     }
                   2441:     *(lp->setup_frame + (HASH_TABLE_LEN >> 3) - 3) = 0x80; /* B'cast address */
                   2442:   } else {
                   2443:     for (i=0; i<ETH_ALEN; i++) { /* Host address */
                   2444:       *(pa + (i&1)) = dev->dev_addr[i];
                   2445:       if (i & 0x01) pa += 4;
                   2446:     }
                   2447:     for (i=0; i<ETH_ALEN; i++) { /* Broadcast address */
                   2448:       *(pa + (i&1)) = (char) 0xff;
                   2449:       if (i & 0x01) pa += 4;
                   2450:     }
                   2451:   }
                   2452: 
                   2453:   return pa;                     /* Points to the next entry */
                   2454: }
                   2455: 
                   2456: static void enable_ast(struct device *dev, u32 time_out)
                   2457: {
                   2458:   struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
                   2459:   u_long iobase = dev->base_addr;
                   2460: 
                   2461:   lp->irq_mask |= IMR_TMM;
                   2462:   outl(lp->irq_mask, DE4X5_IMR);
                   2463:   load_ms_timer(dev, time_out);
                   2464: 
                   2465:   return;
                   2466: }
                   2467: 
                   2468: static void disable_ast(struct device *dev)
                   2469: {
                   2470:   struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
                   2471:   u_long iobase = dev->base_addr;
                   2472: 
                   2473:   lp->irq_mask &= ~IMR_TMM;
                   2474:   outl(lp->irq_mask, DE4X5_IMR);
                   2475:   load_ms_timer(dev, 0);
                   2476: 
                   2477:   return;
                   2478: }
                   2479: 
                   2480: static void kick_tx(struct device *dev)
                   2481: {
                   2482:   struct sk_buff *skb;
                   2483: 
                   2484:   if ((skb = alloc_skb(0, GFP_ATOMIC)) != NULL) {
                   2485:     skb->len= FAKE_FRAME_LEN;
                   2486:     skb->arp=1;
                   2487:     skb->dev=dev;
                   2488:     dev_queue_xmit(skb, dev, SOPRI_NORMAL);
                   2489:   }
                   2490: 
                   2491:   return;
                   2492: }
                   2493: 
                   2494: /*
                   2495: ** Perform IOCTL call functions here. Some are privileged operations and the
                   2496: ** effective uid is checked in those cases.
                   2497: */
                   2498: static int de4x5_ioctl(struct device *dev, struct ifreq *rq, int cmd)
                   2499: {
                   2500:   struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
                   2501:   struct de4x5_ioctl *ioc = (struct de4x5_ioctl *) &rq->ifr_data;
                   2502:   u_long iobase = dev->base_addr;
                   2503:   int i, j, status = 0;
                   2504:   s32 omr;
                   2505:   union {
                   2506:     u8  addr[(HASH_TABLE_LEN * ETH_ALEN)];
                   2507:     u16 sval[(HASH_TABLE_LEN * ETH_ALEN) >> 1];
                   2508:     u32 lval[(HASH_TABLE_LEN * ETH_ALEN) >> 2];
                   2509:   } tmp;
                   2510: 
                   2511:   switch(ioc->cmd) {
                   2512:   case DE4X5_GET_HWADDR:             /* Get the hardware address */
                   2513:     ioc->len = ETH_ALEN;
                   2514:     status = verify_area(VERIFY_WRITE, (void *)ioc->data, ioc->len);
                   2515:     if (status)
                   2516:       break;
                   2517:     for (i=0; i<ETH_ALEN; i++) {
                   2518:       tmp.addr[i] = dev->dev_addr[i];
                   2519:     }
                   2520:     memcpy_tofs(ioc->data, tmp.addr, ioc->len);
                   2521:     
                   2522:     break;
                   2523:   case DE4X5_SET_HWADDR:             /* Set the hardware address */
                   2524:     status = verify_area(VERIFY_READ, (void *)ioc->data, ETH_ALEN);
                   2525:     if (status)
                   2526:       break;
                   2527:     status = -EPERM;
                   2528:     if (!suser())
                   2529:       break;
                   2530:     status = 0;
                   2531:     memcpy_fromfs(tmp.addr, ioc->data, ETH_ALEN);
                   2532:     for (i=0; i<ETH_ALEN; i++) {
                   2533:       dev->dev_addr[i] = tmp.addr[i];
                   2534:     }
                   2535:     build_setup_frame(dev, PHYS_ADDR_ONLY);
                   2536:     /* Set up the descriptor and give ownership to the card */
                   2537:     while (set_bit(0, (void *)&dev->tbusy) != 0);/* Wait for lock to free*/
                   2538:     if (lp->setup_f == HASH_PERF) {
                   2539:       load_packet(dev, lp->setup_frame, TD_IC | HASH_F | TD_SET | 
                   2540:                                                SETUP_FRAME_LEN, NULL);
                   2541:     } else {
                   2542:       load_packet(dev, lp->setup_frame, TD_IC | PERFECT_F | TD_SET | 
                   2543:                                                SETUP_FRAME_LEN, NULL);
                   2544:     }
                   2545:     lp->tx_new = (++lp->tx_new) % lp->txRingSize;
                   2546:     outl(POLL_DEMAND, DE4X5_TPD);                /* Start the TX */
                   2547:     dev->tbusy = 0;                              /* Unlock the TX ring */
                   2548: 
                   2549:     break;
                   2550:   case DE4X5_SET_PROM:               /* Set Promiscuous Mode */
                   2551:     if (suser()) {
                   2552:       omr = inl(DE4X5_OMR);
                   2553:       omr |= OMR_PR;
                   2554:       outl(omr, DE4X5_OMR);
                   2555:     } else {
                   2556:       status = -EPERM;
                   2557:     }
                   2558: 
                   2559:     break;
                   2560:   case DE4X5_CLR_PROM:               /* Clear Promiscuous Mode */
                   2561:     if (suser()) {
                   2562:       omr = inl(DE4X5_OMR);
                   2563:       omr &= ~OMR_PR;
                   2564:       outb(omr, DE4X5_OMR);
                   2565:     } else {
                   2566:       status = -EPERM;
                   2567:     }
                   2568: 
                   2569:     break;
                   2570:   case DE4X5_SAY_BOO:                /* Say "Boo!" to the kernel log file */
                   2571:     printk("%s: Boo!\n", dev->name);
                   2572: 
                   2573:     break;
                   2574:   case DE4X5_GET_MCA:                /* Get the multicast address table */
                   2575:     ioc->len = (HASH_TABLE_LEN >> 3);
                   2576:     status = verify_area(VERIFY_WRITE, ioc->data, ioc->len);
                   2577:     if (status)
                   2578:       break;
                   2579:     memcpy_tofs(ioc->data, lp->setup_frame, ioc->len); 
                   2580: 
                   2581:     break;
                   2582:   case DE4X5_SET_MCA:                /* Set a multicast address */
                   2583:     if (suser()) {
                   2584:       if (ioc->len != HASH_TABLE_LEN) {         /* MCA changes */
                   2585:        if (!(status = verify_area(VERIFY_READ, (void *)ioc->data, ETH_ALEN * ioc->len))) {
                   2586:          memcpy_fromfs(tmp.addr, ioc->data, ETH_ALEN * ioc->len);
                   2587:          set_multicast_list(dev);
                   2588:        }
                   2589:       } else {
                   2590:        set_multicast_list(dev);
                   2591:       }
                   2592:     } else {
                   2593:       status = -EPERM;
                   2594:     }
                   2595: 
                   2596:     break;
                   2597:   case DE4X5_CLR_MCA:                /* Clear all multicast addresses */
                   2598:     if (suser()) {
                   2599:       set_multicast_list(dev);
                   2600:     } else {
                   2601:       status = -EPERM;
                   2602:     }
                   2603: 
                   2604:     break;
                   2605:   case DE4X5_MCA_EN:                 /* Enable pass all multicast addressing */
                   2606:     if (suser()) {
                   2607:       omr = inl(DE4X5_OMR);
                   2608:       omr |= OMR_PM;
                   2609:       outl(omr, DE4X5_OMR);
                   2610:     } else {
                   2611:       status = -EPERM;
                   2612:     }
                   2613: 
                   2614:     break;
                   2615:   case DE4X5_GET_STATS:              /* Get the driver statistics */
                   2616:     ioc->len = sizeof(lp->pktStats);
                   2617:     status = verify_area(VERIFY_WRITE, (void *)ioc->data, ioc->len);
                   2618:     if (status)
                   2619:       break;
                   2620: 
                   2621:     cli();
                   2622:     memcpy_tofs(ioc->data, &lp->pktStats, ioc->len); 
                   2623:     sti();
                   2624: 
                   2625:     break;
                   2626:   case DE4X5_CLR_STATS:              /* Zero out the driver statistics */
                   2627:     if (suser()) {
                   2628:       cli();
                   2629:       memset(&lp->pktStats, 0, sizeof(lp->pktStats));
                   2630:       sti();
                   2631:     } else {
                   2632:       status = -EPERM;
                   2633:     }
                   2634: 
                   2635:     break;
                   2636:   case DE4X5_GET_OMR:                /* Get the OMR Register contents */
                   2637:     tmp.addr[0] = inl(DE4X5_OMR);
                   2638:     if (!(status = verify_area(VERIFY_WRITE, (void *)ioc->data, 1))) {
                   2639:       memcpy_tofs(ioc->data, tmp.addr, 1);
                   2640:     }
                   2641: 
                   2642:     break;
                   2643:   case DE4X5_SET_OMR:                /* Set the OMR Register contents */
                   2644:     if (suser()) {
                   2645:       if (!(status = verify_area(VERIFY_READ, (void *)ioc->data, 1))) {
                   2646:        memcpy_fromfs(tmp.addr, ioc->data, 1);
                   2647:        outl(tmp.addr[0], DE4X5_OMR);
                   2648:       }
                   2649:     } else {
                   2650:       status = -EPERM;
                   2651:     }
                   2652: 
                   2653:     break;
                   2654:   case DE4X5_GET_REG:                /* Get the DE4X5 Registers */
                   2655:     j = 0;
                   2656:     tmp.lval[0] = inl(DE4X5_STS); j+=4;
                   2657:     tmp.lval[1] = inl(DE4X5_BMR); j+=4;
                   2658:     tmp.lval[2] = inl(DE4X5_IMR); j+=4;
                   2659:     tmp.lval[3] = inl(DE4X5_OMR); j+=4;
                   2660:     tmp.lval[4] = inl(DE4X5_SISR); j+=4;
                   2661:     tmp.lval[5] = inl(DE4X5_SICR); j+=4;
                   2662:     tmp.lval[6] = inl(DE4X5_STRR); j+=4;
                   2663:     tmp.lval[7] = inl(DE4X5_SIGR); j+=4;
                   2664:     ioc->len = j;
                   2665:     if (!(status = verify_area(VERIFY_WRITE, (void *)ioc->data, ioc->len))) {
                   2666:       memcpy_tofs(ioc->data, tmp.addr, ioc->len);
                   2667:     }
                   2668:     break;
                   2669: 
                   2670: #define DE4X5_DUMP              0x0f /* Dump the DE4X5 Status */
                   2671: 
                   2672:   case DE4X5_DUMP:
                   2673:     j = 0;
                   2674:     tmp.addr[j++] = dev->irq;
                   2675:     for (i=0; i<ETH_ALEN; i++) {
                   2676:       tmp.addr[j++] = dev->dev_addr[i];
                   2677:     }
                   2678:     tmp.addr[j++] = lp->rxRingSize;
                   2679:     tmp.lval[j>>2] = (long)lp->rx_ring; j+=4;
                   2680:     tmp.lval[j>>2] = (long)lp->tx_ring; j+=4;
                   2681: 
                   2682:     for (i=0;i<lp->rxRingSize-1;i++){
                   2683:       if (i < 3) {
                   2684:        tmp.lval[j>>2] = (long)&lp->rx_ring[i].status; j+=4;
                   2685:       }
                   2686:     }
                   2687:     tmp.lval[j>>2] = (long)&lp->rx_ring[i].status; j+=4;
                   2688:     for (i=0;i<lp->txRingSize-1;i++){
                   2689:       if (i < 3) {
                   2690:        tmp.lval[j>>2] = (long)&lp->tx_ring[i].status; j+=4;
                   2691:       }
                   2692:     }
                   2693:     tmp.lval[j>>2] = (long)&lp->tx_ring[i].status; j+=4;
                   2694:       
                   2695:     for (i=0;i<lp->rxRingSize-1;i++){
                   2696:       if (i < 3) {
                   2697:        tmp.lval[j>>2] = (s32)lp->rx_ring[i].buf; j+=4;
                   2698:       }
                   2699:     }
                   2700:     tmp.lval[j>>2] = (s32)lp->rx_ring[i].buf; j+=4;
                   2701:     for (i=0;i<lp->txRingSize-1;i++){
                   2702:       if (i < 3) {
                   2703:        tmp.lval[j>>2] = (s32)lp->tx_ring[i].buf; j+=4;
                   2704:       }
                   2705:     }
                   2706:     tmp.lval[j>>2] = (s32)lp->tx_ring[i].buf; j+=4;
                   2707:       
                   2708:     for (i=0;i<lp->rxRingSize;i++){
                   2709:       tmp.lval[j>>2] = lp->rx_ring[i].status; j+=4;
                   2710:     }
                   2711:     for (i=0;i<lp->txRingSize;i++){
                   2712:       tmp.lval[j>>2] = lp->tx_ring[i].status; j+=4;
                   2713:     }
                   2714: 
                   2715:     tmp.lval[j>>2] = inl(DE4X5_STS); j+=4;
                   2716:     tmp.lval[j>>2] = inl(DE4X5_BMR); j+=4;
                   2717:     tmp.lval[j>>2] = inl(DE4X5_IMR); j+=4;
                   2718:     tmp.lval[j>>2] = inl(DE4X5_OMR); j+=4;
                   2719:     tmp.lval[j>>2] = inl(DE4X5_SISR); j+=4;
                   2720:     tmp.lval[j>>2] = inl(DE4X5_SICR); j+=4;
                   2721:     tmp.lval[j>>2] = inl(DE4X5_STRR); j+=4;
                   2722:     tmp.lval[j>>2] = inl(DE4X5_SIGR); j+=4; 
                   2723:     
                   2724:     tmp.addr[j++] = lp->txRingSize;
                   2725:     tmp.addr[j++] = dev->tbusy;
                   2726:       
                   2727:     ioc->len = j;
                   2728:     if (!(status = verify_area(VERIFY_WRITE, (void *)ioc->data, ioc->len))) {
                   2729:       memcpy_tofs(ioc->data, tmp.addr, ioc->len);
                   2730:     }
                   2731: 
                   2732:     break;
                   2733:   default:
                   2734:     status = -EOPNOTSUPP;
                   2735:   }
                   2736: 
                   2737:   return status;
                   2738: }
                   2739: 
                   2740: #ifdef MODULE
                   2741: static char devicename[9] = { 0, };
                   2742: static struct device thisDE4X5 = {
                   2743:   devicename, /* device name is inserted by linux/drivers/net/net_init.c */
                   2744:   0, 0, 0, 0,
                   2745:   0x2000, 10, /* I/O address, IRQ */
                   2746:   0, 0, 0, NULL, de4x5_probe };
                   2747:        
                   2748: static int io=0x000b;  /* EDIT THESE LINES FOR YOUR CONFIGURATION */
                   2749: static int irq=10;     /* or use the insmod io= irq= options           */
                   2750: 
                   2751: int
                   2752: init_module(void)
                   2753: {
                   2754:   thisDE4X5.base_addr=io;
                   2755:   thisDE4X5.irq=irq;
                   2756:   if (register_netdev(&thisDE4X5) != 0)
                   2757:     return -EIO;
                   2758:   return 0;
                   2759: }
                   2760: 
                   2761: void
                   2762: cleanup_module(void)
                   2763: {
                   2764:   struct de4x5_private *lp = (struct de4x5_private *) thisDE4X5.priv;
                   2765: 
                   2766:   if (lp) {
                   2767:     kfree_s(bus_to_virt(lp->rx_ring[0].buf), RX_BUFF_SZ * NUM_RX_DESC + ALIGN);
                   2768:   }
                   2769:   kfree_s(thisDE4X5.priv, sizeof(struct de4x5_private) + ALIGN);
                   2770:   thisDE4X5.priv = NULL;
                   2771: 
                   2772:   release_region(thisDE4X5.base_addr, (lp->bus == PCI ? 
                   2773:                                                     DE4X5_PCI_TOTAL_SIZE :
                   2774:                                                     DE4X5_EISA_TOTAL_SIZE));
                   2775:   unregister_netdev(&thisDE4X5);
                   2776: }
                   2777: #endif /* MODULE */
                   2778: 
                   2779: 
                   2780: /*
                   2781:  * Local variables:
                   2782:  *  kernel-compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O2 -m486 -c de4x5.c"
                   2783:  *
                   2784:  *  module-compile-command: "gcc -D__KERNEL__ -DMODULE -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O2 -m486 -c de4x5.c"
                   2785:  * End:
                   2786:  */
                   2787: 
                   2788: 

unix.superglobalmegacorp.com

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