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

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)
        !          1411:                printk(stilllooking_msg);
        !          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)
        !          1442:                printk(found_msg);
        !          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.