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

1.1     ! root        1: /* eepro.c: Intel EtherExpress Pro/10 device driver for Linux. */
        !             2: /*
        !             3:        Written 1994-1998 by Bao C. Ha.
        !             4: 
        !             5:        Copyright (C) 1994-1998 by Bao C. Ha.
        !             6: 
        !             7:        This software may be used and distributed
        !             8:        according to the terms of the GNU Public License,
        !             9:        incorporated herein by reference.
        !            10: 
        !            11:        The author may be reached at [email protected] 
        !            12:        or Hacom, 2477 Wrightsboro Rd., Augusta, GA 30904.
        !            13: 
        !            14:        Things remaining to do:
        !            15:        Better record keeping of errors.
        !            16:        Eliminate transmit interrupt to reduce overhead.
        !            17:        Implement "concurrent processing". I won't be doing it!
        !            18: 
        !            19:        Bugs:
        !            20: 
        !            21:        If you have a problem of not detecting the 82595 during a
        !            22:        reboot (warm reset), disable the FLASH memory should fix it.
        !            23:        This is a compatibility hardware problem.
        !            24: 
        !            25:        Versions:
        !            26: 
        !            27:        0.10c   Some cosmetic changes. (9/28/98, BCH)
        !            28: 
        !            29:         0.10b  Should work now with (some) Pro/10+. At least for 
        !            30:                me (and my two cards) it does. _No_ guarantee for 
        !            31:                function with non-Pro/10+ cards! (don't have any)
        !            32:                (RMC, 9/11/96)
        !            33: 
        !            34:        0.10    Added support for the Etherexpress Pro/10+.  The
        !            35:                IRQ map was changed significantly from the old
        !            36:                pro/10.  The new interrupt map was provided by
        !            37:                Rainer M. Canavan ([email protected]).
        !            38:                (BCH, 9/3/96)
        !            39: 
        !            40:        0.09    Fixed a race condition in the transmit algorithm,
        !            41:                which causes crashes under heavy load with fast
        !            42:                pentium computers.  The performance should also
        !            43:                improve a bit.  The size of RX buffer, and hence
        !            44:                TX buffer, can also be changed via lilo or insmod.
        !            45:                (BCH, 7/31/96)
        !            46: 
        !            47:        0.08    Implement 32-bit I/O for the 82595TX and 82595FX
        !            48:                based lan cards.  Disable full-duplex mode if TPE
        !            49:                is not used.  (BCH, 4/8/96)
        !            50: 
        !            51:        0.07a   Fix a stat report which counts every packet as a
        !            52:                heart-beat failure. (BCH, 6/3/95)
        !            53: 
        !            54:        0.07    Modified to support all other 82595-based lan cards.  
        !            55:                The IRQ vector of the EtherExpress Pro will be set
        !            56:                according to the value saved in the EEPROM.  For other
        !            57:                cards, I will do autoirq_request() to grab the next
        !            58:                available interrupt vector. (BCH, 3/17/95)
        !            59: 
        !            60:        0.06a,b Interim released.  Minor changes in the comments and
        !            61:                print out format. (BCH, 3/9/95 and 3/14/95)
        !            62: 
        !            63:        0.06    First stable release that I am comfortable with. (BCH,
        !            64:                3/2/95) 
        !            65: 
        !            66:        0.05    Complete testing of multicast. (BCH, 2/23/95)   
        !            67: 
        !            68:        0.04    Adding multicast support. (BCH, 2/14/95)        
        !            69: 
        !            70:        0.03    First widely alpha release for public testing. 
        !            71:                (BCH, 2/14/95)  
        !            72: 
        !            73: */
        !            74: 
        !            75: static const char *version =
        !            76:        "eepro.c: v0.10c 9/28/98 Bao C. Ha ([email protected])\n";
        !            77: 
        !            78: #include <linux/module.h>
        !            79: 
        !            80: /*
        !            81:   Sources:
        !            82: 
        !            83:        This driver wouldn't have been written without the availability 
        !            84:        of the Crynwr's Lan595 driver source code.  It helps me to 
        !            85:        familiarize with the 82595 chipset while waiting for the Intel 
        !            86:        documentation.  I also learned how to detect the 82595 using 
        !            87:        the packet driver's technique.
        !            88: 
        !            89:        This driver is written by cutting and pasting the skeleton.c driver
        !            90:        provided by Donald Becker.  I also borrowed the EEPROM routine from
        !            91:        Donald Becker's 82586 driver.
        !            92: 
        !            93:        Datasheet for the Intel 82595 (including the TX and FX version). It 
        !            94:        provides just enough info that the casual reader might think that it 
        !            95:        documents the i82595.
        !            96: 
        !            97:        The User Manual for the 82595.  It provides a lot of the missing
        !            98:        information.
        !            99: 
        !           100: */
        !           101: 
        !           102: #include <linux/kernel.h>
        !           103: #include <linux/sched.h>
        !           104: #include <linux/types.h>
        !           105: #include <linux/fcntl.h>
        !           106: #include <linux/interrupt.h>
        !           107: #include <linux/ptrace.h>
        !           108: #include <linux/ioport.h>
        !           109: #include <linux/in.h>
        !           110: #include <linux/malloc.h>
        !           111: #include <linux/string.h>
        !           112: #include <asm/system.h>
        !           113: #include <asm/bitops.h>
        !           114: #include <asm/io.h>
        !           115: #include <asm/dma.h>
        !           116: #include <linux/errno.h>
        !           117: 
        !           118: #include <linux/netdevice.h>
        !           119: #include <linux/etherdevice.h>
        !           120: #include <linux/skbuff.h>
        !           121: 
        !           122: /* First, a few definitions that the brave might change. */
        !           123: 
        !           124: /* A zero-terminated list of I/O addresses to be probed. */
        !           125: static unsigned int eepro_portlist[] =
        !           126:    { 0x300, 0x240, 0x280, 0x2C0, 0x200, 0x320, 0x340, 0x360, 0};
        !           127: 
        !           128: /* use 0 for production, 1 for verification, >2 for debug */
        !           129: 
        !           130: #ifndef NET_DEBUG
        !           131: #define NET_DEBUG 1
        !           132: #endif
        !           133: 
        !           134: static unsigned int net_debug = NET_DEBUG;
        !           135: 
        !           136: /* The number of low I/O ports used by the ethercard. */
        !           137: 
        !           138: #define EEPRO_IO_EXTENT        16
        !           139: 
        !           140: /* Different 82595 chips */
        !           141: 
        !           142: #define        LAN595          0
        !           143: #define        LAN595TX        1
        !           144: #define        LAN595FX        2
        !           145: 
        !           146: /* Information that need to be kept for each board. */
        !           147: struct eepro_local {
        !           148:        struct enet_statistics stats;
        !           149:        unsigned rx_start;
        !           150:        unsigned tx_start; /* start of the transmit chain */
        !           151:        int tx_last;  /* pointer to last packet in the transmit chain */
        !           152:        unsigned tx_end;   /* end of the transmit chain (plus 1) */
        !           153:        int eepro;      /* 1 for the EtherExpress Pro/10,
        !           154:                           2 for the EtherExpress Pro/10+,
        !           155:                           0 for other 82595-based lan cards. */
        !           156:        int version;    /* a flag to indicate if this is a TX or FX
        !           157:                                   version of the 82595 chip. */
        !           158:        int stepping;
        !           159: };
        !           160: 
        !           161: /* The station (ethernet) address prefix, used for IDing the board. */
        !           162: 
        !           163: #define SA_ADDR0 0x00  /* Etherexpress Pro/10 */
        !           164: #define SA_ADDR1 0xaa
        !           165: #define SA_ADDR2 0x00
        !           166: 
        !           167: #define SA2_ADDR0 0x00 /* Etherexpress Pro/10+ */
        !           168: #define SA2_ADDR1 0xa0
        !           169: #define SA2_ADDR2 0xc9
        !           170: 
        !           171: #define SA3_ADDR0 0x00 /* more Etherexpress Pro/10+ */
        !           172: #define SA3_ADDR1 0xaa
        !           173: #define SA3_ADDR2 0x00
        !           174: #define SA3_ADDR3 0xc9
        !           175: 
        !           176: /* Index to functions, as function prototypes. */
        !           177: 
        !           178: extern int eepro_probe(struct device *dev);    
        !           179: 
        !           180: static int     eepro_probe1(struct device *dev, short ioaddr);
        !           181: static int     eepro_open(struct device *dev);
        !           182: static int     eepro_send_packet(struct sk_buff *skb, struct device *dev);
        !           183: static void    eepro_interrupt(int irq, void *dev_id, struct pt_regs *regs);
        !           184: static void    eepro_rx(struct device *dev);
        !           185: static void    eepro_transmit_interrupt(struct device *dev);
        !           186: static int     eepro_close(struct device *dev);
        !           187: static struct enet_statistics *eepro_get_stats(struct device *dev);
        !           188: static void set_multicast_list(struct device *dev);
        !           189: 
        !           190: static int read_eeprom(int ioaddr, int location);
        !           191: static void hardware_send_packet(struct device *dev, void *buf, short length);
        !           192: static int     eepro_grab_irq(struct device *dev);
        !           193: 
        !           194: /*
        !           195:                        Details of the i82595.
        !           196: 
        !           197: You will need either the datasheet or the user manual to understand what
        !           198: is going on here.  The 82595 is very different from the 82586, 82593.
        !           199: 
        !           200: The receive algorithm in eepro_rx() is just an implementation of the
        !           201: RCV ring structure that the Intel 82595 imposes at the hardware level.
        !           202: The receive buffer is set at 24K, and the transmit buffer is 8K.  I
        !           203: am assuming that the total buffer memory is 32K, which is true for the
        !           204: Intel EtherExpress Pro/10.  If it is less than that on a generic card,
        !           205: the driver will be broken.
        !           206: 
        !           207: The transmit algorithm in the hardware_send_packet() is similar to the
        !           208: one in the eepro_rx().  The transmit buffer is a ring linked list.
        !           209: I just queue the next available packet to the end of the list.  In my
        !           210: system, the 82595 is so fast that the list seems to always contain a
        !           211: single packet.  In other systems with faster computers and more congested
        !           212: network traffics, the ring linked list should improve performance by
        !           213: allowing up to 8K worth of packets to be queued.
        !           214: 
        !           215: The sizes of the receive and transmit buffers can now be changed via lilo 
        !           216: or insmod.  Lilo uses the appended line "ether=io,irq,debug,rx-buffer,eth0"
        !           217: where rx-buffer is in KB unit.  Modules uses the parameter mem which is
        !           218: also in KB unit, for example "insmod io=io-address irq=0 mem=rx-buffer."  
        !           219: The receive buffer has to be more than 3K or less than 29K.  Otherwise,
        !           220: it is reset to the default of 24K, and, hence, 8K for the trasnmit
        !           221: buffer (transmit-buffer = 32K - receive-buffer).
        !           222: 
        !           223: */
        !           224: 
        !           225: #define        RAM_SIZE        0x8000
        !           226: #define        RCV_HEADER      8
        !           227: #define RCV_RAM         0x6000  /* 24KB default for RCV buffer */
        !           228: #define RCV_LOWER_LIMIT 0x00    /* 0x0000 */
        !           229: 
        !           230: /* #define RCV_UPPER_LIMIT ((RCV_RAM - 2) >> 8) */    /* 0x5ffe */
        !           231: #define RCV_UPPER_LIMIT (((rcv_ram) - 2) >> 8)   
        !           232: 
        !           233: /* #define XMT_RAM         (RAM_SIZE - RCV_RAM) */    /* 8KB for XMT buffer */
        !           234: #define XMT_RAM         (RAM_SIZE - (rcv_ram))    /* 8KB for XMT buffer */
        !           235: 
        !           236: /* #define XMT_LOWER_LIMIT (RCV_RAM >> 8) */  /* 0x6000 */
        !           237: #define XMT_LOWER_LIMIT ((rcv_ram) >> 8) 
        !           238: #define XMT_UPPER_LIMIT ((RAM_SIZE - 2) >> 8)   /* 0x7ffe */
        !           239: #define        XMT_HEADER      8
        !           240: 
        !           241: #define        RCV_DONE        0x0008
        !           242: #define        RX_OK           0x2000
        !           243: #define        RX_ERROR        0x0d81
        !           244: 
        !           245: #define        TX_DONE_BIT     0x0080
        !           246: #define        CHAIN_BIT       0x8000
        !           247: #define        XMT_STATUS      0x02
        !           248: #define        XMT_CHAIN       0x04
        !           249: #define        XMT_COUNT       0x06
        !           250: 
        !           251: #define        BANK0_SELECT    0x00            
        !           252: #define        BANK1_SELECT    0x40            
        !           253: #define        BANK2_SELECT    0x80            
        !           254: 
        !           255: /* Bank 0 registers */
        !           256: 
        !           257: #define        COMMAND_REG     0x00    /* Register 0 */
        !           258: #define        MC_SETUP        0x03
        !           259: #define        XMT_CMD         0x04
        !           260: #define        DIAGNOSE_CMD    0x07
        !           261: #define        RCV_ENABLE_CMD  0x08
        !           262: #define        RCV_DISABLE_CMD 0x0a
        !           263: #define        STOP_RCV_CMD    0x0b
        !           264: #define        RESET_CMD       0x0e
        !           265: #define        POWER_DOWN_CMD  0x18
        !           266: #define        RESUME_XMT_CMD  0x1c
        !           267: #define        SEL_RESET_CMD   0x1e
        !           268: #define        STATUS_REG      0x01    /* Register 1 */
        !           269: #define        RX_INT          0x02
        !           270: #define        TX_INT          0x04
        !           271: #define        EXEC_STATUS     0x30
        !           272: #define        ID_REG          0x02    /* Register 2   */
        !           273: #define        R_ROBIN_BITS    0xc0    /* round robin counter */
        !           274: #define        ID_REG_MASK     0x2c
        !           275: #define        ID_REG_SIG      0x24
        !           276: #define        AUTO_ENABLE     0x10
        !           277: #define        INT_MASK_REG    0x03    /* Register 3   */
        !           278: #define        RX_STOP_MASK    0x01
        !           279: #define        RX_MASK         0x02
        !           280: #define        TX_MASK         0x04
        !           281: #define        EXEC_MASK       0x08
        !           282: #define        ALL_MASK        0x0f
        !           283: #define        IO_32_BIT       0x10
        !           284: #define        RCV_BAR         0x04    /* The following are word (16-bit) registers */
        !           285: #define        RCV_STOP        0x06
        !           286: #define        XMT_BAR         0x0a
        !           287: #define        HOST_ADDRESS_REG        0x0c
        !           288: #define        IO_PORT         0x0e
        !           289: #define        IO_PORT_32_BIT  0x0c
        !           290: 
        !           291: /* Bank 1 registers */
        !           292: 
        !           293: #define        REG1    0x01
        !           294: #define        WORD_WIDTH      0x02
        !           295: #define        INT_ENABLE      0x80
        !           296: #define INT_NO_REG     0x02
        !           297: #define        RCV_LOWER_LIMIT_REG     0x08
        !           298: #define        RCV_UPPER_LIMIT_REG     0x09
        !           299: #define        XMT_LOWER_LIMIT_REG     0x0a
        !           300: #define        XMT_UPPER_LIMIT_REG     0x0b
        !           301: 
        !           302: /* Bank 2 registers */
        !           303: 
        !           304: #define        XMT_Chain_Int   0x20    /* Interrupt at the end of the transmit chain */
        !           305: #define        XMT_Chain_ErrStop       0x40 /* Interrupt at the end of the chain even if there are errors */
        !           306: #define        RCV_Discard_BadFrame    0x80 /* Throw bad frames away, and continue to receive others */
        !           307: #define        REG2            0x02
        !           308: #define        PRMSC_Mode      0x01
        !           309: #define        Multi_IA        0x20
        !           310: #define        REG3            0x03
        !           311: #define        TPE_BIT         0x04
        !           312: #define        BNC_BIT         0x20
        !           313: #define        REG13           0x0d
        !           314: #define        FDX             0x00
        !           315: #define        A_N_ENABLE      0x02
        !           316: 
        !           317: #define        I_ADD_REG0      0x04
        !           318: #define        I_ADD_REG1      0x05
        !           319: #define        I_ADD_REG2      0x06
        !           320: #define        I_ADD_REG3      0x07
        !           321: #define        I_ADD_REG4      0x08
        !           322: #define        I_ADD_REG5      0x09
        !           323: 
        !           324: #define EEPROM_REG 0x0a
        !           325: #define EESK 0x01
        !           326: #define EECS 0x02
        !           327: #define EEDI 0x04
        !           328: #define EEDO 0x08
        !           329: 
        !           330: /* Check for a network adaptor of this type, and return '0' if one exists.
        !           331: 
        !           332:    If dev->base_addr == 0, probe all likely locations.
        !           333:    If dev->base_addr == 1, always return failure.
        !           334:    If dev->base_addr == 2, allocate space for the device and return success
        !           335:    (detachable devices only).
        !           336: 
        !           337:    */
        !           338: 
        !           339: #ifdef HAVE_DEVLIST
        !           340: 
        !           341: /* Support for a alternate probe manager, which will eliminate the
        !           342:    boilerplate below. */
        !           343: 
        !           344: struct netdev_entry netcard_drv =
        !           345: {"eepro", eepro_probe1, EEPRO_IO_EXTENT, eepro_portlist};
        !           346: 
        !           347: #else
        !           348: 
        !           349: int 
        !           350: eepro_probe(struct device *dev)
        !           351: {
        !           352:        int i;
        !           353:        int base_addr = dev ? dev->base_addr : 0;
        !           354: 
        !           355:        if (base_addr > 0x1ff)          /* Check a single specified location. */
        !           356:                return eepro_probe1(dev, base_addr);
        !           357:        else if (base_addr != 0)        /* Don't probe at all. */
        !           358:                return ENXIO;
        !           359: 
        !           360:        for (i = 0; eepro_portlist[i]; i++) {
        !           361:                int ioaddr = eepro_portlist[i];
        !           362:                if (check_region(ioaddr, EEPRO_IO_EXTENT))
        !           363:                        continue;
        !           364: 
        !           365:                if (eepro_probe1(dev, ioaddr) == 0)
        !           366:                        return 0;
        !           367:        }
        !           368: 
        !           369:        return ENODEV;
        !           370: }
        !           371: #endif
        !           372: 
        !           373: /* This is the real probe routine.  Linux has a history of friendly device
        !           374:    probes on the ISA bus.  A good device probes avoids doing writes, and
        !           375:    verifies that the correct device exists and functions.  */
        !           376: 
        !           377: int 
        !           378: eepro_probe1(struct device *dev, short ioaddr)
        !           379: {
        !           380:        unsigned short station_addr[6], id, counter;
        !           381:        int i;
        !           382:        int eepro;
        !           383:        const char *ifmap[] = {"AUI", "10Base2", "10BaseT"};
        !           384:        enum iftype { AUI=0, BNC=1, TPE=2 };
        !           385: 
        !           386:        /* Now, we are going to check for the signature of the
        !           387:           ID_REG (register 2 of bank 0) */
        !           388:        if (((id=inb(ioaddr + ID_REG)) & ID_REG_MASK) == ID_REG_SIG) {
        !           389: 
        !           390:                /* We seem to have the 82595 signature, let's
        !           391:                   play with its counter (last 2 bits of
        !           392:                   register 2 of bank 0) to be sure. */
        !           393: 
        !           394:                counter = (id & R_ROBIN_BITS);  
        !           395:                if (((id=inb(ioaddr+ID_REG)) & R_ROBIN_BITS) == 
        !           396:                        (counter + 0x40)) {
        !           397: 
        !           398:                        /* Yes, the 82595 has been found */
        !           399: 
        !           400:                        /* Now, get the ethernet hardware address from
        !           401:                           the EEPROM */
        !           402: 
        !           403:                        station_addr[0] = read_eeprom(ioaddr, 2);
        !           404:                        station_addr[1] = read_eeprom(ioaddr, 3);
        !           405:                        station_addr[2] = read_eeprom(ioaddr, 4);
        !           406: 
        !           407:                        /* Check the station address for the manufacturer's code */
        !           408: 
        !           409:                        if ((station_addr[2] == 0x00aa) && (station_addr[1]!= 0x00c9)) {
        !           410:                                eepro = 1;
        !           411:                                printk("%s: Intel EtherExpress Pro/10 ISA at %#x,", 
        !           412:                                        dev->name, ioaddr);
        !           413:                        } else
        !           414:                        if ( (station_addr[2] == 0x00a0)
        !           415:                             || ((station_addr[2] == 0x00aa) && (station_addr[1] == 0x00c9) )) {
        !           416:                                eepro = 2;
        !           417:                                printk("%s: Intel EtherExpress Pro/10+ ISA\n at %#x,", 
        !           418:                                        dev->name, ioaddr);
        !           419:                        }
        !           420:                        else {
        !           421:                                eepro = 0;
        !           422:                                printk("%s: Intel 82595-based lan card at %#x,", 
        !           423:                                        dev->name, ioaddr);
        !           424:                        }
        !           425: 
        !           426:                        /* Fill in the 'dev' fields. */
        !           427:                        dev->base_addr = ioaddr;
        !           428: 
        !           429:                        for (i=0; i < 6; i++) {
        !           430:                                dev->dev_addr[i] = ((unsigned char *) station_addr)[5-i];
        !           431:                                printk("%c%02x", i ? ':' : ' ', dev->dev_addr[i]);
        !           432:                        }
        !           433: 
        !           434:                        if ((dev->mem_end & 0x3f) < 3 ||        /* RX buffer must be more than 3K */
        !           435:                                (dev->mem_end & 0x3f) > 29)     /* and less than 29K */
        !           436:                                dev->mem_end = RCV_RAM;         /* or it will be set to 24K */
        !           437:                        else dev->mem_end = 1024*dev->mem_end;  /* Maybe I should shift << 10 */
        !           438: 
        !           439:                        /* From now on, dev->mem_end contains the actual size of rx buffer */
        !           440: 
        !           441:                        if (net_debug > 3)
        !           442:                                printk(", %dK RCV buffer", (int)(dev->mem_end)/1024);
        !           443: 
        !           444:                        outb(BANK2_SELECT, ioaddr); /* be CAREFUL, BANK 2 now */
        !           445:                        id = inb(ioaddr + REG3);
        !           446:                        if (id & TPE_BIT)
        !           447:                                dev->if_port = TPE;
        !           448:                        else dev->if_port = BNC;
        !           449: 
        !           450:                        if (net_debug>3) 
        !           451:                                printk("id: %x\n", id);
        !           452: 
        !           453:                        if (dev->irq < 2 && eepro) {
        !           454:                                i = read_eeprom(ioaddr, 1);
        !           455:                                if (eepro == 1)
        !           456:                                   switch (i & 0x07) {
        !           457:                                        case 0: dev->irq = 9; break;
        !           458:                                        case 1: dev->irq = 3; break;
        !           459:                                        case 2: dev->irq = 5; break;
        !           460:                                        case 3: dev->irq = 10; break;
        !           461:                                        case 4: dev->irq = 11; break;
        !           462:                                        default: /* should never get here !!!!! */
        !           463:                                                printk(" illegal interrupt vector stored in EEPROM.\n");
        !           464:                                                return ENODEV;
        !           465:                                        }
        !           466:                                else switch (i & 0x07) {
        !           467:                                        case 0: dev->irq = 3; break;
        !           468:                                        case 1: dev->irq = 4; break;
        !           469:                                        case 2: dev->irq = 5; break;
        !           470:                                        case 3: dev->irq = 7; break;
        !           471:                                        case 4: dev->irq = 9; break;
        !           472:                                        case 5: dev->irq = 10; break;
        !           473:                                        case 6: dev->irq = 11; break;
        !           474:                                        case 7: dev->irq = 12; break;
        !           475:                                        }
        !           476:                                }
        !           477:                        else if (dev->irq == 2)
        !           478:                                dev->irq = 9;
        !           479: 
        !           480:                        if (dev->irq > 2) {
        !           481:                                printk(", IRQ %d, %s.\n", dev->irq,
        !           482:                                                ifmap[dev->if_port]);
        !           483:                                if (request_irq(dev->irq, &eepro_interrupt, 0, "eepro", NULL)) {
        !           484:                                        printk("%s: unable to get IRQ %d.\n", dev->name, dev->irq);
        !           485:                                        return -EAGAIN;
        !           486:                                }
        !           487:                        }
        !           488:                        else printk(", %s.\n", ifmap[dev->if_port]);
        !           489: 
        !           490:                        if ((dev->mem_start & 0xf) > 0) /* I don't know if this is */
        !           491:                                net_debug = dev->mem_start & 7; /* still useful or not */
        !           492: 
        !           493:                        if (net_debug > 3) {
        !           494:                                i = read_eeprom(ioaddr, 5);
        !           495:                                if (i & 0x2000) /* bit 13 of EEPROM word 5 */
        !           496:                                        printk("%s: Concurrent Processing is enabled but not used!\n",
        !           497:                                                dev->name);
        !           498:                        }
        !           499: 
        !           500:                        if (net_debug) 
        !           501:                                printk(version);
        !           502: 
        !           503:                        /* Grab the region so we can find another board if autoIRQ fails. */
        !           504:                        request_region(ioaddr, EEPRO_IO_EXTENT, "eepro");
        !           505: 
        !           506:                        /* Initialize the device structure */
        !           507:                        dev->priv = kmalloc(sizeof(struct eepro_local), GFP_KERNEL);
        !           508:                        if (dev->priv == NULL)
        !           509:                                return -ENOMEM;
        !           510:                        memset(dev->priv, 0, sizeof(struct eepro_local));
        !           511: 
        !           512:                        dev->open = eepro_open;
        !           513:                        dev->stop = eepro_close;
        !           514:                        dev->hard_start_xmit = eepro_send_packet;
        !           515:                        dev->get_stats = eepro_get_stats;
        !           516:                        dev->set_multicast_list = &set_multicast_list;
        !           517: 
        !           518:                        /* Fill in the fields of the device structure with
        !           519:                           ethernet generic values */
        !           520: 
        !           521:                        ether_setup(dev);
        !           522: 
        !           523:                        outb(RESET_CMD, ioaddr); /* RESET the 82595 */
        !           524: 
        !           525:                        return 0;
        !           526:                        }
        !           527:                else return ENODEV;
        !           528:                }
        !           529:        else if (net_debug > 3)
        !           530:                printk ("EtherExpress Pro probed failed!\n");
        !           531:        return ENODEV;
        !           532: }
        !           533: 
        !           534: /* Open/initialize the board.  This is called (in the current kernel)
        !           535:    sometime after booting when the 'ifconfig' program is run.
        !           536: 
        !           537:    This routine should set everything up anew at each open, even
        !           538:    registers that "should" only need to be set once at boot, so that
        !           539:    there is non-reboot way to recover if something goes wrong.
        !           540:    */
        !           541: 
        !           542: static char irqrmap[] = {-1,-1,0,1,-1,2,-1,-1,-1,0,3,4,-1,-1,-1,-1};
        !           543: static char irqrmap2[] = {-1,-1,4,0,1,2,-1,3,-1,4,5,6,7,-1,-1,-1};
        !           544: 
        !           545: static int     
        !           546: eepro_grab_irq(struct device *dev)
        !           547: {
        !           548:        int irqlist[] = { 3, 4, 5, 7, 9, 10, 11, 12 };  
        !           549:        int *irqp = irqlist, temp_reg, ioaddr = dev->base_addr;
        !           550: 
        !           551:        outb(BANK1_SELECT, ioaddr); /* be CAREFUL, BANK 1 now */
        !           552: 
        !           553:        /* Enable the interrupt line. */
        !           554:        temp_reg = inb(ioaddr + REG1);
        !           555:        outb(temp_reg | INT_ENABLE, ioaddr + REG1); 
        !           556: 
        !           557:        outb(BANK0_SELECT, ioaddr); /* be CAREFUL, BANK 0 now */
        !           558: 
        !           559:        /* clear all interrupts */
        !           560:        outb(ALL_MASK, ioaddr + STATUS_REG); 
        !           561: 
        !           562:        /* Let EXEC event to interrupt */
        !           563:        outb(ALL_MASK & ~(EXEC_MASK), ioaddr + INT_MASK_REG); 
        !           564: 
        !           565:        do {
        !           566:                outb(BANK1_SELECT, ioaddr); /* be CAREFUL, BANK 1 now */
        !           567:                temp_reg = inb(ioaddr + INT_NO_REG);
        !           568:                outb((temp_reg & 0xf8) | irqrmap[*irqp], ioaddr + INT_NO_REG); 
        !           569:                outb(BANK0_SELECT, ioaddr); /* Switch back to Bank 0 */
        !           570:                if (request_irq (*irqp, NULL, 0, "bogus", NULL) != EBUSY) {
        !           571:                        /* Twinkle the interrupt, and check if it's seen */
        !           572:                        autoirq_setup(0);
        !           573:                        outb(DIAGNOSE_CMD, ioaddr); /* RESET the 82595 */
        !           574:                                
        !           575:                        if (*irqp == autoirq_report(2) &&  /* It's a good IRQ line */
        !           576:                                (request_irq(dev->irq = *irqp, &eepro_interrupt, 0, "eepro", NULL) == 0)) 
        !           577:                                        break;
        !           578:                        /* clear all interrupts */
        !           579:                        outb(ALL_MASK, ioaddr + STATUS_REG); 
        !           580:                }
        !           581:        } while (*++irqp);
        !           582: 
        !           583:        outb(BANK1_SELECT, ioaddr); /* Switch back to Bank 1 */
        !           584: 
        !           585:        /* Disable the physical interrupt line. */
        !           586:        temp_reg = inb(ioaddr + REG1);
        !           587:        outb(temp_reg & 0x7f, ioaddr + REG1); 
        !           588:        outb(BANK0_SELECT, ioaddr); /* Switch back to Bank 0 */
        !           589: 
        !           590:        /* Mask all the interrupts. */
        !           591:        outb(ALL_MASK, ioaddr + INT_MASK_REG); 
        !           592: 
        !           593:        /* clear all interrupts */
        !           594:        outb(ALL_MASK, ioaddr + STATUS_REG); 
        !           595: 
        !           596:        return dev->irq;
        !           597: }
        !           598: 
        !           599: static int
        !           600: eepro_open(struct device *dev)
        !           601: {
        !           602:        unsigned short temp_reg, old8, old9;
        !           603:        int i, ioaddr = dev->base_addr, rcv_ram = dev->mem_end;
        !           604:        struct eepro_local *lp = (struct eepro_local *)dev->priv;
        !           605: 
        !           606:        if (net_debug > 3)
        !           607:                printk("eepro: entering eepro_open routine.\n");
        !           608: 
        !           609:        if ((dev->dev_addr[0] == SA_ADDR0 &&
        !           610:                        dev->dev_addr[1] == SA_ADDR1 &&
        !           611:                        dev->dev_addr[2] == SA_ADDR2)&&
        !           612:                        (dev->dev_addr[3] != SA3_ADDR3))
        !           613:                { 
        !           614:                        lp->eepro = 1;
        !           615:                        if (net_debug > 3) printk("p->eepro = 1;\n"); 
        !           616:                }  /* Yes, an Intel EtherExpress Pro/10 */
        !           617: 
        !           618:        else if ((dev->dev_addr[0] == SA2_ADDR0 &&
        !           619:                        dev->dev_addr[1] == SA2_ADDR1 &&
        !           620:                        dev->dev_addr[2] == SA2_ADDR2)||
        !           621:                (dev->dev_addr[0] == SA3_ADDR0 &&
        !           622:                        dev->dev_addr[1] == SA3_ADDR1 &&
        !           623:                        dev->dev_addr[2] == SA3_ADDR2 &&
        !           624:                        dev->dev_addr[3] == SA3_ADDR3))
        !           625:                {
        !           626:                        lp->eepro = 2; /* Yes, an Intel EtherExpress Pro/10+ */
        !           627:                        if (net_debug > 3) printk("p->eepro = 2;\n"); 
        !           628:                }
        !           629:        
        !           630:        else lp->eepro = 0; /* No, it is a generic 82585 lan card */
        !           631: 
        !           632:        /* Get the interrupt vector for the 82595 */    
        !           633:        if (dev->irq < 2 && eepro_grab_irq(dev) == 0) {
        !           634:                printk("%s: unable to get IRQ %d.\n", dev->name, dev->irq);
        !           635:                return -EAGAIN;
        !           636:        }
        !           637:                                
        !           638:        if (irq2dev_map[dev->irq] != 0
        !           639:                || (irq2dev_map[dev->irq] = dev) == 0)
        !           640:                return -EAGAIN;
        !           641: 
        !           642:        /* Initialize the 82595. */
        !           643:        outb(BANK2_SELECT, ioaddr); /* be CAREFUL, BANK 2 now */
        !           644:        temp_reg = inb(ioaddr + EEPROM_REG);
        !           645:        lp->stepping = temp_reg >> 5;   /* Get the stepping number of the 595 */
        !           646:        
        !           647:        if (net_debug > 3)
        !           648:                printk("The stepping of the 82595 is %d\n", lp->stepping);
        !           649:        if (temp_reg & 0x10) /* Check the TurnOff Enable bit */
        !           650:                outb(temp_reg & 0xef, ioaddr + EEPROM_REG);
        !           651:        for (i=0; i < 6; i++) 
        !           652:                outb(dev->dev_addr[i] , ioaddr + I_ADD_REG0 + i); 
        !           653:                        
        !           654:        temp_reg = inb(ioaddr + REG1);    /* Setup Transmit Chaining */
        !           655:        outb(temp_reg | XMT_Chain_Int | XMT_Chain_ErrStop /* and discard bad RCV frames */
        !           656:                | RCV_Discard_BadFrame, ioaddr + REG1);  
        !           657:        temp_reg = inb(ioaddr + REG2); /* Match broadcast */
        !           658:        outb(temp_reg | 0x14, ioaddr + REG2);
        !           659:        temp_reg = inb(ioaddr + REG3);
        !           660:        outb(temp_reg & 0x3f, ioaddr + REG3); /* clear test mode */
        !           661: 
        !           662:        /* Set the receiving mode */
        !           663:        outb(BANK1_SELECT, ioaddr); /* be CAREFUL, BANK 1 now */
        !           664: 
        !           665:        /* Set the interrupt vector */  
        !           666:        temp_reg = inb(ioaddr + INT_NO_REG);
        !           667:        
        !           668:        if (lp->eepro == 2)
        !           669:                outb((temp_reg & 0xf8) | irqrmap2[dev->irq], ioaddr + INT_NO_REG); 
        !           670:        else outb((temp_reg & 0xf8) | irqrmap[dev->irq], ioaddr + INT_NO_REG); 
        !           671:     
        !           672:        temp_reg = inb(ioaddr + INT_NO_REG);
        !           673:     
        !           674:        if (lp->eepro == 2)
        !           675:                        outb((temp_reg & 0xf0) | irqrmap2[dev->irq] | 0x08,ioaddr+INT_NO_REG);
        !           676:        else outb((temp_reg & 0xf8) | irqrmap[dev->irq], ioaddr + INT_NO_REG);
        !           677:     
        !           678:        if (net_debug > 3)
        !           679:                        printk("eepro_open: content of INT Reg is %x\n", temp_reg);
        !           680:        
        !           681:        
        !           682:        /* Initialize the RCV and XMT upper and lower limits */
        !           683:        outb(RCV_LOWER_LIMIT, ioaddr + RCV_LOWER_LIMIT_REG); 
        !           684:        outb(RCV_UPPER_LIMIT, ioaddr + RCV_UPPER_LIMIT_REG); 
        !           685:        outb(XMT_LOWER_LIMIT, ioaddr + XMT_LOWER_LIMIT_REG); 
        !           686:        outb(XMT_UPPER_LIMIT, ioaddr + XMT_UPPER_LIMIT_REG); 
        !           687: 
        !           688:        /* Enable the interrupt line. */
        !           689:        temp_reg = inb(ioaddr + REG1);
        !           690:        outb(temp_reg | INT_ENABLE, ioaddr + REG1); 
        !           691:        outb(BANK0_SELECT, ioaddr); /* Switch back to Bank 0 */
        !           692:        
        !           693:        /* Let RX and TX events to interrupt */
        !           694:        outb(ALL_MASK & ~(RX_MASK | TX_MASK), ioaddr + INT_MASK_REG); 
        !           695:        
        !           696:        /* clear all interrupts */
        !           697:        outb(ALL_MASK, ioaddr + STATUS_REG); 
        !           698:        
        !           699:        /* Initialize RCV */
        !           700:        outw(RCV_LOWER_LIMIT << 8, ioaddr + RCV_BAR); 
        !           701:        lp->rx_start = (RCV_LOWER_LIMIT << 8) ;
        !           702:        outw((RCV_UPPER_LIMIT << 8) | 0xfe, ioaddr + RCV_STOP); 
        !           703:        
        !           704:        /* Initialize XMT */
        !           705:        outw(XMT_LOWER_LIMIT << 8, ioaddr + XMT_BAR); 
        !           706:        
        !           707:        /* Check for the i82595TX and i82595FX */
        !           708:        old8 = inb(ioaddr + 8);
        !           709:        outb(~old8, ioaddr + 8);
        !           710:        
        !           711:        if ((temp_reg = inb(ioaddr + 8)) == old8) {
        !           712:                if (net_debug > 3)
        !           713:                        printk("i82595 detected!\n");
        !           714:                lp->version = LAN595;
        !           715:        }
        !           716:        else {
        !           717:                lp->version = LAN595TX;
        !           718:                outb(old8, ioaddr + 8);
        !           719:                old9 = inb(ioaddr + 9);
        !           720:                outb(~old9, ioaddr + 9);
        !           721:        
        !           722:                if (((temp_reg = inb(ioaddr + 9)) == ( (~old9)&0xff) )) {
        !           723:                        enum iftype { AUI=0, BNC=1, TPE=2 };
        !           724:        
        !           725:                        if (net_debug > 3) {
        !           726:                                printk("temp_reg: %#x  ~old9: %#x\n",temp_reg, ~old9);
        !           727:                                printk("i82595FX detected!\n");
        !           728:                        }
        !           729:        
        !           730:                        lp->version = LAN595FX;
        !           731:                        outb(old9, ioaddr + 9);
        !           732:        
        !           733:                        if (dev->if_port != TPE) {      /* Hopefully, this will fix the
        !           734:                                                        problem of using Pentiums and
        !           735:                                                        pro/10 w/ BNC. */
        !           736:                                outb(BANK2_SELECT, ioaddr); /* be CAREFUL, BANK 2 now */
        !           737:                                temp_reg = inb(ioaddr + REG13);
        !           738:        
        !           739:                                /* disable the full duplex mode since it is not
        !           740:                                applicable with the 10Base2 cable. */
        !           741:                                outb(temp_reg & ~(FDX | A_N_ENABLE), REG13);
        !           742:                                outb(BANK0_SELECT, ioaddr); /* be CAREFUL, BANK 0 now */
        !           743:                        }
        !           744:                }
        !           745:                else if (net_debug > 3) {
        !           746:                        printk("temp_reg: %#x  ~old9: %#x\n",temp_reg,((~old9)&0xff));
        !           747:                        printk("i82595TX detected!\n");
        !           748:                }
        !           749:        }
        !           750:        
        !           751:        outb(SEL_RESET_CMD, ioaddr);
        !           752:        
        !           753:        /* We are supposed to wait for 2 us after a SEL_RESET */
        !           754:        SLOW_DOWN_IO;
        !           755:        SLOW_DOWN_IO;   
        !           756:        
        !           757:        lp->tx_start = lp->tx_end = XMT_LOWER_LIMIT << 8; /* or = RCV_RAM */
        !           758:        lp->tx_last = 0;  
        !           759:        
        !           760:        dev->tbusy = 0;
        !           761:        dev->interrupt = 0;
        !           762:        dev->start = 1;
        !           763:        
        !           764:        if (net_debug > 3)
        !           765:                printk("eepro: exiting eepro_open routine.\n");
        !           766:        
        !           767:        outb(RCV_ENABLE_CMD, ioaddr);
        !           768:        MOD_INC_USE_COUNT;
        !           769:        
        !           770:        return 0;
        !           771: }
        !           772: 
        !           773: static int
        !           774: eepro_send_packet(struct sk_buff *skb, struct device *dev)
        !           775: {
        !           776:        struct eepro_local *lp = (struct eepro_local *)dev->priv;
        !           777:        int ioaddr = dev->base_addr;
        !           778:        int rcv_ram = dev->mem_end;
        !           779: 
        !           780:        if (net_debug > 5)
        !           781:                printk("eepro: entering eepro_send_packet routine.\n");
        !           782:        
        !           783:        if (dev->tbusy) {
        !           784:                /* If we get here, some higher level has decided we are broken.
        !           785:                   There should really be a "kick me" function call instead. */
        !           786:        
        !           787:                int tickssofar = jiffies - dev->trans_start;
        !           788:        
        !           789:                if (tickssofar < 40)
        !           790:                        return 1;
        !           791:        
        !           792:                if (net_debug > 1)
        !           793:                        printk("%s: transmit timed out, %s?\n", dev->name,
        !           794:                                   "network cable problem");
        !           795:        
        !           796:                lp->stats.tx_errors++;
        !           797:        
        !           798:                /* Try to restart the adaptor. */
        !           799:                outb(SEL_RESET_CMD, ioaddr); 
        !           800:        
        !           801:                /* We are supposed to wait for 2 us after a SEL_RESET */
        !           802:                SLOW_DOWN_IO;
        !           803:                SLOW_DOWN_IO;
        !           804:        
        !           805:                /* Do I also need to flush the transmit buffers here? YES? */
        !           806:                lp->tx_start = lp->tx_end = rcv_ram; 
        !           807:                lp->tx_last = 0;
        !           808:        
        !           809:                dev->tbusy=0;
        !           810:                dev->trans_start = jiffies;
        !           811:                outb(RCV_ENABLE_CMD, ioaddr);
        !           812:        }
        !           813:        
        !           814:        /* If some higher layer thinks we've missed an tx-done interrupt
        !           815:           we are passed NULL. Caution: dev_tint() handles the cli()/sti()
        !           816:           itself. */
        !           817:        
        !           818:        if (skb == NULL) {
        !           819:                dev_tint(dev);
        !           820:                return 0;
        !           821:        }
        !           822:        
        !           823:        /* Block a timer-based transmit from overlapping. */
        !           824:        
        !           825:        if (set_bit(0, (void*)&dev->tbusy) != 0)
        !           826:                printk("%s: Transmitter access conflict.\n", dev->name);
        !           827:        else {
        !           828:                short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
        !           829:                unsigned char *buf = skb->data;
        !           830:                hardware_send_packet(dev, buf, length);
        !           831:                dev->trans_start = jiffies;
        !           832:        }
        !           833:        
        !           834:        dev_kfree_skb (skb, FREE_WRITE);
        !           835:        
        !           836:        /* You might need to clean up and record Tx statistics here. */
        !           837:        /* lp->stats.tx_aborted_errors++; */
        !           838:        
        !           839:        if (net_debug > 5)
        !           840:                printk("eepro: exiting eepro_send_packet routine.\n");
        !           841:        
        !           842:        return 0;
        !           843: }
        !           844: 
        !           845: /*     The typical workload of the driver:
        !           846:        Handle the network interface interrupts. */
        !           847: 
        !           848: static void
        !           849: eepro_interrupt(int irq, void *dev_id, struct pt_regs * regs)
        !           850: {
        !           851:        struct device *dev = (struct device *)(irq2dev_map[irq]);
        !           852:        int ioaddr, status, boguscount = 20;
        !           853: 
        !           854:        if (net_debug > 5)
        !           855:                printk("eepro: entering eepro_interrupt routine.\n");
        !           856:        
        !           857:        if (dev == NULL) {
        !           858:                printk ("eepro_interrupt(): irq %d for unknown device.\n", irq);
        !           859:                return;
        !           860:        }
        !           861:        
        !           862:        dev->interrupt = 1;
        !           863:        
        !           864:        ioaddr = dev->base_addr;
        !           865:        
        !           866:        do { 
        !           867:                status = inb(ioaddr + STATUS_REG);
        !           868:                
        !           869:                if (status & RX_INT) {
        !           870:                        if (net_debug > 4)
        !           871:                                printk("eepro: packet received interrupt.\n");
        !           872:                        /* Acknowledge the RX_INT */
        !           873:                        outb(RX_INT, ioaddr + STATUS_REG); 
        !           874:                        /* Get the received packets */
        !           875:                        eepro_rx(dev);
        !           876:                }
        !           877:                else if (status & TX_INT) {
        !           878:                        if (net_debug > 4)
        !           879:                                printk("eepro: packet transmit interrupt.\n");
        !           880:                        /* Acknowledge the TX_INT */
        !           881:                        outb(TX_INT, ioaddr + STATUS_REG); 
        !           882:                        /* Process the status of transmitted packets */
        !           883:                        eepro_transmit_interrupt(dev);
        !           884:                }
        !           885:        
        !           886:        } while ((boguscount-- > 0) && (status & 0x06));
        !           887:        
        !           888:        dev->interrupt = 0;
        !           889:                
        !           890:        if (net_debug > 5)
        !           891:                printk("eepro: exiting eepro_interrupt routine.\n");
        !           892:        
        !           893:        return;
        !           894: }
        !           895: 
        !           896: static int
        !           897: eepro_close(struct device *dev)
        !           898: {
        !           899:        struct eepro_local *lp = (struct eepro_local *)dev->priv;
        !           900:        int ioaddr = dev->base_addr;
        !           901:        int rcv_ram = dev->mem_end;
        !           902:        short temp_reg;
        !           903: 
        !           904:        dev->tbusy = 1;
        !           905:        dev->start = 0;
        !           906:        
        !           907:        outb(BANK1_SELECT, ioaddr); /* Switch back to Bank 1 */
        !           908:        
        !           909:        /* Disable the physical interrupt line. */
        !           910:        temp_reg = inb(ioaddr + REG1);
        !           911:        outb(temp_reg & 0x7f, ioaddr + REG1); 
        !           912:        outb(BANK0_SELECT, ioaddr); /* Switch back to Bank 0 */
        !           913:        
        !           914:        /* Flush the Tx and disable Rx. */
        !           915:        outb(STOP_RCV_CMD, ioaddr); 
        !           916:        
        !           917:        lp->tx_start = lp->tx_end = rcv_ram ;
        !           918:        lp->tx_last = 0;  
        !           919:        
        !           920:        /* Mask all the interrupts. */
        !           921:        outb(ALL_MASK, ioaddr + INT_MASK_REG); 
        !           922:        
        !           923:        /* clear all interrupts */
        !           924:        outb(ALL_MASK, ioaddr + STATUS_REG); 
        !           925:        
        !           926:        /* Reset the 82595 */
        !           927:        outb(RESET_CMD, ioaddr); 
        !           928:        
        !           929:        /* release the interrupt */
        !           930:        free_irq(dev->irq, NULL);
        !           931:        irq2dev_map[dev->irq] = 0;
        !           932:        
        !           933:        /* Update the statistics here. What statistics? */
        !           934:        /* We are supposed to wait for 200 us after a RESET */
        !           935:        SLOW_DOWN_IO;
        !           936:        SLOW_DOWN_IO; /* May not be enough? */
        !           937:        MOD_DEC_USE_COUNT;
        !           938:        
        !           939:        return 0;
        !           940: }
        !           941: 
        !           942: /* Get the current statistics. This may be called with the card open or
        !           943:    closed. */
        !           944: static struct enet_statistics *
        !           945: eepro_get_stats(struct device *dev)
        !           946: {
        !           947:        struct eepro_local *lp = (struct eepro_local *)dev->priv;
        !           948:        return &lp->stats;
        !           949: }
        !           950: 
        !           951: /* Set or clear the multicast filter for this adaptor.
        !           952:  */
        !           953: 
        !           954: static void
        !           955: set_multicast_list(struct device *dev)
        !           956: {
        !           957:        struct eepro_local *lp = (struct eepro_local *)dev->priv;
        !           958:        short ioaddr = dev->base_addr;
        !           959:        unsigned short mode;
        !           960:        struct dev_mc_list *dmi=dev->mc_list;
        !           961:        
        !           962:        if (dev->flags&(IFF_ALLMULTI|IFF_PROMISC) || dev->mc_count > 63) 
        !           963:        {
        !           964:                /*
        !           965:                 *      We must make the kernel realise we had to move
        !           966:                 *      into promisc mode or we start all out war on
        !           967:                 *      the cable. If it was a promisc request the
        !           968:                 *      flag is already set. If not we assert it.
        !           969:                 */
        !           970:                dev->flags|=IFF_PROMISC;                
        !           971:                outb(BANK2_SELECT, ioaddr); /* be CAREFUL, BANK 2 now */
        !           972:                mode = inb(ioaddr + REG2);
        !           973:                outb(mode | PRMSC_Mode, ioaddr + REG2); 
        !           974:                mode = inb(ioaddr + REG3);
        !           975:                outb(mode, ioaddr + REG3); /* writing reg. 3 to complete the update */
        !           976:                outb(BANK0_SELECT, ioaddr); /* Return to BANK 0 now */
        !           977:                printk("%s: promiscuous mode enabled.\n", dev->name);
        !           978:        } 
        !           979:        
        !           980:        else if (dev->mc_count==0 ) 
        !           981:        {
        !           982:                outb(BANK2_SELECT, ioaddr); /* be CAREFUL, BANK 2 now */
        !           983:                mode = inb(ioaddr + REG2);
        !           984:                outb(mode & 0xd6, ioaddr + REG2); /* Turn off Multi-IA and PRMSC_Mode bits */
        !           985:                mode = inb(ioaddr + REG3);
        !           986:                outb(mode, ioaddr + REG3); /* writing reg. 3 to complete the update */
        !           987:                outb(BANK0_SELECT, ioaddr); /* Return to BANK 0 now */
        !           988:        }
        !           989:        
        !           990:        else 
        !           991:        {
        !           992:                unsigned short status, *eaddrs;
        !           993:                int i, boguscount = 0;
        !           994:                
        !           995:                /* Disable RX and TX interrupts.  Necessary to avoid
        !           996:                   corruption of the HOST_ADDRESS_REG by interrupt
        !           997:                   service routines. */
        !           998:                outb(ALL_MASK, ioaddr + INT_MASK_REG);
        !           999:                outb(BANK2_SELECT, ioaddr); /* be CAREFUL, BANK 2 now */
        !          1000:                mode = inb(ioaddr + REG2);
        !          1001:                outb(mode | Multi_IA, ioaddr + REG2);   
        !          1002:                mode = inb(ioaddr + REG3);
        !          1003:                outb(mode, ioaddr + REG3); /* writing reg. 3 to complete the update */
        !          1004:                outb(BANK0_SELECT, ioaddr); /* Return to BANK 0 now */
        !          1005:                outw(lp->tx_end, ioaddr + HOST_ADDRESS_REG);
        !          1006:                outw(MC_SETUP, ioaddr + IO_PORT);
        !          1007:                outw(0, ioaddr + IO_PORT);
        !          1008:                outw(0, ioaddr + IO_PORT);
        !          1009:                outw(6*(dev->mc_count + 1), ioaddr + IO_PORT);
        !          1010:        
        !          1011:                for (i = 0; i < dev->mc_count; i++) 
        !          1012:                {
        !          1013:                        eaddrs=(unsigned short *)dmi->dmi_addr;
        !          1014:                        dmi=dmi->next;
        !          1015:                        outw(*eaddrs++, ioaddr + IO_PORT);
        !          1016:                        outw(*eaddrs++, ioaddr + IO_PORT);
        !          1017:                        outw(*eaddrs++, ioaddr + IO_PORT);
        !          1018:                }
        !          1019:        
        !          1020:                eaddrs = (unsigned short *) dev->dev_addr;
        !          1021:                outw(eaddrs[0], ioaddr + IO_PORT);
        !          1022:                outw(eaddrs[1], ioaddr + IO_PORT);
        !          1023:                outw(eaddrs[2], ioaddr + IO_PORT);
        !          1024:                outw(lp->tx_end, ioaddr + XMT_BAR);
        !          1025:                outb(MC_SETUP, ioaddr);
        !          1026:        
        !          1027:                /* Update the transmit queue */
        !          1028:                i = lp->tx_end + XMT_HEADER + 6*(dev->mc_count + 1);
        !          1029:        
        !          1030:                if (lp->tx_start != lp->tx_end) 
        !          1031:                { 
        !          1032:                        /* update the next address and the chain bit in the 
        !          1033:                           last packet */
        !          1034:                        outw(lp->tx_last + XMT_CHAIN, ioaddr + HOST_ADDRESS_REG);
        !          1035:                        outw(i, ioaddr + IO_PORT);
        !          1036:                        outw(lp->tx_last + XMT_COUNT, ioaddr + HOST_ADDRESS_REG);
        !          1037:                        status = inw(ioaddr + IO_PORT);
        !          1038:                        outw(status | CHAIN_BIT, ioaddr + IO_PORT);
        !          1039:                        lp->tx_end = i ;
        !          1040:                }
        !          1041:                else {
        !          1042:                        lp->tx_start = lp->tx_end = i ;
        !          1043:                }
        !          1044:        
        !          1045:                /* Acknowledge that the MC setup is done */
        !          1046:                do { /* We should be doing this in the eepro_interrupt()! */
        !          1047:                        SLOW_DOWN_IO;
        !          1048:                        SLOW_DOWN_IO;
        !          1049:        
        !          1050:                        if (inb(ioaddr + STATUS_REG) & 0x08) 
        !          1051:                        {
        !          1052:                                i = inb(ioaddr);
        !          1053:                                outb(0x08, ioaddr + STATUS_REG);
        !          1054:        
        !          1055:                                if (i & 0x20) { /* command ABORTed */
        !          1056:                                        printk("%s: multicast setup failed.\n", 
        !          1057:                                                dev->name);
        !          1058:                                        break;
        !          1059:                                } else if ((i & 0x0f) == 0x03)  { /* MC-Done */
        !          1060:                                        printk("%s: set Rx mode to %d addresses.\n", 
        !          1061:                                                dev->name, dev->mc_count);
        !          1062:                                        break;
        !          1063:                                }
        !          1064:                        }
        !          1065:                } while (++boguscount < 100);
        !          1066:        
        !          1067:                /* Re-enable RX and TX interrupts */
        !          1068:                outb(ALL_MASK & ~(RX_MASK | TX_MASK), ioaddr + INT_MASK_REG); 
        !          1069:        
        !          1070:        }
        !          1071:        outb(RCV_ENABLE_CMD, ioaddr);
        !          1072: }
        !          1073: 
        !          1074: /* The horrible routine to read a word from the serial EEPROM. */
        !          1075: /* IMPORTANT - the 82595 will be set to Bank 0 after the eeprom is read */
        !          1076: /* The delay between EEPROM clock transitions. */
        !          1077: 
        !          1078: #define eeprom_delay() { int _i = 40; while (--_i > 0) { __SLOW_DOWN_IO; }}
        !          1079: #define EE_READ_CMD (6 << 6)
        !          1080: 
        !          1081: int
        !          1082: read_eeprom(int ioaddr, int location)
        !          1083: {
        !          1084:        int i;
        !          1085:        unsigned short retval = 0;
        !          1086:        short ee_addr = ioaddr + EEPROM_REG;
        !          1087:        int read_cmd = location | EE_READ_CMD;
        !          1088:        short ctrl_val = EECS ;
        !          1089:        
        !          1090:        outb(BANK2_SELECT, ioaddr);
        !          1091:        outb(ctrl_val, ee_addr);
        !          1092:        
        !          1093:        /* Shift the read command bits out. */
        !          1094:        for (i = 8; i >= 0; i--) {
        !          1095:                short outval = (read_cmd & (1 << i)) ? ctrl_val | EEDI
        !          1096:                        : ctrl_val;
        !          1097:                outb(outval, ee_addr);
        !          1098:                outb(outval | EESK, ee_addr);   /* EEPROM clock tick. */
        !          1099:                eeprom_delay();
        !          1100:                outb(outval, ee_addr);  /* Finish EEPROM a clock tick. */
        !          1101:                eeprom_delay();
        !          1102:        }
        !          1103:        outb(ctrl_val, ee_addr);
        !          1104:        
        !          1105:        for (i = 16; i > 0; i--) {
        !          1106:                outb(ctrl_val | EESK, ee_addr);  eeprom_delay();
        !          1107:                retval = (retval << 1) | ((inb(ee_addr) & EEDO) ? 1 : 0);
        !          1108:                outb(ctrl_val, ee_addr);  eeprom_delay();
        !          1109:        }
        !          1110:        /* Terminate the EEPROM access. */
        !          1111:        ctrl_val &= ~EECS;
        !          1112:        outb(ctrl_val | EESK, ee_addr);
        !          1113:        eeprom_delay();
        !          1114:        outb(ctrl_val, ee_addr);
        !          1115:        eeprom_delay();
        !          1116:        outb(BANK0_SELECT, ioaddr);
        !          1117:        return retval;
        !          1118: }
        !          1119: 
        !          1120: static void
        !          1121: hardware_send_packet(struct device *dev, void *buf, short length)
        !          1122: {
        !          1123:        struct eepro_local *lp = (struct eepro_local *)dev->priv;
        !          1124:        short ioaddr = dev->base_addr;
        !          1125:        int rcv_ram = dev->mem_end;
        !          1126:        unsigned status, tx_available, last, end, boguscount = 100;
        !          1127: 
        !          1128:        if (net_debug > 5)
        !          1129:                printk("eepro: entering hardware_send_packet routine.\n");
        !          1130:        
        !          1131:        while (boguscount-- > 0) {
        !          1132:        
        !          1133:                /* Disable RX and TX interrupts.  Necessary to avoid
        !          1134:                corruption of the HOST_ADDRESS_REG by interrupt
        !          1135:                service routines. */
        !          1136:                outb(ALL_MASK, ioaddr + INT_MASK_REG);
        !          1137:        
        !          1138:                if (dev->interrupt == 1) {  
        !          1139:                        /* Enable RX and TX interrupts */
        !          1140:                        outb(ALL_MASK & ~(RX_MASK | TX_MASK), ioaddr + INT_MASK_REG); 
        !          1141:                        continue;
        !          1142:                }
        !          1143:        
        !          1144:                /* determine how much of the transmit buffer space is available */
        !          1145:                if (lp->tx_end > lp->tx_start)
        !          1146:                        tx_available = XMT_RAM - (lp->tx_end - lp->tx_start);
        !          1147:                else if (lp->tx_end < lp->tx_start)
        !          1148:                        tx_available = lp->tx_start - lp->tx_end;
        !          1149:                else tx_available = XMT_RAM;
        !          1150:        
        !          1151:                if (((((length + 3) >> 1) << 1) + 2*XMT_HEADER) 
        !          1152:                        >= tx_available)   /* No space available ??? */
        !          1153:                        {
        !          1154:                        eepro_transmit_interrupt(dev); /* Clean up the transmiting queue */
        !          1155:                        /* Enable RX and TX interrupts */
        !          1156:                        outb(ALL_MASK & ~(RX_MASK | TX_MASK), ioaddr + INT_MASK_REG); 
        !          1157:                        continue;
        !          1158:                }
        !          1159:        
        !          1160:                last = lp->tx_end;
        !          1161:                end = last + (((length + 3) >> 1) << 1) + XMT_HEADER;
        !          1162:                if (end >= RAM_SIZE) { /* the transmit buffer is wrapped around */
        !          1163:        
        !          1164:                        if ((RAM_SIZE - last) <= XMT_HEADER) {  
        !          1165:                        /* Arrrr!!!, must keep the xmt header together,
        !          1166:                          several days were lost to chase this one down. */
        !          1167:                                last = rcv_ram;
        !          1168:                                end = last + (((length + 3) >> 1) << 1) + XMT_HEADER;
        !          1169:                        }       
        !          1170: 
        !          1171:                        else end = rcv_ram + (end - RAM_SIZE);
        !          1172:                }
        !          1173: 
        !          1174:                outw(last, ioaddr + HOST_ADDRESS_REG);
        !          1175:                outw(XMT_CMD, ioaddr + IO_PORT);
        !          1176:                outw(0, ioaddr + IO_PORT);
        !          1177:                outw(end, ioaddr + IO_PORT);
        !          1178:                outw(length, ioaddr + IO_PORT);
        !          1179:        
        !          1180:                if (lp->version == LAN595)
        !          1181:                        outsw(ioaddr + IO_PORT, buf, (length + 3) >> 1);
        !          1182:        
        !          1183:                else {  /* LAN595TX or LAN595FX, capable of 32-bit I/O processing */
        !          1184:                        unsigned short temp = inb(ioaddr + INT_MASK_REG);
        !          1185:                        outb(temp | IO_32_BIT, ioaddr + INT_MASK_REG);
        !          1186:                        outsl(ioaddr + IO_PORT_32_BIT, buf, (length + 3) >> 2);
        !          1187:                        outb(temp & ~(IO_32_BIT), ioaddr + INT_MASK_REG);
        !          1188:                }
        !          1189:        
        !          1190:                /* A dummy read to flush the DRAM write pipeline */
        !          1191:                status = inw(ioaddr + IO_PORT); 
        !          1192:        
        !          1193:                if (lp->tx_start == lp->tx_end) {       
        !          1194:                        outw(last, ioaddr + XMT_BAR);
        !          1195:                        outb(XMT_CMD, ioaddr);
        !          1196:                        lp->tx_start = last;   /* I don't like to change tx_start here */
        !          1197:                }
        !          1198:                else {
        !          1199:                        /* update the next address and the chain bit in the 
        !          1200:                        last packet */
        !          1201: 
        !          1202:                        if (lp->tx_end != last) {
        !          1203:                                outw(lp->tx_last + XMT_CHAIN, ioaddr + HOST_ADDRESS_REG);
        !          1204:                                outw(last, ioaddr + IO_PORT);
        !          1205:                        }
        !          1206:        
        !          1207:                        outw(lp->tx_last + XMT_COUNT, ioaddr + HOST_ADDRESS_REG);
        !          1208:                        status = inw(ioaddr + IO_PORT);
        !          1209:                        outw(status | CHAIN_BIT, ioaddr + IO_PORT);
        !          1210:        
        !          1211:                        /* Continue the transmit command */
        !          1212:                        outb(RESUME_XMT_CMD, ioaddr);
        !          1213:                }
        !          1214:                lp->tx_last = last;
        !          1215:                lp->tx_end = end;
        !          1216:        
        !          1217:                /* Enable RX and TX interrupts */
        !          1218:                outb(ALL_MASK & ~(RX_MASK | TX_MASK), ioaddr + INT_MASK_REG); 
        !          1219:        
        !          1220:                if (dev->tbusy) {
        !          1221:                        dev->tbusy = 0;
        !          1222:                }
        !          1223:        
        !          1224:                if (net_debug > 5)
        !          1225:                        printk("eepro: exiting hardware_send_packet routine.\n");
        !          1226:        
        !          1227:                return;
        !          1228:        }
        !          1229:        dev->tbusy = 1;
        !          1230:        
        !          1231:        if (net_debug > 5)
        !          1232:                printk("eepro: exiting hardware_send_packet routine.\n");
        !          1233: }
        !          1234: 
        !          1235: static void
        !          1236: eepro_rx(struct device *dev)
        !          1237: {
        !          1238:        struct eepro_local *lp = (struct eepro_local *)dev->priv;
        !          1239:        short ioaddr = dev->base_addr, rcv_ram = dev->mem_end;
        !          1240:        short boguscount = 20;
        !          1241:        short rcv_car = lp->rx_start;
        !          1242:        unsigned rcv_event, rcv_status, rcv_next_frame, rcv_size;
        !          1243: 
        !          1244:        if (net_debug > 5)
        !          1245:                printk("eepro: entering eepro_rx routine.\n");
        !          1246:        
        !          1247:        /* Set the read pointer to the start of the RCV */
        !          1248:        outw(rcv_car, ioaddr + HOST_ADDRESS_REG);
        !          1249:        
        !          1250:        rcv_event = inw(ioaddr + IO_PORT);
        !          1251:        while (rcv_event == RCV_DONE) {
        !          1252: 
        !          1253:                rcv_status = inw(ioaddr + IO_PORT);
        !          1254:                rcv_next_frame = inw(ioaddr + IO_PORT);
        !          1255:                rcv_size = inw(ioaddr + IO_PORT);
        !          1256:        
        !          1257:                if ((rcv_status & (RX_OK | RX_ERROR)) == RX_OK) {
        !          1258:        
        !          1259:                        /* Malloc up new buffer. */
        !          1260:                        struct sk_buff *skb;
        !          1261:                        rcv_size &= 0x3fff;
        !          1262:                        skb = dev_alloc_skb(rcv_size+5);
        !          1263:        
        !          1264:                        if (skb == NULL) {
        !          1265:                                printk("%s: Memory squeeze, dropping packet.\n", dev->name);
        !          1266:                                lp->stats.rx_dropped++;
        !          1267:                                break;
        !          1268:                        }
        !          1269:        
        !          1270:                        skb->dev = dev;
        !          1271:                        skb_reserve(skb,2);
        !          1272:        
        !          1273:                        if (lp->version == LAN595)
        !          1274:                                insw(ioaddr+IO_PORT, skb_put(skb,rcv_size), (rcv_size + 3) >> 1);
        !          1275:        
        !          1276:                        else {  /* LAN595TX or LAN595FX, capable of 32-bit I/O processing */
        !          1277:                                unsigned short temp = inb(ioaddr + INT_MASK_REG);
        !          1278:                                outb(temp | IO_32_BIT, ioaddr + INT_MASK_REG);
        !          1279:                                insl(ioaddr+IO_PORT_32_BIT, skb_put(skb,rcv_size), (rcv_size + 3) >> 2);
        !          1280:                                outb(temp & ~(IO_32_BIT), ioaddr + INT_MASK_REG);
        !          1281:                        }
        !          1282:        
        !          1283:                        skb->protocol = eth_type_trans(skb,dev);        
        !          1284:                        netif_rx(skb);
        !          1285:                        lp->stats.rx_packets++;
        !          1286:                }
        !          1287:        
        !          1288:                else { /* Not sure will ever reach here, 
        !          1289:                          I set the 595 to discard bad received frames */
        !          1290:                        lp->stats.rx_errors++;
        !          1291:        
        !          1292:                        if (rcv_status & 0x0100)
        !          1293:                                lp->stats.rx_over_errors++;
        !          1294:        
        !          1295:                        else if (rcv_status & 0x0400)
        !          1296:                                lp->stats.rx_frame_errors++;
        !          1297:        
        !          1298:                        else if (rcv_status & 0x0800)
        !          1299:                                lp->stats.rx_crc_errors++;
        !          1300:        
        !          1301:                        printk("%s: event = %#x, status = %#x, next = %#x, size = %#x\n", 
        !          1302:                                dev->name, rcv_event, rcv_status, rcv_next_frame, rcv_size);
        !          1303:                }
        !          1304:        
        !          1305:                if (rcv_status & 0x1000)
        !          1306:                        lp->stats.rx_length_errors++;
        !          1307:        
        !          1308:                if (--boguscount == 0)
        !          1309:                        break;
        !          1310:        
        !          1311:                rcv_car = lp->rx_start + RCV_HEADER + rcv_size;
        !          1312:                lp->rx_start = rcv_next_frame;
        !          1313:                outw(rcv_next_frame, ioaddr + HOST_ADDRESS_REG);
        !          1314:                rcv_event = inw(ioaddr + IO_PORT);
        !          1315:        } 
        !          1316:        if (rcv_car == 0)
        !          1317:                rcv_car = (RCV_UPPER_LIMIT << 8) | 0xff;
        !          1318:        
        !          1319:        outw(rcv_car - 1, ioaddr + RCV_STOP);
        !          1320:        
        !          1321:        if (net_debug > 5)
        !          1322:                printk("eepro: exiting eepro_rx routine.\n");
        !          1323: }
        !          1324: 
        !          1325: static void
        !          1326: eepro_transmit_interrupt(struct device *dev)
        !          1327: {
        !          1328:        struct eepro_local *lp = (struct eepro_local *)dev->priv;
        !          1329:        short ioaddr = dev->base_addr;
        !          1330:        short boguscount = 20; 
        !          1331:        short xmt_status;
        !          1332: 
        !          1333:        while (lp->tx_start != lp->tx_end) { 
        !          1334:        
        !          1335:                outw(lp->tx_start, ioaddr + HOST_ADDRESS_REG);
        !          1336:                xmt_status = inw(ioaddr+IO_PORT);
        !          1337:        
        !          1338:                if ((xmt_status & TX_DONE_BIT) == 0) break;
        !          1339:        
        !          1340:                xmt_status = inw(ioaddr+IO_PORT);
        !          1341:                lp->tx_start = inw(ioaddr+IO_PORT);
        !          1342:                dev->tbusy = 0;
        !          1343:                mark_bh(NET_BH);
        !          1344:        
        !          1345:                if (xmt_status & 0x2000)
        !          1346:                        lp->stats.tx_packets++; 
        !          1347:                else {
        !          1348:                        lp->stats.tx_errors++;
        !          1349:                        if (xmt_status & 0x0400)
        !          1350:                                lp->stats.tx_carrier_errors++;
        !          1351:                        printk("%s: XMT status = %#x\n",
        !          1352:                                dev->name, xmt_status);
        !          1353:                }
        !          1354:        
        !          1355:                if (xmt_status & 0x000f) {
        !          1356:                        lp->stats.collisions += (xmt_status & 0x000f);
        !          1357:                }
        !          1358:        
        !          1359:                if ((xmt_status & 0x0040) == 0x0) {
        !          1360:                        lp->stats.tx_heartbeat_errors++;
        !          1361:                }
        !          1362:        
        !          1363:                if (--boguscount == 0)
        !          1364:                        break;  
        !          1365:        }
        !          1366: }
        !          1367: 
        !          1368: #ifdef MODULE
        !          1369: 
        !          1370: static char devicename[9] = { 0, };
        !          1371: static struct device dev_eepro = {
        !          1372:        devicename, /* device name is inserted by linux/drivers/net/net_init.c */
        !          1373:        0, 0, 0, 0,
        !          1374:        0, 0,
        !          1375:        0, 0, 0, NULL, eepro_probe };
        !          1376: static int io = 0x200;
        !          1377: static int irq = 0;
        !          1378: static int mem = (RCV_RAM/1024);       /* Size of the rx buffer in KB */
        !          1379: 
        !          1380: int 
        !          1381: init_module(void)
        !          1382: {
        !          1383:        if (io == 0)
        !          1384:                printk("eepro: You should not use auto-probing with insmod!\n");
        !          1385: 
        !          1386:        dev_eepro.base_addr = io;
        !          1387:        dev_eepro.irq       = irq;
        !          1388:        dev_eepro.mem_end   = mem;
        !          1389: 
        !          1390:        if (register_netdev(&dev_eepro) != 0)
        !          1391:                return -EIO;
        !          1392: 
        !          1393:        return 0;
        !          1394: }
        !          1395: 
        !          1396: void
        !          1397: cleanup_module(void)
        !          1398: {
        !          1399:        unregister_netdev(&dev_eepro);
        !          1400: 
        !          1401:        kfree_s(dev_eepro.priv,sizeof(struct eepro_local));
        !          1402:        dev_eepro.priv=NULL;
        !          1403: 
        !          1404:        /* If we don't do this, we can't re-insmod it later. */
        !          1405:        release_region(dev_eepro.base_addr, EEPRO_IO_EXTENT);
        !          1406: }
        !          1407: #endif /* MODULE */

unix.superglobalmegacorp.com

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