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

1.1     ! root        1: /* 3c515.c: A 3Com ISA EtherLink XL "Corkscrew" ethernet driver for linux. */
        !             2: /*
        !             3:        Written 1997-1998 by Donald Becker.
        !             4: 
        !             5:        This software may be used and distributed according to the terms
        !             6:        of the GNU Public License, incorporated herein by reference.
        !             7: 
        !             8:        This driver is for the 3Com ISA EtherLink XL "Corkscrew" 3c515 ethercard.
        !             9: 
        !            10:        The author may be reached as [email protected], or C/O
        !            11:        Center of Excellence in Space Data and Information Sciences
        !            12:           Code 930.5, Goddard Space Flight Center, Greenbelt MD 20771
        !            13: */
        !            14: 
        !            15: static char *version = "3c515.c:v0.99 4/7/98 [email protected]\n";
        !            16: #define CORKSCREW 1
        !            17: 
        !            18: /* "Knobs" that adjust features and parameters. */
        !            19: /* Set the copy breakpoint for the copy-only-tiny-frames scheme.
        !            20:    Setting to > 1512 effectively disables this feature. */
        !            21: static const int rx_copybreak = 200;
        !            22: /* Allow setting MTU to a larger size, bypassing the normal ethernet setup. */
        !            23: static const int mtu = 1500;
        !            24: /* Maximum events (Rx packets, etc.) to handle at each interrupt. */
        !            25: static int max_interrupt_work = 20;
        !            26: 
        !            27: /* Enable the automatic media selection code -- usually set. */
        !            28: #define AUTOMEDIA 1
        !            29: 
        !            30: /* Allow the use of fragment bus master transfers instead of only
        !            31:    programmed-I/O for Vortex cards.  Full-bus-master transfers are always
        !            32:    enabled by default on Boomerang cards.  If VORTEX_BUS_MASTER is defined,
        !            33:    the feature may be turned on using 'options'. */
        !            34: #define VORTEX_BUS_MASTER
        !            35: 
        !            36: /* A few values that may be tweaked. */
        !            37: /* Keep the ring sizes a power of two for efficiency. */
        !            38: #define TX_RING_SIZE   16
        !            39: #define RX_RING_SIZE   16
        !            40: #define PKT_BUF_SZ             1536                    /* Size of each temporary Rx buffer.*/
        !            41: 
        !            42: #ifdef MODULE
        !            43: #ifdef MODVERSIONS
        !            44: #include <linux/modversions.h>
        !            45: #endif
        !            46: #include <linux/module.h>
        !            47: #include <linux/version.h>
        !            48: #else
        !            49: #define MOD_INC_USE_COUNT
        !            50: #define MOD_DEC_USE_COUNT
        !            51: #endif
        !            52: 
        !            53: #include <linux/kernel.h>
        !            54: #include <linux/sched.h>
        !            55: #include <linux/string.h>
        !            56: #include <linux/ptrace.h>
        !            57: #include <linux/errno.h>
        !            58: #include <linux/in.h>
        !            59: #include <linux/ioport.h>
        !            60: #include <linux/malloc.h>
        !            61: #include <linux/interrupt.h>
        !            62: #include <linux/pci.h>
        !            63: #include <linux/bios32.h>
        !            64: #include <linux/timer.h>
        !            65: #include <asm/bitops.h>
        !            66: #include <asm/io.h>
        !            67: #include <asm/dma.h>
        !            68: 
        !            69: #include <linux/netdevice.h>
        !            70: #include <linux/etherdevice.h>
        !            71: #include <linux/skbuff.h>
        !            72: #if (LINUX_VERSION_CODE >= 0x10344)
        !            73: #define NEW_MULTICAST
        !            74: #include <linux/delay.h>
        !            75: #else
        !            76: #define udelay(microsec)       do { int _i = 4*microsec; while (--_i > 0) { __SLOW_DOWN_IO; }} while (0)
        !            77: #endif
        !            78: 
        !            79: /* Kernel version compatibility functions. */
        !            80: #define RUN_AT(x) (jiffies + (x))
        !            81: #define DEV_ALLOC_SKB(len) dev_alloc_skb(len + 2)
        !            82: 
        !            83: #define FREE_IRQ(irqnum, dev) free_irq(irqnum, dev)
        !            84: #define REQUEST_IRQ(i,h,f,n, instance) request_irq(i,h,f,n, instance)
        !            85: #define IRQ(irq, dev_id, pt_regs) (irq, dev_id, pt_regs)
        !            86: 
        !            87: #if (LINUX_VERSION_CODE < 0x20123)
        !            88: #define test_and_set_bit(val, addr) set_bit(val, addr)
        !            89: #elif defined(MODULE)
        !            90: MODULE_AUTHOR("Donald Becker <[email protected]>");
        !            91: MODULE_DESCRIPTION("3Com 3c515 Corkscrew driver");
        !            92: MODULE_PARM(debug, "i");
        !            93: MODULE_PARM(options, "1-" __MODULE_STRING(8) "i");
        !            94: MODULE_PARM(full_duplex, "1-" __MODULE_STRING(8) "i");
        !            95: MODULE_PARM(rx_copybreak, "i");
        !            96: MODULE_PARM(max_interrupt_work, "i");
        !            97: #endif
        !            98: 
        !            99: /* "Knobs" for adjusting internal parameters. */
        !           100: /* Put out somewhat more debugging messages. (0 - no msg, 1 minimal msgs). */
        !           101: #define DRIVER_DEBUG 1
        !           102: /* Some values here only for performance evaluation and path-coverage
        !           103:    debugging. */
        !           104: static int rx_nocopy = 0, rx_copy = 0, queued_packet = 0;
        !           105: 
        !           106: /* Number of times to check to see if the Tx FIFO has space, used in some
        !           107:    limited cases. */
        !           108: #define WAIT_TX_AVAIL 200
        !           109: 
        !           110: /* Operational parameter that usually are not changed. */
        !           111: #define TX_TIMEOUT  40         /* Time in jiffies before concluding Tx hung */
        !           112: 
        !           113: /* The size here is somewhat misleading: the Corkscrew also uses the ISA
        !           114:    aliased registers at <base>+0x400.
        !           115:    */
        !           116: #define CORKSCREW_TOTAL_SIZE 0x20
        !           117: 
        !           118: #ifdef HAVE_DEVLIST
        !           119: struct netdev_entry tc515_drv =
        !           120: {"3c515", tc515_probe, CORKSCREW_TOTAL_SIZE, NULL};
        !           121: #endif
        !           122: 
        !           123: #ifdef DRIVER_DEBUG
        !           124: int vortex_debug = DRIVER_DEBUG;
        !           125: #else
        !           126: int vortex_debug = 1;
        !           127: #endif
        !           128: 
        !           129: #define CORKSCREW_ID 10
        !           130: 
        !           131: /*
        !           132:                                Theory of Operation
        !           133: 
        !           134: I. Board Compatibility
        !           135: 
        !           136: This device driver is designed for the 3Com 3c515 ISA Fast EtherLink XL,
        !           137: 3Com's ISA bus adapter for Fast Ethernet.  Due to the unique I/O port layout,
        !           138: it's not practical to integrate this driver with the other EtherLink drivers.
        !           139: 
        !           140: II. Board-specific settings
        !           141: 
        !           142: The Corkscrew has an EEPROM for configuration, but no special settings are
        !           143: needed for Linux.
        !           144: 
        !           145: III. Driver operation
        !           146: 
        !           147: The 3c515 series use an interface that's very similar to the 3c900 "Boomerang"
        !           148: PCI cards, with the bus master interface extensively modified to work with
        !           149: the ISA bus.
        !           150: 
        !           151: The card is capable of full-bus-master transfers with separate
        !           152: lists of transmit and receive descriptors, similar to the AMD LANCE/PCnet,
        !           153: DEC Tulip and Intel Speedo3.
        !           154: 
        !           155: This driver uses a "RX_COPYBREAK" scheme rather than a fixed intermediate
        !           156: receive buffer.  This scheme allocates full-sized skbuffs as receive
        !           157: buffers.  The value RX_COPYBREAK is used as the copying breakpoint: it is
        !           158: chosen to trade-off the memory wasted by passing the full-sized skbuff to
        !           159: the queue layer for all frames vs. the copying cost of copying a frame to a
        !           160: correctly-sized skbuff.
        !           161: 
        !           162: 
        !           163: IIIC. Synchronization
        !           164: The driver runs as two independent, single-threaded flows of control.  One
        !           165: is the send-packet routine, which enforces single-threaded use by the
        !           166: dev->tbusy flag.  The other thread is the interrupt handler, which is single
        !           167: threaded by the hardware and other software.
        !           168: 
        !           169: IV. Notes
        !           170: 
        !           171: Thanks to Terry Murphy of 3Com for providing documentation and a development
        !           172: board.
        !           173: 
        !           174: The names "Vortex", "Boomerang" and "Corkscrew" are the internal 3Com
        !           175: project names.  I use these names to eliminate confusion -- 3Com product
        !           176: numbers and names are very similar and often confused.
        !           177: 
        !           178: The new chips support both ethernet (1.5K) and FDDI (4.5K) frame sizes!
        !           179: This driver only supports ethernet frames because of the recent MTU limit
        !           180: of 1.5K, but the changes to support 4.5K are minimal.
        !           181: */
        !           182: 
        !           183: /* Operational definitions.
        !           184:    These are not used by other compilation units and thus are not
        !           185:    exported in a ".h" file.
        !           186: 
        !           187:    First the windows.  There are eight register windows, with the command
        !           188:    and status registers available in each.
        !           189:    */
        !           190: #define EL3WINDOW(win_num) outw(SelectWindow + (win_num), ioaddr + EL3_CMD)
        !           191: #define EL3_CMD 0x0e
        !           192: #define EL3_STATUS 0x0e
        !           193: 
        !           194: /* The top five bits written to EL3_CMD are a command, the lower
        !           195:    11 bits are the parameter, if applicable.
        !           196:    Note that 11 parameters bits was fine for ethernet, but the new chips
        !           197:    can handle FDDI length frames (~4500 octets) and now parameters count
        !           198:    32-bit 'Dwords' rather than octets. */
        !           199: 
        !           200: enum vortex_cmd {
        !           201:        TotalReset = 0<<11, SelectWindow = 1<<11, StartCoax = 2<<11,
        !           202:        RxDisable = 3<<11, RxEnable = 4<<11, RxReset = 5<<11,
        !           203:        UpStall = 6<<11, UpUnstall = (6<<11)+1,
        !           204:        DownStall = (6<<11)+2, DownUnstall = (6<<11)+3,
        !           205:        RxDiscard = 8<<11, TxEnable = 9<<11, TxDisable = 10<<11, TxReset = 11<<11,
        !           206:        FakeIntr = 12<<11, AckIntr = 13<<11, SetIntrEnb = 14<<11,
        !           207:        SetStatusEnb = 15<<11, SetRxFilter = 16<<11, SetRxThreshold = 17<<11,
        !           208:        SetTxThreshold = 18<<11, SetTxStart = 19<<11,
        !           209:        StartDMAUp = 20<<11, StartDMADown = (20<<11)+1, StatsEnable = 21<<11,
        !           210:        StatsDisable = 22<<11, StopCoax = 23<<11,};
        !           211: 
        !           212: /* The SetRxFilter command accepts the following classes: */
        !           213: enum RxFilter {
        !           214:        RxStation = 1, RxMulticast = 2, RxBroadcast = 4, RxProm = 8 };
        !           215: 
        !           216: /* Bits in the general status register. */
        !           217: enum vortex_status {
        !           218:        IntLatch = 0x0001, AdapterFailure = 0x0002, TxComplete = 0x0004,
        !           219:        TxAvailable = 0x0008, RxComplete = 0x0010, RxEarly = 0x0020,
        !           220:        IntReq = 0x0040, StatsFull = 0x0080,
        !           221:        DMADone = 1<<8, DownComplete = 1<<9, UpComplete = 1<<10,
        !           222:        DMAInProgress = 1<<11,                  /* DMA controller is still busy.*/
        !           223:        CmdInProgress = 1<<12,                  /* EL3_CMD is still busy.*/
        !           224: };
        !           225: 
        !           226: /* Register window 1 offsets, the window used in normal operation.
        !           227:    On the Corkscrew this window is always mapped at offsets 0x10-0x1f. */
        !           228: enum Window1 {
        !           229:        TX_FIFO = 0x10,  RX_FIFO = 0x10,  RxErrors = 0x14,
        !           230:        RxStatus = 0x18,  Timer=0x1A, TxStatus = 0x1B,
        !           231:        TxFree = 0x1C, /* Remaining free bytes in Tx buffer. */
        !           232: };
        !           233: enum Window0 {
        !           234:   Wn0IRQ = 0x08,
        !           235: #if defined(CORKSCREW)
        !           236:        Wn0EepromCmd = 0x200A,          /* Corkscrew EEPROM command register. */
        !           237:        Wn0EepromData = 0x200C,         /* Corkscrew EEPROM results register. */
        !           238: #else
        !           239:        Wn0EepromCmd = 10,              /* Window 0: EEPROM command register. */
        !           240:        Wn0EepromData = 12,             /* Window 0: EEPROM results register. */
        !           241: #endif
        !           242: };
        !           243: enum Win0_EEPROM_bits {
        !           244:        EEPROM_Read = 0x80, EEPROM_WRITE = 0x40, EEPROM_ERASE = 0xC0,
        !           245:        EEPROM_EWENB = 0x30,            /* Enable erasing/writing for 10 msec. */
        !           246:        EEPROM_EWDIS = 0x00,            /* Disable EWENB before 10 msec timeout. */
        !           247: };
        !           248: /* EEPROM locations. */
        !           249: enum eeprom_offset {
        !           250:        PhysAddr01=0, PhysAddr23=1, PhysAddr45=2, ModelID=3,
        !           251:        EtherLink3ID=7, };
        !           252: 
        !           253: enum Window3 {                 /* Window 3: MAC/config bits. */
        !           254:        Wn3_Config=0, Wn3_MAC_Ctrl=6, Wn3_Options=8,
        !           255: };
        !           256: union wn3_config {
        !           257:        int i;
        !           258:        struct w3_config_fields {
        !           259:                unsigned int ram_size:3, ram_width:1, ram_speed:2, rom_size:2;
        !           260:                int pad8:8;
        !           261:                unsigned int ram_split:2, pad18:2, xcvr:3, pad21:1, autoselect:1;
        !           262:                int pad24:7;
        !           263:        } u;
        !           264: };
        !           265: 
        !           266: enum Window4 {
        !           267:        Wn4_NetDiag = 6, Wn4_Media = 10,                /* Window 4: Xcvr/media bits. */
        !           268: };
        !           269: enum Win4_Media_bits {
        !           270:        Media_SQE = 0x0008,             /* Enable SQE error counting for AUI. */
        !           271:        Media_10TP = 0x00C0,    /* Enable link beat and jabber for 10baseT. */
        !           272:        Media_Lnk = 0x0080,             /* Enable just link beat for 100TX/100FX. */
        !           273:        Media_LnkBeat = 0x0800,
        !           274: };
        !           275: enum Window7 {                                 /* Window 7: Bus Master control. */
        !           276:        Wn7_MasterAddr = 0, Wn7_MasterLen = 6, Wn7_MasterStatus = 12,
        !           277: };
        !           278: /* Boomerang-style bus master control registers.  Note ISA aliases! */
        !           279: enum MasterCtrl {
        !           280:        PktStatus = 0x400, DownListPtr = 0x404, FragAddr = 0x408, FragLen = 0x40c,
        !           281:        TxFreeThreshold = 0x40f, UpPktStatus = 0x410, UpListPtr = 0x418,
        !           282: };
        !           283: 
        !           284: /* The Rx and Tx descriptor lists.
        !           285:    Caution Alpha hackers: these types are 32 bits!  Note also the 8 byte
        !           286:    alignment contraint on tx_ring[] and rx_ring[]. */
        !           287: struct boom_rx_desc {
        !           288:        u32 next;
        !           289:        s32 status;
        !           290:        u32 addr;
        !           291:        s32 length;
        !           292: };
        !           293: /* Values for the Rx status entry. */
        !           294: enum rx_desc_status {
        !           295:        RxDComplete=0x00008000, RxDError=0x4000,
        !           296:        /* See boomerang_rx() for actual error bits */
        !           297: };
        !           298: 
        !           299: struct boom_tx_desc {
        !           300:        u32 next;
        !           301:        s32 status;
        !           302:        u32 addr;
        !           303:        s32 length;
        !           304: };
        !           305: 
        !           306: struct vortex_private {
        !           307:        char devname[8];                        /* "ethN" string, also for kernel debug. */
        !           308:        const char *product_name;
        !           309:        struct device *next_module;
        !           310:        /* The Rx and Tx rings are here to keep them quad-word-aligned. */
        !           311:        struct boom_rx_desc rx_ring[RX_RING_SIZE];
        !           312:        struct boom_tx_desc tx_ring[TX_RING_SIZE];
        !           313:        /* The addresses of transmit- and receive-in-place skbuffs. */
        !           314:        struct sk_buff* rx_skbuff[RX_RING_SIZE];
        !           315:        struct sk_buff* tx_skbuff[TX_RING_SIZE];
        !           316:        unsigned int cur_rx, cur_tx;            /* The next free ring entry */
        !           317:        unsigned int dirty_rx, dirty_tx;        /* The ring entries to be free()ed. */
        !           318:        struct enet_statistics stats;
        !           319:        struct sk_buff *tx_skb;         /* Packet being eaten by bus master ctrl.  */
        !           320:        struct timer_list timer;        /* Media selection timer. */
        !           321:        int capabilities;                       /* Adapter capabilities word. */
        !           322:        int options;                            /* User-settable misc. driver options. */
        !           323:        int last_rx_packets;            /* For media autoselection. */
        !           324:        unsigned int available_media:8, /* From Wn3_Options */
        !           325:          media_override:3,                     /* Passed-in media type. */
        !           326:          default_media:3,                      /* Read from the EEPROM. */
        !           327:          full_duplex:1, autoselect:1,
        !           328:          bus_master:1,                         /* Vortex can only do a fragment bus-m. */
        !           329:          full_bus_master_tx:1, full_bus_master_rx:1, /* Boomerang  */
        !           330:       tx_full:1;
        !           331: };
        !           332: 
        !           333: /* The action to take with a media selection timer tick.
        !           334:    Note that we deviate from the 3Com order by checking 10base2 before AUI.
        !           335:  */
        !           336: enum xcvr_types {
        !           337:        XCVR_10baseT=0, XCVR_AUI, XCVR_10baseTOnly, XCVR_10base2, XCVR_100baseTx,
        !           338:        XCVR_100baseFx, XCVR_MII=6, XCVR_Default=8,
        !           339: };
        !           340: 
        !           341: static struct media_table {
        !           342:   char *name;
        !           343:   unsigned int media_bits:16,          /* Bits to set in Wn4_Media register. */
        !           344:        mask:8,                         /* The transceiver-present bit in Wn3_Config.*/
        !           345:        next:8;                         /* The media type to try next. */
        !           346:   short wait;                  /* Time before we check media status. */
        !           347: } media_tbl[] = {
        !           348:   {    "10baseT",   Media_10TP,0x08, XCVR_10base2, (14*HZ)/10},
        !           349:   { "10Mbs AUI", Media_SQE, 0x20, XCVR_Default, (1*HZ)/10},
        !           350:   { "undefined", 0,                    0x80, XCVR_10baseT, 10000},
        !           351:   { "10base2",   0,                    0x10, XCVR_AUI,         (1*HZ)/10},
        !           352:   { "100baseTX", Media_Lnk, 0x02, XCVR_100baseFx, (14*HZ)/10},
        !           353:   { "100baseFX", Media_Lnk, 0x04, XCVR_MII,            (14*HZ)/10},
        !           354:   { "MII",              0,                     0x40, XCVR_10baseT, 3*HZ },
        !           355:   { "undefined", 0,                    0x01, XCVR_10baseT, 10000},
        !           356:   { "Default",  0,                     0xFF, XCVR_10baseT, 10000},
        !           357: };
        !           358: 
        !           359: static int vortex_scan(struct device *dev);
        !           360: static struct device *vortex_found_device(struct device *dev, int ioaddr,
        !           361:                                                                                  int irq, int product_index,
        !           362:                                                                                  int options);
        !           363: static int vortex_probe1(struct device *dev);
        !           364: static int vortex_open(struct device *dev);
        !           365: static void vortex_timer(unsigned long arg);
        !           366: static int vortex_start_xmit(struct sk_buff *skb, struct device *dev);
        !           367: static int vortex_rx(struct device *dev);
        !           368: static int boomerang_rx(struct device *dev);
        !           369: static void vortex_interrupt IRQ(int irq, void *dev_id, struct pt_regs *regs);
        !           370: static int vortex_close(struct device *dev);
        !           371: static void update_stats(int addr, struct device *dev);
        !           372: static struct enet_statistics *vortex_get_stats(struct device *dev);
        !           373: static void set_rx_mode(struct device *dev);
        !           374: 
        !           375: 
        !           376: /* Unlike the other PCI cards the 59x cards don't need a large contiguous
        !           377:    memory region, so making the driver a loadable module is feasible.
        !           378: 
        !           379:    Unfortunately maximizing the shared code between the integrated and
        !           380:    module version of the driver results in a complicated set of initialization
        !           381:    procedures.
        !           382:    init_module() -- modules /  tc59x_init()  -- built-in
        !           383:                The wrappers for vortex_scan()
        !           384:    vortex_scan()                The common routine that scans for PCI and EISA cards
        !           385:    vortex_found_device() Allocate a device structure when we find a card.
        !           386:                                        Different versions exist for modules and built-in.
        !           387:    vortex_probe1()             Fill in the device structure -- this is separated
        !           388:                                        so that the modules code can put it in dev->init.
        !           389: */
        !           390: /* This driver uses 'options' to pass the media type, full-duplex flag, etc. */
        !           391: /* Note: this is the only limit on the number of cards supported!! */
        !           392: static int options[8] = { -1, -1, -1, -1, -1, -1, -1, -1,};
        !           393: 
        !           394: #ifdef MODULE
        !           395: static int debug = -1;
        !           396: /* A list of all installed Vortex devices, for removing the driver module. */
        !           397: static struct device *root_vortex_dev = NULL;
        !           398: 
        !           399: int
        !           400: init_module(void)
        !           401: {
        !           402:        int cards_found;
        !           403: 
        !           404:        if (debug >= 0)
        !           405:                vortex_debug = debug;
        !           406:        if (vortex_debug)
        !           407:                printk(version);
        !           408: 
        !           409:        root_vortex_dev = NULL;
        !           410:        cards_found = vortex_scan(0);
        !           411:        return cards_found ? 0 : -ENODEV;
        !           412: }
        !           413: 
        !           414: #else
        !           415: int tc515_probe(struct device *dev)
        !           416: {
        !           417:        int cards_found = 0;
        !           418: 
        !           419:        cards_found = vortex_scan(dev);
        !           420: 
        !           421:        if (vortex_debug > 0  &&  cards_found)
        !           422:                printk(version);
        !           423: 
        !           424:        return cards_found ? 0 : -ENODEV;
        !           425: }
        !           426: #endif  /* not MODULE */
        !           427: 
        !           428: static int vortex_scan(struct device *dev)
        !           429: {
        !           430:        int cards_found = 0;
        !           431:        static int ioaddr = 0x100;
        !           432: 
        !           433:        /* Check all locations on the ISA bus -- evil! */
        !           434:        for (; ioaddr < 0x400; ioaddr += 0x20) {
        !           435:          int irq;
        !           436:          if (check_region(ioaddr, CORKSCREW_TOTAL_SIZE))
        !           437:                continue;
        !           438:          /* Check the resource configuration for a matching ioaddr. */
        !           439:          if ((inw(ioaddr + 0x2002) & 0x1f0) != (ioaddr & 0x1f0))
        !           440:                continue;
        !           441:          /* Verify by reading the device ID from the EEPROM. */
        !           442:          {
        !           443:                int timer;
        !           444:                outw(EEPROM_Read + 7, ioaddr + Wn0EepromCmd);
        !           445:                /* Pause for at least 162 us. for the read to take place. */
        !           446:                for (timer = 4; timer >= 0; timer--) {
        !           447:                  udelay(162);
        !           448:                  if ((inw(ioaddr + Wn0EepromCmd) & 0x0200) == 0)
        !           449:                        break;
        !           450:                }
        !           451:                if (inw(ioaddr + Wn0EepromData) != 0x6d50)
        !           452:                  continue;
        !           453:          }
        !           454:          printk("3c515 Resource configuraiton register %#4.4x, DCR %4.4x.\n",
        !           455:                         inl(ioaddr + 0x2002), inw(ioaddr + 0x2000));
        !           456:          irq = inw(ioaddr + 0x2002) & 15;
        !           457:          vortex_found_device(dev, ioaddr, irq, CORKSCREW_ID, dev && dev->mem_start
        !           458:                                                  ? dev->mem_start : options[cards_found]);
        !           459:          dev = 0;
        !           460:          cards_found++;
        !           461:        }
        !           462: 
        !           463:        if (vortex_debug)
        !           464:          printk("%d 3c515 cards found.\n", cards_found);
        !           465:        return cards_found;
        !           466: }
        !           467: 
        !           468: static struct device *vortex_found_device(struct device *dev, int ioaddr,
        !           469:                                                                                  int irq, int product_index,
        !           470:                                                                                  int options)
        !           471: {
        !           472:        struct vortex_private *vp;
        !           473: 
        !           474: #ifdef MODULE
        !           475:        /* Allocate and fill new device structure. */
        !           476:        int dev_size = sizeof(struct device) +
        !           477:                sizeof(struct vortex_private) + 15;             /* Pad for alignment */
        !           478:        
        !           479:        dev = (struct device *) kmalloc(dev_size, GFP_KERNEL);
        !           480:        memset(dev, 0, dev_size);
        !           481:        /* Align the Rx and Tx ring entries.  */
        !           482:        dev->priv = (void *)(((long)dev + sizeof(struct device) + 15) & ~15);
        !           483:        vp = (struct vortex_private *)dev->priv;
        !           484:        dev->name = vp->devname; /* An empty string. */
        !           485:        dev->base_addr = ioaddr;
        !           486:        dev->irq = irq;
        !           487:        dev->dma = (product_index == CORKSCREW_ID ? inw(ioaddr + 0x2000) & 7 : 0);
        !           488:        dev->init = vortex_probe1;
        !           489:        vp->product_name = "3c515";
        !           490:        vp->options = options;
        !           491:        if (options >= 0) {
        !           492:                vp->media_override = ((options & 7) == 2)  ?  0  :  options & 7;
        !           493:                vp->full_duplex = (options & 8) ? 1 : 0;
        !           494:                vp->bus_master = (options & 16) ? 1 : 0;
        !           495:        } else {
        !           496:                vp->media_override = 7;
        !           497:                vp->full_duplex = 0;
        !           498:                vp->bus_master = 0;
        !           499:        }
        !           500:        ether_setup(dev);
        !           501:        vp->next_module = root_vortex_dev;
        !           502:        root_vortex_dev = dev;
        !           503:        if (register_netdev(dev) != 0)
        !           504:                return 0;
        !           505: #else  /* not a MODULE */
        !           506:        if (dev) {
        !           507:                /* Caution: quad-word alignment required for rings! */
        !           508:                dev->priv = kmalloc(sizeof (struct vortex_private), GFP_KERNEL);
        !           509:                memset(dev->priv, 0, sizeof (struct vortex_private));
        !           510:        }
        !           511:        dev = init_etherdev(dev, sizeof(struct vortex_private));
        !           512:        dev->base_addr = ioaddr;
        !           513:        dev->irq = irq;
        !           514:        dev->dma = (product_index == CORKSCREW_ID ? inw(ioaddr + 0x2000) & 7 : 0);
        !           515:        vp  = (struct vortex_private *)dev->priv;
        !           516:        vp->product_name = "3c515";
        !           517:        vp->options = options;
        !           518:        if (options >= 0) {
        !           519:                vp->media_override = ((options & 7) == 2)  ?  0  :  options & 7;
        !           520:                vp->full_duplex = (options & 8) ? 1 : 0;
        !           521:                vp->bus_master = (options & 16) ? 1 : 0;
        !           522:        } else {
        !           523:                vp->media_override = 7;
        !           524:                vp->full_duplex = 0;
        !           525:                vp->bus_master = 0;
        !           526:        }
        !           527: 
        !           528:        vortex_probe1(dev);
        !           529: #endif /* MODULE */
        !           530:        return dev;
        !           531: }
        !           532: 
        !           533: static int vortex_probe1(struct device *dev)
        !           534: {
        !           535:        int ioaddr = dev->base_addr;
        !           536:        struct vortex_private *vp = (struct vortex_private *)dev->priv;
        !           537:        unsigned int eeprom[0x40], checksum = 0;                /* EEPROM contents */
        !           538:        int i;
        !           539: 
        !           540:        printk("%s: 3Com %s at %#3x,", dev->name,
        !           541:                   vp->product_name, ioaddr);
        !           542: 
        !           543:        /* Read the station address from the EEPROM. */
        !           544:        EL3WINDOW(0);
        !           545:        for (i = 0; i < 0x18; i++) {
        !           546:                short *phys_addr = (short *)dev->dev_addr;
        !           547:                int timer;
        !           548:                outw(EEPROM_Read + i, ioaddr + Wn0EepromCmd);
        !           549:                /* Pause for at least 162 us. for the read to take place. */
        !           550:                for (timer = 4; timer >= 0; timer--) {
        !           551:                        udelay(162);
        !           552:                        if ((inw(ioaddr + Wn0EepromCmd) & 0x0200) == 0)
        !           553:                                break;
        !           554:                }
        !           555:                eeprom[i] = inw(ioaddr + Wn0EepromData);
        !           556:                checksum ^= eeprom[i];
        !           557:                if (i < 3)
        !           558:                        phys_addr[i] = htons(eeprom[i]);
        !           559:        }
        !           560:        checksum = (checksum ^ (checksum >> 8)) & 0xff;
        !           561:        if (checksum != 0x00)
        !           562:                printk(" ***INVALID CHECKSUM %4.4x*** ", checksum);
        !           563:        for (i = 0; i < 6; i++)
        !           564:                printk("%c%2.2x", i ? ':' : ' ', dev->dev_addr[i]);
        !           565:        if (eeprom[16] == 0x11c7) {             /* Corkscrew */
        !           566:          if (request_dma(dev->dma, "3c515")) {
        !           567:                printk(", DMA %d allocation failed", dev->dma);
        !           568:                dev->dma = 0;
        !           569:          } else 
        !           570:                printk(", DMA %d", dev->dma);
        !           571:        }
        !           572:        printk(", IRQ %d\n", dev->irq);
        !           573:        /* Tell them about an invalid IRQ. */
        !           574:        if (vortex_debug && (dev->irq <= 0 || dev->irq > 15))
        !           575:                printk(" *** Warning: this IRQ is unlikely to work! ***\n");
        !           576: 
        !           577:        {
        !           578:                char *ram_split[] = {"5:3", "3:1", "1:1", "3:5"};
        !           579:                union wn3_config config;
        !           580:                EL3WINDOW(3);
        !           581:                vp->available_media = inw(ioaddr + Wn3_Options);
        !           582:                config.i = inl(ioaddr + Wn3_Config);
        !           583:                if (vortex_debug > 1)
        !           584:                        printk("  Internal config register is %4.4x, transceivers %#x.\n",
        !           585:                                   config.i, inw(ioaddr + Wn3_Options));
        !           586:                printk("  %dK %s-wide RAM %s Rx:Tx split, %s%s interface.\n",
        !           587:                           8 << config.u.ram_size,
        !           588:                           config.u.ram_width ? "word" : "byte",
        !           589:                           ram_split[config.u.ram_split],
        !           590:                           config.u.autoselect ? "autoselect/" : "",
        !           591:                           media_tbl[config.u.xcvr].name);
        !           592:                dev->if_port = config.u.xcvr;
        !           593:                vp->default_media = config.u.xcvr;
        !           594:                vp->autoselect = config.u.autoselect;
        !           595:        }
        !           596:        if (vp->media_override != 7) {
        !           597:                printk("  Media override to transceiver type %d (%s).\n",
        !           598:                           vp->media_override, media_tbl[vp->media_override].name);
        !           599:                dev->if_port = vp->media_override;
        !           600:        }
        !           601: 
        !           602:        vp->capabilities = eeprom[16];
        !           603:        vp->full_bus_master_tx = (vp->capabilities & 0x20) ? 1 : 0;
        !           604:        /* Rx is broken at 10mbps, so we always disable it. */
        !           605:        /* vp->full_bus_master_rx = 0;*/
        !           606:        vp->full_bus_master_rx = (vp->capabilities & 0x20) ? 1 : 0;
        !           607: 
        !           608:        /* We do a request_region() to register /proc/ioports info. */
        !           609:        request_region(ioaddr, CORKSCREW_TOTAL_SIZE, vp->product_name);
        !           610: 
        !           611:        /* The 3c59x-specific entries in the device structure. */
        !           612:        dev->open = &vortex_open;
        !           613:        dev->hard_start_xmit = &vortex_start_xmit;
        !           614:        dev->stop = &vortex_close;
        !           615:        dev->get_stats = &vortex_get_stats;
        !           616:        dev->set_multicast_list = &set_rx_mode;
        !           617: 
        !           618:        return 0;
        !           619: }
        !           620: 
        !           621: 
        !           622: static int
        !           623: vortex_open(struct device *dev)
        !           624: {
        !           625:        int ioaddr = dev->base_addr;
        !           626:        struct vortex_private *vp = (struct vortex_private *)dev->priv;
        !           627:        union wn3_config config;
        !           628:        int i;
        !           629: 
        !           630:        /* Before initializing select the active media port. */
        !           631:        EL3WINDOW(3);
        !           632:        if (vp->full_duplex)
        !           633:                outb(0x20, ioaddr + Wn3_MAC_Ctrl); /* Set the full-duplex bit. */
        !           634:        config.i = inl(ioaddr + Wn3_Config);
        !           635: 
        !           636:        if (vp->media_override != 7) {
        !           637:                if (vortex_debug > 1)
        !           638:                        printk("%s: Media override to transceiver %d (%s).\n",
        !           639:                                   dev->name, vp->media_override,
        !           640:                                   media_tbl[vp->media_override].name);
        !           641:                dev->if_port = vp->media_override;
        !           642:        } else if (vp->autoselect) {
        !           643:                /* Find first available media type, starting with 100baseTx. */
        !           644:                dev->if_port = 4;
        !           645:                while (! (vp->available_media & media_tbl[dev->if_port].mask))
        !           646:                        dev->if_port = media_tbl[dev->if_port].next;
        !           647: 
        !           648:                if (vortex_debug > 1)
        !           649:                        printk("%s: Initial media type %s.\n",
        !           650:                                   dev->name, media_tbl[dev->if_port].name);
        !           651: 
        !           652:                init_timer(&vp->timer);
        !           653:                vp->timer.expires = RUN_AT(media_tbl[dev->if_port].wait);
        !           654:                vp->timer.data = (unsigned long)dev;
        !           655:                vp->timer.function = &vortex_timer;    /* timer handler */
        !           656:                add_timer(&vp->timer);
        !           657:        } else
        !           658:                dev->if_port = vp->default_media;
        !           659: 
        !           660:        config.u.xcvr = dev->if_port;
        !           661:        outl(config.i, ioaddr + Wn3_Config);
        !           662: 
        !           663:        if (vortex_debug > 1) {
        !           664:                printk("%s: vortex_open() InternalConfig %8.8x.\n",
        !           665:                        dev->name, config.i);
        !           666:        }
        !           667: 
        !           668:        outw(TxReset, ioaddr + EL3_CMD);
        !           669:        for (i = 20; i >= 0 ; i--)
        !           670:                if ( ! (inw(ioaddr + EL3_STATUS) & CmdInProgress))
        !           671:                        break;
        !           672: 
        !           673:        outw(RxReset, ioaddr + EL3_CMD);
        !           674:        /* Wait a few ticks for the RxReset command to complete. */
        !           675:        for (i = 20; i >= 0 ; i--)
        !           676:                if ( ! (inw(ioaddr + EL3_STATUS) & CmdInProgress))
        !           677:                        break;
        !           678: 
        !           679:        outw(SetStatusEnb | 0x00, ioaddr + EL3_CMD);
        !           680: 
        !           681:        /* Use the now-standard shared IRQ implementation. */
        !           682:        if (vp->capabilities == 0x11c7) {
        !           683:          /* Corkscrew: Cannot share ISA resources. */
        !           684:          if (dev->irq == 0
        !           685:                  || dev->dma == 0
        !           686:                  || request_irq(dev->irq, &vortex_interrupt, 0,
        !           687:                                                 vp->product_name, dev))
        !           688:                return -EAGAIN;
        !           689:          enable_dma(dev->dma);
        !           690:          set_dma_mode(dev->dma, DMA_MODE_CASCADE);
        !           691:        } else if (request_irq(dev->irq, &vortex_interrupt, SA_SHIRQ,
        !           692:                                                   vp->product_name, dev)) {
        !           693:          return -EAGAIN;
        !           694:        }
        !           695: 
        !           696:        if (vortex_debug > 1) {
        !           697:                EL3WINDOW(4);
        !           698:                printk("%s: vortex_open() irq %d media status %4.4x.\n",
        !           699:                           dev->name, dev->irq, inw(ioaddr + Wn4_Media));
        !           700:        }
        !           701: 
        !           702:        /* Set the station address and mask in window 2 each time opened. */
        !           703:        EL3WINDOW(2);
        !           704:        for (i = 0; i < 6; i++)
        !           705:                outb(dev->dev_addr[i], ioaddr + i);
        !           706:        for (; i < 12; i+=2)
        !           707:                outw(0, ioaddr + i);
        !           708: 
        !           709:        if (dev->if_port == 3)
        !           710:                /* Start the thinnet transceiver. We should really wait 50ms...*/
        !           711:                outw(StartCoax, ioaddr + EL3_CMD);
        !           712:        EL3WINDOW(4);
        !           713:        outw((inw(ioaddr + Wn4_Media) & ~(Media_10TP|Media_SQE)) |
        !           714:                 media_tbl[dev->if_port].media_bits, ioaddr + Wn4_Media);
        !           715: 
        !           716:        /* Switch to the stats window, and clear all stats by reading. */
        !           717:        outw(StatsDisable, ioaddr + EL3_CMD);
        !           718:        EL3WINDOW(6);
        !           719:        for (i = 0; i < 10; i++)        
        !           720:                inb(ioaddr + i);
        !           721:        inw(ioaddr + 10);
        !           722:        inw(ioaddr + 12);
        !           723:        /* New: On the Vortex we must also clear the BadSSD counter. */
        !           724:        EL3WINDOW(4);
        !           725:        inb(ioaddr + 12);
        !           726:        /* ..and on the Boomerang we enable the extra statistics bits. */
        !           727:        outw(0x0040, ioaddr + Wn4_NetDiag);
        !           728: 
        !           729:        /* Switch to register set 7 for normal use. */
        !           730:        EL3WINDOW(7);
        !           731: 
        !           732:        if (vp->full_bus_master_rx) { /* Boomerang bus master. */
        !           733:                vp->cur_rx = vp->dirty_rx = 0;
        !           734:                if (vortex_debug > 2)
        !           735:                        printk("%s:  Filling in the Rx ring.\n", dev->name);
        !           736:                for (i = 0; i < RX_RING_SIZE; i++) {
        !           737:                        struct sk_buff *skb;
        !           738:                        if (i < (RX_RING_SIZE - 1))
        !           739:                          vp->rx_ring[i].next = virt_to_bus(&vp->rx_ring[i+1]);
        !           740:                        else
        !           741:                          vp->rx_ring[i].next = 0;
        !           742:                        vp->rx_ring[i].status = 0;      /* Clear complete bit. */
        !           743:                        vp->rx_ring[i].length = PKT_BUF_SZ | 0x80000000;
        !           744:                        skb = dev_alloc_skb(PKT_BUF_SZ);
        !           745:                        vp->rx_skbuff[i] = skb;
        !           746:                        if (skb == NULL)
        !           747:                                break;                  /* Bad news!  */
        !           748:                        skb->dev = dev;                 /* Mark as being used by this device. */
        !           749:                        skb_reserve(skb, 2);    /* Align IP on 16 byte boundaries */
        !           750:                        vp->rx_ring[i].addr = virt_to_bus(skb->tail);
        !           751:                }
        !           752:                vp->rx_ring[i-1].next = virt_to_bus(&vp->rx_ring[0]); /* Wrap the ring. */
        !           753:                outl(virt_to_bus(&vp->rx_ring[0]), ioaddr + UpListPtr);
        !           754:        }
        !           755:        if (vp->full_bus_master_tx) {           /* Boomerang bus master Tx. */
        !           756:                vp->cur_tx = vp->dirty_tx = 0;
        !           757:                outb(PKT_BUF_SZ>>8, ioaddr + TxFreeThreshold); /* Room for a packet. */
        !           758:                /* Clear the Tx ring. */
        !           759:                for (i = 0; i < TX_RING_SIZE; i++)
        !           760:                        vp->tx_skbuff[i] = 0;
        !           761:                outl(0, ioaddr + DownListPtr);
        !           762:        }
        !           763:        /* Set reciever mode: presumably accept b-case and phys addr only. */
        !           764:        set_rx_mode(dev);
        !           765:        outw(StatsEnable, ioaddr + EL3_CMD); /* Turn on statistics. */
        !           766: 
        !           767:        dev->tbusy = 0;
        !           768:        dev->interrupt = 0;
        !           769:        dev->start = 1;
        !           770: 
        !           771:        outw(RxEnable, ioaddr + EL3_CMD); /* Enable the receiver. */
        !           772:        outw(TxEnable, ioaddr + EL3_CMD); /* Enable transmitter. */
        !           773:        /* Allow status bits to be seen. */
        !           774:        outw(SetStatusEnb | AdapterFailure|IntReq|StatsFull | 
        !           775:                 (vp->full_bus_master_tx ? DownComplete : TxAvailable) |
        !           776:                 (vp->full_bus_master_rx ? UpComplete : RxComplete) | 
        !           777:                 (vp->bus_master ? DMADone : 0),
        !           778:                 ioaddr + EL3_CMD);
        !           779:        /* Ack all pending events, and set active indicator mask. */
        !           780:        outw(AckIntr | IntLatch | TxAvailable | RxEarly | IntReq,
        !           781:                 ioaddr + EL3_CMD);
        !           782:        outw(SetIntrEnb | IntLatch | TxAvailable | RxComplete | StatsFull
        !           783:                 | (vp->bus_master ? DMADone : 0) | UpComplete | DownComplete,
        !           784:                        ioaddr + EL3_CMD);
        !           785: 
        !           786:        MOD_INC_USE_COUNT;
        !           787: 
        !           788:        return 0;
        !           789: }
        !           790: 
        !           791: static void vortex_timer(unsigned long data)
        !           792: {
        !           793: #ifdef AUTOMEDIA
        !           794:        struct device *dev = (struct device *)data;
        !           795:        struct vortex_private *vp = (struct vortex_private *)dev->priv;
        !           796:        int ioaddr = dev->base_addr;
        !           797:        unsigned long flags;
        !           798:        int ok = 0;
        !           799: 
        !           800:        if (vortex_debug > 1)
        !           801:                printk("%s: Media selection timer tick happened, %s.\n",
        !           802:                           dev->name, media_tbl[dev->if_port].name);
        !           803: 
        !           804:        save_flags(flags);      cli(); {
        !           805:          int old_window = inw(ioaddr + EL3_CMD) >> 13;
        !           806:          int media_status;
        !           807:          EL3WINDOW(4);
        !           808:          media_status = inw(ioaddr + Wn4_Media);
        !           809:          switch (dev->if_port) {
        !           810:          case 0:  case 4:  case 5:             /* 10baseT, 100baseTX, 100baseFX  */
        !           811:                if (media_status & Media_LnkBeat) {
        !           812:                  ok = 1;
        !           813:                  if (vortex_debug > 1)
        !           814:                        printk("%s: Media %s has link beat, %x.\n",
        !           815:                                   dev->name, media_tbl[dev->if_port].name, media_status);
        !           816:                } else if (vortex_debug > 1)
        !           817:                  printk("%s: Media %s is has no link beat, %x.\n",
        !           818:                                   dev->name, media_tbl[dev->if_port].name, media_status);
        !           819:  
        !           820:                break;
        !           821:          default:                                      /* Other media types handled by Tx timeouts. */
        !           822:                if (vortex_debug > 1)
        !           823:                  printk("%s: Media %s is has no indication, %x.\n",
        !           824:                                 dev->name, media_tbl[dev->if_port].name, media_status);
        !           825:                ok = 1;
        !           826:          }
        !           827:          if ( ! ok) {
        !           828:                union wn3_config config;
        !           829: 
        !           830:                do {
        !           831:                        dev->if_port = media_tbl[dev->if_port].next;
        !           832:                } while ( ! (vp->available_media & media_tbl[dev->if_port].mask));
        !           833:                if (dev->if_port == 8) { /* Go back to default. */
        !           834:                  dev->if_port = vp->default_media;
        !           835:                  if (vortex_debug > 1)
        !           836:                        printk("%s: Media selection failing, using default %s port.\n",
        !           837:                                   dev->name, media_tbl[dev->if_port].name);
        !           838:                } else {
        !           839:                  if (vortex_debug > 1)
        !           840:                        printk("%s: Media selection failed, now trying %s port.\n",
        !           841:                                   dev->name, media_tbl[dev->if_port].name);
        !           842:                  vp->timer.expires = RUN_AT(media_tbl[dev->if_port].wait);
        !           843:                  add_timer(&vp->timer);
        !           844:                }
        !           845:                outw((media_status & ~(Media_10TP|Media_SQE)) |
        !           846:                         media_tbl[dev->if_port].media_bits, ioaddr + Wn4_Media);
        !           847: 
        !           848:                EL3WINDOW(3);
        !           849:                config.i = inl(ioaddr + Wn3_Config);
        !           850:                config.u.xcvr = dev->if_port;
        !           851:                outl(config.i, ioaddr + Wn3_Config);
        !           852: 
        !           853:                outw(dev->if_port == 3 ? StartCoax : StopCoax, ioaddr + EL3_CMD);
        !           854:          }
        !           855:          EL3WINDOW(old_window);
        !           856:        }   restore_flags(flags);
        !           857:        if (vortex_debug > 1)
        !           858:          printk("%s: Media selection timer finished, %s.\n",
        !           859:                         dev->name, media_tbl[dev->if_port].name);
        !           860: 
        !           861: #endif /* AUTOMEDIA*/
        !           862:        return;
        !           863: }
        !           864: 
        !           865: static int
        !           866: vortex_start_xmit(struct sk_buff *skb, struct device *dev)
        !           867: {
        !           868:        struct vortex_private *vp = (struct vortex_private *)dev->priv;
        !           869:        int ioaddr = dev->base_addr;
        !           870: 
        !           871:        if (dev->tbusy) {
        !           872:                int tickssofar = jiffies - dev->trans_start;
        !           873:                int i;
        !           874: 
        !           875:                /* Min. wait before assuming a Tx failed == 400ms. */
        !           876: 
        !           877:                if (tickssofar < 400*HZ/1000)           /* We probably aren't empty. */
        !           878:                        return 1;
        !           879:                printk("%s: transmit timed out, tx_status %2.2x status %4.4x.\n",
        !           880:                           dev->name, inb(ioaddr + TxStatus),
        !           881:                           inw(ioaddr + EL3_STATUS));
        !           882:                /* Slight code bloat to be user friendly. */
        !           883:                if ((inb(ioaddr + TxStatus) & 0x88) == 0x88)
        !           884:                        printk("%s: Transmitter encountered 16 collisions -- network"
        !           885:                                   " network cable problem?\n", dev->name);
        !           886: #ifndef final_version
        !           887:                printk("  Flags; bus-master %d, full %d; dirty %d current %d.\n",
        !           888:                           vp->full_bus_master_tx, vp->tx_full, vp->dirty_tx, vp->cur_tx);
        !           889:                printk("  Down list %8.8x vs. %p.\n", inl(ioaddr + DownListPtr),
        !           890:                           &vp->tx_ring[0]);
        !           891:                for (i = 0; i < TX_RING_SIZE; i++) {
        !           892:                        printk("  %d: %p  length %8.8x status %8.8x\n", i,
        !           893:                                   &vp->tx_ring[i],
        !           894:                                   vp->tx_ring[i].length,
        !           895:                                   vp->tx_ring[i].status);
        !           896:                }
        !           897: #endif
        !           898:                /* Issue TX_RESET and TX_START commands. */
        !           899:                outw(TxReset, ioaddr + EL3_CMD);
        !           900:                for (i = 20; i >= 0 ; i--)
        !           901:                        if ( ! (inw(ioaddr + EL3_STATUS) & CmdInProgress))
        !           902:                                break;
        !           903:                outw(TxEnable, ioaddr + EL3_CMD);
        !           904:                dev->trans_start = jiffies;
        !           905:                /* dev->tbusy = 0;*/
        !           906:                vp->stats.tx_errors++;
        !           907:                vp->stats.tx_dropped++;
        !           908:                return 0;                       /* Yes, silently *drop* the packet! */
        !           909:        }
        !           910: 
        !           911:        /* Block a timer-based transmit from overlapping.  This could better be
        !           912:           done with atomic_swap(1, dev->tbusy), but set_bit() works as well.
        !           913:           If this ever occurs the queue layer is doing something evil! */
        !           914:        if (test_and_set_bit(0, (void*)&dev->tbusy) != 0) {
        !           915:                printk("%s: Transmitter access conflict.\n", dev->name);
        !           916:                return 1;
        !           917:        }
        !           918: 
        !           919:        if (vp->full_bus_master_tx) { /* BOOMERANG bus-master */
        !           920:                /* Calculate the next Tx descriptor entry. */
        !           921:                int entry = vp->cur_tx % TX_RING_SIZE;
        !           922:                struct boom_tx_desc *prev_entry;
        !           923:                unsigned long flags, i;
        !           924: 
        !           925:                if (vp->tx_full) /* No room to transmit with */
        !           926:                  return 1;
        !           927:                if (vp->cur_tx != 0)
        !           928:                  prev_entry = &vp->tx_ring[(vp->cur_tx-1) % TX_RING_SIZE];
        !           929:                else
        !           930:                  prev_entry = NULL;
        !           931:                if (vortex_debug > 3)
        !           932:                        printk("%s: Trying to send a packet, Tx index %d.\n",
        !           933:                                   dev->name, vp->cur_tx);
        !           934:                /* vp->tx_full = 1; */
        !           935:                vp->tx_skbuff[entry] = skb;
        !           936:                vp->tx_ring[entry].next = 0;
        !           937:                vp->tx_ring[entry].addr = virt_to_bus(skb->data);
        !           938:                vp->tx_ring[entry].length = skb->len | 0x80000000;
        !           939:                vp->tx_ring[entry].status = skb->len | 0x80000000;
        !           940: 
        !           941:                save_flags(flags);
        !           942:                cli();
        !           943:                outw(DownStall, ioaddr + EL3_CMD);
        !           944:                /* Wait for the stall to complete. */
        !           945:                for (i = 20; i >= 0 ; i--)
        !           946:                        if ( (inw(ioaddr + EL3_STATUS) & CmdInProgress) == 0)
        !           947:                                break;
        !           948:                if (prev_entry)
        !           949:                  prev_entry->next = virt_to_bus(&vp->tx_ring[entry]);
        !           950:                if (inl(ioaddr + DownListPtr) == 0) {
        !           951:                        outl(virt_to_bus(&vp->tx_ring[entry]), ioaddr + DownListPtr);
        !           952:                        queued_packet++;
        !           953:                }
        !           954:                outw(DownUnstall, ioaddr + EL3_CMD);
        !           955:                restore_flags(flags);
        !           956: 
        !           957:                vp->cur_tx++;
        !           958:                if (vp->cur_tx - vp->dirty_tx > TX_RING_SIZE - 1)
        !           959:                        vp->tx_full = 1;
        !           960:                else {                                  /* Clear previous interrupt enable. */
        !           961:                  if (prev_entry)
        !           962:                        prev_entry->status &= ~0x80000000;
        !           963:                  dev->tbusy = 0;
        !           964:                }
        !           965:                dev->trans_start = jiffies;
        !           966:                return 0;
        !           967:        }
        !           968:        /* Put out the doubleword header... */
        !           969:        outl(skb->len, ioaddr + TX_FIFO);
        !           970: #ifdef VORTEX_BUS_MASTER
        !           971:        if (vp->bus_master) {
        !           972:                /* Set the bus-master controller to transfer the packet. */
        !           973:                outl((int)(skb->data), ioaddr + Wn7_MasterAddr);
        !           974:                outw((skb->len + 3) & ~3, ioaddr + Wn7_MasterLen);
        !           975:                vp->tx_skb = skb;
        !           976:                outw(StartDMADown, ioaddr + EL3_CMD);
        !           977:                /* dev->tbusy will be cleared at the DMADone interrupt. */
        !           978:        } else {
        !           979:                /* ... and the packet rounded to a doubleword. */
        !           980:                outsl(ioaddr + TX_FIFO, skb->data, (skb->len + 3) >> 2);
        !           981:                dev_kfree_skb (skb, FREE_WRITE);
        !           982:                if (inw(ioaddr + TxFree) > 1536) {
        !           983:                        dev->tbusy = 0;
        !           984:                } else
        !           985:                        /* Interrupt us when the FIFO has room for max-sized packet. */
        !           986:                        outw(SetTxThreshold + (1536>>2), ioaddr + EL3_CMD);
        !           987:        }
        !           988: #else
        !           989:        /* ... and the packet rounded to a doubleword. */
        !           990:        outsl(ioaddr + TX_FIFO, skb->data, (skb->len + 3) >> 2);
        !           991:        dev_kfree_skb (skb, FREE_WRITE);
        !           992:        if (inw(ioaddr + TxFree) > 1536) {
        !           993:                dev->tbusy = 0;
        !           994:        } else
        !           995:                /* Interrupt us when the FIFO has room for max-sized packet. */
        !           996:                outw(SetTxThreshold + (1536>>2), ioaddr + EL3_CMD);
        !           997: #endif  /* bus master */
        !           998: 
        !           999:        dev->trans_start = jiffies;
        !          1000: 
        !          1001:        /* Clear the Tx status stack. */
        !          1002:        {
        !          1003:                short tx_status;
        !          1004:                int i = 4;
        !          1005: 
        !          1006:                while (--i > 0  &&      (tx_status = inb(ioaddr + TxStatus)) > 0) {
        !          1007:                        if (tx_status & 0x3C) {         /* A Tx-disabling error occurred.  */
        !          1008:                                if (vortex_debug > 2)
        !          1009:                                  printk("%s: Tx error, status %2.2x.\n",
        !          1010:                                                 dev->name, tx_status);
        !          1011:                                if (tx_status & 0x04) vp->stats.tx_fifo_errors++;
        !          1012:                                if (tx_status & 0x38) vp->stats.tx_aborted_errors++;
        !          1013:                                if (tx_status & 0x30) {
        !          1014:                                        int j;
        !          1015:                                        outw(TxReset, ioaddr + EL3_CMD);
        !          1016:                                        for (j = 20; j >= 0 ; j--)
        !          1017:                                                if ( ! (inw(ioaddr + EL3_STATUS) & CmdInProgress))
        !          1018:                                                        break;
        !          1019:                                }
        !          1020:                                outw(TxEnable, ioaddr + EL3_CMD);
        !          1021:                        }
        !          1022:                        outb(0x00, ioaddr + TxStatus); /* Pop the status stack. */
        !          1023:                }
        !          1024:        }
        !          1025:        return 0;
        !          1026: }
        !          1027: 
        !          1028: /* The interrupt handler does all of the Rx thread work and cleans up
        !          1029:    after the Tx thread. */
        !          1030: static void vortex_interrupt IRQ(int irq, void *dev_id, struct pt_regs *regs)
        !          1031: {
        !          1032:        /* Use the now-standard shared IRQ implementation. */
        !          1033:        struct device *dev = dev_id;
        !          1034:        struct vortex_private *lp;
        !          1035:        int ioaddr, status;
        !          1036:        int latency;
        !          1037:        int i = max_interrupt_work;
        !          1038: 
        !          1039:        if (test_and_set_bit(0, (void*)&dev->interrupt)) {
        !          1040:                printk("%s: Re-entering the interrupt handler.\n", dev->name);
        !          1041:                return;
        !          1042:        }
        !          1043: 
        !          1044:        ioaddr = dev->base_addr;
        !          1045:        latency = inb(ioaddr + Timer);
        !          1046:        lp = (struct vortex_private *)dev->priv;
        !          1047: 
        !          1048:        status = inw(ioaddr + EL3_STATUS);
        !          1049: 
        !          1050:        if (vortex_debug > 4)
        !          1051:                printk("%s: interrupt, status %4.4x, timer %d.\n", dev->name,
        !          1052:                           status, latency);
        !          1053:        if ((status & 0xE000) != 0xE000) {
        !          1054:                static int donedidthis=0;
        !          1055:                /* Some interrupt controllers store a bogus interrupt from boot-time.
        !          1056:                   Ignore a single early interrupt, but don't hang the machine for
        !          1057:                   other interrupt problems. */
        !          1058:                if (donedidthis++ > 100) {
        !          1059:                        printk("%s: Bogus interrupt, bailing. Status %4.4x, start=%d.\n",
        !          1060:                                   dev->name, status, dev->start);
        !          1061:                        FREE_IRQ(dev->irq, dev);
        !          1062:                }
        !          1063:        }
        !          1064: 
        !          1065:        do {
        !          1066:                if (vortex_debug > 5)
        !          1067:                                printk("%s: In interrupt loop, status %4.4x.\n",
        !          1068:                                           dev->name, status);
        !          1069:                if (status & RxComplete)
        !          1070:                        vortex_rx(dev);
        !          1071: 
        !          1072:                if (status & TxAvailable) {
        !          1073:                        if (vortex_debug > 5)
        !          1074:                                printk("        TX room bit was handled.\n");
        !          1075:                        /* There's room in the FIFO for a full-sized packet. */
        !          1076:                        outw(AckIntr | TxAvailable, ioaddr + EL3_CMD);
        !          1077:                        dev->tbusy = 0;
        !          1078:                        mark_bh(NET_BH);
        !          1079:                }
        !          1080:                if (status & DownComplete) {
        !          1081:                        unsigned int dirty_tx = lp->dirty_tx;
        !          1082: 
        !          1083:                        while (lp->cur_tx - dirty_tx > 0) {
        !          1084:                                int entry = dirty_tx % TX_RING_SIZE;
        !          1085:                                if (inl(ioaddr + DownListPtr) ==
        !          1086:                                        virt_to_bus(&lp->tx_ring[entry]))
        !          1087:                                        break;                  /* It still hasn't been processed. */
        !          1088:                                if (lp->tx_skbuff[entry]) {
        !          1089:                                        dev_kfree_skb(lp->tx_skbuff[entry], FREE_WRITE);
        !          1090:                                        lp->tx_skbuff[entry] = 0;
        !          1091:                                }
        !          1092:                                dirty_tx++;
        !          1093:                        }
        !          1094:                        lp->dirty_tx = dirty_tx;
        !          1095:                        outw(AckIntr | DownComplete, ioaddr + EL3_CMD);
        !          1096:                        if (lp->tx_full && (lp->cur_tx - dirty_tx <= TX_RING_SIZE - 1)) {
        !          1097:                                lp->tx_full= 0;
        !          1098:                                dev->tbusy = 0;
        !          1099:                                mark_bh(NET_BH);
        !          1100:                        }
        !          1101:                }
        !          1102: #ifdef VORTEX_BUS_MASTER
        !          1103:                if (status & DMADone) {
        !          1104:                        outw(0x1000, ioaddr + Wn7_MasterStatus); /* Ack the event. */
        !          1105:                        dev->tbusy = 0;
        !          1106:                        dev_kfree_skb (lp->tx_skb, FREE_WRITE); /* Release the transfered buffer */
        !          1107:                        mark_bh(NET_BH);
        !          1108:                }
        !          1109: #endif
        !          1110:                if (status & UpComplete) {
        !          1111:                        boomerang_rx(dev);
        !          1112:                        outw(AckIntr | UpComplete, ioaddr + EL3_CMD);
        !          1113:                }
        !          1114:                if (status & (AdapterFailure | RxEarly | StatsFull)) {
        !          1115:                        /* Handle all uncommon interrupts at once. */
        !          1116:                        if (status & RxEarly) {                         /* Rx early is unused. */
        !          1117:                                vortex_rx(dev);
        !          1118:                                outw(AckIntr | RxEarly, ioaddr + EL3_CMD);
        !          1119:                        }
        !          1120:                        if (status & StatsFull) {       /* Empty statistics. */
        !          1121:                                static int DoneDidThat = 0;
        !          1122:                                if (vortex_debug > 4)
        !          1123:                                        printk("%s: Updating stats.\n", dev->name);
        !          1124:                                update_stats(ioaddr, dev);
        !          1125:                                /* DEBUG HACK: Disable statistics as an interrupt source. */
        !          1126:                                /* This occurs when we have the wrong media type! */
        !          1127:                                if (DoneDidThat == 0  &&
        !          1128:                                        inw(ioaddr + EL3_STATUS) & StatsFull) {
        !          1129:                                        int win, reg;
        !          1130:                                        printk("%s: Updating stats failed, disabling stats as an"
        !          1131:                                                   " interrupt source.\n", dev->name);
        !          1132:                                        for (win = 0; win < 8; win++) {
        !          1133:                                                EL3WINDOW(win);
        !          1134:                                                printk("\n Vortex window %d:", win);
        !          1135:                                                for (reg = 0; reg < 16; reg++)
        !          1136:                                                        printk(" %2.2x", inb(ioaddr+reg));
        !          1137:                                        }
        !          1138:                                        EL3WINDOW(7);
        !          1139:                                        outw(SetIntrEnb | TxAvailable | RxComplete | AdapterFailure
        !          1140:                                                 | UpComplete | DownComplete | TxComplete,
        !          1141:                                                 ioaddr + EL3_CMD);
        !          1142:                                        DoneDidThat++;
        !          1143:                                }
        !          1144:                        }
        !          1145:                        if (status & AdapterFailure) {
        !          1146:                                /* Adapter failure requires Rx reset and reinit. */
        !          1147:                                outw(RxReset, ioaddr + EL3_CMD);
        !          1148:                                /* Set the Rx filter to the current state. */
        !          1149:                                set_rx_mode(dev);
        !          1150:                                outw(RxEnable, ioaddr + EL3_CMD); /* Re-enable the receiver. */
        !          1151:                                outw(AckIntr | AdapterFailure, ioaddr + EL3_CMD);
        !          1152:                        }
        !          1153:                }
        !          1154: 
        !          1155:                if (--i < 0) {
        !          1156:                        printk("%s: Too much work in interrupt, status %4.4x.  "
        !          1157:                                   "Disabling functions (%4.4x).\n",
        !          1158:                                   dev->name, status, SetStatusEnb | ((~status) & 0x7FE));
        !          1159:                        /* Disable all pending interrupts. */
        !          1160:                        outw(SetStatusEnb | ((~status) & 0x7FE), ioaddr + EL3_CMD);
        !          1161:                        outw(AckIntr | 0x7FF, ioaddr + EL3_CMD);
        !          1162:                        break;
        !          1163:                }
        !          1164:                /* Acknowledge the IRQ. */
        !          1165:                outw(AckIntr | IntReq | IntLatch, ioaddr + EL3_CMD);
        !          1166: 
        !          1167:        } while ((status = inw(ioaddr + EL3_STATUS)) & (IntLatch | RxComplete));
        !          1168: 
        !          1169:        if (vortex_debug > 4)
        !          1170:                printk("%s: exiting interrupt, status %4.4x.\n", dev->name, status);
        !          1171: 
        !          1172:        dev->interrupt = 0;
        !          1173:        return;
        !          1174: }
        !          1175: 
        !          1176: static int
        !          1177: vortex_rx(struct device *dev)
        !          1178: {
        !          1179:        struct vortex_private *vp = (struct vortex_private *)dev->priv;
        !          1180:        int ioaddr = dev->base_addr;
        !          1181:        int i;
        !          1182:        short rx_status;
        !          1183: 
        !          1184:        if (vortex_debug > 5)
        !          1185:                printk("   In rx_packet(), status %4.4x, rx_status %4.4x.\n",
        !          1186:                           inw(ioaddr+EL3_STATUS), inw(ioaddr+RxStatus));
        !          1187:        while ((rx_status = inw(ioaddr + RxStatus)) > 0) {
        !          1188:                if (rx_status & 0x4000) { /* Error, update stats. */
        !          1189:                        unsigned char rx_error = inb(ioaddr + RxErrors);
        !          1190:                        if (vortex_debug > 2)
        !          1191:                                printk(" Rx error: status %2.2x.\n", rx_error);
        !          1192:                        vp->stats.rx_errors++;
        !          1193:                        if (rx_error & 0x01)  vp->stats.rx_over_errors++;
        !          1194:                        if (rx_error & 0x02)  vp->stats.rx_length_errors++;
        !          1195:                        if (rx_error & 0x04)  vp->stats.rx_frame_errors++;
        !          1196:                        if (rx_error & 0x08)  vp->stats.rx_crc_errors++;
        !          1197:                        if (rx_error & 0x10)  vp->stats.rx_length_errors++;
        !          1198:                } else {
        !          1199:                        /* The packet length: up to 4.5K!. */
        !          1200:                        short pkt_len = rx_status & 0x1fff;
        !          1201:                        struct sk_buff *skb;
        !          1202: 
        !          1203:                        skb = DEV_ALLOC_SKB(pkt_len + 5);
        !          1204:                        if (vortex_debug > 4)
        !          1205:                                printk("Receiving packet size %d status %4.4x.\n",
        !          1206:                                           pkt_len, rx_status);
        !          1207:                        if (skb != NULL) {
        !          1208:                                skb->dev = dev;
        !          1209: #if LINUX_VERSION_CODE >= 0x10300
        !          1210:                                skb_reserve(skb, 2);    /* Align IP on 16 byte boundaries */
        !          1211:                                /* 'skb_put()' points to the start of sk_buff data area. */
        !          1212:                                insl(ioaddr + RX_FIFO, skb_put(skb, pkt_len),
        !          1213:                                         (pkt_len + 3) >> 2);
        !          1214:                                outw(RxDiscard, ioaddr + EL3_CMD); /* Pop top Rx packet. */
        !          1215:                                skb->protocol = eth_type_trans(skb, dev);
        !          1216: #else
        !          1217:                                skb->len = pkt_len;
        !          1218:                                /* 'skb->data' points to the start of sk_buff data area. */
        !          1219:                                insl(ioaddr + RX_FIFO, skb->data, (pkt_len + 3) >> 2);
        !          1220:                                outw(RxDiscard, ioaddr + EL3_CMD); /* Pop top Rx packet. */
        !          1221: #endif  /* KERNEL_1_3_0 */
        !          1222:                                netif_rx(skb);
        !          1223:                                dev->last_rx = jiffies;
        !          1224:                                vp->stats.rx_packets++;
        !          1225:                                /* Wait a limited time to go to next packet. */
        !          1226:                                for (i = 200; i >= 0; i--)
        !          1227:                                        if ( ! (inw(ioaddr + EL3_STATUS) & CmdInProgress))
        !          1228:                                                break;
        !          1229:                                continue;
        !          1230:                        } else if (vortex_debug)
        !          1231:                                printk("%s: Couldn't allocate a sk_buff of size %d.\n",
        !          1232:                                           dev->name, pkt_len);
        !          1233:                }
        !          1234:                outw(RxDiscard, ioaddr + EL3_CMD);
        !          1235:                vp->stats.rx_dropped++;
        !          1236:                /* Wait a limited time to skip this packet. */
        !          1237:                for (i = 200; i >= 0; i--)
        !          1238:                        if ( ! (inw(ioaddr + EL3_STATUS) & CmdInProgress))
        !          1239:                                break;
        !          1240:        }
        !          1241: 
        !          1242:        return 0;
        !          1243: }
        !          1244: 
        !          1245: static int
        !          1246: boomerang_rx(struct device *dev)
        !          1247: {
        !          1248:        struct vortex_private *vp = (struct vortex_private *)dev->priv;
        !          1249:        int entry = vp->cur_rx % RX_RING_SIZE;
        !          1250:        int ioaddr = dev->base_addr;
        !          1251:        int rx_status;
        !          1252: 
        !          1253:        if (vortex_debug > 5)
        !          1254:                printk("   In boomerang_rx(), status %4.4x, rx_status %4.4x.\n",
        !          1255:                           inw(ioaddr+EL3_STATUS), inw(ioaddr+RxStatus));
        !          1256:        while ((rx_status = vp->rx_ring[entry].status) & RxDComplete) {
        !          1257:                if (rx_status & RxDError) { /* Error, update stats. */
        !          1258:                        unsigned char rx_error = rx_status >> 16;
        !          1259:                        if (vortex_debug > 2)
        !          1260:                                printk(" Rx error: status %2.2x.\n", rx_error);
        !          1261:                        vp->stats.rx_errors++;
        !          1262:                        if (rx_error & 0x01)  vp->stats.rx_over_errors++;
        !          1263:                        if (rx_error & 0x02)  vp->stats.rx_length_errors++;
        !          1264:                        if (rx_error & 0x04)  vp->stats.rx_frame_errors++;
        !          1265:                        if (rx_error & 0x08)  vp->stats.rx_crc_errors++;
        !          1266:                        if (rx_error & 0x10)  vp->stats.rx_length_errors++;
        !          1267:                } else {
        !          1268:                        /* The packet length: up to 4.5K!. */
        !          1269:                        short pkt_len = rx_status & 0x1fff;
        !          1270:                        struct sk_buff *skb;
        !          1271: 
        !          1272:                        if (vortex_debug > 4)
        !          1273:                                printk("Receiving packet size %d status %4.4x.\n",
        !          1274:                                           pkt_len, rx_status);
        !          1275: 
        !          1276:                        /* Check if the packet is long enough to just accept without
        !          1277:                           copying to a properly sized skbuff. */
        !          1278:                        if (pkt_len < rx_copybreak
        !          1279:                                && (skb = DEV_ALLOC_SKB(pkt_len + 2)) != 0) {
        !          1280:                                skb->dev = dev;
        !          1281:                                skb_reserve(skb, 2);    /* Align IP on 16 byte boundaries */
        !          1282:                                /* 'skb_put()' points to the start of sk_buff data area. */
        !          1283:                                memcpy(skb_put(skb, pkt_len),
        !          1284:                                           bus_to_virt(vp->rx_ring[entry].addr),
        !          1285:                                           pkt_len);
        !          1286:                                rx_copy++;
        !          1287:                        } else{
        !          1288:                                void *temp;
        !          1289:                                /* Pass up the skbuff already on the Rx ring. */
        !          1290:                                skb = vp->rx_skbuff[entry];
        !          1291:                                vp->rx_skbuff[entry] = NULL;
        !          1292:                                temp = skb_put(skb, pkt_len);
        !          1293:                                /* Remove this checking code for final release. */
        !          1294:                                if (bus_to_virt(vp->rx_ring[entry].addr) != temp)
        !          1295:                                        printk("%s: Warning -- the skbuff addresses do not match"
        !          1296:                                                   " in boomerang_rx: %p vs. %p / %p.\n", dev->name,
        !          1297:                                                   bus_to_virt(vp->rx_ring[entry].addr),
        !          1298:                                                   skb->head, temp);
        !          1299:                                rx_nocopy++;
        !          1300:                        }
        !          1301: #if LINUX_VERSION_CODE > 0x10300
        !          1302:                        skb->protocol = eth_type_trans(skb, dev);
        !          1303: #else
        !          1304:                        skb->len = pkt_len;
        !          1305: #endif
        !          1306:                        netif_rx(skb);
        !          1307:                        dev->last_rx = jiffies;
        !          1308:                        vp->stats.rx_packets++;
        !          1309:                }
        !          1310:                entry = (++vp->cur_rx) % RX_RING_SIZE;
        !          1311:        }
        !          1312:        /* Refill the Rx ring buffers. */
        !          1313:        for (; vp->dirty_rx < vp->cur_rx; vp->dirty_rx++) {
        !          1314:                struct sk_buff *skb;
        !          1315:                entry = vp->dirty_rx % RX_RING_SIZE;
        !          1316:                if (vp->rx_skbuff[entry] == NULL) {
        !          1317:                        skb = dev_alloc_skb(PKT_BUF_SZ);
        !          1318:                        if (skb == NULL)
        !          1319:                                break;                  /* Bad news!  */
        !          1320:                        skb->dev = dev;                 /* Mark as being used by this device. */
        !          1321: #if LINUX_VERSION_CODE > 0x10300
        !          1322:                        skb_reserve(skb, 2);    /* Align IP on 16 byte boundaries */
        !          1323:                        vp->rx_ring[entry].addr = virt_to_bus(skb->tail);
        !          1324: #else
        !          1325:                        vp->rx_ring[entry].addr = virt_to_bus(skb->data);
        !          1326: #endif
        !          1327:                        vp->rx_skbuff[entry] = skb;
        !          1328:                }
        !          1329:                vp->rx_ring[entry].status = 0;  /* Clear complete bit. */
        !          1330:        }
        !          1331:        return 0;
        !          1332: }
        !          1333: 
        !          1334: static int
        !          1335: vortex_close(struct device *dev)
        !          1336: {
        !          1337:        struct vortex_private *vp = (struct vortex_private *)dev->priv;
        !          1338:        int ioaddr = dev->base_addr;
        !          1339:        int i;
        !          1340: 
        !          1341:        dev->start = 0;
        !          1342:        dev->tbusy = 1;
        !          1343: 
        !          1344:        if (vortex_debug > 1) {
        !          1345:                printk("%s: vortex_close() status %4.4x, Tx status %2.2x.\n",
        !          1346:                           dev->name, inw(ioaddr + EL3_STATUS), inb(ioaddr + TxStatus));
        !          1347:                printk("%s: vortex close stats: rx_nocopy %d rx_copy %d"
        !          1348:                           " tx_queued %d.\n",
        !          1349:                           dev->name, rx_nocopy, rx_copy, queued_packet);
        !          1350:        }
        !          1351: 
        !          1352:        del_timer(&vp->timer);
        !          1353: 
        !          1354:        /* Turn off statistics ASAP.  We update lp->stats below. */
        !          1355:        outw(StatsDisable, ioaddr + EL3_CMD);
        !          1356: 
        !          1357:        /* Disable the receiver and transmitter. */
        !          1358:        outw(RxDisable, ioaddr + EL3_CMD);
        !          1359:        outw(TxDisable, ioaddr + EL3_CMD);
        !          1360: 
        !          1361:        if (dev->if_port == XCVR_10base2)
        !          1362:                /* Turn off thinnet power.  Green! */
        !          1363:                outw(StopCoax, ioaddr + EL3_CMD);
        !          1364: 
        !          1365: #ifdef SA_SHIRQ
        !          1366:        free_irq(dev->irq, dev);
        !          1367: #else
        !          1368:        free_irq(dev->irq);
        !          1369:        irq2dev_map[dev->irq] = 0;
        !          1370: #endif
        !          1371: 
        !          1372:        outw(SetIntrEnb | 0x0000, ioaddr + EL3_CMD);
        !          1373: 
        !          1374:        update_stats(ioaddr, dev);
        !          1375:        if (vp->full_bus_master_rx) { /* Free Boomerang bus master Rx buffers. */
        !          1376:                outl(0, ioaddr + UpListPtr);
        !          1377:                for (i = 0; i < RX_RING_SIZE; i++)
        !          1378:                        if (vp->rx_skbuff[i]) {
        !          1379: #if LINUX_VERSION_CODE < 0x20100
        !          1380:                                vp->rx_skbuff[i]->free = 1;
        !          1381: #endif
        !          1382:                                dev_kfree_skb (vp->rx_skbuff[i], FREE_WRITE);
        !          1383:                                vp->rx_skbuff[i] = 0;
        !          1384:                        }
        !          1385:        }
        !          1386:        if (vp->full_bus_master_tx) { /* Free Boomerang bus master Tx buffers. */
        !          1387:                outl(0, ioaddr + DownListPtr);
        !          1388:                for (i = 0; i < TX_RING_SIZE; i++)
        !          1389:                        if (vp->tx_skbuff[i]) {
        !          1390:                                dev_kfree_skb(vp->tx_skbuff[i], FREE_WRITE);
        !          1391:                                vp->tx_skbuff[i] = 0;
        !          1392:                        }
        !          1393:        }
        !          1394: 
        !          1395:        MOD_DEC_USE_COUNT;
        !          1396: 
        !          1397:        return 0;
        !          1398: }
        !          1399: 
        !          1400: static struct enet_statistics *
        !          1401: vortex_get_stats(struct device *dev)
        !          1402: {
        !          1403:        struct vortex_private *vp = (struct vortex_private *)dev->priv;
        !          1404:        unsigned long flags;
        !          1405: 
        !          1406:        if (dev->start) {
        !          1407:                save_flags(flags);
        !          1408:                cli();
        !          1409:                update_stats(dev->base_addr, dev);
        !          1410:                restore_flags(flags);
        !          1411:        }
        !          1412:        return &vp->stats;
        !          1413: }
        !          1414: 
        !          1415: /*  Update statistics.
        !          1416:        Unlike with the EL3 we need not worry about interrupts changing
        !          1417:        the window setting from underneath us, but we must still guard
        !          1418:        against a race condition with a StatsUpdate interrupt updating the
        !          1419:        table.  This is done by checking that the ASM (!) code generated uses
        !          1420:        atomic updates with '+='.
        !          1421:        */
        !          1422: static void update_stats(int ioaddr, struct device *dev)
        !          1423: {
        !          1424:        struct vortex_private *vp = (struct vortex_private *)dev->priv;
        !          1425: 
        !          1426:        /* Unlike the 3c5x9 we need not turn off stats updates while reading. */
        !          1427:        /* Switch to the stats window, and read everything. */
        !          1428:        EL3WINDOW(6);
        !          1429:        vp->stats.tx_carrier_errors             += inb(ioaddr + 0);
        !          1430:        vp->stats.tx_heartbeat_errors   += inb(ioaddr + 1);
        !          1431:        /* Multiple collisions. */              inb(ioaddr + 2);
        !          1432:        vp->stats.collisions                    += inb(ioaddr + 3);
        !          1433:        vp->stats.tx_window_errors              += inb(ioaddr + 4);
        !          1434:        vp->stats.rx_fifo_errors                += inb(ioaddr + 5);
        !          1435:        vp->stats.tx_packets                    += inb(ioaddr + 6);
        !          1436:        vp->stats.tx_packets                    += (inb(ioaddr + 9)&0x30) << 4;
        !          1437:        /* Rx packets   */                              inb(ioaddr + 7);   /* Must read to clear */
        !          1438:        /* Tx deferrals */                              inb(ioaddr + 8);
        !          1439:        /* Don't bother with register 9, an extension of registers 6&7.
        !          1440:           If we do use the 6&7 values the atomic update assumption above
        !          1441:           is invalid. */
        !          1442:        inw(ioaddr + 10);       /* Total Rx and Tx octets. */
        !          1443:        inw(ioaddr + 12);
        !          1444:        /* New: On the Vortex we must also clear the BadSSD counter. */
        !          1445:        EL3WINDOW(4);
        !          1446:        inb(ioaddr + 12);
        !          1447: 
        !          1448:        /* We change back to window 7 (not 1) with the Vortex. */
        !          1449:        EL3WINDOW(7);
        !          1450:        return;
        !          1451: }
        !          1452: 
        !          1453: /* This new version of set_rx_mode() supports v1.4 kernels.
        !          1454:    The Vortex chip has no documented multicast filter, so the only
        !          1455:    multicast setting is to receive all multicast frames.  At least
        !          1456:    the chip has a very clean way to set the mode, unlike many others. */
        !          1457: static void
        !          1458: set_rx_mode(struct device *dev)
        !          1459: {
        !          1460:        int ioaddr = dev->base_addr;
        !          1461:        short new_mode;
        !          1462: 
        !          1463:        if (dev->flags & IFF_PROMISC) {
        !          1464:                if (vortex_debug > 3)
        !          1465:                        printk("%s: Setting promiscuous mode.\n", dev->name);
        !          1466:                new_mode = SetRxFilter|RxStation|RxMulticast|RxBroadcast|RxProm;
        !          1467:        } else  if ((dev->mc_list)  ||  (dev->flags & IFF_ALLMULTI)) {
        !          1468:                new_mode = SetRxFilter|RxStation|RxMulticast|RxBroadcast;
        !          1469:        } else
        !          1470:                new_mode = SetRxFilter | RxStation | RxBroadcast;
        !          1471: 
        !          1472:        outw(new_mode, ioaddr + EL3_CMD);
        !          1473: }
        !          1474: 
        !          1475: #ifdef MODULE
        !          1476: void
        !          1477: cleanup_module(void)
        !          1478: {
        !          1479:        struct device *next_dev;
        !          1480: 
        !          1481:        /* No need to check MOD_IN_USE, as sys_delete_module() checks. */
        !          1482:        while (root_vortex_dev) {
        !          1483:                next_dev = ((struct vortex_private *)root_vortex_dev->priv)->next_module;
        !          1484:                if (root_vortex_dev->dma)
        !          1485:                  free_dma(root_vortex_dev->dma);
        !          1486:                unregister_netdev(root_vortex_dev);
        !          1487:                outw(TotalReset, root_vortex_dev->base_addr + EL3_CMD);
        !          1488:                release_region(root_vortex_dev->base_addr, CORKSCREW_TOTAL_SIZE);
        !          1489:                kfree(root_vortex_dev);
        !          1490:                root_vortex_dev = next_dev;
        !          1491:        }
        !          1492: }
        !          1493: #endif /* MODULE */
        !          1494: 
        !          1495: /*
        !          1496:  * Local variables:
        !          1497:  *  compile-command: "gcc -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -c 3c515.c"
        !          1498:  *  c-indent-level: 4
        !          1499:  *  tab-width: 4
        !          1500:  * End:
        !          1501:  */

unix.superglobalmegacorp.com

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