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

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

unix.superglobalmegacorp.com

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