Annotation of Gnu-Mach/linux/src/drivers/net/3c505.c, revision 1.1.1.2

1.1       root        1: /*
                      2:  * Linux ethernet device driver for the 3Com Etherlink Plus (3C505)
                      3:  *      By Craig Southeren, Juha Laiho and Philip Blundell
                      4:  *
                      5:  * 3c505.c      This module implements an interface to the 3Com
                      6:  *              Etherlink Plus (3c505) ethernet card. Linux device 
                      7:  *              driver interface reverse engineered from the Linux 3C509
                      8:  *              device drivers. Some 3C505 information gleaned from
                      9:  *              the Crynwr packet driver. Still this driver would not
                     10:  *              be here without 3C505 technical reference provided by
                     11:  *              3Com.
                     12:  *
                     13:  * $Id: 3c505.c,v 1.1 1999/04/26 05:51:48 tb Exp $
                     14:  *
                     15:  * Authors:     Linux 3c505 device driver by
                     16:  *                      Craig Southeren, <[email protected]>
                     17:  *              Final debugging by
                     18:  *                      Andrew Tridgell, <[email protected]>
                     19:  *              Auto irq/address, tuning, cleanup and v1.1.4+ kernel mods by
                     20:  *                      Juha Laiho, <[email protected]>
                     21:  *              Linux 3C509 driver by
                     22:  *                      Donald Becker, <[email protected]>
                     23:  *              Crynwr packet driver by
                     24:  *                      Krishnan Gopalan and Gregg Stefancik,
                     25:  *                      Clemson University Engineering Computer Operations.
                     26:  *                      Portions of the code have been adapted from the 3c505
                     27:  *                         driver for NCSA Telnet by Bruce Orchard and later
                     28:  *                         modified by Warren Van Houten and [email protected].
                     29:  *              3C505 technical information provided by
                     30:  *                      Terry Murphy, of 3Com Network Adapter Division
                     31:  *              Linux 1.3.0 changes by
                     32:  *                      Alan Cox <[email protected]>
                     33:  *              More debugging and DMA version by Philip Blundell
                     34:  */
                     35: 
                     36: /* Theory of operation:
                     37: 
                     38:  * The 3c505 is quite an intelligent board.  All communication with it is done
                     39:  * by means of Primary Command Blocks (PCBs); these are transferred using PIO
                     40:  * through the command register.  The card has 256k of on-board RAM, which is
                     41:  * used to buffer received packets.  It might seem at first that more buffers
                     42:  * are better, but in fact this isn't true.  From my tests, it seems that
                     43:  * more than about 10 buffers are unnecessary, and there is a noticeable
                     44:  * performance hit in having more active on the card.  So the majority of the
                     45:  * card's memory isn't, in fact, used.
                     46:  *
                     47:  * We keep up to 4 "receive packet" commands active on the board at a time.
                     48:  * When a packet comes in, so long as there is a receive command active, the
                     49:  * board will send us a "packet received" PCB and then add the data for that
                     50:  * packet to the DMA queue.  If a DMA transfer is not already in progress, we
                     51:  * set one up to start uploading the data.  We have to maintain a list of
                     52:  * backlogged receive packets, because the card may decide to tell us about
                     53:  * a newly-arrived packet at any time, and we may not be able to start a DMA
                     54:  * transfer immediately (ie one may already be going on).  We can't NAK the
                     55:  * PCB, because then it would throw the packet away.
                     56:  *
                     57:  * Trying to send a PCB to the card at the wrong moment seems to have bad
                     58:  * effects.  If we send it a transmit PCB while a receive DMA is happening,
                     59:  * it will just NAK the PCB and so we will have wasted our time.  Worse, it
                     60:  * sometimes seems to interrupt the transfer.  The majority of the low-level
                     61:  * code is protected by one huge semaphore -- "busy" -- which is set whenever
                     62:  * it probably isn't safe to do anything to the card.  The receive routine
                     63:  * must gain a lock on "busy" before it can start a DMA transfer, and the
                     64:  * transmit routine must gain a lock before it sends the first PCB to the card.
                     65:  * The send_pcb() routine also has an internal semaphore to protect it against
                     66:  * being re-entered (which would be disastrous) -- this is needed because
                     67:  * several things can happen asynchronously (re-priming the receiver and
                     68:  * asking the card for statistics, for example).  send_pcb() will also refuse
                     69:  * to talk to the card at all if a DMA upload is happening.  The higher-level
                     70:  * networking code will reschedule a later retry if some part of the driver
                     71:  * is blocked.  In practice, this doesn't seem to happen very often.
                     72:  */
                     73: 
                     74: /* This driver will not work with revision 2 hardware, because the host
                     75:  * control register is write-only.  It should be fairly easy to arrange to
                     76:  * keep our own soft-copy of the intended contents of this register, if
                     77:  * somebody has the time.  There may be firmware differences that cause
                     78:  * other problems, though, and I don't have an old card to test.
                     79:  */
                     80: 
                     81: /* The driver is a mess.  I took Craig's and Juha's code, and hacked it firstly
                     82:  * to make it more reliable, and secondly to add DMA mode.  Many things could
                     83:  * probably be done better; the concurrency protection is particularly awful.
                     84:  */
                     85: 
                     86: #include <linux/module.h>
                     87: 
                     88: #include <linux/kernel.h>
                     89: #include <linux/sched.h>
                     90: #include <linux/string.h>
                     91: #include <linux/interrupt.h>
                     92: #include <linux/ptrace.h>
                     93: #include <linux/errno.h>
                     94: #include <linux/in.h>
                     95: #include <linux/malloc.h>
                     96: #include <linux/ioport.h>
                     97: #include <asm/bitops.h>
                     98: #include <asm/io.h>
                     99: #include <asm/dma.h>
                    100: 
                    101: #include <linux/netdevice.h>
                    102: #include <linux/etherdevice.h>
                    103: #include <linux/skbuff.h>
                    104: 
                    105: #include "3c505.h"
                    106: 
                    107: #define ELP_DMA      6         /* DMA channel to use */
                    108: #define ELP_RX_PCBS  4
                    109: 
                    110: /*********************************************************
                    111:  *
                    112:  *  define debug messages here as common strings to reduce space
                    113:  *
                    114:  *********************************************************/
                    115: 
                    116: static const char *filename = __FILE__;
                    117: 
                    118: static const char *timeout_msg = "*** timeout at %s:%s (line %d) ***\n";
                    119: #define TIMEOUT_MSG(lineno) \
                    120:        printk(timeout_msg, filename,__FUNCTION__,(lineno))
                    121: 
                    122: static const char *invalid_pcb_msg =
                    123: "*** invalid pcb length %d at %s:%s (line %d) ***\n";
                    124: #define INVALID_PCB_MSG(len) \
                    125:        printk(invalid_pcb_msg, (len),filename,__FUNCTION__,__LINE__)
                    126: 
                    127: static const char *search_msg = "%s: Looking for 3c505 adapter at address %#x...";
                    128: 
                    129: static const char *stilllooking_msg = "still looking...";
                    130: 
                    131: static const char *found_msg = "found.\n";
                    132: 
                    133: static const char *notfound_msg = "not found (reason = %d)\n";
                    134: 
                    135: static const char *couldnot_msg = "%s: 3c505 not found\n";
                    136: 
                    137: /*********************************************************
                    138:  *
                    139:  *  various other debug stuff
                    140:  *
                    141:  *********************************************************/
                    142: 
                    143: #ifdef ELP_DEBUG
                    144: static const int elp_debug = ELP_DEBUG;
                    145: #else
                    146: static const int elp_debug = 0;
                    147: #endif
                    148: 
                    149: /*
                    150:  *  0 = no messages (well, some)
                    151:  *  1 = messages when high level commands performed
                    152:  *  2 = messages when low level commands performed
                    153:  *  3 = messages when interrupts received
                    154:  */
                    155: 
                    156: /*****************************************************************
                    157:  *
                    158:  * useful macros
                    159:  *
                    160:  *****************************************************************/
                    161: 
                    162: #ifndef        TRUE
                    163: #define        TRUE    1
                    164: #endif
                    165: 
                    166: #ifndef        FALSE
                    167: #define        FALSE   0
                    168: #endif
                    169: 
                    170: 
                    171: /*****************************************************************
                    172:  *
                    173:  * List of I/O-addresses we try to auto-sense
                    174:  * Last element MUST BE 0!
                    175:  *****************************************************************/
                    176: 
                    177: const int addr_list[] = {0x300, 0x280, 0x310, 0};
                    178: 
                    179: /* Dma Memory related stuff */
                    180: 
                    181: /* Pure 2^n version of get_order */
                    182: static inline int __get_order(unsigned long size)
                    183: {
                    184:        int order;
                    185: 
                    186:        size = (size - 1) >> (PAGE_SHIFT - 1);
                    187:        order = -1;
                    188:        do {
                    189:                size >>= 1;
                    190:                order++;
                    191:        } while (size);
                    192:        return order;
                    193: }
                    194: 
                    195: static unsigned long dma_mem_alloc(int size)
                    196: {
                    197:        int order = __get_order(size);
                    198: 
                    199:        return __get_dma_pages(GFP_KERNEL, order);
                    200: }
                    201: 
                    202: 
                    203: /*****************************************************************
                    204:  *
                    205:  * Functions for I/O (note the inline !)
                    206:  *
                    207:  *****************************************************************/
                    208: 
                    209: static inline unsigned char inb_status(unsigned int base_addr)
                    210: {
                    211:        return inb(base_addr + PORT_STATUS);
                    212: }
                    213: 
                    214: static inline unsigned char inb_control(unsigned int base_addr)
                    215: {
                    216:        return inb(base_addr + PORT_CONTROL);
                    217: }
                    218: 
                    219: static inline int inb_command(unsigned int base_addr)
                    220: {
                    221:        return inb(base_addr + PORT_COMMAND);
                    222: }
                    223: 
                    224: static inline void outb_control(unsigned char val, unsigned int base_addr)
                    225: {
                    226:        outb(val, base_addr + PORT_CONTROL);
                    227: }
                    228: 
                    229: static inline void outb_command(unsigned char val, unsigned int base_addr)
                    230: {
                    231:        outb(val, base_addr + PORT_COMMAND);
                    232: }
                    233: 
                    234: static inline unsigned int inw_data(unsigned int base_addr)
                    235: {
                    236:        return inw(base_addr + PORT_DATA);
                    237: }
                    238: 
                    239: static inline void outw_data(unsigned int val, unsigned int base_addr)
                    240: {
                    241:        outw(val, base_addr + PORT_DATA);
                    242: }
                    243: 
                    244: 
                    245: /*****************************************************************
                    246:  *
                    247:  *  structure to hold context information for adapter
                    248:  *
                    249:  *****************************************************************/
                    250: 
                    251: #define DMA_BUFFER_SIZE  1600
                    252: #define BACKLOG_SIZE      4
                    253: 
                    254: typedef struct {
                    255:        volatile short got[NUM_TRANSMIT_CMDS];  /* flags for command completion */
                    256:        pcb_struct tx_pcb;      /* PCB for foreground sending */
                    257:        pcb_struct rx_pcb;      /* PCB for foreground receiving */
                    258:        pcb_struct itx_pcb;     /* PCB for background sending */
                    259:        pcb_struct irx_pcb;     /* PCB for background receiving */
                    260:        struct enet_statistics stats;
                    261: 
                    262:        void *dma_buffer;
                    263: 
                    264:        struct {
                    265:                unsigned int length[BACKLOG_SIZE];
                    266:                unsigned int in;
                    267:                unsigned int out;
                    268:        } rx_backlog;
                    269: 
                    270:        struct {
                    271:                unsigned int direction;
                    272:                unsigned int length;
                    273:                unsigned int copy_flag;
                    274:                struct sk_buff *skb;
                    275:                long int start_time;
                    276:        } current_dma;
                    277: 
                    278:        /* flags */
                    279:        unsigned long send_pcb_semaphore;
                    280:        unsigned int dmaing;
                    281:        unsigned long busy;
                    282: 
                    283:        unsigned int rx_active;  /* number of receive PCBs */
                    284: } elp_device;
                    285: 
                    286: static inline unsigned int backlog_next(unsigned int n)
                    287: {
                    288:        return (n + 1) % BACKLOG_SIZE;
                    289: }
                    290: 
                    291: /*****************************************************************
                    292:  *
                    293:  *  useful functions for accessing the adapter
                    294:  *
                    295:  *****************************************************************/
                    296: 
                    297: /*
                    298:  * use this routine when accessing the ASF bits as they are
                    299:  * changed asynchronously by the adapter
                    300:  */
                    301: 
                    302: /* get adapter PCB status */
                    303: #define        GET_ASF(addr) \
                    304:        (get_status(addr)&ASF_PCB_MASK)
                    305: 
                    306: static inline int get_status(unsigned int base_addr)
                    307: {
                    308:        int timeout = jiffies + 10;
                    309:        register int stat1;
                    310:        do {
                    311:                stat1 = inb_status(base_addr);
                    312:        } while (stat1 != inb_status(base_addr) && jiffies < timeout);
                    313:        if (jiffies >= timeout)
                    314:                TIMEOUT_MSG(__LINE__);
                    315:        return stat1;
                    316: }
                    317: 
                    318: static inline void set_hsf(unsigned int base_addr, int hsf)
                    319: {
                    320:        cli();
                    321:        outb_control((inb_control(base_addr) & ~HSF_PCB_MASK) | hsf, base_addr);
                    322:        sti();
                    323: }
                    324: 
                    325: static int start_receive(struct device *, pcb_struct *);
                    326: 
                    327: inline static void adapter_reset(struct device *dev)
                    328: {
                    329:        int timeout;
                    330:        unsigned char orig_hcr = inb_control(dev->base_addr);
                    331: 
                    332:        elp_device *adapter = dev->priv;
                    333: 
                    334:        outb_control(0, dev->base_addr);
                    335: 
                    336:        if (inb_status(dev->base_addr) & ACRF) {
                    337:                do {
                    338:                        inb_command(dev->base_addr);
                    339:                        timeout = jiffies + 2;
                    340:                        while ((jiffies <= timeout) && !(inb_status(dev->base_addr) & ACRF));
                    341:                } while (inb_status(dev->base_addr) & ACRF);
                    342:                set_hsf(dev->base_addr, HSF_PCB_NAK);
                    343:        }
                    344:        outb_control(inb_control(dev->base_addr) | ATTN | DIR, dev->base_addr);
                    345:        timeout = jiffies + 1;
                    346:        while (jiffies <= timeout);
                    347:        outb_control(inb_control(dev->base_addr) & ~ATTN, dev->base_addr);
                    348:        timeout = jiffies + 1;
                    349:        while (jiffies <= timeout);
                    350:        outb_control(inb_control(dev->base_addr) | FLSH, dev->base_addr);
                    351:        timeout = jiffies + 1;
                    352:        while (jiffies <= timeout);
                    353:        outb_control(inb_control(dev->base_addr) & ~FLSH, dev->base_addr);
                    354:        timeout = jiffies + 1;
                    355:        while (jiffies <= timeout);
                    356: 
                    357:        outb_control(orig_hcr, dev->base_addr);
                    358:        if (!start_receive(dev, &adapter->tx_pcb))
                    359:                printk("%s: start receive command failed \n", dev->name);
                    360: }
                    361: 
                    362: /* Check to make sure that a DMA transfer hasn't timed out.  This should never happen
                    363:  * in theory, but seems to occur occasionally if the card gets prodded at the wrong
                    364:  * time.
                    365:  */
                    366: static inline void check_dma(struct device *dev)
                    367: {
                    368:        elp_device *adapter = dev->priv;
                    369:        if (adapter->dmaing && (jiffies > (adapter->current_dma.start_time + 10))) {
                    370:                unsigned long flags;
                    371:                printk("%s: DMA %s timed out, %d bytes left\n", dev->name, adapter->current_dma.direction ? "download" : "upload", get_dma_residue(dev->dma));
                    372:                save_flags(flags);
                    373:                cli();
                    374:                adapter->dmaing = 0;
                    375:                adapter->busy = 0;
                    376:                disable_dma(dev->dma);
                    377:                if (adapter->rx_active)
                    378:                        adapter->rx_active--;
                    379:                outb_control(inb_control(dev->base_addr) & ~(DMAE | TCEN | DIR), dev->base_addr);
                    380:                restore_flags(flags);
                    381:        }
                    382: }
                    383: 
                    384: /* Primitive functions used by send_pcb() */
                    385: static inline unsigned int send_pcb_slow(unsigned int base_addr, unsigned char byte)
                    386: {
                    387:        unsigned int timeout;
                    388:        outb_command(byte, base_addr);
                    389:        for (timeout = jiffies + 5; jiffies < timeout;) {
                    390:                if (inb_status(base_addr) & HCRE)
                    391:                        return FALSE;
                    392:        }
                    393:        printk("3c505: send_pcb_slow timed out\n");
                    394:        return TRUE;
                    395: }
                    396: 
                    397: static inline unsigned int send_pcb_fast(unsigned int base_addr, unsigned char byte)
                    398: {
                    399:        unsigned int timeout;
                    400:        outb_command(byte, base_addr);
                    401:        for (timeout = 0; timeout < 40000; timeout++) {
                    402:                if (inb_status(base_addr) & HCRE)
                    403:                        return FALSE;
                    404:        }
                    405:        printk("3c505: send_pcb_fast timed out\n");
                    406:        return TRUE;
                    407: }
                    408: 
                    409: /* Check to see if the receiver needs restarting, and kick it if so */
                    410: static inline void prime_rx(struct device *dev)
                    411: {
                    412:        elp_device *adapter = dev->priv;
                    413:        while (adapter->rx_active < ELP_RX_PCBS && dev->start) {
                    414:                if (!start_receive(dev, &adapter->itx_pcb))
                    415:                        break;
                    416:        }
                    417: }
                    418: 
                    419: /*****************************************************************
                    420:  *
                    421:  * send_pcb
                    422:  *   Send a PCB to the adapter. 
                    423:  *
                    424:  *     output byte to command reg  --<--+
                    425:  *     wait until HCRE is non zero      |
                    426:  *     loop until all bytes sent   -->--+
                    427:  *     set HSF1 and HSF2 to 1
                    428:  *     output pcb length
                    429:  *     wait until ASF give ACK or NAK
                    430:  *     set HSF1 and HSF2 to 0
                    431:  *
                    432:  *****************************************************************/
                    433: 
                    434: /* This can be quite slow -- the adapter is allowed to take up to 40ms
                    435:  * to respond to the initial interrupt.
                    436:  *
                    437:  * We run initially with interrupts turned on, but with a semaphore set
                    438:  * so that nobody tries to re-enter this code.  Once the first byte has
                    439:  * gone through, we turn interrupts off and then send the others (the
                    440:  * timeout is reduced to 500us).
                    441:  */
                    442: 
                    443: static int send_pcb(struct device *dev, pcb_struct * pcb)
                    444: {
                    445:        int i;
                    446:        int timeout;
                    447:        elp_device *adapter = dev->priv;
                    448: 
                    449:        check_dma(dev);
                    450: 
                    451:        if (adapter->dmaing && adapter->current_dma.direction == 0)
                    452:                return FALSE;
                    453: 
                    454:        /* Avoid contention */
                    455:        if (set_bit(1, &adapter->send_pcb_semaphore)) {
                    456:                if (elp_debug >= 3) {
                    457:                        printk("%s: send_pcb entered while threaded\n", dev->name);
                    458:                }
                    459:                return FALSE;
                    460:        }
                    461:        /*
                    462:         * load each byte into the command register and
                    463:         * wait for the HCRE bit to indicate the adapter
                    464:         * had read the byte
                    465:         */
                    466:        set_hsf(dev->base_addr, 0);
                    467: 
                    468:        if (send_pcb_slow(dev->base_addr, pcb->command))
                    469:                goto abort;
                    470: 
                    471:        cli();
                    472: 
                    473:        if (send_pcb_fast(dev->base_addr, pcb->length))
                    474:                goto sti_abort;
                    475: 
                    476:        for (i = 0; i < pcb->length; i++) {
                    477:                if (send_pcb_fast(dev->base_addr, pcb->data.raw[i]))
                    478:                        goto sti_abort;
                    479:        }
                    480: 
                    481:        outb_control(inb_control(dev->base_addr) | 3, dev->base_addr);  /* signal end of PCB */
                    482:        outb_command(2 + pcb->length, dev->base_addr);
                    483: 
                    484:        /* now wait for the acknowledgement */
                    485:        sti();
                    486: 
                    487:        for (timeout = jiffies + 5; jiffies < timeout;) {
                    488:                switch (GET_ASF(dev->base_addr)) {
                    489:                case ASF_PCB_ACK:
                    490:                        adapter->send_pcb_semaphore = 0;
                    491:                        return TRUE;
                    492:                        break;
                    493:                case ASF_PCB_NAK:
                    494:                        printk("%s: send_pcb got NAK\n", dev->name);
                    495:                        goto abort;
                    496:                        break;
                    497:                }
                    498:        }
                    499: 
                    500:        if (elp_debug >= 1)
                    501:                printk("%s: timeout waiting for PCB acknowledge (status %02x)\n", dev->name, inb_status(dev->base_addr));
                    502: 
                    503:       sti_abort:
                    504:        sti();
                    505:       abort:
                    506:        adapter->send_pcb_semaphore = 0;
                    507:        return FALSE;
                    508: }
                    509: 
                    510: 
                    511: /*****************************************************************
                    512:  *
                    513:  * receive_pcb
                    514:  *   Read a PCB from the adapter
                    515:  *
                    516:  *     wait for ACRF to be non-zero        ---<---+
                    517:  *     input a byte                               |
                    518:  *     if ASF1 and ASF2 were not both one         |
                    519:  *             before byte was read, loop      --->---+
                    520:  *     set HSF1 and HSF2 for ack
                    521:  *
                    522:  *****************************************************************/
                    523: 
                    524: static int receive_pcb(struct device *dev, pcb_struct * pcb)
                    525: {
                    526:        int i, j;
                    527:        int total_length;
                    528:        int stat;
                    529:        int timeout;
                    530: 
                    531:        elp_device *adapter = dev->priv;
                    532: 
                    533:        set_hsf(dev->base_addr, 0);
                    534: 
                    535:        /* get the command code */
                    536:        timeout = jiffies + 2;
                    537:        while (((stat = get_status(dev->base_addr)) & ACRF) == 0 && jiffies < timeout);
                    538:        if (jiffies >= timeout) {
                    539:                TIMEOUT_MSG(__LINE__);
                    540:                return FALSE;
                    541:        }
                    542:        pcb->command = inb_command(dev->base_addr);
                    543: 
                    544:        /* read the data length */
                    545:        timeout = jiffies + 3;
                    546:        while (((stat = get_status(dev->base_addr)) & ACRF) == 0 && jiffies < timeout);
                    547:        if (jiffies >= timeout) {
                    548:                TIMEOUT_MSG(__LINE__);
                    549:                printk("%s: status %02x\n", dev->name, stat);
                    550:                return FALSE;
                    551:        }
                    552:        pcb->length = inb_command(dev->base_addr);
                    553: 
                    554:        if (pcb->length > MAX_PCB_DATA) {
                    555:                INVALID_PCB_MSG(pcb->length);
                    556:                adapter_reset(dev);
                    557:                return FALSE;
                    558:        }
                    559:        /* read the data */
                    560:        cli();
                    561:        i = 0;
                    562:        do {
                    563:                j = 0;
                    564:                while (((stat = get_status(dev->base_addr)) & ACRF) == 0 && j++ < 20000);
                    565:                pcb->data.raw[i++] = inb_command(dev->base_addr);
                    566:                if (i > MAX_PCB_DATA)
                    567:                        INVALID_PCB_MSG(i);
                    568:        } while ((stat & ASF_PCB_MASK) != ASF_PCB_END && j < 20000);
                    569:        sti();
                    570:        if (j >= 20000) {
                    571:                TIMEOUT_MSG(__LINE__);
                    572:                return FALSE;
                    573:        }
                    574:        /* woops, the last "data" byte was really the length! */
                    575:        total_length = pcb->data.raw[--i];
                    576: 
                    577:        /* safety check total length vs data length */
                    578:        if (total_length != (pcb->length + 2)) {
                    579:                if (elp_debug >= 2)
                    580:                        printk("%s: mangled PCB received\n", dev->name);
                    581:                set_hsf(dev->base_addr, HSF_PCB_NAK);
                    582:                return FALSE;
                    583:        }
                    584: 
                    585:        if (pcb->command == CMD_RECEIVE_PACKET_COMPLETE) {
                    586:                if (set_bit(0, (void *) &adapter->busy)) {
                    587:                        if (backlog_next(adapter->rx_backlog.in) == adapter->rx_backlog.out) {
                    588:                                set_hsf(dev->base_addr, HSF_PCB_NAK);
                    589:                                printk("%s: PCB rejected, transfer in progress and backlog full\n", dev->name);
                    590:                                pcb->command = 0;
                    591:                                return TRUE;
                    592:                        } else {
                    593:                                pcb->command = 0xff;
                    594:                        }
                    595:                }
                    596:        }
                    597:        set_hsf(dev->base_addr, HSF_PCB_ACK);
                    598:        return TRUE;
                    599: }
                    600: 
                    601: /******************************************************
                    602:  *
                    603:  *  queue a receive command on the adapter so we will get an
                    604:  *  interrupt when a packet is received.
                    605:  *
                    606:  ******************************************************/
                    607: 
                    608: static int start_receive(struct device *dev, pcb_struct * tx_pcb)
                    609: {
                    610:        int status;
                    611:        elp_device *adapter = dev->priv;
                    612: 
                    613:        if (elp_debug >= 3)
                    614:                printk("%s: restarting receiver\n", dev->name);
                    615:        tx_pcb->command = CMD_RECEIVE_PACKET;
                    616:        tx_pcb->length = sizeof(struct Rcv_pkt);
                    617:        tx_pcb->data.rcv_pkt.buf_seg
                    618:            = tx_pcb->data.rcv_pkt.buf_ofs = 0;         /* Unused */
                    619:        tx_pcb->data.rcv_pkt.buf_len = 1600;
                    620:        tx_pcb->data.rcv_pkt.timeout = 0;       /* set timeout to zero */
                    621:        status = send_pcb(dev, tx_pcb);
                    622:        if (status)
                    623:                adapter->rx_active++;
                    624:        return status;
                    625: }
                    626: 
                    627: /******************************************************
                    628:  *
                    629:  * extract a packet from the adapter
                    630:  * this routine is only called from within the interrupt
                    631:  * service routine, so no cli/sti calls are needed
                    632:  * note that the length is always assumed to be even
                    633:  *
                    634:  ******************************************************/
                    635: 
                    636: static void receive_packet(struct device *dev, int len)
                    637: {
                    638:        int rlen;
                    639:        elp_device *adapter = dev->priv;
                    640:        unsigned long target;
                    641:        struct sk_buff *skb;
                    642: 
                    643:        rlen = (len + 1) & ~1;
                    644:        skb = dev_alloc_skb(rlen + 2);
                    645: 
                    646:        adapter->current_dma.copy_flag = 0;
                    647: 
                    648:        if (!skb) {
                    649:          printk("%s: memory squeeze, dropping packet\n", dev->name);
                    650:          target = virt_to_bus(adapter->dma_buffer);
                    651:        } else {
                    652:          skb_reserve(skb, 2);
                    653:          target = virt_to_bus(skb_put(skb, rlen));
                    654:          if ((target + rlen) >= MAX_DMA_ADDRESS) {
                    655:            target = virt_to_bus(adapter->dma_buffer);
                    656:            adapter->current_dma.copy_flag = 1;
                    657:          }
                    658:        }
                    659:        /* if this happens, we die */
                    660:        if (set_bit(0, (void *) &adapter->dmaing))
                    661:                printk("%s: rx blocked, DMA in progress, dir %d\n", dev->name, adapter->current_dma.direction);
                    662: 
                    663:        adapter->current_dma.direction = 0;
                    664:        adapter->current_dma.length = rlen;
                    665:        adapter->current_dma.skb = skb;
                    666:        adapter->current_dma.start_time = jiffies;
                    667: 
                    668:        outb_control(inb_control(dev->base_addr) | DIR | TCEN | DMAE, dev->base_addr);
                    669: 
                    670:        disable_dma(dev->dma);
                    671:        clear_dma_ff(dev->dma);
                    672:        set_dma_mode(dev->dma, 0x04);   /* dma read */
                    673:        set_dma_addr(dev->dma, target);
                    674:        set_dma_count(dev->dma, rlen);
                    675:        enable_dma(dev->dma);
                    676: 
                    677:        if (elp_debug >= 3) {
                    678:                printk("%s: rx DMA transfer started\n", dev->name);
                    679:        }
                    680:        if (adapter->rx_active)
                    681:                adapter->rx_active--;
                    682: 
                    683:        if (!adapter->busy)
                    684:                printk("%s: receive_packet called, busy not set.\n", dev->name);
                    685: }
                    686: 
                    687: /******************************************************
                    688:  *
                    689:  * interrupt handler
                    690:  *
                    691:  ******************************************************/
                    692: 
                    693: static void elp_interrupt(int irq, void *dev_id, struct pt_regs *reg_ptr)
                    694: {
                    695:        int len;
                    696:        int dlen;
                    697:        int icount = 0;
                    698:        struct device *dev;
                    699:        elp_device *adapter;
                    700:        int timeout;
                    701: 
                    702:        if (irq < 0 || irq > 15) {
                    703:                printk("elp_interrupt(): illegal IRQ number found in interrupt routine (%i)\n", irq);
                    704:                return;
                    705:        }
                    706:        dev = irq2dev_map[irq];
                    707: 
                    708:        if (dev == NULL) {
                    709:                printk("elp_interrupt(): irq %d for unknown device.\n", irq);
                    710:                return;
                    711:        }
                    712:        adapter = (elp_device *) dev->priv;
                    713: 
                    714:        if (dev->interrupt) {
                    715:                printk("%s: re-entering the interrupt handler!\n", dev->name);
                    716:                return;
                    717:        }
                    718:        dev->interrupt = 1;
                    719: 
                    720:        do {
                    721:                /*
                    722:                 * has a DMA transfer finished?
                    723:                 */
                    724:                if (inb_status(dev->base_addr) & DONE) {
                    725:                        if (!adapter->dmaing) {
                    726:                                printk("%s: phantom DMA completed\n", dev->name);
                    727:                        }
                    728:                        if (elp_debug >= 3) {
                    729:                                printk("%s: %s DMA complete, status %02x\n", dev->name, adapter->current_dma.direction ? "tx" : "rx", inb_status(dev->base_addr));
                    730:                        }
                    731: 
                    732:                        outb_control(inb_control(dev->base_addr) & ~(DMAE | TCEN | DIR), dev->base_addr);
                    733:                        if (adapter->current_dma.direction) {
                    734:                                dev_kfree_skb(adapter->current_dma.skb, FREE_WRITE);
                    735:                        } else {
                    736:                                struct sk_buff *skb = adapter->current_dma.skb;
                    737:                                if (skb) {
                    738:                                  skb->dev = dev;
                    739:                                  if (adapter->current_dma.copy_flag) {
                    740:                                    memcpy(skb_put(skb, adapter->current_dma.length), adapter->dma_buffer, adapter->current_dma.length);
                    741:                                  }
                    742:                                  skb->protocol = eth_type_trans(skb,dev);
                    743:                                  netif_rx(skb);
                    744:                                }
                    745:                        }
                    746:                        adapter->dmaing = 0;
                    747:                        if (adapter->rx_backlog.in != adapter->rx_backlog.out) {
                    748:                                int t = adapter->rx_backlog.length[adapter->rx_backlog.out];
                    749:                                adapter->rx_backlog.out = backlog_next(adapter->rx_backlog.out);
                    750:                                if (elp_debug >= 2)
                    751:                                        printk("%s: receiving backlogged packet (%d)\n", dev->name, t);
                    752:                                receive_packet(dev, t);
                    753:                        } else {
                    754:                                adapter->busy = 0;
                    755:                        }
                    756:                } else {
                    757:                        /* has one timed out? */
                    758:                        check_dma(dev);
                    759:                }
                    760: 
                    761:                sti();
                    762: 
                    763:                /*
                    764:                 * receive a PCB from the adapter
                    765:                 */
                    766:                timeout = jiffies + 3;
                    767:                while ((inb_status(dev->base_addr) & ACRF) != 0 && jiffies < timeout) {
                    768:                        if (receive_pcb(dev, &adapter->irx_pcb)) {
                    769:                                switch (adapter->irx_pcb.command) {
                    770:                                case 0:
                    771:                                        break;
                    772:                                        /*
                    773:                                         * received a packet - this must be handled fast
                    774:                                         */
                    775:                                case 0xff:
                    776:                                case CMD_RECEIVE_PACKET_COMPLETE:
                    777:                                        /* if the device isn't open, don't pass packets up the stack */
                    778:                                        if (dev->start == 0)
                    779:                                                break;
                    780:                                        cli();
                    781:                                        len = adapter->irx_pcb.data.rcv_resp.pkt_len;
                    782:                                        dlen = adapter->irx_pcb.data.rcv_resp.buf_len;
                    783:                                        if (adapter->irx_pcb.data.rcv_resp.timeout != 0) {
                    784:                                                printk("%s: interrupt - packet not received correctly\n", dev->name);
                    785:                                                sti();
                    786:                                        } else {
                    787:                                                if (elp_debug >= 3) {
                    788:                                                        sti();
                    789:                                                        printk("%s: interrupt - packet received of length %i (%i)\n", dev->name, len, dlen);
                    790:                                                        cli();
                    791:                                                }
                    792:                                                if (adapter->irx_pcb.command == 0xff) {
                    793:                                                        if (elp_debug >= 2)
                    794:                                                                printk("%s: adding packet to backlog (len = %d)\n", dev->name, dlen);
                    795:                                                        adapter->rx_backlog.length[adapter->rx_backlog.in] = dlen;
                    796:                                                        adapter->rx_backlog.in = backlog_next(adapter->rx_backlog.in);
                    797:                                                } else {
                    798:                                                        receive_packet(dev, dlen);
                    799:                                                }
                    800:                                                sti();
                    801:                                                if (elp_debug >= 3)
                    802:                                                        printk("%s: packet received\n", dev->name);
                    803:                                        }
                    804:                                        break;
                    805: 
                    806:                                        /*
                    807:                                         * 82586 configured correctly
                    808:                                         */
                    809:                                case CMD_CONFIGURE_82586_RESPONSE:
                    810:                                        adapter->got[CMD_CONFIGURE_82586] = 1;
                    811:                                        if (elp_debug >= 3)
                    812:                                                printk("%s: interrupt - configure response received\n", dev->name);
                    813:                                        break;
                    814: 
                    815:                                        /*
                    816:                                         * Adapter memory configuration
                    817:                                         */
                    818:                                case CMD_CONFIGURE_ADAPTER_RESPONSE:
                    819:                                        adapter->got[CMD_CONFIGURE_ADAPTER_MEMORY] = 1;
                    820:                                        if (elp_debug >= 3)
                    821:                                                printk("%s: Adapter memory configuration %s.\n", dev->name,
                    822:                                                       adapter->irx_pcb.data.failed ? "failed" : "succeeded");
                    823:                                        break;
                    824: 
                    825:                                        /*
                    826:                                         * Multicast list loading
                    827:                                         */
                    828:                                case CMD_LOAD_MULTICAST_RESPONSE:
                    829:                                        adapter->got[CMD_LOAD_MULTICAST_LIST] = 1;
                    830:                                        if (elp_debug >= 3)
                    831:                                                printk("%s: Multicast address list loading %s.\n", dev->name,
                    832:                                                       adapter->irx_pcb.data.failed ? "failed" : "succeeded");
                    833:                                        break;
                    834: 
                    835:                                        /*
                    836:                                         * Station address setting
                    837:                                         */
                    838:                                case CMD_SET_ADDRESS_RESPONSE:
                    839:                                        adapter->got[CMD_SET_STATION_ADDRESS] = 1;
                    840:                                        if (elp_debug >= 3)
                    841:                                                printk("%s: Ethernet address setting %s.\n", dev->name,
                    842:                                                       adapter->irx_pcb.data.failed ? "failed" : "succeeded");
                    843:                                        break;
                    844: 
                    845: 
                    846:                                        /*
                    847:                                         * received board statistics
                    848:                                         */
                    849:                                case CMD_NETWORK_STATISTICS_RESPONSE:
                    850:                                        adapter->stats.rx_packets += adapter->irx_pcb.data.netstat.tot_recv;
                    851:                                        adapter->stats.tx_packets += adapter->irx_pcb.data.netstat.tot_xmit;
                    852:                                        adapter->stats.rx_crc_errors += adapter->irx_pcb.data.netstat.err_CRC;
                    853:                                        adapter->stats.rx_frame_errors += adapter->irx_pcb.data.netstat.err_align;
                    854:                                        adapter->stats.rx_fifo_errors += adapter->irx_pcb.data.netstat.err_ovrrun;
                    855:                                        adapter->stats.rx_over_errors += adapter->irx_pcb.data.netstat.err_res;
                    856:                                        adapter->got[CMD_NETWORK_STATISTICS] = 1;
                    857:                                        if (elp_debug >= 3)
                    858:                                                printk("%s: interrupt - statistics response received\n", dev->name);
                    859:                                        break;
                    860: 
                    861:                                        /*
                    862:                                         * sent a packet
                    863:                                         */
                    864:                                case CMD_TRANSMIT_PACKET_COMPLETE:
                    865:                                        if (elp_debug >= 3)
                    866:                                                printk("%s: interrupt - packet sent\n", dev->name);
                    867:                                        if (dev->start == 0)
                    868:                                                break;
                    869:                                        switch (adapter->irx_pcb.data.xmit_resp.c_stat) {
                    870:                                        case 0xffff:
                    871:                                                adapter->stats.tx_aborted_errors++;
                    872:                                                printk(KERN_INFO "%s: transmit timed out, network cable problem?\n", dev->name);
                    873:                                                break;
                    874:                                        case 0xfffe:
                    875:                                                adapter->stats.tx_fifo_errors++;
                    876:                                                printk(KERN_INFO "%s: transmit timed out, FIFO underrun\n", dev->name);
                    877:                                                break;
                    878:                                        }
                    879:                                        dev->tbusy = 0;
                    880:                                        mark_bh(NET_BH);
                    881:                                        break;
                    882: 
                    883:                                        /*
                    884:                                         * some unknown PCB
                    885:                                         */
                    886:                                default:
                    887:                                        printk(KERN_DEBUG "%s: unknown PCB received - %2.2x\n", dev->name, adapter->irx_pcb.command);
                    888:                                        break;
                    889:                                }
                    890:                        } else {
                    891:                                printk("%s: failed to read PCB on interrupt\n", dev->name);
                    892:                                adapter_reset(dev);
                    893:                        }
                    894:                }
                    895: 
                    896:        } while (icount++ < 5 && (inb_status(dev->base_addr) & (ACRF | DONE)));
                    897: 
                    898:        prime_rx(dev);
                    899: 
                    900:        /*
                    901:         * indicate no longer in interrupt routine
                    902:         */
                    903:        dev->interrupt = 0;
                    904: }
                    905: 
                    906: 
                    907: /******************************************************
                    908:  *
                    909:  * open the board
                    910:  *
                    911:  ******************************************************/
                    912: 
                    913: static int elp_open(struct device *dev)
                    914: {
                    915:        elp_device *adapter;
                    916: 
                    917:        adapter = dev->priv;
                    918: 
                    919:        if (elp_debug >= 3)
                    920:                printk("%s: request to open device\n", dev->name);
                    921: 
                    922:        /*
                    923:         * make sure we actually found the device
                    924:         */
                    925:        if (adapter == NULL) {
                    926:                printk("%s: Opening a non-existent physical device\n", dev->name);
                    927:                return -EAGAIN;
                    928:        }
                    929:        /*
                    930:         * disable interrupts on the board
                    931:         */
                    932:        outb_control(0x00, dev->base_addr);
                    933: 
                    934:        /*
                    935:         * clear any pending interrupts
                    936:         */
                    937:        inb_command(dev->base_addr);
                    938:        adapter_reset(dev);
                    939: 
                    940:        /*
                    941:         * interrupt routine not entered
                    942:         */
                    943:        dev->interrupt = 0;
                    944: 
                    945:        /*
                    946:         *  transmitter not busy 
                    947:         */
                    948:        dev->tbusy = 0;
                    949: 
                    950:        /*
                    951:         * no receive PCBs active
                    952:         */
                    953:        adapter->rx_active = 0;
                    954: 
                    955:        adapter->busy = 0;
                    956:        adapter->send_pcb_semaphore = 0;
                    957:        adapter->rx_backlog.in = 0;
                    958:        adapter->rx_backlog.out = 0;
                    959: 
                    960:        /*
                    961:         * make sure we can find the device header given the interrupt number
                    962:         */
                    963:        irq2dev_map[dev->irq] = dev;
                    964: 
                    965:        /*
                    966:         * install our interrupt service routine
                    967:         */
                    968:        if (request_irq(dev->irq, &elp_interrupt, 0, "3c505", NULL)) {
                    969:                irq2dev_map[dev->irq] = NULL;
                    970:                return -EAGAIN;
                    971:        }
                    972:        if (request_dma(dev->dma, "3c505")) {
                    973:                printk("%s: could not allocate DMA channel\n", dev->name);
                    974:                return -EAGAIN;
                    975:        }
                    976:        adapter->dma_buffer = (void *) dma_mem_alloc(DMA_BUFFER_SIZE);
                    977:        if (!adapter->dma_buffer) {
                    978:                printk("Could not allocate DMA buffer\n");
                    979:        }
                    980:        adapter->dmaing = 0;
                    981: 
                    982:        /*
                    983:         * enable interrupts on the board
                    984:         */
                    985:        outb_control(CMDE, dev->base_addr);
                    986: 
                    987:        /*
                    988:         * device is now officially open!
                    989:         */
                    990:        dev->start = 1;
                    991: 
                    992:        /*
                    993:         * configure adapter memory: we need 10 multicast addresses, default==0
                    994:         */
                    995:        if (elp_debug >= 3)
                    996:                printk("%s: sending 3c505 memory configuration command\n", dev->name);
                    997:        adapter->tx_pcb.command = CMD_CONFIGURE_ADAPTER_MEMORY;
                    998:        adapter->tx_pcb.data.memconf.cmd_q = 10;
                    999:        adapter->tx_pcb.data.memconf.rcv_q = 20;
                   1000:        adapter->tx_pcb.data.memconf.mcast = 10;
                   1001:        adapter->tx_pcb.data.memconf.frame = 20;
                   1002:        adapter->tx_pcb.data.memconf.rcv_b = 20;
                   1003:        adapter->tx_pcb.data.memconf.progs = 0;
                   1004:        adapter->tx_pcb.length = sizeof(struct Memconf);
                   1005:        adapter->got[CMD_CONFIGURE_ADAPTER_MEMORY] = 0;
                   1006:        if (!send_pcb(dev, &adapter->tx_pcb))
                   1007:                printk("%s: couldn't send memory configuration command\n", dev->name);
                   1008:        else {
                   1009:                int timeout = jiffies + TIMEOUT;
                   1010:                while (adapter->got[CMD_CONFIGURE_ADAPTER_MEMORY] == 0 && jiffies < timeout);
                   1011:                if (jiffies >= timeout)
                   1012:                        TIMEOUT_MSG(__LINE__);
                   1013:        }
                   1014: 
                   1015: 
                   1016:        /*
                   1017:         * configure adapter to receive broadcast messages and wait for response
                   1018:         */
                   1019:        if (elp_debug >= 3)
                   1020:                printk("%s: sending 82586 configure command\n", dev->name);
                   1021:        adapter->tx_pcb.command = CMD_CONFIGURE_82586;
                   1022:        adapter->tx_pcb.data.configure = NO_LOOPBACK | RECV_BROAD;
                   1023:        adapter->tx_pcb.length = 2;
                   1024:        adapter->got[CMD_CONFIGURE_82586] = 0;
                   1025:        if (!send_pcb(dev, &adapter->tx_pcb))
                   1026:                printk("%s: couldn't send 82586 configure command\n", dev->name);
                   1027:        else {
                   1028:                int timeout = jiffies + TIMEOUT;
                   1029:                while (adapter->got[CMD_CONFIGURE_82586] == 0 && jiffies < timeout);
                   1030:                if (jiffies >= timeout)
                   1031:                        TIMEOUT_MSG(__LINE__);
                   1032:        }
                   1033: 
                   1034:        /* enable burst-mode DMA */
                   1035:        outb(0x1, dev->base_addr + PORT_AUXDMA);
                   1036: 
                   1037:        /*
                   1038:         * queue receive commands to provide buffering
                   1039:         */
                   1040:        prime_rx(dev);
                   1041:        if (elp_debug >= 3)
                   1042:                printk("%s: %d receive PCBs active\n", dev->name, adapter->rx_active);
                   1043: 
                   1044:        MOD_INC_USE_COUNT;
                   1045: 
                   1046:        return 0;               /* Always succeed */
                   1047: }
                   1048: 
                   1049: 
                   1050: /******************************************************
                   1051:  *
                   1052:  * send a packet to the adapter
                   1053:  *
                   1054:  ******************************************************/
                   1055: 
                   1056: static int send_packet(struct device *dev, struct sk_buff *skb)
                   1057: {
                   1058:        elp_device *adapter = dev->priv;
                   1059:        unsigned long target;
                   1060: 
                   1061:        /*
                   1062:         * make sure the length is even and no shorter than 60 bytes
                   1063:         */
                   1064:        unsigned int nlen = (((skb->len < 60) ? 60 : skb->len) + 1) & (~1);
                   1065: 
                   1066:        if (set_bit(0, (void *) &adapter->busy)) {
                   1067:                if (elp_debug >= 2)
                   1068:                        printk("%s: transmit blocked\n", dev->name);
                   1069:                return FALSE;
                   1070:        }
                   1071:        adapter = dev->priv;
                   1072: 
                   1073:        /*
                   1074:         * send the adapter a transmit packet command. Ignore segment and offset
                   1075:         * and make sure the length is even
                   1076:         */
                   1077:        adapter->tx_pcb.command = CMD_TRANSMIT_PACKET;
                   1078:        adapter->tx_pcb.length = sizeof(struct Xmit_pkt);
                   1079:        adapter->tx_pcb.data.xmit_pkt.buf_ofs
                   1080:            = adapter->tx_pcb.data.xmit_pkt.buf_seg = 0;        /* Unused */
                   1081:        adapter->tx_pcb.data.xmit_pkt.pkt_len = nlen;
                   1082: 
                   1083:        if (!send_pcb(dev, &adapter->tx_pcb)) {
                   1084:                adapter->busy = 0;
                   1085:                return FALSE;
                   1086:        }
                   1087:        /* if this happens, we die */
                   1088:        if (set_bit(0, (void *) &adapter->dmaing))
                   1089:                printk("%s: tx: DMA %d in progress\n", dev->name, adapter->current_dma.direction);
                   1090: 
                   1091:        adapter->current_dma.direction = 1;
                   1092:        adapter->current_dma.start_time = jiffies;
                   1093: 
                   1094:        target = virt_to_bus(skb->data);
                   1095:        if ((target + nlen) >= MAX_DMA_ADDRESS) {
                   1096:                memcpy(adapter->dma_buffer, skb->data, nlen);
                   1097:                target = virt_to_bus(adapter->dma_buffer);
                   1098:        }
                   1099:        adapter->current_dma.skb = skb;
                   1100:        cli();
                   1101:        disable_dma(dev->dma);
                   1102:        clear_dma_ff(dev->dma);
                   1103:        set_dma_mode(dev->dma, 0x08);   /* dma memory -> io */
                   1104:        set_dma_addr(dev->dma, target);
                   1105:        set_dma_count(dev->dma, nlen);
                   1106:        enable_dma(dev->dma);
                   1107:        outb_control(inb_control(dev->base_addr) | DMAE | TCEN, dev->base_addr);
                   1108:        if (elp_debug >= 3)
                   1109:                printk("%s: DMA transfer started\n", dev->name);
                   1110: 
                   1111:        return TRUE;
                   1112: }
                   1113: 
                   1114: /******************************************************
                   1115:  *
                   1116:  * start the transmitter
                   1117:  *    return 0 if sent OK, else return 1
                   1118:  *
                   1119:  ******************************************************/
                   1120: 
                   1121: static int elp_start_xmit(struct sk_buff *skb, struct device *dev)
                   1122: {
                   1123:        if (dev->interrupt) {
                   1124:                printk("%s: start_xmit aborted (in irq)\n", dev->name);
                   1125:                return 1;
                   1126:        }
                   1127: 
                   1128:        check_dma(dev);
                   1129: 
                   1130:        /*
                   1131:         * if the transmitter is still busy, we have a transmit timeout...
                   1132:         */
                   1133:        if (dev->tbusy) {
                   1134:                elp_device *adapter = dev->priv;
                   1135:                        int tickssofar = jiffies - dev->trans_start;
                   1136:                int stat;
                   1137: 
                   1138:                if (tickssofar < 1000)
                   1139:                        return 1;
                   1140: 
                   1141:                stat = inb_status(dev->base_addr);
                   1142:                printk("%s: transmit timed out, lost %s?\n", dev->name, (stat & ACRF) ? "interrupt" : "command");
                   1143:                if (elp_debug >= 1)
                   1144:                        printk("%s: status %#02x\n", dev->name, stat);
                   1145:                dev->trans_start = jiffies;
                   1146:                dev->tbusy = 0;
                   1147:                adapter->stats.tx_dropped++;
                   1148:        }
                   1149: 
                   1150:        /* Some upper layer thinks we've missed a tx-done interrupt */
                   1151:        if (skb == NULL) {
                   1152:                dev_tint(dev);
                   1153:                return 0;
                   1154:        }
                   1155: 
                   1156:        if (skb->len <= 0)
                   1157:                return 0;
                   1158: 
                   1159:        if (elp_debug >= 3)
                   1160:                printk("%s: request to send packet of length %d\n", dev->name, (int) skb->len);
                   1161: 
                   1162:        if (set_bit(0, (void *) &dev->tbusy)) {
                   1163:                printk("%s: transmitter access conflict\n", dev->name);
                   1164:                return 1;
                   1165:        }
                   1166:        /*
                   1167:         * send the packet at skb->data for skb->len
                   1168:         */
                   1169:        if (!send_packet(dev, skb)) {
                   1170:                if (elp_debug >= 2) {
                   1171:                        printk("%s: failed to transmit packet\n", dev->name);
                   1172:                }
                   1173:                dev->tbusy = 0;
                   1174:                return 1;
                   1175:        }
                   1176:        if (elp_debug >= 3)
                   1177:                printk("%s: packet of length %d sent\n", dev->name, (int) skb->len);
                   1178: 
                   1179:        /*
                   1180:         * start the transmit timeout
                   1181:         */
                   1182:        dev->trans_start = jiffies;
                   1183: 
                   1184:        prime_rx(dev);
                   1185: 
                   1186:        return 0;
                   1187: }
                   1188: 
                   1189: /******************************************************
                   1190:  *
                   1191:  * return statistics on the board
                   1192:  *
                   1193:  ******************************************************/
                   1194: 
                   1195: static struct enet_statistics *elp_get_stats(struct device *dev)
                   1196: {
                   1197:        elp_device *adapter = (elp_device *) dev->priv;
                   1198: 
                   1199:        if (elp_debug >= 3)
                   1200:                printk("%s: request for stats\n", dev->name);
                   1201: 
                   1202:        /* If the device is closed, just return the latest stats we have,
                   1203:           - we cannot ask from the adapter without interrupts */
                   1204:        if (!dev->start)
                   1205:                return &adapter->stats;
                   1206: 
                   1207:        /* send a get statistics command to the board */
                   1208:        adapter->tx_pcb.command = CMD_NETWORK_STATISTICS;
                   1209:        adapter->tx_pcb.length = 0;
                   1210:        adapter->got[CMD_NETWORK_STATISTICS] = 0;
                   1211:        if (!send_pcb(dev, &adapter->tx_pcb))
                   1212:                printk("%s: couldn't send get statistics command\n", dev->name);
                   1213:        else {
                   1214:                int timeout = jiffies + TIMEOUT;
                   1215:                while (adapter->got[CMD_NETWORK_STATISTICS] == 0 && jiffies < timeout);
                   1216:                if (jiffies >= timeout) {
                   1217:                        TIMEOUT_MSG(__LINE__);
                   1218:                        return &adapter->stats;
                   1219:                }
                   1220:        }
                   1221: 
                   1222:        /* statistics are now up to date */
                   1223:        return &adapter->stats;
                   1224: }
                   1225: 
                   1226: /******************************************************
                   1227:  *
                   1228:  * close the board
                   1229:  *
                   1230:  ******************************************************/
                   1231: 
                   1232: static int elp_close(struct device *dev)
                   1233: {
                   1234:        elp_device *adapter;
                   1235: 
                   1236:        adapter = dev->priv;
                   1237: 
                   1238:        if (elp_debug >= 3)
                   1239:                printk("%s: request to close device\n", dev->name);
                   1240: 
                   1241:        /* Someone may request the device statistic information even when
                   1242:         * the interface is closed. The following will update the statistics
                   1243:         * structure in the driver, so we'll be able to give current statistics.
                   1244:         */
                   1245:        (void) elp_get_stats(dev);
                   1246: 
                   1247:        /*
                   1248:         * disable interrupts on the board
                   1249:         */
                   1250:        outb_control(0x00, dev->base_addr);
                   1251: 
                   1252:        /*
                   1253:         *  flag transmitter as busy (i.e. not available)
                   1254:         */
                   1255:        dev->tbusy = 1;
                   1256: 
                   1257:        /*
                   1258:         *  indicate device is closed
                   1259:         */
                   1260:        dev->start = 0;
                   1261: 
                   1262:        /*
                   1263:         * release the IRQ
                   1264:         */
                   1265:        free_irq(dev->irq, NULL);
                   1266: 
                   1267:        /*
                   1268:         * and we no longer have to map irq to dev either
                   1269:         */
                   1270:        irq2dev_map[dev->irq] = 0;
                   1271: 
                   1272:        free_dma(dev->dma);
                   1273:        free_pages((unsigned long) adapter->dma_buffer, __get_order(DMA_BUFFER_SIZE));
                   1274: 
                   1275:        MOD_DEC_USE_COUNT;
                   1276: 
                   1277:        return 0;
                   1278: }
                   1279: 
                   1280: 
                   1281: /************************************************************
                   1282:  *
                   1283:  * Set multicast list
                   1284:  * num_addrs==0: clear mc_list
                   1285:  * num_addrs==-1: set promiscuous mode
                   1286:  * num_addrs>0: set mc_list
                   1287:  *
                   1288:  ************************************************************/
                   1289: 
                   1290: static void elp_set_mc_list(struct device *dev)
                   1291: {
                   1292:        elp_device *adapter = (elp_device *) dev->priv;
                   1293:        struct dev_mc_list *dmi = dev->mc_list;
                   1294:        int i;
                   1295: 
                   1296:        if (elp_debug >= 3)
                   1297:                printk("%s: request to set multicast list\n", dev->name);
                   1298: 
                   1299:        if (!(dev->flags & (IFF_PROMISC | IFF_ALLMULTI))) {
                   1300:                /* send a "load multicast list" command to the board, max 10 addrs/cmd */
                   1301:                /* if num_addrs==0 the list will be cleared */
                   1302:                adapter->tx_pcb.command = CMD_LOAD_MULTICAST_LIST;
                   1303:                adapter->tx_pcb.length = 6 * dev->mc_count;
                   1304:                for (i = 0; i < dev->mc_count; i++) {
                   1305:                        memcpy(adapter->tx_pcb.data.multicast[i], dmi->dmi_addr, 6);
                   1306:                        dmi = dmi->next;
                   1307:                }
                   1308:                adapter->got[CMD_LOAD_MULTICAST_LIST] = 0;
                   1309:                if (!send_pcb(dev, &adapter->tx_pcb))
                   1310:                        printk("%s: couldn't send set_multicast command\n", dev->name);
                   1311:                else {
                   1312:                        int timeout = jiffies + TIMEOUT;
                   1313:                        while (adapter->got[CMD_LOAD_MULTICAST_LIST] == 0 && jiffies < timeout);
                   1314:                        if (jiffies >= timeout) {
                   1315:                                TIMEOUT_MSG(__LINE__);
                   1316:                        }
                   1317:                }
                   1318:                if (dev->mc_count)
                   1319:                        adapter->tx_pcb.data.configure = NO_LOOPBACK | RECV_BROAD | RECV_MULTI;
                   1320:                else            /* num_addrs == 0 */
                   1321:                        adapter->tx_pcb.data.configure = NO_LOOPBACK | RECV_BROAD;
                   1322:        } else
                   1323:                adapter->tx_pcb.data.configure = NO_LOOPBACK | RECV_PROMISC;
                   1324:        /*
                   1325:         * configure adapter to receive messages (as specified above)
                   1326:         * and wait for response
                   1327:         */
                   1328:        if (elp_debug >= 3)
                   1329:                printk("%s: sending 82586 configure command\n", dev->name);
                   1330:        adapter->tx_pcb.command = CMD_CONFIGURE_82586;
                   1331:        adapter->tx_pcb.length = 2;
                   1332:        adapter->got[CMD_CONFIGURE_82586] = 0;
                   1333:        if (!send_pcb(dev, &adapter->tx_pcb))
                   1334:                printk("%s: couldn't send 82586 configure command\n", dev->name);
                   1335:        else {
                   1336:                int timeout = jiffies + TIMEOUT;
                   1337:                while (adapter->got[CMD_CONFIGURE_82586] == 0 && jiffies < timeout);
                   1338:                if (jiffies >= timeout)
                   1339:                        TIMEOUT_MSG(__LINE__);
                   1340:        }
                   1341: }
                   1342: 
                   1343: /******************************************************
                   1344:  *
                   1345:  * initialise Etherlink Plus board
                   1346:  *
                   1347:  ******************************************************/
                   1348: 
                   1349: static void elp_init(struct device *dev)
                   1350: {
                   1351:        elp_device *adapter = dev->priv;
                   1352: 
                   1353:        /*
                   1354:         * set ptrs to various functions
                   1355:         */
                   1356:        dev->open = elp_open;   /* local */
                   1357:        dev->stop = elp_close;  /* local */
                   1358:        dev->get_stats = elp_get_stats;         /* local */
                   1359:        dev->hard_start_xmit = elp_start_xmit;  /* local */
                   1360:        dev->set_multicast_list = elp_set_mc_list;      /* local */
                   1361: 
                   1362:        /* Setup the generic properties */
                   1363:        ether_setup(dev);
                   1364: 
                   1365:        /*
                   1366:         * setup ptr to adapter specific information
                   1367:         */
                   1368:        memset(&(adapter->stats), 0, sizeof(struct enet_statistics));
                   1369: 
                   1370:        /*
                   1371:         * memory information
                   1372:         */
                   1373:        dev->mem_start = dev->mem_end = dev->rmem_end = dev->rmem_start = 0;
                   1374: }
                   1375: 
                   1376: /************************************************************
                   1377:  *
                   1378:  * A couple of tests to see if there's 3C505 or not
                   1379:  * Called only by elp_autodetect
                   1380:  ************************************************************/
                   1381: 
                   1382: static int elp_sense(struct device *dev)
                   1383: {
                   1384:        int timeout;
                   1385:        int addr = dev->base_addr;
                   1386:        const char *name = dev->name;
                   1387:        long flags;
                   1388:        byte orig_HCR, orig_HSR;
                   1389: 
                   1390:        if (check_region(addr, 0xf))
                   1391:                return -1;
                   1392: 
                   1393:        orig_HCR = inb_control(addr);
                   1394:        orig_HSR = inb_status(addr);
                   1395: 
                   1396:        if (elp_debug > 0)
                   1397:                printk(search_msg, name, addr);
                   1398: 
                   1399:        if (((orig_HCR == 0xff) && (orig_HSR == 0xff)) ||
                   1400:            ((orig_HCR & DIR) != (orig_HSR & DIR))) {
                   1401:                if (elp_debug > 0)
                   1402:                        printk(notfound_msg, 1);
                   1403:                return -1;      /* It can't be 3c505 if HCR.DIR != HSR.DIR */
                   1404:        }
                   1405:        /* Enable interrupts - we need timers! */
                   1406:        save_flags(flags);
                   1407:        sti();
                   1408: 
                   1409:        /* Wait for a while; the adapter may still be booting up */
                   1410:        if (elp_debug > 0)
1.1.1.2 ! root     1411:                printk("%s", stilllooking_msg);
1.1       root     1412:        if (orig_HCR & DIR) {
                   1413:                /* If HCR.DIR is up, we pull it down. HSR.DIR should follow. */
                   1414:                outb_control(orig_HCR & ~DIR, addr);
                   1415:                timeout = jiffies + 30;
                   1416:                while (jiffies < timeout);
                   1417:                restore_flags(flags);
                   1418:                if (inb_status(addr) & DIR) {
                   1419:                        outb_control(orig_HCR, addr);
                   1420:                        if (elp_debug > 0)
                   1421:                                printk(notfound_msg, 2);
                   1422:                        return -1;
                   1423:                }
                   1424:        } else {
                   1425:                /* If HCR.DIR is down, we pull it up. HSR.DIR should follow. */
                   1426:                outb_control(orig_HCR | DIR, addr);
                   1427:                timeout = jiffies + 30;
                   1428:                while (jiffies < timeout);
                   1429:                restore_flags(flags);
                   1430:                if (!(inb_status(addr) & DIR)) {
                   1431:                        outb_control(orig_HCR, addr);
                   1432:                        if (elp_debug > 0)
                   1433:                                printk(notfound_msg, 3);
                   1434:                        return -1;
                   1435:                }
                   1436:        }
                   1437:        /*
                   1438:         * It certainly looks like a 3c505. If it has DMA enabled, it needs
                   1439:         * a hard reset. Also, do a hard reset if selected at the compile time.
                   1440:         */
                   1441:        if (elp_debug > 0)
1.1.1.2 ! root     1442:                printk("%s", found_msg);
1.1       root     1443: 
                   1444:        return 0;
                   1445: }
                   1446: 
                   1447: /*************************************************************
                   1448:  *
                   1449:  * Search through addr_list[] and try to find a 3C505
                   1450:  * Called only by eplus_probe
                   1451:  *************************************************************/
                   1452: 
                   1453: static int elp_autodetect(struct device *dev)
                   1454: {
                   1455:        int idx = 0;
                   1456: 
                   1457:        /* if base address set, then only check that address
                   1458:           otherwise, run through the table */
                   1459:        if (dev->base_addr != 0) {      /* dev->base_addr == 0 ==> plain autodetect */
                   1460:                if (elp_sense(dev) == 0)
                   1461:                        return dev->base_addr;
                   1462:        } else
                   1463:                while ((dev->base_addr = addr_list[idx++])) {
                   1464:                        if (elp_sense(dev) == 0)
                   1465:                                return dev->base_addr;
                   1466:                }
                   1467: 
                   1468:        /* could not find an adapter */
                   1469:        if (elp_debug > 0)
                   1470:                printk(couldnot_msg, dev->name);
                   1471: 
                   1472:        return 0;               /* Because of this, the layer above will return -ENODEV */
                   1473: }
                   1474: 
                   1475: 
                   1476: /******************************************************
                   1477:  *
                   1478:  * probe for an Etherlink Plus board at the specified address
                   1479:  *
                   1480:  ******************************************************/
                   1481: 
                   1482: /* There are three situations we need to be able to detect here:
                   1483: 
                   1484:  *  a) the card is idle
                   1485:  *  b) the card is still booting up
                   1486:  *  c) the card is stuck in a strange state (some DOS drivers do this)
                   1487:  *
                   1488:  * In case (a), all is well.  In case (b), we wait 10 seconds to see if the
                   1489:  * card finishes booting, and carry on if so.  In case (c), we do a hard reset,
                   1490:  * loop round, and hope for the best.
                   1491:  *
                   1492:  * This is all very unpleasant, but hopefully avoids the problems with the old
                   1493:  * probe code (which had a 15-second delay if the card was idle, and didn't
                   1494:  * work at all if it was in a weird state).
                   1495:  */
                   1496: 
                   1497: int elplus_probe(struct device *dev)
                   1498: {
                   1499:        elp_device *adapter;
                   1500:        int i, tries, tries1, timeout, okay;
                   1501: 
                   1502:        /*
                   1503:         *  setup adapter structure
                   1504:         */
                   1505: 
                   1506:        dev->base_addr = elp_autodetect(dev);
                   1507:        if (!(dev->base_addr))
                   1508:                return -ENODEV;
                   1509: 
                   1510:        /*
                   1511:         * setup ptr to adapter specific information
                   1512:         */
                   1513:        adapter = (elp_device *) (dev->priv = kmalloc(sizeof(elp_device), GFP_KERNEL));
                   1514:        if (adapter == NULL) {
                   1515:                printk("%s: out of memory\n", dev->name);
                   1516:                return -ENODEV;
                   1517:         }
                   1518: 
                   1519:        for (tries1 = 0; tries1 < 3; tries1++) {
                   1520:                outb_control((inb_control(dev->base_addr) | CMDE) & ~DIR, dev->base_addr);
                   1521:                /* First try to write just one byte, to see if the card is
                   1522:                 * responding at all normally.
                   1523:                 */
                   1524:                timeout = jiffies + 5;
                   1525:                okay = 0;
                   1526:                while (jiffies < timeout && !(inb_status(dev->base_addr) & HCRE));
                   1527:                if ((inb_status(dev->base_addr) & HCRE)) {
                   1528:                        outb_command(0, dev->base_addr);        /* send a spurious byte */
                   1529:                        timeout = jiffies + 5;
                   1530:                        while (jiffies < timeout && !(inb_status(dev->base_addr) & HCRE));
                   1531:                        if (inb_status(dev->base_addr) & HCRE)
                   1532:                                okay = 1;
                   1533:                }
                   1534:                if (!okay) {
                   1535:                        /* Nope, it's ignoring the command register.  This means that
                   1536:                         * either it's still booting up, or it's died.
                   1537:                         */
                   1538:                        printk("%s: command register wouldn't drain, ", dev->name);
                   1539:                        if ((inb_status(dev->base_addr) & 7) == 3) {
                   1540:                                /* If the adapter status is 3, it *could* still be booting.
                   1541:                                 * Give it the benefit of the doubt for 10 seconds.
                   1542:                                 */
                   1543:                                printk("assuming 3c505 still starting\n");
                   1544:                                timeout = jiffies + 10 * HZ;
                   1545:                                while (jiffies < timeout && (inb_status(dev->base_addr) & 7));
                   1546:                                if (inb_status(dev->base_addr) & 7) {
                   1547:                                        printk("%s: 3c505 failed to start\n", dev->name);
                   1548:                                } else {
                   1549:                                        okay = 1;  /* It started */
                   1550:                                }
                   1551:                        } else {
                   1552:                                /* Otherwise, it must just be in a strange state.  We probably
                   1553:                                 * need to kick it.
                   1554:                                 */
                   1555:                                printk("3c505 is sulking\n");
                   1556:                        }
                   1557:                }
                   1558:                for (tries = 0; tries < 5 && okay; tries++) {
                   1559: 
                   1560:                        /*
                   1561:                         * Try to set the Ethernet address, to make sure that the board
                   1562:                         * is working.
                   1563:                         */
                   1564:                        adapter->tx_pcb.command = CMD_STATION_ADDRESS;
                   1565:                        adapter->tx_pcb.length = 0;
                   1566:                        autoirq_setup(0);
                   1567:                        if (!send_pcb(dev, &adapter->tx_pcb)) {
                   1568:                                printk("%s: could not send first PCB\n", dev->name);
                   1569:                                autoirq_report(0);
                   1570:                                continue;
                   1571:                        }
                   1572:                        if (!receive_pcb(dev, &adapter->rx_pcb)) {
                   1573:                                printk("%s: could not read first PCB\n", dev->name);
                   1574:                                autoirq_report(0);
                   1575:                                continue;
                   1576:                        }
                   1577:                        if ((adapter->rx_pcb.command != CMD_ADDRESS_RESPONSE) ||
                   1578:                            (adapter->rx_pcb.length != 6)) {
                   1579:                                printk("%s: first PCB wrong (%d, %d)\n", dev->name, adapter->rx_pcb.command, adapter->rx_pcb.length);
                   1580:                                autoirq_report(0);
                   1581:                                continue;
                   1582:                        }
                   1583:                        goto okay;
                   1584:                }
                   1585:                /* It's broken.  Do a hard reset to re-initialise the board,
                   1586:                 * and try again.
                   1587:                 */
                   1588:                printk(KERN_INFO "%s: resetting adapter\n", dev->name);
                   1589:                outb_control(inb_control(dev->base_addr) | FLSH | ATTN, dev->base_addr);
                   1590:                outb_control(inb_control(dev->base_addr) & ~(FLSH | ATTN), dev->base_addr);
                   1591:        }
                   1592:        printk("%s: failed to initialise 3c505\n", dev->name);
                   1593:        return -ENODEV;
                   1594: 
                   1595:       okay:
                   1596:        if (dev->irq) {         /* Is there a preset IRQ? */
                   1597:                int rpt = autoirq_report(0);
                   1598:                if (dev->irq != rpt) {
                   1599:                        printk("%s: warning, irq %d configured but %d detected\n", dev->name, dev->irq, rpt);
                   1600:                        return -ENODEV;
                   1601:                }
                   1602:                /* if dev->irq == autoirq_report(0), all is well */
                   1603:        } else                  /* No preset IRQ; just use what we can detect */
                   1604:                dev->irq = autoirq_report(0);
                   1605:        switch (dev->irq) {     /* Legal, sane? */
                   1606:        case 0:
                   1607:                printk("%s: No IRQ reported by autoirq_report().\n", dev->name);
                   1608:                printk("%s: Check the jumpers of your 3c505 board.\n", dev->name);
                   1609:                return -ENODEV;
                   1610:        case 1:
                   1611:        case 6:
                   1612:        case 8:
                   1613:        case 13:
                   1614:                printk("%s: Impossible IRQ %d reported by autoirq_report().\n",
                   1615:                       dev->name, dev->irq);
                   1616:                return -ENODEV;
                   1617:        }
                   1618:        /*
                   1619:         *  Now we have the IRQ number so we can disable the interrupts from
                   1620:         *  the board until the board is opened.
                   1621:         */
                   1622:        outb_control(inb_control(dev->base_addr) & ~CMDE, dev->base_addr);
                   1623: 
                   1624:        /*
                   1625:         * copy ethernet address into structure
                   1626:         */
                   1627:        for (i = 0; i < 6; i++)
                   1628:                dev->dev_addr[i] = adapter->rx_pcb.data.eth_addr[i];
                   1629: 
                   1630:        /* set up the DMA channel */
                   1631:        dev->dma = ELP_DMA;
                   1632: 
                   1633:        /*
                   1634:         * print remainder of startup message
                   1635:         */
                   1636:        printk("%s: 3c505 at %#lx, irq %d, dma %d, ",
                   1637:               dev->name, dev->base_addr, dev->irq, dev->dma);
                   1638:        printk("addr %02x:%02x:%02x:%02x:%02x:%02x, ",
                   1639:               dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
                   1640:               dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
                   1641: 
                   1642:        /*
                   1643:         * read more information from the adapter
                   1644:         */
                   1645: 
                   1646:        adapter->tx_pcb.command = CMD_ADAPTER_INFO;
                   1647:        adapter->tx_pcb.length = 0;
                   1648:        if (!send_pcb(dev, &adapter->tx_pcb) ||
                   1649:            !receive_pcb(dev, &adapter->rx_pcb) ||
                   1650:            (adapter->rx_pcb.command != CMD_ADAPTER_INFO_RESPONSE) ||
                   1651:            (adapter->rx_pcb.length != 10)) {
                   1652:                printk("%s: not responding to second PCB\n", dev->name);
                   1653:        }
                   1654:        printk("rev %d.%d, %dk\n", adapter->rx_pcb.data.info.major_vers, adapter->rx_pcb.data.info.minor_vers, adapter->rx_pcb.data.info.RAM_sz);
                   1655: 
                   1656:        /*
                   1657:         * reconfigure the adapter memory to better suit our purposes
                   1658:         */
                   1659:        adapter->tx_pcb.command = CMD_CONFIGURE_ADAPTER_MEMORY;
                   1660:        adapter->tx_pcb.length = 12;
                   1661:        adapter->tx_pcb.data.memconf.cmd_q = 8;
                   1662:        adapter->tx_pcb.data.memconf.rcv_q = 8;
                   1663:        adapter->tx_pcb.data.memconf.mcast = 10;
                   1664:        adapter->tx_pcb.data.memconf.frame = 10;
                   1665:        adapter->tx_pcb.data.memconf.rcv_b = 10;
                   1666:        adapter->tx_pcb.data.memconf.progs = 0;
                   1667:        if (!send_pcb(dev, &adapter->tx_pcb) ||
                   1668:            !receive_pcb(dev, &adapter->rx_pcb) ||
                   1669:            (adapter->rx_pcb.command != CMD_CONFIGURE_ADAPTER_RESPONSE) ||
                   1670:            (adapter->rx_pcb.length != 2)) {
                   1671:                printk("%s: could not configure adapter memory\n", dev->name);
                   1672:        }
                   1673:        if (adapter->rx_pcb.data.configure) {
                   1674:                printk("%s: adapter configuration failed\n", dev->name);
                   1675:        }
                   1676:        /*
                   1677:         * and reserve the address region
                   1678:         */
                   1679:        request_region(dev->base_addr, ELP_IO_EXTENT, "3c505");
                   1680: 
                   1681:        /*
                   1682:         * initialise the device
                   1683:         */
                   1684:        elp_init(dev);
                   1685: 
                   1686:        return 0;
                   1687: }
                   1688: 
                   1689: #ifdef MODULE
                   1690: static char devicename[9] = {0,};
                   1691: static struct device dev_3c505 =
                   1692: {
                   1693:        devicename,             /* device name is inserted by linux/drivers/net/net_init.c */
                   1694:        0, 0, 0, 0,
                   1695:        0, 0,
                   1696:        0, 0, 0, NULL, elplus_probe};
                   1697: 
                   1698: int io = 0x300;
                   1699: int irq = 0;
                   1700: 
                   1701: int init_module(void)
                   1702: {
                   1703:        if (io == 0)
                   1704:                printk("3c505: You should not use auto-probing with insmod!\n");
                   1705:        dev_3c505.base_addr = io;
                   1706:        dev_3c505.irq = irq;
                   1707:        if (register_netdev(&dev_3c505) != 0) {
                   1708:                return -EIO;
                   1709:        }
                   1710:        return 0;
                   1711: }
                   1712: 
                   1713: void cleanup_module(void)
                   1714: {
                   1715:        unregister_netdev(&dev_3c505);
                   1716:        kfree(dev_3c505.priv);
                   1717:        dev_3c505.priv = NULL;
                   1718: 
                   1719:        /* If we don't do this, we can't re-insmod it later. */
                   1720:        release_region(dev_3c505.base_addr, ELP_IO_EXTENT);
                   1721: }
                   1722: 
                   1723: #endif                         /* MODULE */
                   1724: 
                   1725: 
                   1726: /*
                   1727:  * Local Variables:
                   1728:  *  c-file-style: "linux"
                   1729:  *  tab-width: 8
                   1730:  *  compile-command: "gcc -D__KERNEL__ -I/discs/bibble/src/linux-1.3.69/include  -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -fno-strength-reduce -pipe -m486 -DCPU=486 -DMODULE  -c 3c505.c"
                   1731:  * End:
                   1732:  */

unix.superglobalmegacorp.com

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