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

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

unix.superglobalmegacorp.com

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