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

1.1       root        1: /* lance.c: An AMD LANCE ethernet driver for linux. */
                      2: /*
                      3:        Written 1993,1994,1995 by Donald Becker.
                      4: 
                      5:        Copyright 1993 United States Government as represented by the
                      6:        Director, National Security Agency.
                      7:        This software may be used and distributed according to the terms
                      8:        of the GNU Public License, incorporated herein by reference.
                      9: 
                     10:        This driver is for the Allied Telesis AT1500 and HP J2405A, and should work
                     11:        with most other LANCE-based bus-master (NE2100 clone) ethercards.
                     12: 
                     13:        The author may be reached as [email protected], or C/O
                     14:        Center of Excellence in Space Data and Information Sciences
                     15:           Code 930.5, Goddard Space Flight Center, Greenbelt MD 20771
                     16: */
                     17: 
                     18: static const char *version = "lance.c:v1.08 4/10/95 [email protected]\n";
                     19: 
                     20: #include <linux/config.h>
                     21: #include <linux/kernel.h>
                     22: #include <linux/sched.h>
                     23: #include <linux/string.h>
                     24: #include <linux/ptrace.h>
                     25: #include <linux/errno.h>
                     26: #include <linux/ioport.h>
                     27: #include <linux/malloc.h>
                     28: #include <linux/interrupt.h>
                     29: #include <linux/pci.h>
                     30: #include <linux/bios32.h>
                     31: #include <asm/bitops.h>
                     32: #include <asm/io.h>
                     33: #include <asm/dma.h>
                     34: 
                     35: #include <linux/netdevice.h>
                     36: #include <linux/etherdevice.h>
                     37: #include <linux/skbuff.h>
                     38: 
                     39: static unsigned int lance_portlist[] = {0x300, 0x320, 0x340, 0x360, 0};
                     40: void lance_probe1(int ioaddr);
                     41: 
                     42: #ifdef HAVE_DEVLIST
                     43: struct netdev_entry lance_drv =
                     44: {"lance", lance_probe1, LANCE_TOTAL_SIZE, lance_portlist};
                     45: #endif
                     46: 
                     47: #ifdef LANCE_DEBUG
                     48: int lance_debug = LANCE_DEBUG;
                     49: #else
                     50: int lance_debug = 1;
                     51: #endif
                     52: 
                     53: /*
                     54:                                Theory of Operation
                     55: 
                     56: I. Board Compatibility
                     57: 
                     58: This device driver is designed for the AMD 79C960, the "PCnet-ISA
                     59: single-chip ethernet controller for ISA".  This chip is used in a wide
                     60: variety of boards from vendors such as Allied Telesis, HP, Kingston,
                     61: and Boca.  This driver is also intended to work with older AMD 7990
                     62: designs, such as the NE1500 and NE2100, and newer 79C961.  For convenience,
                     63: I use the name LANCE to refer to all of the AMD chips, even though it properly
                     64: refers only to the original 7990.
                     65: 
                     66: II. Board-specific settings
                     67: 
                     68: The driver is designed to work the boards that use the faster
                     69: bus-master mode, rather than in shared memory mode.     (Only older designs
                     70: have on-board buffer memory needed to support the slower shared memory mode.)
                     71: 
                     72: Most ISA boards have jumpered settings for the I/O base, IRQ line, and DMA
                     73: channel.  This driver probes the likely base addresses:
                     74: {0x300, 0x320, 0x340, 0x360}.
                     75: After the board is found it generates a DMA-timeout interrupt and uses
                     76: autoIRQ to find the IRQ line.  The DMA channel can be set with the low bits
                     77: of the otherwise-unused dev->mem_start value (aka PARAM1).  If unset it is
                     78: probed for by enabling each free DMA channel in turn and checking if
                     79: initialization succeeds.
                     80: 
                     81: The HP-J2405A board is an exception: with this board it's easy to read the
                     82: EEPROM-set values for the base, IRQ, and DMA.  (Of course you must already
                     83: _know_ the base address -- that field is for writing the EEPROM.)
                     84: 
                     85: III. Driver operation
                     86: 
                     87: IIIa. Ring buffers
                     88: The LANCE uses ring buffers of Tx and Rx descriptors.  Each entry describes
                     89: the base and length of the data buffer, along with status bits.         The length
                     90: of these buffers is set by LANCE_LOG_{RX,TX}_BUFFERS, which is log_2() of
                     91: the buffer length (rather than being directly the buffer length) for
                     92: implementation ease.  The current values are 2 (Tx) and 4 (Rx), which leads to
                     93: ring sizes of 4 (Tx) and 16 (Rx).  Increasing the number of ring entries
                     94: needlessly uses extra space and reduces the chance that an upper layer will
                     95: be able to reorder queued Tx packets based on priority.         Decreasing the number
                     96: of entries makes it more difficult to achieve back-to-back packet transmission
                     97: and increases the chance that Rx ring will overflow.  (Consider the worst case
                     98: of receiving back-to-back minimum-sized packets.)
                     99: 
                    100: The LANCE has the capability to "chain" both Rx and Tx buffers, but this driver
                    101: statically allocates full-sized (slightly oversized -- PKT_BUF_SZ) buffers to
                    102: avoid the administrative overhead. For the Rx side this avoids dynamically
                    103: allocating full-sized buffers "just in case", at the expense of a
                    104: memory-to-memory data copy for each packet received.  For most systems this
                    105: is a good tradeoff: the Rx buffer will always be in low memory, the copy
                    106: is inexpensive, and it primes the cache for later packet processing.  For Tx
                    107: the buffers are only used when needed as low-memory bounce buffers.
                    108: 
                    109: IIIB. 16M memory limitations.
                    110: For the ISA bus master mode all structures used directly by the LANCE,
                    111: the initialization block, Rx and Tx rings, and data buffers, must be
                    112: accessible from the ISA bus, i.e. in the lower 16M of real memory.
                    113: This is a problem for current Linux kernels on >16M machines. The network
                    114: devices are initialized after memory initialization, and the kernel doles out
                    115: memory from the top of memory downward.         The current solution is to have a
                    116: special network initialization routine that's called before memory
                    117: initialization; this will eventually be generalized for all network devices.
                    118: As mentioned before, low-memory "bounce-buffers" are used when needed.
                    119: 
                    120: IIIC. Synchronization
                    121: The driver runs as two independent, single-threaded flows of control.  One
                    122: is the send-packet routine, which enforces single-threaded use by the
                    123: dev->tbusy flag.  The other thread is the interrupt handler, which is single
                    124: threaded by the hardware and other software.
                    125: 
                    126: The send packet thread has partial control over the Tx ring and 'dev->tbusy'
                    127: flag.  It sets the tbusy flag whenever it's queuing a Tx packet. If the next
                    128: queue slot is empty, it clears the tbusy flag when finished otherwise it sets
                    129: the 'lp->tx_full' flag.
                    130: 
                    131: The interrupt handler has exclusive control over the Rx ring and records stats
                    132: from the Tx ring.  (The Tx-done interrupt can't be selectively turned off, so
                    133: we can't avoid the interrupt overhead by having the Tx routine reap the Tx
                    134: stats.)         After reaping the stats, it marks the queue entry as empty by setting
                    135: the 'base' to zero.     Iff the 'lp->tx_full' flag is set, it clears both the
                    136: tx_full and tbusy flags.
                    137: 
                    138: */
                    139: 
                    140: /* Set the number of Tx and Rx buffers, using Log_2(# buffers).
                    141:    Reasonable default values are 4 Tx buffers, and 16 Rx buffers.
                    142:    That translates to 2 (4 == 2^^2) and 4 (16 == 2^^4). */
                    143: #ifndef LANCE_LOG_TX_BUFFERS
                    144: #define LANCE_LOG_TX_BUFFERS 4
                    145: #define LANCE_LOG_RX_BUFFERS 4
                    146: #endif
                    147: 
                    148: #define TX_RING_SIZE                   (1 << (LANCE_LOG_TX_BUFFERS))
                    149: #define TX_RING_MOD_MASK               (TX_RING_SIZE - 1)
                    150: #define TX_RING_LEN_BITS               ((LANCE_LOG_TX_BUFFERS) << 29)
                    151: 
                    152: #define RX_RING_SIZE                   (1 << (LANCE_LOG_RX_BUFFERS))
                    153: #define RX_RING_MOD_MASK               (RX_RING_SIZE - 1)
                    154: #define RX_RING_LEN_BITS               ((LANCE_LOG_RX_BUFFERS) << 29)
                    155: 
                    156: #define PKT_BUF_SZ             1544
                    157: 
                    158: /* Offsets from base I/O address. */
                    159: #define LANCE_DATA 0x10
                    160: #define LANCE_ADDR 0x12
                    161: #define LANCE_RESET 0x14
                    162: #define LANCE_BUS_IF 0x16
                    163: #define LANCE_TOTAL_SIZE 0x18
                    164: 
                    165: /* The LANCE Rx and Tx ring descriptors. */
                    166: struct lance_rx_head {
                    167:        int base;
                    168:        short buf_length;                       /* This length is 2s complement (negative)! */
                    169:        short msg_length;                       /* This length is "normal". */
                    170: };
                    171: 
                    172: struct lance_tx_head {
                    173:        int       base;
                    174:        short length;                           /* Length is 2s complement (negative)! */
                    175:        short misc;
                    176: };
                    177: 
                    178: /* The LANCE initialization block, described in databook. */
                    179: struct lance_init_block {
                    180:        unsigned short mode;            /* Pre-set mode (reg. 15) */
                    181:        unsigned char phys_addr[6]; /* Physical ethernet address */
                    182:        unsigned filter[2];                     /* Multicast filter (unused). */
                    183:        /* Receive and transmit ring base, along with extra bits. */
                    184:        unsigned rx_ring;                       /* Tx and Rx ring base pointers */
                    185:        unsigned tx_ring;
                    186: };
                    187: 
                    188: struct lance_private {
                    189:        /* The Tx and Rx ring entries must be aligned on 8-byte boundaries.
                    190:           This is always true for kmalloc'ed memory */
                    191:        struct lance_rx_head rx_ring[RX_RING_SIZE];
                    192:        struct lance_tx_head tx_ring[TX_RING_SIZE];
                    193:        struct lance_init_block         init_block;
                    194:        const char *name;
                    195:        /* The saved address of a sent-in-place packet/buffer, for skfree(). */
                    196:        struct sk_buff* tx_skbuff[TX_RING_SIZE];
                    197:        long rx_buffs;                          /* Address of Rx and Tx buffers. */
                    198:        /* Tx low-memory "bounce buffer" address. */
                    199:        char (*tx_bounce_buffs)[PKT_BUF_SZ];
                    200:        int cur_rx, cur_tx;                     /* The next free ring entry */
                    201:        int dirty_rx, dirty_tx;         /* The ring entries to be free()ed. */
                    202:        int dma;
                    203:        struct enet_statistics stats;
                    204:        unsigned char chip_version;                     /* See lance_chip_type. */
                    205:        char tx_full;
                    206:        char lock;
                    207: };
                    208: 
                    209: #define LANCE_MUST_PAD          0x00000001
                    210: #define LANCE_ENABLE_AUTOSELECT 0x00000002
                    211: #define LANCE_MUST_REINIT_RING  0x00000004
                    212: #define LANCE_MUST_UNRESET      0x00000008
                    213: #define LANCE_HAS_MISSED_FRAME  0x00000010
                    214: 
                    215: /* A mapping from the chip ID number to the part number and features.
                    216:    These are from the datasheets -- in real life the '970 version
                    217:    reportedly has the same ID as the '965. */
                    218: static struct lance_chip_type {
                    219:        int id_number;
                    220:        const char *name;
                    221:        int flags;
                    222: } chip_table[] = {
                    223:        {0x0000, "LANCE 7990",                          /* Ancient lance chip.  */
                    224:                LANCE_MUST_PAD + LANCE_MUST_UNRESET},
                    225:        {0x0003, "PCnet/ISA 79C960",            /* 79C960 PCnet/ISA.  */
                    226:                LANCE_ENABLE_AUTOSELECT + LANCE_MUST_REINIT_RING +
                    227:                        LANCE_HAS_MISSED_FRAME},
                    228:        {0x2260, "PCnet/ISA+ 79C961",           /* 79C961 PCnet/ISA+, Plug-n-Play.  */
                    229:                LANCE_ENABLE_AUTOSELECT + LANCE_MUST_REINIT_RING +
                    230:                        LANCE_HAS_MISSED_FRAME},
                    231:        {0x2420, "PCnet/PCI 79C970",            /* 79C970 or 79C974 PCnet-SCSI, PCI. */
                    232:                LANCE_ENABLE_AUTOSELECT + LANCE_MUST_REINIT_RING +
                    233:                        LANCE_HAS_MISSED_FRAME},
                    234:        /* Bug: the PCnet/PCI actually uses the PCnet/VLB ID number, so just call
                    235:                it the PCnet32. */
                    236:        {0x2430, "PCnet32",                                     /* 79C965 PCnet for VL bus. */
                    237:                LANCE_ENABLE_AUTOSELECT + LANCE_MUST_REINIT_RING +
                    238:                        LANCE_HAS_MISSED_FRAME},
                    239:        {0x0,    "PCnet (unknown)",
                    240:                LANCE_ENABLE_AUTOSELECT + LANCE_MUST_REINIT_RING +
                    241:                        LANCE_HAS_MISSED_FRAME},
                    242: };
                    243: 
                    244: enum {OLD_LANCE = 0, PCNET_ISA=1, PCNET_ISAP=2, PCNET_PCI=3, PCNET_VLB=4, LANCE_UNKNOWN=5};
                    245: 
                    246: /* Non-zero only if the current card is a PCI with BIOS-set IRQ. */
                    247: static unsigned char pci_irq_line = 0;
                    248: 
                    249: /* Non-zero if lance_probe1() needs to allocate low-memory bounce buffers.
                    250:    Assume yes until we know the memory size. */
                    251: static unsigned char lance_need_isa_bounce_buffers = 1;
                    252: 
                    253: static int lance_open(struct device *dev);
                    254: static void lance_init_ring(struct device *dev);
                    255: static int lance_start_xmit(struct sk_buff *skb, struct device *dev);
                    256: static int lance_rx(struct device *dev);
                    257: static void lance_interrupt(int irq, struct pt_regs *regs);
                    258: static int lance_close(struct device *dev);
                    259: static struct enet_statistics *lance_get_stats(struct device *dev);
                    260: static void set_multicast_list(struct device *dev);
                    261: 
                    262: 
                    263: 
                    264: /* This lance probe is unlike the other board probes in 1.0.*.  The LANCE may
                    265:    have to allocate a contiguous low-memory region for bounce buffers.
                    266:    This requirement is satisfied by having the lance initialization occur
                    267:    before the memory management system is started, and thus well before the
                    268:    other probes. */
                    269: 
                    270: int lance_init(void)
                    271: {
                    272:        int *port;
                    273: 
                    274:        if (high_memory <= 16*1024*1024)
                    275:                lance_need_isa_bounce_buffers = 0;
                    276: 
                    277: #if defined(CONFIG_PCI)
                    278:     if (pcibios_present()) {
                    279:            int pci_index;
                    280:                printk("lance.c: PCI bios is present, checking for devices...\n");
                    281:                for (pci_index = 0; pci_index < 8; pci_index++) {
                    282:                        unsigned char pci_bus, pci_device_fn;
                    283:                        unsigned int pci_ioaddr;
                    284:                        unsigned short pci_command;
                    285: 
                    286:                        if (pcibios_find_device (PCI_VENDOR_ID_AMD,
                    287:                                                                         PCI_DEVICE_ID_AMD_LANCE, pci_index,
                    288:                                                                         &pci_bus, &pci_device_fn) != 0)
                    289:                                break;
                    290:                        pcibios_read_config_byte(pci_bus, pci_device_fn,
                    291:                                                                         PCI_INTERRUPT_LINE, &pci_irq_line);
                    292:                        pcibios_read_config_dword(pci_bus, pci_device_fn,
                    293:                                                                          PCI_BASE_ADDRESS_0, &pci_ioaddr);
                    294:                        /* Remove I/O space marker in bit 0. */
                    295:                        pci_ioaddr &= ~3;
                    296:                        /* PCI Spec 2.1 states that it is either the driver or PCI card's
                    297:                         * responsibility to set the PCI Master Enable Bit if needed.
                    298:                         *      (From Mark Stockton <[email protected]>)
                    299:                         */
                    300:                        pcibios_read_config_word(pci_bus, pci_device_fn,
                    301:                                                                         PCI_COMMAND, &pci_command);
                    302:                        if ( ! (pci_command & PCI_COMMAND_MASTER)) {
                    303:                                printk("PCI Master Bit has not been set. Setting...\n");
                    304:                                pci_command |= PCI_COMMAND_MASTER;
                    305:                                pcibios_write_config_word(pci_bus, pci_device_fn,
                    306:                                                                                  PCI_COMMAND, pci_command);
                    307:                        }
                    308:                        printk("Found PCnet/PCI at %#x, irq %d.\n",
                    309:                                   pci_ioaddr, pci_irq_line);
                    310:                        lance_probe1(pci_ioaddr);
                    311:                        pci_irq_line = 0;
                    312:                }
                    313:        }
                    314: #endif  /* defined(CONFIG_PCI) */
                    315: 
                    316:        for (port = lance_portlist; *port; port++) {
                    317:                int ioaddr = *port;
                    318: 
                    319:                if ( check_region(ioaddr, LANCE_TOTAL_SIZE) == 0) {
                    320:                        /* Detect "normal" 0x57 0x57 and the NI6510EB 0x52 0x44
                    321:                           signatures w/ minimal I/O reads */
                    322:                        char offset15, offset14 = inb(ioaddr + 14);
                    323:                        
                    324:                        if ((offset14 == 0x52 || offset14 == 0x57) &&
                    325:                                ((offset15 = inb(ioaddr + 15)) == 0x57 || offset15 == 0x44))
                    326:                                lance_probe1(ioaddr);
                    327:                }
                    328:        }
                    329: 
                    330:        return 0;
                    331: }
                    332: 
                    333: void lance_probe1(int ioaddr)
                    334: {
                    335:        struct device *dev;
                    336:        struct lance_private *lp;
                    337:        short dma_channels;                                     /* Mark spuriously-busy DMA channels */
                    338:        int i, reset_val, lance_version;
                    339:        const char *chipname;
                    340:        /* Flags for specific chips or boards. */
                    341:        unsigned char hpJ2405A = 0;                                             /* HP ISA adaptor */
                    342:        int hp_builtin = 0;                                     /* HP on-board ethernet. */
                    343:        static int did_version = 0;                     /* Already printed version info. */
                    344: 
                    345:        /* First we look for special cases.
                    346:           Check for HP's on-board ethernet by looking for 'HP' in the BIOS.
                    347:           There are two HP versions, check the BIOS for the configuration port.
                    348:           This method provided by L. Julliard, [email protected].
                    349:           */
                    350:        if ( *((unsigned short *) 0x000f0102) == 0x5048)  {
                    351:                static const short ioaddr_table[] = { 0x300, 0x320, 0x340, 0x360};
                    352:                int hp_port = ( *((unsigned char *) 0x000f00f1) & 1)  ? 0x499 : 0x99;
                    353:                /* We can have boards other than the built-in!  Verify this is on-board. */
                    354:                if ((inb(hp_port) & 0xc0) == 0x80
                    355:                        && ioaddr_table[inb(hp_port) & 3] == ioaddr)
                    356:                        hp_builtin = hp_port;
                    357:        }
                    358:        /* We also recognize the HP Vectra on-board here, but check below. */
                    359:        hpJ2405A = (inb(ioaddr) == 0x08 && inb(ioaddr+1) == 0x00
                    360:                                && inb(ioaddr+2) == 0x09);
                    361: 
                    362:        /* Reset the LANCE.      */
                    363:        reset_val = inw(ioaddr+LANCE_RESET); /* Reset the LANCE */
                    364: 
                    365:        /* The Un-Reset needed is only needed for the real NE2100, and will
                    366:           confuse the HP board. */
                    367:        if (!hpJ2405A)
                    368:                outw(reset_val, ioaddr+LANCE_RESET);
                    369: 
                    370:        outw(0x0000, ioaddr+LANCE_ADDR); /* Switch to window 0 */
                    371:        if (inw(ioaddr+LANCE_DATA) != 0x0004)
                    372:                return;
                    373: 
                    374:        /* Get the version of the chip. */
                    375:        outw(88, ioaddr+LANCE_ADDR);
                    376:        if (inw(ioaddr+LANCE_ADDR) != 88) {
                    377:                lance_version = 0;
                    378:        } else {                                                        /* Good, it's a newer chip. */
                    379:                int chip_version = inw(ioaddr+LANCE_DATA);
                    380:                outw(89, ioaddr+LANCE_ADDR);
                    381:                chip_version |= inw(ioaddr+LANCE_DATA) << 16;
                    382:                if (lance_debug > 2)
                    383:                        printk("  LANCE chip version is %#x.\n", chip_version);
                    384:                if ((chip_version & 0xfff) != 0x003)
                    385:                        return;
                    386:                chip_version = (chip_version >> 12) & 0xffff;
                    387:                for (lance_version = 1; chip_table[lance_version].id_number; lance_version++) {
                    388:                        if (chip_table[lance_version].id_number == chip_version)
                    389:                                break;
                    390:                }
                    391:        }
                    392: 
                    393:        dev = init_etherdev(0, 0);
                    394:        chipname = chip_table[lance_version].name;
                    395:        printk("%s: %s at %#3x,", dev->name, chipname, ioaddr);
                    396: 
                    397:        /* There is a 16 byte station address PROM at the base address.
                    398:           The first six bytes are the station address. */
                    399:        for (i = 0; i < 6; i++)
                    400:                printk(" %2.2x", dev->dev_addr[i] = inb(ioaddr + i));
                    401: 
                    402:        dev->base_addr = ioaddr;
                    403:        request_region(ioaddr, LANCE_TOTAL_SIZE, chip_table[lance_version].name);
                    404: 
                    405:        /* Make certain the data structures used by the LANCE are aligned and DMAble. */
                    406:        lp = (struct lance_private *) kmalloc(sizeof(*lp), GFP_DMA | GFP_KERNEL);
                    407:        memset(lp, 0, sizeof(*lp));
                    408:        dev->priv = lp;
                    409:        lp->name = chipname;
                    410:        lp->rx_buffs = (unsigned long) kmalloc(PKT_BUF_SZ*RX_RING_SIZE, GFP_DMA | GFP_KERNEL);
                    411:        lp->tx_bounce_buffs = NULL;
                    412:        if (lance_need_isa_bounce_buffers)
                    413:                lp->tx_bounce_buffs = kmalloc(PKT_BUF_SZ*TX_RING_SIZE, GFP_DMA | GFP_KERNEL);
                    414: 
                    415:        lp->chip_version = lance_version;
                    416: 
                    417:        lp->init_block.mode = 0x0003;           /* Disable Rx and Tx. */
                    418:        for (i = 0; i < 6; i++)
                    419:                lp->init_block.phys_addr[i] = dev->dev_addr[i];
                    420:        lp->init_block.filter[0] = 0x00000000;
                    421:        lp->init_block.filter[1] = 0x00000000;
                    422:        lp->init_block.rx_ring = (int)lp->rx_ring | RX_RING_LEN_BITS;
                    423:        lp->init_block.tx_ring = (int)lp->tx_ring | TX_RING_LEN_BITS;
                    424: 
                    425:        outw(0x0001, ioaddr+LANCE_ADDR);
                    426:        inw(ioaddr+LANCE_ADDR);
                    427:        outw((short) (int) &lp->init_block, ioaddr+LANCE_DATA);
                    428:        outw(0x0002, ioaddr+LANCE_ADDR);
                    429:        inw(ioaddr+LANCE_ADDR);
                    430:        outw(((int)&lp->init_block) >> 16, ioaddr+LANCE_DATA);
                    431:        outw(0x0000, ioaddr+LANCE_ADDR);
                    432:        inw(ioaddr+LANCE_ADDR);
                    433: 
                    434:        if (pci_irq_line) {
                    435:                dev->dma = 4;                   /* Native bus-master, no DMA channel needed. */
                    436:                dev->irq = pci_irq_line;
                    437:        } else if (hp_builtin) {
                    438:                static const char dma_tbl[4] = {3, 5, 6, 0};
                    439:                static const char irq_tbl[4] = {3, 4, 5, 9};
                    440:                unsigned char port_val = inb(hp_builtin);
                    441:                dev->dma = dma_tbl[(port_val >> 4) & 3];
                    442:                dev->irq = irq_tbl[(port_val >> 2) & 3];
                    443:                printk(" HP Vectra IRQ %d DMA %d.\n", dev->irq, dev->dma);
                    444:        } else if (hpJ2405A) {
                    445:                static const char dma_tbl[4] = {3, 5, 6, 7};
                    446:                static const char irq_tbl[8] = {3, 4, 5, 9, 10, 11, 12, 15};
                    447:                short reset_val = inw(ioaddr+LANCE_RESET);
                    448:                dev->dma = dma_tbl[(reset_val >> 2) & 3];
                    449:                dev->irq = irq_tbl[(reset_val >> 4) & 7];
                    450:                printk(" HP J2405A IRQ %d DMA %d.\n", dev->irq, dev->dma);
                    451:        } else if (lance_version == PCNET_ISAP) {               /* The plug-n-play version. */
                    452:                short bus_info;
                    453:                outw(8, ioaddr+LANCE_ADDR);
                    454:                bus_info = inw(ioaddr+LANCE_BUS_IF);
                    455:                dev->dma = bus_info & 0x07;
                    456:                dev->irq = (bus_info >> 4) & 0x0F;
                    457:        } else {
                    458:                /* The DMA channel may be passed in PARAM1. */
                    459:                if (dev->mem_start & 0x07)
                    460:                        dev->dma = dev->mem_start & 0x07;
                    461:        }
                    462: 
                    463:        if (dev->dma == 0) {
                    464:                /* Read the DMA channel status register, so that we can avoid
                    465:                   stuck DMA channels in the DMA detection below. */
                    466:                dma_channels = ((inb(DMA1_STAT_REG) >> 4) & 0x0f) |
                    467:                        (inb(DMA2_STAT_REG) & 0xf0);
                    468:        }
                    469:        if (dev->irq >= 2)
                    470:                printk(" assigned IRQ %d", dev->irq);
                    471:        else {
                    472:                /* To auto-IRQ we enable the initialization-done and DMA error
                    473:                   interrupts. For ISA boards we get a DMA error, but VLB and PCI
                    474:                   boards will work. */
                    475:                autoirq_setup(0);
                    476: 
                    477:                /* Trigger an initialization just for the interrupt. */
                    478:                outw(0x0041, ioaddr+LANCE_DATA);
                    479: 
                    480:                dev->irq = autoirq_report(1);
                    481:                if (dev->irq)
                    482:                        printk(", probed IRQ %d", dev->irq);
                    483:                else {
                    484:                        printk(", failed to detect IRQ line.\n");
                    485:                        return;
                    486:                }
                    487: 
                    488:                /* Check for the initialization done bit, 0x0100, which means
                    489:                   that we don't need a DMA channel. */
                    490:                if (inw(ioaddr+LANCE_DATA) & 0x0100)
                    491:                        dev->dma = 4;
                    492:        }
                    493: 
                    494:        if (dev->dma == 4) {
                    495:                printk(", no DMA needed.\n");
                    496:        } else if (dev->dma) {
                    497:                if (request_dma(dev->dma, chipname)) {
                    498:                        printk("DMA %d allocation failed.\n", dev->dma);
                    499:                        return;
                    500:                } else
                    501:                        printk(", assigned DMA %d.\n", dev->dma);
                    502:        } else {                        /* OK, we have to auto-DMA. */
                    503:                for (i = 0; i < 4; i++) {
                    504:                        static const char dmas[] = { 5, 6, 7, 3 };
                    505:                        int dma = dmas[i];
                    506:                        int boguscnt;
                    507: 
                    508:                        /* Don't enable a permanently busy DMA channel, or the machine
                    509:                           will hang. */
                    510:                        if (test_bit(dma, &dma_channels))
                    511:                                continue;
                    512:                        outw(0x7f04, ioaddr+LANCE_DATA); /* Clear the memory error bits. */
                    513:                        if (request_dma(dma, chipname))
                    514:                                continue;
                    515:                        set_dma_mode(dma, DMA_MODE_CASCADE);
                    516:                        enable_dma(dma);
                    517: 
                    518:                        /* Trigger an initialization. */
                    519:                        outw(0x0001, ioaddr+LANCE_DATA);
                    520:                        for (boguscnt = 100; boguscnt > 0; --boguscnt)
                    521:                                if (inw(ioaddr+LANCE_DATA) & 0x0900)
                    522:                                        break;
                    523:                        if (inw(ioaddr+LANCE_DATA) & 0x0100) {
                    524:                                dev->dma = dma;
                    525:                                printk(", DMA %d.\n", dev->dma);
                    526:                                break;
                    527:                        } else {
                    528:                                disable_dma(dma);
                    529:                                free_dma(dma);
                    530:                        }
                    531:                }
                    532:                if (i == 4) {                   /* Failure: bail. */
                    533:                        printk("DMA detection failed.\n");
                    534:                        return;
                    535:                }
                    536:        }
                    537: 
                    538:        if (chip_table[lp->chip_version].flags & LANCE_ENABLE_AUTOSELECT) {
                    539:                /* Turn on auto-select of media (10baseT or BNC) so that the user
                    540:                   can watch the LEDs even if the board isn't opened. */
                    541:                outw(0x0002, ioaddr+LANCE_ADDR);
                    542:                outw(0x0002, ioaddr+LANCE_BUS_IF);
                    543:        }
                    544: 
                    545:        if (lance_debug > 0  &&  did_version++ == 0)
                    546:                printk(version);
                    547: 
                    548:        /* The LANCE-specific entries in the device structure. */
                    549:        dev->open = &lance_open;
                    550:        dev->hard_start_xmit = &lance_start_xmit;
                    551:        dev->stop = &lance_close;
                    552:        dev->get_stats = &lance_get_stats;
                    553:        dev->set_multicast_list = &set_multicast_list;
                    554: 
                    555:        return;
                    556: }
                    557: 
                    558: 
                    559: static int
                    560: lance_open(struct device *dev)
                    561: {
                    562:        struct lance_private *lp = (struct lance_private *)dev->priv;
                    563:        int ioaddr = dev->base_addr;
                    564:        int i;
                    565: 
                    566:        if (dev->irq == 0 ||
                    567:                request_irq(dev->irq, &lance_interrupt, 0, lp->name)) {
                    568:                return -EAGAIN;
                    569:        }
                    570: 
                    571:        /* We used to allocate DMA here, but that was silly.
                    572:           DMA lines can't be shared!  We now permanently allocate them. */
                    573: 
                    574:        irq2dev_map[dev->irq] = dev;
                    575: 
                    576:        /* Reset the LANCE */
                    577:        inw(ioaddr+LANCE_RESET);
                    578: 
                    579:        /* The DMA controller is used as a no-operation slave, "cascade mode". */
                    580:        if (dev->dma != 4) {
                    581:                enable_dma(dev->dma);
                    582:                set_dma_mode(dev->dma, DMA_MODE_CASCADE);
                    583:        }
                    584: 
                    585:        /* Un-Reset the LANCE, needed only for the NE2100. */
                    586:        if (chip_table[lp->chip_version].flags & LANCE_MUST_UNRESET)
                    587:                outw(0, ioaddr+LANCE_RESET);
                    588: 
                    589:        if (chip_table[lp->chip_version].flags & LANCE_ENABLE_AUTOSELECT) {
                    590:                /* This is 79C960-specific: Turn on auto-select of media (AUI, BNC). */
                    591:                outw(0x0002, ioaddr+LANCE_ADDR);
                    592:                outw(0x0002, ioaddr+LANCE_BUS_IF);
                    593:        }
                    594: 
                    595:        if (lance_debug > 1)
                    596:                printk("%s: lance_open() irq %d dma %d tx/rx rings %#x/%#x init %#x.\n",
                    597:                           dev->name, dev->irq, dev->dma, (int) lp->tx_ring, (int) lp->rx_ring,
                    598:                           (int) &lp->init_block);
                    599: 
                    600:        lance_init_ring(dev);
                    601:        /* Re-initialize the LANCE, and start it when done. */
                    602:        outw(0x0001, ioaddr+LANCE_ADDR);
                    603:        outw((short) (int) &lp->init_block, ioaddr+LANCE_DATA);
                    604:        outw(0x0002, ioaddr+LANCE_ADDR);
                    605:        outw(((int)&lp->init_block) >> 16, ioaddr+LANCE_DATA);
                    606: 
                    607:        outw(0x0004, ioaddr+LANCE_ADDR);
                    608:        outw(0x0915, ioaddr+LANCE_DATA);
                    609: 
                    610:        outw(0x0000, ioaddr+LANCE_ADDR);
                    611:        outw(0x0001, ioaddr+LANCE_DATA);
                    612: 
                    613:        dev->tbusy = 0;
                    614:        dev->interrupt = 0;
                    615:        dev->start = 1;
                    616:        i = 0;
                    617:        while (i++ < 100)
                    618:                if (inw(ioaddr+LANCE_DATA) & 0x0100)
                    619:                        break;
                    620:        /* 
                    621:         * We used to clear the InitDone bit, 0x0100, here but Mark Stockton
                    622:         * reports that doing so triggers a bug in the '974.
                    623:         */
                    624:        outw(0x0042, ioaddr+LANCE_DATA);
                    625: 
                    626:        if (lance_debug > 2)
                    627:                printk("%s: LANCE open after %d ticks, init block %#x csr0 %4.4x.\n",
                    628:                           dev->name, i, (int) &lp->init_block, inw(ioaddr+LANCE_DATA));
                    629: 
                    630:        return 0;                                       /* Always succeed */
                    631: }
                    632: 
                    633: /* The LANCE has been halted for one reason or another (busmaster memory
                    634:    arbitration error, Tx FIFO underflow, driver stopped it to reconfigure,
                    635:    etc.).  Modern LANCE variants always reload their ring-buffer
                    636:    configuration when restarted, so we must reinitialize our ring
                    637:    context before restarting.  As part of this reinitialization,
                    638:    find all packets still on the Tx ring and pretend that they had been
                    639:    sent (in effect, drop the packets on the floor) - the higher-level
                    640:    protocols will time out and retransmit.  It'd be better to shuffle
                    641:    these skbs to a temp list and then actually re-Tx them after
                    642:    restarting the chip, but I'm too lazy to do so right now.  [email protected]
                    643: */
                    644: 
                    645: static void 
                    646: lance_purge_tx_ring(struct device *dev)
                    647: {
                    648:        struct lance_private *lp = (struct lance_private *)dev->priv;
                    649:        int i;
                    650: 
                    651:        for (i = 0; i < TX_RING_SIZE; i++) {
                    652:                if (lp->tx_skbuff[i]) {
                    653:                        dev_kfree_skb(lp->tx_skbuff[i],FREE_WRITE);
                    654:                        lp->tx_skbuff[i] = NULL;
                    655:                }
                    656:        }
                    657: }
                    658: 
                    659: 
                    660: /* Initialize the LANCE Rx and Tx rings. */
                    661: static void
                    662: lance_init_ring(struct device *dev)
                    663: {
                    664:        struct lance_private *lp = (struct lance_private *)dev->priv;
                    665:        int i;
                    666: 
                    667:        lp->lock = 0, lp->tx_full = 0;
                    668:        lp->cur_rx = lp->cur_tx = 0;
                    669:        lp->dirty_rx = lp->dirty_tx = 0;
                    670: 
                    671:        for (i = 0; i < RX_RING_SIZE; i++) {
                    672:                lp->rx_ring[i].base = (lp->rx_buffs + i*PKT_BUF_SZ) | 0x80000000;
                    673:                lp->rx_ring[i].buf_length = -PKT_BUF_SZ;
                    674:        }
                    675:        /* The Tx buffer address is filled in as needed, but we do need to clear
                    676:           the upper ownership bit. */
                    677:        for (i = 0; i < TX_RING_SIZE; i++) {
                    678:                lp->tx_ring[i].base = 0;
                    679:        }
                    680: 
                    681:        lp->init_block.mode = 0x0000;
                    682:        for (i = 0; i < 6; i++)
                    683:                lp->init_block.phys_addr[i] = dev->dev_addr[i];
                    684:        lp->init_block.filter[0] = 0x00000000;
                    685:        lp->init_block.filter[1] = 0x00000000;
                    686:        lp->init_block.rx_ring = (int)lp->rx_ring | RX_RING_LEN_BITS;
                    687:        lp->init_block.tx_ring = (int)lp->tx_ring | TX_RING_LEN_BITS;
                    688: }
                    689: 
                    690: static void
                    691: lance_restart(struct device *dev, unsigned int csr0_bits, int must_reinit)
                    692: {
                    693:        struct lance_private *lp = (struct lance_private *)dev->priv;
                    694: 
                    695:        if (must_reinit ||
                    696:                (chip_table[lp->chip_version].flags & LANCE_MUST_REINIT_RING)) {
                    697:                lance_purge_tx_ring(dev);
                    698:                lance_init_ring(dev);
                    699:        }
                    700:        outw(0x0000,    dev->base_addr + LANCE_ADDR);
                    701:        outw(csr0_bits, dev->base_addr + LANCE_DATA);
                    702: }
                    703: 
                    704: static int
                    705: lance_start_xmit(struct sk_buff *skb, struct device *dev)
                    706: {
                    707:        struct lance_private *lp = (struct lance_private *)dev->priv;
                    708:        int ioaddr = dev->base_addr;
                    709:        int entry;
                    710:        unsigned long flags;
                    711: 
                    712:        /* Transmitter timeout, serious problems. */
                    713:        if (dev->tbusy) {
                    714:                int tickssofar = jiffies - dev->trans_start;
                    715:                if (tickssofar < 20)
                    716:                        return 1;
                    717:                outw(0, ioaddr+LANCE_ADDR);
                    718:                printk("%s: transmit timed out, status %4.4x, resetting.\n",
                    719:                           dev->name, inw(ioaddr+LANCE_DATA));
                    720:                outw(0x0004, ioaddr+LANCE_DATA);
                    721:                lp->stats.tx_errors++;
                    722: #ifndef final_version
                    723:                {
                    724:                        int i;
                    725:                        printk(" Ring data dump: dirty_tx %d cur_tx %d%s cur_rx %d.",
                    726:                                   lp->dirty_tx, lp->cur_tx, lp->tx_full ? " (full)" : "",
                    727:                                   lp->cur_rx);
                    728:                        for (i = 0 ; i < RX_RING_SIZE; i++)
                    729:                                printk("%s %08x %04x %04x", i & 0x3 ? "" : "\n ",
                    730:                                           lp->rx_ring[i].base, -lp->rx_ring[i].buf_length,
                    731:                                           lp->rx_ring[i].msg_length);
                    732:                        for (i = 0 ; i < TX_RING_SIZE; i++)
                    733:                                printk("%s %08x %04x %04x", i & 0x3 ? "" : "\n ",
                    734:                                           lp->tx_ring[i].base, -lp->tx_ring[i].length,
                    735:                                           lp->tx_ring[i].misc);
                    736:                        printk("\n");
                    737:                }
                    738: #endif
                    739:                lance_restart(dev, 0x0043, 1);
                    740: 
                    741:                dev->tbusy=0;
                    742:                dev->trans_start = jiffies;
                    743: 
                    744:                return 0;
                    745:        }
                    746: 
                    747:        if (skb == NULL) {
                    748:                dev_tint(dev);
                    749:                return 0;
                    750:        }
                    751: 
                    752:        if (skb->len <= 0)
                    753:                return 0;
                    754: 
                    755:        if (lance_debug > 3) {
                    756:                outw(0x0000, ioaddr+LANCE_ADDR);
                    757:                printk("%s: lance_start_xmit() called, csr0 %4.4x.\n", dev->name,
                    758:                           inw(ioaddr+LANCE_DATA));
                    759:                outw(0x0000, ioaddr+LANCE_DATA);
                    760:        }
                    761: 
                    762:        /* Block a timer-based transmit from overlapping.  This could better be
                    763:           done with atomic_swap(1, dev->tbusy), but set_bit() works as well. */
                    764:        if (set_bit(0, (void*)&dev->tbusy) != 0) {
                    765:                printk("%s: Transmitter access conflict.\n", dev->name);
                    766:                return 1;
                    767:        }
                    768: 
                    769:        if (set_bit(0, (void*)&lp->lock) != 0) {
                    770:                if (lance_debug > 0)
                    771:                        printk("%s: tx queue lock!.\n", dev->name);
                    772:                /* don't clear dev->tbusy flag. */
                    773:                return 1;
                    774:        }
                    775: 
                    776:        /* Fill in a Tx ring entry */
                    777: 
                    778:        /* Mask to ring buffer boundary. */
                    779:        entry = lp->cur_tx & TX_RING_MOD_MASK;
                    780: 
                    781:        /* Caution: the write order is important here, set the base address
                    782:           with the "ownership" bits last. */
                    783: 
                    784:        /* The old LANCE chips doesn't automatically pad buffers to min. size. */
                    785:        if (chip_table[lp->chip_version].flags & LANCE_MUST_PAD) {
                    786:                lp->tx_ring[entry].length =
                    787:                        -(ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN);
                    788:        } else
                    789:                lp->tx_ring[entry].length = -skb->len;
                    790: 
                    791:        lp->tx_ring[entry].misc = 0x0000;
                    792: 
                    793:        /* If any part of this buffer is >16M we must copy it to a low-memory
                    794:           buffer. */
                    795:        if ((int)(skb->data) + skb->len > 0x01000000) {
                    796:                if (lance_debug > 5)
                    797:                        printk("%s: bouncing a high-memory packet (%#x).\n",
                    798:                                   dev->name, (int)(skb->data));
                    799:                memcpy(&lp->tx_bounce_buffs[entry], skb->data, skb->len);
                    800:                lp->tx_ring[entry].base =
                    801:                        (int)(lp->tx_bounce_buffs + entry) | 0x83000000;
                    802:                dev_kfree_skb (skb, FREE_WRITE);
                    803:        } else {
                    804:                lp->tx_skbuff[entry] = skb;
                    805:                lp->tx_ring[entry].base = (int)(skb->data) | 0x83000000;
                    806:        }
                    807:        lp->cur_tx++;
                    808: 
                    809:        /* Trigger an immediate send poll. */
                    810:        outw(0x0000, ioaddr+LANCE_ADDR);
                    811:        outw(0x0048, ioaddr+LANCE_DATA);
                    812: 
                    813:        dev->trans_start = jiffies;
                    814: 
                    815:        save_flags(flags);
                    816:        cli();
                    817:        lp->lock = 0;
                    818:        if (lp->tx_ring[(entry+1) & TX_RING_MOD_MASK].base == 0)
                    819:                dev->tbusy=0;
                    820:        else
                    821:                lp->tx_full = 1;
                    822:        restore_flags(flags);
                    823: 
                    824:        return 0;
                    825: }
                    826: 
                    827: /* The LANCE interrupt handler. */
                    828: static void
                    829: lance_interrupt(int irq, struct pt_regs * regs)
                    830: {
                    831:        struct device *dev = (struct device *)(irq2dev_map[irq]);
                    832:        struct lance_private *lp;
                    833:        int csr0, ioaddr, boguscnt=10;
                    834:        int must_restart;
                    835: 
                    836:        if (dev == NULL) {
                    837:                printk ("lance_interrupt(): irq %d for unknown device.\n", irq);
                    838:                return;
                    839:        }
                    840: 
                    841:        ioaddr = dev->base_addr;
                    842:        lp = (struct lance_private *)dev->priv;
                    843:        if (dev->interrupt)
                    844:                printk("%s: Re-entering the interrupt handler.\n", dev->name);
                    845: 
                    846:        dev->interrupt = 1;
                    847: 
                    848:        outw(0x00, dev->base_addr + LANCE_ADDR);
                    849:        while ((csr0 = inw(dev->base_addr + LANCE_DATA)) & 0x8600
                    850:                   && --boguscnt >= 0) {
                    851:                /* Acknowledge all of the current interrupt sources ASAP. */
                    852:                outw(csr0 & ~0x004f, dev->base_addr + LANCE_DATA);
                    853: 
                    854:                must_restart = 0;
                    855: 
                    856:                if (lance_debug > 5)
                    857:                        printk("%s: interrupt  csr0=%#2.2x new csr=%#2.2x.\n",
                    858:                                   dev->name, csr0, inw(dev->base_addr + LANCE_DATA));
                    859: 
                    860:                if (csr0 & 0x0400)                      /* Rx interrupt */
                    861:                        lance_rx(dev);
                    862: 
                    863:                if (csr0 & 0x0200) {            /* Tx-done interrupt */
                    864:                        int dirty_tx = lp->dirty_tx;
                    865: 
                    866:                        while (dirty_tx < lp->cur_tx) {
                    867:                                int entry = dirty_tx & TX_RING_MOD_MASK;
                    868:                                int status = lp->tx_ring[entry].base;
                    869:                        
                    870:                                if (status < 0)
                    871:                                        break;                  /* It still hasn't been Txed */
                    872: 
                    873:                                lp->tx_ring[entry].base = 0;
                    874: 
                    875:                                if (status & 0x40000000) {
                    876:                                        /* There was an major error, log it. */
                    877:                                        int err_status = lp->tx_ring[entry].misc;
                    878:                                        lp->stats.tx_errors++;
                    879:                                        if (err_status & 0x0400) lp->stats.tx_aborted_errors++;
                    880:                                        if (err_status & 0x0800) lp->stats.tx_carrier_errors++;
                    881:                                        if (err_status & 0x1000) lp->stats.tx_window_errors++;
                    882:                                        if (err_status & 0x4000) {
                    883:                                                /* Ackk!  On FIFO errors the Tx unit is turned off! */
                    884:                                                lp->stats.tx_fifo_errors++;
                    885:                                                /* Remove this verbosity later! */
                    886:                                                printk("%s: Tx FIFO error! Status %4.4x.\n",
                    887:                                                           dev->name, csr0);
                    888:                                                /* Restart the chip. */
                    889:                                                must_restart = 1;
                    890:                                        }
                    891:                                } else {
                    892:                                        if (status & 0x18000000)
                    893:                                                lp->stats.collisions++;
                    894:                                        lp->stats.tx_packets++;
                    895:                                }
                    896: 
                    897:                                /* We must free the original skb if it's not a data-only copy
                    898:                                   in the bounce buffer. */
                    899:                                if (lp->tx_skbuff[entry]) {
                    900:                                        dev_kfree_skb(lp->tx_skbuff[entry],FREE_WRITE);
                    901:                                        lp->tx_skbuff[entry] = 0;
                    902:                                }
                    903:                                dirty_tx++;
                    904:                        }
                    905: 
                    906: #ifndef final_version
                    907:                        if (lp->cur_tx - dirty_tx >= TX_RING_SIZE) {
                    908:                                printk("out-of-sync dirty pointer, %d vs. %d, full=%d.\n",
                    909:                                           dirty_tx, lp->cur_tx, lp->tx_full);
                    910:                                dirty_tx += TX_RING_SIZE;
                    911:                        }
                    912: #endif
                    913: 
                    914:                        if (lp->tx_full && dev->tbusy
                    915:                                && dirty_tx > lp->cur_tx - TX_RING_SIZE + 2) {
                    916:                                /* The ring is no longer full, clear tbusy. */
                    917:                                lp->tx_full = 0;
                    918:                                dev->tbusy = 0;
                    919:                                mark_bh(NET_BH);
                    920:                        }
                    921: 
                    922:                        lp->dirty_tx = dirty_tx;
                    923:                }
                    924: 
                    925:                /* Log misc errors. */
                    926:                if (csr0 & 0x4000) lp->stats.tx_errors++; /* Tx babble. */
                    927:                if (csr0 & 0x1000) lp->stats.rx_errors++; /* Missed a Rx frame. */
                    928:                if (csr0 & 0x0800) {
                    929:                        printk("%s: Bus master arbitration failure, status %4.4x.\n",
                    930:                                   dev->name, csr0);
                    931:                        /* Restart the chip. */
                    932:                        must_restart = 1;
                    933:                }
                    934: 
                    935:                if (must_restart) {
                    936:                        /* stop the chip to clear the error condition, then restart */
                    937:                        outw(0x0000, dev->base_addr + LANCE_ADDR);
                    938:                        outw(0x0004, dev->base_addr + LANCE_DATA);
                    939:                        lance_restart(dev, 0x0002, 0);
                    940:                }
                    941:        }
                    942: 
                    943:     /* Clear any other interrupt, and set interrupt enable. */
                    944:     outw(0x0000, dev->base_addr + LANCE_ADDR);
                    945:     outw(0x7940, dev->base_addr + LANCE_DATA);
                    946: 
                    947:        if (lance_debug > 4)
                    948:                printk("%s: exiting interrupt, csr%d=%#4.4x.\n",
                    949:                           dev->name, inw(ioaddr + LANCE_ADDR),
                    950:                           inw(dev->base_addr + LANCE_DATA));
                    951: 
                    952:        dev->interrupt = 0;
                    953:        return;
                    954: }
                    955: 
                    956: static int
                    957: lance_rx(struct device *dev)
                    958: {
                    959:        struct lance_private *lp = (struct lance_private *)dev->priv;
                    960:        int entry = lp->cur_rx & RX_RING_MOD_MASK;
                    961:        int i;
                    962:                
                    963:        /* If we own the next entry, it's a new packet. Send it up. */
                    964:        while (lp->rx_ring[entry].base >= 0) {
                    965:                int status = lp->rx_ring[entry].base >> 24;
                    966: 
                    967:                if (status != 0x03) {                   /* There was an error. */
                    968:                        /* There is a tricky error noted by John Murphy,
                    969:                           <[email protected]> to Russ Nelson: Even with full-sized
                    970:                           buffers it's possible for a jabber packet to use two
                    971:                           buffers, with only the last correctly noting the error. */
                    972:                        if (status & 0x01)      /* Only count a general error at the */
                    973:                                lp->stats.rx_errors++; /* end of a packet.*/
                    974:                        if (status & 0x20) lp->stats.rx_frame_errors++;
                    975:                        if (status & 0x10) lp->stats.rx_over_errors++;
                    976:                        if (status & 0x08) lp->stats.rx_crc_errors++;
                    977:                        if (status & 0x04) lp->stats.rx_fifo_errors++;
                    978:                        lp->rx_ring[entry].base &= 0x03ffffff;
                    979:                }
                    980:                else 
                    981:                {
                    982:                        /* Malloc up new buffer, compatible with net-2e. */
                    983:                        short pkt_len = (lp->rx_ring[entry].msg_length & 0xfff)-4;
                    984:                        struct sk_buff *skb;
                    985:                        
                    986:                        if(pkt_len<60)
                    987:                        {
                    988:                                printk("%s: Runt packet!\n",dev->name);
                    989:                                lp->stats.rx_errors++;
                    990:                        }
                    991:                        else
                    992:                        {
                    993:                                skb = dev_alloc_skb(pkt_len+2);
                    994:                                if (skb == NULL) 
                    995:                                {
                    996:                                        printk("%s: Memory squeeze, deferring packet.\n", dev->name);
                    997:                                        for (i=0; i < RX_RING_SIZE; i++)
                    998:                                                if (lp->rx_ring[(entry+i) & RX_RING_MOD_MASK].base < 0)
                    999:                                                        break;
                   1000: 
                   1001:                                        if (i > RX_RING_SIZE -2) 
                   1002:                                        {
                   1003:                                                lp->stats.rx_dropped++;
                   1004:                                                lp->rx_ring[entry].base |= 0x80000000;
                   1005:                                                lp->cur_rx++;
                   1006:                                        }
                   1007:                                        break;
                   1008:                                }
                   1009:                                skb->dev = dev;
                   1010:                                skb_reserve(skb,2);     /* 16 byte align */
                   1011:                                skb_put(skb,pkt_len);   /* Make room */
                   1012:                                eth_copy_and_sum(skb,
                   1013:                                        (unsigned char *)(lp->rx_ring[entry].base & 0x00ffffff),
                   1014:                                        pkt_len,0);
                   1015:                                skb->protocol=eth_type_trans(skb,dev);
                   1016:                                netif_rx(skb);
                   1017:                                lp->stats.rx_packets++;
                   1018:                        }
                   1019:                }
                   1020:                /* The docs say that the buffer length isn't touched, but Andrew Boyd
                   1021:                   of QNX reports that some revs of the 79C965 clear it. */
                   1022:                lp->rx_ring[entry].buf_length = -PKT_BUF_SZ;
                   1023:                lp->rx_ring[entry].base |= 0x80000000;
                   1024:                entry = (++lp->cur_rx) & RX_RING_MOD_MASK;
                   1025:        }
                   1026: 
                   1027:        /* We should check that at least two ring entries are free.      If not,
                   1028:           we should free one and mark stats->rx_dropped++. */
                   1029: 
                   1030:        return 0;
                   1031: }
                   1032: 
                   1033: static int
                   1034: lance_close(struct device *dev)
                   1035: {
                   1036:        int ioaddr = dev->base_addr;
                   1037:        struct lance_private *lp = (struct lance_private *)dev->priv;
                   1038: 
                   1039:        dev->start = 0;
                   1040:        dev->tbusy = 1;
                   1041: 
                   1042:        if (chip_table[lp->chip_version].flags & LANCE_HAS_MISSED_FRAME) {
                   1043:                outw(112, ioaddr+LANCE_ADDR);
                   1044:                lp->stats.rx_missed_errors = inw(ioaddr+LANCE_DATA);
                   1045:        }
                   1046:        outw(0, ioaddr+LANCE_ADDR);
                   1047: 
                   1048:        if (lance_debug > 1)
                   1049:                printk("%s: Shutting down ethercard, status was %2.2x.\n",
                   1050:                           dev->name, inw(ioaddr+LANCE_DATA));
                   1051: 
                   1052:        /* We stop the LANCE here -- it occasionally polls
                   1053:           memory if we don't. */
                   1054:        outw(0x0004, ioaddr+LANCE_DATA);
                   1055: 
                   1056:        if (dev->dma != 4)
                   1057:                disable_dma(dev->dma);
                   1058: 
                   1059:        free_irq(dev->irq);
                   1060: 
                   1061:        irq2dev_map[dev->irq] = 0;
                   1062: 
                   1063:        return 0;
                   1064: }
                   1065: 
                   1066: static struct enet_statistics *
                   1067: lance_get_stats(struct device *dev)
                   1068: {
                   1069:        struct lance_private *lp = (struct lance_private *)dev->priv;
                   1070:        short ioaddr = dev->base_addr;
                   1071:        short saved_addr;
                   1072:        unsigned long flags;
                   1073: 
                   1074:        if (chip_table[lp->chip_version].flags & LANCE_HAS_MISSED_FRAME) {
                   1075:                save_flags(flags);
                   1076:                cli();
                   1077:                saved_addr = inw(ioaddr+LANCE_ADDR);
                   1078:                outw(112, ioaddr+LANCE_ADDR);
                   1079:                lp->stats.rx_missed_errors = inw(ioaddr+LANCE_DATA);
                   1080:                outw(saved_addr, ioaddr+LANCE_ADDR);
                   1081:                restore_flags(flags);
                   1082:        }
                   1083: 
                   1084:        return &lp->stats;
                   1085: }
                   1086: 
                   1087: /* Set or clear the multicast filter for this adaptor.
                   1088:  */
                   1089: 
                   1090: static void set_multicast_list(struct device *dev)
                   1091: {
                   1092:        short ioaddr = dev->base_addr;
                   1093: 
                   1094:        outw(0, ioaddr+LANCE_ADDR);
                   1095:        outw(0x0004, ioaddr+LANCE_DATA); /* Temporarily stop the lance.  */
                   1096: 
                   1097:        if (dev->flags&IFF_PROMISC) {
                   1098:                /* Log any net taps. */
                   1099:                printk("%s: Promiscuous mode enabled.\n", dev->name);
                   1100:                outw(15, ioaddr+LANCE_ADDR);
                   1101:                outw(0x8000, ioaddr+LANCE_DATA); /* Set promiscuous mode */
                   1102:        } else {
                   1103:                short multicast_table[4];
                   1104:                int i;
                   1105:                int num_addrs=dev->mc_count;
                   1106:                if(dev->flags&IFF_ALLMULTI)
                   1107:                        num_addrs=1;
                   1108:                /* FIXIT: We don't use the multicast table, but rely on upper-layer filtering. */
                   1109:                memset(multicast_table, (num_addrs == 0) ? 0 : -1, sizeof(multicast_table));
                   1110:                for (i = 0; i < 4; i++) {
                   1111:                        outw(8 + i, ioaddr+LANCE_ADDR);
                   1112:                        outw(multicast_table[i], ioaddr+LANCE_DATA);
                   1113:                }
                   1114:                outw(15, ioaddr+LANCE_ADDR);
                   1115:                outw(0x0000, ioaddr+LANCE_DATA); /* Unset promiscuous mode */
                   1116:        }
                   1117: 
                   1118:        lance_restart(dev, 0x0142, 0); /*  Resume normal operation */
                   1119: 
                   1120: }
                   1121: 
                   1122: 
                   1123: /*
                   1124:  * Local variables:
                   1125:  *  compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -m486 -c lance.c"
                   1126:  *  c-indent-level: 4
                   1127:  *  tab-width: 4
                   1128:  * End:
                   1129:  */

unix.superglobalmegacorp.com

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