Annotation of Gnu-Mach/linux/src/drivers/net/rtl8139.c, revision 1.1.1.1

1.1       root        1: /* rtl8139.c: A RealTek RTL8129/8139 Fast 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:     All other rights reserved.
                      8: 
                      9:        This driver is for boards based on the RTL8129 and RTL8139 PCI ethernet
                     10:        chips.
                     11: 
                     12:        The author may be reached as [email protected], or C/O
                     13:        Center of Excellence in Space Data and Information Sciences
                     14:           Code 930.5, Goddard Space Flight Center, Greenbelt MD 20771
                     15: 
                     16:        Support and updates available at
                     17:        http://cesdis.gsfc.nasa.gov/linux/drivers/rtl8139.html
                     18: 
                     19:        Twister-tuning code contributed by Kinston <[email protected]>.
                     20: */
                     21: 
                     22: static const char *version =
                     23: "rtl8139.c:v0.99B 4/7/98 Donald Becker http://cesdis.gsfc.nasa.gov/linux/drivers/rtl8139.html\n";
                     24: 
                     25: /* A few user-configurable values. */
                     26: /* Maximum events (Rx packets, etc.) to handle at each interrupt. */
                     27: static int max_interrupt_work = 10;
                     28: 
                     29: /* Size of the in-memory receive ring. */
                     30: #define RX_BUF_LEN_IDX 3                       /* 0==8K, 1==16K, 2==32K, 3==64K */
                     31: #define RX_BUF_LEN (8192 << RX_BUF_LEN_IDX)
                     32: /* Size of the Tx bounce buffers -- must be at least (dev->mtu+14+4). */
                     33: #define TX_BUF_SIZE    1536
                     34: 
                     35: /* PCI Tuning Parameters
                     36:    Threshold is bytes transferred to chip before transmission starts. */
                     37: #define TX_FIFO_THRESH 256     /* In bytes, rounded down to 32 byte units. */
                     38: 
                     39: /* The following settings are log_2(bytes)-4:  0 == 16 bytes .. 6==1024. */
                     40: #define RX_FIFO_THRESH 4               /* Rx buffer level before first PCI xfer.  */
                     41: #define RX_DMA_BURST   4               /* Maximum PCI burst, '4' is 256 bytes */
                     42: #define TX_DMA_BURST   4
                     43: 
                     44: /* Operational parameters that usually are not changed. */
                     45: /* Time in jiffies before concluding the transmitter is hung. */
                     46: #define TX_TIMEOUT  ((4000*HZ)/1000)
                     47: 
                     48: #ifdef MODULE
                     49: #ifdef MODVERSIONS
                     50: #include <linux/modversions.h>
                     51: #endif
                     52: #include <linux/module.h>
                     53: #include <linux/version.h>
                     54: #else
                     55: #define MOD_INC_USE_COUNT
                     56: #define MOD_DEC_USE_COUNT
                     57: #endif
                     58: 
                     59: #include <linux/kernel.h>
                     60: #include <linux/sched.h>
                     61: #include <linux/string.h>
                     62: #include <linux/timer.h>
                     63: #include <linux/ptrace.h>
                     64: #include <linux/errno.h>
                     65: #include <linux/ioport.h>
                     66: #include <linux/malloc.h>
                     67: #include <linux/interrupt.h>
                     68: #include <linux/pci.h>
                     69: #include <linux/bios32.h>
                     70: #include <asm/processor.h>             /* Processor type for cache alignment. */
                     71: #include <asm/bitops.h>
                     72: #include <asm/io.h>
                     73: #include <asm/dma.h>
                     74: 
                     75: #include <linux/netdevice.h>
                     76: #include <linux/etherdevice.h>
                     77: #include <linux/skbuff.h>
                     78: 
                     79: #define RUN_AT(x) (jiffies + (x))
                     80: 
                     81: #include <linux/delay.h>
                     82: 
                     83: #if (LINUX_VERSION_CODE < 0x20123)
                     84: #define test_and_set_bit(val, addr) set_bit(val, addr)
                     85: #endif
                     86: 
                     87: /* The I/O extent. */
                     88: #define RTL8129_TOTAL_SIZE 0x80
                     89: 
                     90: #ifdef HAVE_DEVLIST
                     91: struct netdev_entry rtl8139_drv =
                     92: {"RTL8139", rtl8139_probe, RTL8129_TOTAL_SIZE, NULL};
                     93: #endif
                     94: 
                     95: static int rtl8129_debug = 1;
                     96: 
                     97: /*
                     98:                                Theory of Operation
                     99: 
                    100: I. Board Compatibility
                    101: 
                    102: This device driver is designed for the RealTek RTL8129, the RealTek Fast
                    103: Ethernet controllers for PCI.  This chip is used on a few clone boards.
                    104: 
                    105: 
                    106: II. Board-specific settings
                    107: 
                    108: PCI bus devices are configured by the system at boot time, so no jumpers
                    109: need to be set on the board.  The system BIOS will assign the
                    110: PCI INTA signal to a (preferably otherwise unused) system IRQ line.
                    111: Note: Kernel versions earlier than 1.3.73 do not support shared PCI
                    112: interrupt lines.
                    113: 
                    114: III. Driver operation
                    115: 
                    116: IIIa. Rx Ring buffers
                    117: 
                    118: The receive unit uses a single linear ring buffer rather than the more
                    119: common (and more efficient) descriptor-based architecture.  Incoming frames
                    120: are sequentially stored into the Rx region, and the host copies them into
                    121: skbuffs.
                    122: 
                    123: Comment: While it is theoretically possible to process many frames in place,
                    124: any delay in Rx processing would cause us to drop frames.  More importantly,
                    125: the Linux protocol stack is not designed to operate in this manner.
                    126: 
                    127: IIIb. Tx operation
                    128: 
                    129: The RTL8129 uses a fixed set of four Tx descriptors in register space.
                    130: In a stunningly bad design choice, Tx frames must be 32 bit aligned.  Linux
                    131: aligns the IP header on word boundaries, and 14 byte ethernet header means
                    132: that almost all frames will need to be copied to an alignment buffer.
                    133: 
                    134: IVb. References
                    135: 
                    136: http://www.realtek.com.tw/cn/cn.html
                    137: http://cesdis.gsfc.nasa.gov/linux/misc/NWay.html
                    138: 
                    139: IVc. Errata
                    140: 
                    141: */
                    142: 
                    143: #ifndef PCI_VENDOR_ID_REALTEK
                    144: #define PCI_VENDOR_ID_REALTEK          0x10ec
                    145: #endif
                    146: #ifndef PCI_DEVICE_ID_REALTEK_8129
                    147: #define PCI_DEVICE_ID_REALTEK_8129     0x8129
                    148: #endif
                    149: #ifndef PCI_DEVICE_ID_REALTEK_8139
                    150: #define PCI_DEVICE_ID_REALTEK_8139     0x8139
                    151: #endif
                    152: 
                    153: /* The rest of these values should never change. */
                    154: #define NUM_TX_DESC    4                       /* Number of Tx descriptor registers. */
                    155: 
                    156: /* Symbolic offsets to registers. */
                    157: enum RTL8129_registers {
                    158:        MAC0=0,                                         /* Ethernet hardware address. */
                    159:        MAR0=8,                                         /* Multicast filter. */
                    160:        TxStat0=0x10,                           /* Transmit status (Four 32bit registers). */
                    161:        TxAddr0=0x20,                           /* Tx descriptors (also four 32bit). */
                    162:        RxBuf=0x30, RxEarlyCnt=0x34, RxEarlyStatus=0x36,
                    163:        ChipCmd=0x37, RxBufPtr=0x38, RxBufAddr=0x3A,
                    164:        IntrMask=0x3C, IntrStatus=0x3E,
                    165:        TxConfig=0x40, RxConfig=0x44,
                    166:        Timer=0x48,                                     /* A general-purpose counter. */
                    167:        RxMissed=0x4C,                          /* 24 bits valid, write clears. */
                    168:        Cfg9346=0x50, Config0=0x51, Config1=0x52,
                    169:        FlashReg=0x54, GPPinData=0x58, GPPinDir=0x59, MII_SMI=0x5A, HltClk=0x5B,
                    170:        MultiIntr=0x5C, TxSummary=0x60,
                    171:        BMCR=0x62, BMSR=0x64, NWayAdvert=0x66, NWayLPAR=0x68, NWayExpansion=0x6A,
                    172:        /* Undocumented registers, but required for proper operation. */
                    173:        FIFOTMS=0x70,   /* FIFO Test Mode Select */
                    174:        CSCR=0x74,      /* Chip Status and Configuration Register. */
                    175:        PARA78=0x78, PARA7c=0x7c,       /* Magic transceiver parameter register. */
                    176: };
                    177: 
                    178: enum ChipCmdBits {
                    179:        CmdReset=0x10, CmdRxEnb=0x08, CmdTxEnb=0x04, RxBufEmpty=0x01, };
                    180: 
                    181: /* Interrupt register bits, using my own meaningful names. */
                    182: enum IntrStatusBits {
                    183:        PCIErr=0x8000, PCSTimeout=0x4000,
                    184:        RxFIFOOver=0x40, RxUnderrun=0x20, RxOverflow=0x10,
                    185:        TxErr=0x08, TxOK=0x04, RxErr=0x02, RxOK=0x01,
                    186: };
                    187: enum TxStatusBits {
                    188:        TxHostOwns=0x2000, TxUnderrun=0x4000, TxStatOK=0x8000,
                    189:        TxOutOfWindow=0x20000000, TxAborted=0x40000000, TxCarrierLost=0x80000000,
                    190: };
                    191: enum RxStatusBits {
                    192:        RxMulticast=0x8000, RxPhysical=0x4000, RxBroadcast=0x2000,
                    193:        RxBadSymbol=0x0020, RxRunt=0x0010, RxTooLong=0x0008, RxCRCErr=0x0004,
                    194:        RxBadAlign=0x0002, RxStatusOK=0x0001,
                    195: };
                    196: 
                    197: enum CSCRBits {
                    198:        CSCR_LinkOKBit=0x0400, CSCR_LinkChangeBit=0x0800,
                    199:        CSCR_LinkStatusBits=0x0f000, CSCR_LinkDownOffCmd=0x003c0,
                    200:        CSCR_LinkDownCmd=0x0f3c0,
                    201: };     
                    202: 
                    203: /* Twister tuning parameters from RealTek.  Completely undocumented. */
                    204: unsigned long param[4][4]={
                    205:        {0x0cb39de43,0x0cb39ce43,0x0fb38de03,0x0cb38de43},
                    206:        {0x0cb39de43,0x0cb39ce43,0x0cb39ce83,0x0cb39ce83},
                    207:        {0x0cb39de43,0x0cb39ce43,0x0cb39ce83,0x0cb39ce83},
                    208:        {0x0bb39de43,0x0bb39ce43,0x0bb39ce83,0x0bb39ce83}
                    209: };
                    210: 
                    211: struct rtl8129_private {
                    212:        char devname[8];                        /* Used only for kernel debugging. */
                    213:        const char *product_name;
                    214:        struct device *next_module;
                    215:        int chip_id;
                    216:        int chip_revision;
                    217: #if LINUX_VERSION_CODE > 0x20139
                    218:        struct net_device_stats stats;
                    219: #else
                    220:        struct enet_statistics stats;
                    221: #endif
                    222:        struct timer_list timer;        /* Media selection timer. */
                    223:        unsigned int cur_rx, cur_tx;            /* The next free and used entries */
                    224:        unsigned int dirty_rx, dirty_tx;
                    225:        /* The saved address of a sent-in-place packet/buffer, for skfree(). */
                    226:        struct sk_buff* tx_skbuff[NUM_TX_DESC];
                    227:        unsigned char *tx_buf[NUM_TX_DESC];     /* Tx bounce buffers */
                    228:        unsigned char *rx_ring;
                    229:        unsigned char *tx_bufs;                         /* Tx bounce buffer region. */
                    230:        unsigned char mc_filter[8];                     /* Current multicast filter. */
                    231:        char phys[4];                                           /* MII device addresses. */
                    232:        int in_interrupt;                                       /* Alpha needs word-wide lock. */
                    233:        unsigned int tx_full:1;                         /* The Tx queue is full. */
                    234:        unsigned int full_duplex:1;                     /* Full-duplex operation requested. */
                    235:        unsigned int default_port:4;            /* Last dev->if_port value. */
                    236:        unsigned int media2:4;                          /* Secondary monitored media port. */
                    237:        unsigned int medialock:1;                       /* Don't sense media type. */
                    238:        unsigned int mediasense:1;                      /* Media sensing in progress. */
                    239: };
                    240: 
                    241: #ifdef MODULE
                    242: /* Used to pass the full-duplex flag, etc. */
                    243: static int options[] = {-1, -1, -1, -1, -1, -1, -1, -1};
                    244: static int full_duplex[] = {-1, -1, -1, -1, -1, -1, -1, -1};
                    245: #if LINUX_VERSION_CODE > 0x20118
                    246: MODULE_AUTHOR("Donald Becker <[email protected]>");
                    247: MODULE_DESCRIPTION("RealTek RTL8129/8139 Fast Ethernet driver");
                    248: MODULE_PARM(debug, "i");
                    249: MODULE_PARM(options, "1-" __MODULE_STRING(8) "i");
                    250: MODULE_PARM(full_duplex, "1-" __MODULE_STRING(8) "i");
                    251: MODULE_PARM(max_interrupt_work, "i");
                    252: #endif
                    253: #endif
                    254: 
                    255: static struct device *rtl8129_probe1(struct device *dev, int ioaddr, int irq,
                    256:                                                                         int chip_id, int options, int card_idx);
                    257: static int rtl8129_open(struct device *dev);
                    258: static int read_eeprom(int ioaddr, int location);
                    259: static int mdio_read(int ioaddr, int phy_id, int location);
                    260: static void rtl8129_timer(unsigned long data);
                    261: static void rtl8129_tx_timeout(struct device *dev);
                    262: static void rtl8129_init_ring(struct device *dev);
                    263: static int rtl8129_start_xmit(struct sk_buff *skb, struct device *dev);
                    264: static int rtl8129_rx(struct device *dev);
                    265: static void rtl8129_interrupt(int irq, void *dev_instance, struct pt_regs *regs);
                    266: static int rtl8129_close(struct device *dev);
                    267: static struct enet_statistics *rtl8129_get_stats(struct device *dev);
                    268: static void set_rx_mode(struct device *dev);
                    269: 
                    270: 
                    271: #ifdef MODULE
                    272: /* A list of all installed RTL8129 devices, for removing the driver module. */
                    273: static struct device *root_rtl8129_dev = NULL;
                    274: #endif
                    275: 
                    276: int rtl8139_probe(struct device *dev)
                    277: {
                    278:        int cards_found = 0;
                    279:        static int pci_index = 0;       /* Static, for multiple probe calls. */
                    280: 
                    281:        /* Ideally we would detect all network cards in slot order.  That would
                    282:           be best done a central PCI probe dispatch, which wouldn't work
                    283:           well with the current structure.  So instead we detect just the
                    284:           Rtl81*9 cards in slot order. */
                    285: 
                    286:        if (pcibios_present()) {
                    287:                unsigned char pci_bus, pci_device_fn;
                    288: 
                    289:                for (;pci_index < 0xff; pci_index++) {
                    290:                        u8 pci_irq_line, pci_latency;
                    291:                        u16 pci_command, new_command, vendor, device;
                    292:                        u32 pci_ioaddr;
                    293: 
                    294:                        if (pcibios_find_class (PCI_CLASS_NETWORK_ETHERNET << 8,
                    295: #ifdef REVERSE_PROBE_ORDER
                    296:                                                                        0xff - pci_index,
                    297: #else
                    298:                                                                        pci_index,
                    299: #endif
                    300:                                                                        &pci_bus, &pci_device_fn)
                    301:                                != PCIBIOS_SUCCESSFUL)
                    302:                                break;
                    303:                        pcibios_read_config_word(pci_bus, pci_device_fn,
                    304:                                                                         PCI_VENDOR_ID, &vendor);
                    305:                        if (vendor != PCI_VENDOR_ID_REALTEK)
                    306:                                continue;
                    307: 
                    308:                        pcibios_read_config_word(pci_bus, pci_device_fn,
                    309:                                                                         PCI_DEVICE_ID, &device);
                    310:                        pcibios_read_config_byte(pci_bus, pci_device_fn,
                    311:                                                                         PCI_INTERRUPT_LINE, &pci_irq_line);
                    312:                        pcibios_read_config_dword(pci_bus, pci_device_fn,
                    313:                                                                          PCI_BASE_ADDRESS_0, &pci_ioaddr);
                    314:                        /* Remove I/O space marker in bit 0. */
                    315:                        pci_ioaddr &= ~3;
                    316: 
                    317:                        if (device != PCI_DEVICE_ID_REALTEK_8129
                    318:                                &&  device != PCI_DEVICE_ID_REALTEK_8139) {
                    319:                                printk(KERN_NOTICE "Unknown RealTek PCI ethernet chip type "
                    320:                                           "%4.4x detected: not configured.\n", device);
                    321:                                continue;
                    322:                        }
                    323:                        if (check_region(pci_ioaddr, RTL8129_TOTAL_SIZE))
                    324:                                continue;
                    325: 
                    326:                        /* Activate the card: fix for brain-damaged Win98 BIOSes. */
                    327:                        pcibios_read_config_word(pci_bus, pci_device_fn,
                    328:                                                                         PCI_COMMAND, &pci_command);
                    329:                        new_command = pci_command | PCI_COMMAND_MASTER|PCI_COMMAND_IO;
                    330:                        if (pci_command != new_command) {
                    331:                                printk(KERN_INFO "  The PCI BIOS has not enabled this"
                    332:                                           " device!  Updating PCI config %4.4x->%4.4x.\n",
                    333:                                           pci_command, new_command);
                    334:                                pcibios_write_config_word(pci_bus, pci_device_fn,
                    335:                                                                                  PCI_COMMAND, new_command);
                    336:                        }
                    337: 
                    338: #ifdef MODULE
                    339:                        dev = rtl8129_probe1(dev, pci_ioaddr, pci_irq_line, device,
                    340:                                                                 options[cards_found], cards_found);
                    341: #else
                    342:                        dev = rtl8129_probe1(dev, pci_ioaddr, pci_irq_line, device,
                    343:                                                                 dev ? dev->mem_start : 0, -1);
                    344: #endif
                    345: 
                    346:                        if (dev) {
                    347:                                pcibios_read_config_byte(pci_bus, pci_device_fn,
                    348:                                                                                 PCI_LATENCY_TIMER, &pci_latency);
                    349:                                if (pci_latency < 32) {
                    350:                                        printk(KERN_NOTICE"  PCI latency timer (CFLT) is "
                    351:                                                   "unreasonably low at %d.  Setting to 64 clocks.\n",
                    352:                                                   pci_latency);
                    353:                                        pcibios_write_config_byte(pci_bus, pci_device_fn,
                    354:                                                                                          PCI_LATENCY_TIMER, 64);
                    355:                                } else if (rtl8129_debug > 1)
                    356:                                        printk(KERN_INFO"  PCI latency timer (CFLT) is %#x.\n",
                    357:                                                   pci_latency);
                    358:                                dev = 0;
                    359:                                cards_found++;
                    360:                        }
                    361:                }
                    362:        }
                    363: 
                    364: #if defined (MODULE)
                    365:        return cards_found;
                    366: #else
                    367:        return cards_found ? 0 : -ENODEV;
                    368: #endif
                    369: }
                    370: 
                    371: static struct device *rtl8129_probe1(struct device *dev, int ioaddr, int irq,
                    372:                                                                   int chip_id, int options, int card_idx)
                    373: {
                    374:        static int did_version = 0;                     /* Already printed version info. */
                    375:        struct rtl8129_private *tp;
                    376:        int i;
                    377: 
                    378:        if (rtl8129_debug > 0  &&  did_version++ == 0)
                    379:                printk(KERN_INFO "%s", version);
                    380: 
                    381:        dev = init_etherdev(dev, 0);
                    382: 
                    383:        printk(KERN_INFO "%s: RealTek RTL%x at %#3x, IRQ %d, ",
                    384:                   dev->name, chip_id, ioaddr, irq);
                    385: 
                    386:        /* Bring the chip out of low-power mode. */
                    387:        outb(0x00, ioaddr + Config1);
                    388: 
                    389:        /* Perhaps this should be read from the EEPROM? */
                    390:        for (i = 0; i < 6; i++)
                    391:                dev->dev_addr[i] = inb(ioaddr + MAC0 + i);
                    392: 
                    393:        for (i = 0; i < 5; i++)
                    394:                printk("%2.2x:", dev->dev_addr[i]);
                    395:        printk("%2.2x.\n", dev->dev_addr[i]);
                    396: 
                    397:        if (rtl8129_debug > 1) {
                    398:                printk(KERN_INFO "%s: EEPROM contents\n", dev->name);
                    399:                for (i = 0; i < 64; i++)
                    400:                        printk(" %4.4x%s", read_eeprom(ioaddr, i),
                    401:                                   i%16 == 15 ? "\n"KERN_INFO : "");
                    402:        }
                    403: 
                    404:        /* We do a request_region() to register /proc/ioports info. */
                    405:        request_region(ioaddr, RTL8129_TOTAL_SIZE, "RealTek RTL8129/39 Fast Ethernet");
                    406: 
                    407:        dev->base_addr = ioaddr;
                    408:        dev->irq = irq;
                    409: 
                    410:        /* Some data structures must be quadword aligned. */
                    411:        tp = kmalloc(sizeof(*tp), GFP_KERNEL | GFP_DMA);
                    412:        memset(tp, 0, sizeof(*tp));
                    413:        dev->priv = tp;
                    414: 
                    415: #ifdef MODULE
                    416:        tp->next_module = root_rtl8129_dev;
                    417:        root_rtl8129_dev = dev;
                    418: #endif
                    419: 
                    420:        tp->chip_id = chip_id;
                    421: 
                    422:        /* Find the connected MII xcvrs.
                    423:           Doing this in open() would allow detecting external xcvrs later, but
                    424:           takes too much time. */
                    425:        if (chip_id == 0x8129) {
                    426:                int phy, phy_idx;
                    427:                for (phy = 0, phy_idx = 0; phy < 32 && phy_idx < sizeof(tp->phys);
                    428:                         phy++) {
                    429:                        int mii_status = mdio_read(ioaddr, phy, 1);
                    430: 
                    431:                        if (mii_status != 0xffff  && mii_status != 0x0000) {
                    432:                                tp->phys[phy_idx++] = phy;
                    433:                                printk(KERN_INFO "%s: MII transceiver found at address %d.\n",
                    434:                                           dev->name, phy);
                    435:                        }
                    436:                }
                    437:                if (phy_idx == 0) {
                    438:                        printk(KERN_INFO "%s: No MII transceivers found!  Assuming SYM "
                    439:                                   "transceiver.\n",
                    440:                                   dev->name);
                    441:                        tp->phys[0] = -1;
                    442:                }
                    443:        } else {
                    444:                        tp->phys[0] = -1;
                    445:        }
                    446: 
                    447:        /* Put the chip into low-power mode. */
                    448:        outb(0xC0, ioaddr + Cfg9346);
                    449:        outb(0x03, ioaddr + Config1);
                    450:        outb('H', ioaddr + HltClk);             /* 'R' would leave the clock running. */
                    451: 
                    452:        /* The lower four bits are the media type. */
                    453:        if (options > 0) {
                    454:                tp->full_duplex = (options & 16) ? 1 : 0;
                    455:                tp->default_port = options & 15;
                    456:                if (tp->default_port)
                    457:                        tp->medialock = 1;
                    458:        }
                    459: #ifdef MODULE
                    460:        if (card_idx >= 0) {
                    461:                if (full_duplex[card_idx] >= 0)
                    462:                        tp->full_duplex = full_duplex[card_idx];
                    463:        }
                    464: #endif
                    465: 
                    466:        /* The Rtl8129-specific entries in the device structure. */
                    467:        dev->open = &rtl8129_open;
                    468:        dev->hard_start_xmit = &rtl8129_start_xmit;
                    469:        dev->stop = &rtl8129_close;
                    470:        dev->get_stats = &rtl8129_get_stats;
                    471:        dev->set_multicast_list = &set_rx_mode;
                    472: 
                    473:        return dev;
                    474: }
                    475: 
                    476: /* Serial EEPROM section. */
                    477: 
                    478: /*  EEPROM_Ctrl bits. */
                    479: #define EE_SHIFT_CLK   0x04    /* EEPROM shift clock. */
                    480: #define EE_CS                  0x08    /* EEPROM chip select. */
                    481: #define EE_DATA_WRITE  0x02    /* EEPROM chip data in. */
                    482: #define EE_WRITE_0             0x00
                    483: #define EE_WRITE_1             0x02
                    484: #define EE_DATA_READ   0x01    /* EEPROM chip data out. */
                    485: #define EE_ENB                 (0x80 | EE_CS)
                    486: 
                    487: /* Delay between EEPROM clock transitions.
                    488:    No extra delay is needed with 33Mhz PCI, but 66Mhz is untested.
                    489:  */
                    490: 
                    491: #ifdef _LINUX_DELAY_H
                    492: #define eeprom_delay(nanosec)  udelay(1)
                    493: #else
                    494: #define eeprom_delay(nanosec)  do { ; } while (0)
                    495: #endif
                    496: 
                    497: /* The EEPROM commands include the alway-set leading bit. */
                    498: #define EE_WRITE_CMD   (5 << 6)
                    499: #define EE_READ_CMD            (6 << 6)
                    500: #define EE_ERASE_CMD   (7 << 6)
                    501: 
                    502: static int read_eeprom(int ioaddr, int location)
                    503: {
                    504:        int i;
                    505:        unsigned retval = 0;
                    506:        int ee_addr = ioaddr + Cfg9346;
                    507:        int read_cmd = location | EE_READ_CMD;
                    508: 
                    509:        outb(EE_ENB & ~EE_CS, ee_addr);
                    510:        outb(EE_ENB, ee_addr);
                    511: 
                    512:        /* Shift the read command bits out. */
                    513:        for (i = 10; i >= 0; i--) {
                    514:                int dataval = (read_cmd & (1 << i)) ? EE_DATA_WRITE : 0;
                    515:                outb(EE_ENB | dataval, ee_addr);
                    516:                eeprom_delay(100);
                    517:                outb(EE_ENB | dataval | EE_SHIFT_CLK, ee_addr);
                    518:                eeprom_delay(150);
                    519:                outb(EE_ENB | dataval, ee_addr);        /* Finish EEPROM a clock tick. */
                    520:                eeprom_delay(250);
                    521:        }
                    522:        outb(EE_ENB, ee_addr);
                    523: 
                    524:        for (i = 16; i > 0; i--) {
                    525:                outb(EE_ENB | EE_SHIFT_CLK, ee_addr);
                    526:                eeprom_delay(100);
                    527:                retval = (retval << 1) | ((inb(ee_addr) & EE_DATA_READ) ? 1 : 0);
                    528:                outb(EE_ENB, ee_addr);
                    529:                eeprom_delay(100);
                    530:        }
                    531: 
                    532:        /* Terminate the EEPROM access. */
                    533:        outb(~EE_CS, ee_addr);
                    534:        return retval;
                    535: }
                    536: 
                    537: /* MII serial management: mostly bogus for now. */
                    538: /* Read and write the MII management registers using software-generated
                    539:    serial MDIO protocol.
                    540:    The maximum data clock rate is 2.5 Mhz.  The minimum timing is usually
                    541:    met by back-to-back PCI I/O cycles, but we insert a delay to avoid
                    542:    "overclocking" issues. */
                    543: #define MDIO_DIR               0x80
                    544: #define MDIO_DATA_OUT  0x04
                    545: #define MDIO_DATA_IN   0x02
                    546: #define MDIO_CLK               0x01
                    547: #ifdef _LINUX_DELAY_H
                    548: #define mdio_delay()   udelay(1) /* Really 400ns. */
                    549: #else
                    550: #define mdio_delay()   do { ; } while (0)
                    551: #endif
                    552: 
                    553: /* Syncronize the MII management interface by shifting 32 one bits out. */
                    554: static void mdio_sync(int ioaddr)
                    555: {
                    556:        int i;
                    557:        int mdio_addr = ioaddr + MII_SMI;
                    558: 
                    559:        for (i = 32; i >= 0; i--) {
                    560:                outb(MDIO_DIR | MDIO_DATA_OUT, mdio_addr);
                    561:                mdio_delay();
                    562:                outb(MDIO_DIR | MDIO_DATA_OUT | MDIO_CLK, mdio_addr);
                    563:                mdio_delay();
                    564:        }
                    565:        return;
                    566: }
                    567: static int mdio_read(int ioaddr, int phy_id, int location)
                    568: {
                    569:        int i;
                    570:        int read_cmd = (0xf6 << 10) | (phy_id << 5) | location;
                    571:        int retval = 0;
                    572:        int mdio_addr = ioaddr + MII_SMI;
                    573: 
                    574:        mdio_sync(ioaddr);
                    575:        /* Shift the read command bits out. */
                    576:        for (i = 15; i >= 0; i--) {
                    577:                int dataval =
                    578:                  (read_cmd & (1 << i)) ? MDIO_DATA_OUT : 0;
                    579: 
                    580:                outb(MDIO_DIR | dataval, mdio_addr);
                    581:                mdio_delay();
                    582:                outb(MDIO_DIR | dataval | MDIO_CLK, mdio_addr);
                    583:                mdio_delay();
                    584:        }
                    585: 
                    586:        /* Read the two transition, 16 data, and wire-idle bits. */
                    587:        for (i = 19; i > 0; i--) {
                    588:                outb(0, mdio_addr);
                    589:                mdio_delay();
                    590:                retval = (retval << 1) | ((inb(mdio_addr) & MDIO_DATA_IN) ? 1 : 0);
                    591:                outb(MDIO_CLK, mdio_addr);
                    592:                mdio_delay();
                    593:        }
                    594:        return (retval>>1) & 0xffff;
                    595: }
                    596: 
                    597: static int
                    598: rtl8129_open(struct device *dev)
                    599: {
                    600:        struct rtl8129_private *tp = (struct rtl8129_private *)dev->priv;
                    601:        int ioaddr = dev->base_addr;
                    602:        int i;
                    603:        int full_duplex = 0;
                    604: 
                    605:        /* Soft reset the chip. */
                    606:        outb(CmdReset, ioaddr + ChipCmd);
                    607: 
                    608:        if (request_irq(dev->irq, &rtl8129_interrupt, SA_SHIRQ, dev->name, dev)) {
                    609:                return -EAGAIN;
                    610:        }
                    611: 
                    612:        MOD_INC_USE_COUNT;
                    613: 
                    614:        tp->tx_bufs = kmalloc(TX_BUF_SIZE * NUM_TX_DESC, GFP_KERNEL);
                    615:        tp->rx_ring = kmalloc(RX_BUF_LEN + 16, GFP_KERNEL);
                    616:        if (tp->tx_bufs == NULL ||  tp->rx_ring == NULL) {
                    617:                if (tp->tx_bufs)
                    618:                        kfree(tp->tx_bufs);
                    619:                if (rtl8129_debug > 0)
                    620:                        printk(KERN_ERR "%s: Couldn't allocate a %d byte receive ring.\n",
                    621:                                   dev->name, RX_BUF_LEN);
                    622:                return -ENOMEM;
                    623:        }
                    624:        rtl8129_init_ring(dev);
                    625: 
                    626:        /* Check that the chip has finished the reset. */
                    627:        for (i = 1000; i > 0; i--)
                    628:                if ((inb(ioaddr + ChipCmd) & CmdReset) == 0)
                    629:                        break;
                    630: 
                    631:        for (i = 0; i < 6; i++)
                    632:                outb(dev->dev_addr[i], ioaddr + MAC0 + i);
                    633: 
                    634:        /* Must enable Tx/Rx before setting transfer thresholds! */
                    635:        outb(CmdRxEnb | CmdTxEnb, ioaddr + ChipCmd);
                    636:        outl((RX_FIFO_THRESH << 13) | (RX_BUF_LEN_IDX << 11) | (RX_DMA_BURST<<8),
                    637:                 ioaddr + RxConfig);
                    638:        outl((TX_DMA_BURST<<8)|0x03000000, ioaddr + TxConfig);
                    639: 
                    640:        full_duplex = tp->full_duplex;
                    641:        if (tp->phys[0] >= 0  ||  tp->chip_id == 0x8139) {
                    642:                u16 mii_reg5;
                    643:                if (tp->chip_id == 0x8139)
                    644:                        mii_reg5 = inw(ioaddr + NWayLPAR);
                    645:                else
                    646:                        mii_reg5 = mdio_read(ioaddr, tp->phys[0], 5);
                    647:                if (mii_reg5 == 0xffff)
                    648:                        ;                                       /* Not there */
                    649:                else if ((mii_reg5 & 0x0100) == 0x0100
                    650:                                 || (mii_reg5 & 0x00C0) == 0x0040)
                    651:                        full_duplex = 1;
                    652:                if (rtl8129_debug > 1)
                    653:                        printk(KERN_INFO"%s: Setting %s%s-duplex based on"
                    654:                                   " auto-negotiated partner ability %4.4x.\n", dev->name,
                    655:                                   mii_reg5 == 0 ? "" :
                    656:                                   (mii_reg5 & 0x0180) ? "100mbps " : "10mbps ",
                    657:                                   full_duplex ? "full" : "half", mii_reg5);
                    658:        }
                    659: 
                    660:        outb(0xC0, ioaddr + Cfg9346);
                    661:        outb(full_duplex ? 0x60 : 0x20, ioaddr + Config1);
                    662:        outb(0x00, ioaddr + Cfg9346);
                    663: 
                    664:        outl(virt_to_bus(tp->rx_ring), ioaddr + RxBuf);
                    665: 
                    666:        /* Start the chip's Tx and Rx process. */
                    667:        outl(0, ioaddr + RxMissed);
                    668:        set_rx_mode(dev);
                    669: 
                    670:        outb(CmdRxEnb | CmdTxEnb, ioaddr + ChipCmd);
                    671: 
                    672:        dev->tbusy = 0;
                    673:        dev->interrupt = 0;
                    674:        dev->start = 1;
                    675: 
                    676:        /* Enable all known interrupts by setting the interrupt mask. */
                    677:        outw(PCIErr | PCSTimeout | RxUnderrun | RxOverflow | RxFIFOOver
                    678:                | TxErr | TxOK | RxErr | RxOK, ioaddr + IntrMask);
                    679: 
                    680:        if (rtl8129_debug > 1)
                    681:                printk(KERN_DEBUG"%s: rtl8129_open() ioaddr %4.4x IRQ %d"
                    682:                           " GP Pins %2.2x %s-duplex.\n",
                    683:                           dev->name, ioaddr, dev->irq, inb(ioaddr + GPPinData),
                    684:                           full_duplex ? "full" : "half");
                    685: 
                    686:        /* Set the timer to switch to check for link beat and perhaps switch
                    687:           to an alternate media type. */
                    688:        init_timer(&tp->timer);
                    689:        tp->timer.expires = RUN_AT((24*HZ)/10);                 /* 2.4 sec. */
                    690:        tp->timer.data = (unsigned long)dev;
                    691:        tp->timer.function = &rtl8129_timer;                            /* timer handler */
                    692:        add_timer(&tp->timer);
                    693: 
                    694:        return 0;
                    695: }
                    696: 
                    697: static void rtl8129_timer(unsigned long data)
                    698: {
                    699:        struct device *dev = (struct device *)data;
                    700:        struct rtl8129_private *tp = (struct rtl8129_private *)dev->priv;
                    701:        int ioaddr = dev->base_addr;
                    702:        int next_tick = 0;
                    703: 
                    704:        if (tp->chip_id == 0x8139) {
                    705:                u16 mii_reg5 = inw(ioaddr + NWayLPAR);
                    706:                if ((mii_reg5 & 0x0100) == 0x0100
                    707:                        || (mii_reg5 & 0x00C0) == 0x0040)
                    708:                        if ( ! tp->full_duplex) {
                    709:                                tp->full_duplex = 1;
                    710:                                if (rtl8129_debug > 0)
                    711:                                        printk(KERN_INFO "%s: Switching to full-duplex based on "
                    712:                                                   "link partner ability of %4.4x.\n",
                    713:                                                   dev->name, mii_reg5);
                    714:                                outb(0xC0, ioaddr + Cfg9346);
                    715:                                outb(tp->full_duplex ? 0x60 : 0x20, ioaddr + Config1);
                    716:                                outb(0x00, ioaddr + Cfg9346);
                    717:                        }
                    718:        }
                    719:        if (rtl8129_debug > 2) {
                    720:                if (tp->chip_id == 0x8129)
                    721:                        printk(KERN_DEBUG"%s: Media selection tick, GP pins %2.2x.\n",
                    722:                                   dev->name, inb(ioaddr + GPPinData));
                    723:                else
                    724:                        printk(KERN_DEBUG"%s: Media selection tick, Link partner %4.4x.\n",
                    725:                                   dev->name, inw(ioaddr + NWayLPAR));
                    726:                printk(KERN_DEBUG"%s:  Other registers are IntMask %4.4x IntStatus %4.4x"
                    727:                           " RxStatus %4.4x.\n",
                    728:                           dev->name, inw(ioaddr + IntrMask), inw(ioaddr + IntrStatus),
                    729:                           inl(ioaddr + RxEarlyStatus));
                    730:                printk(KERN_DEBUG"%s:  Chip config %2.2x %2.2x.\n",
                    731:                           dev->name, inb(ioaddr + Config0), inb(ioaddr + Config1));
                    732:        }
                    733: 
                    734:        if (next_tick) {
                    735:                tp->timer.expires = RUN_AT(next_tick);
                    736:                add_timer(&tp->timer);
                    737:        }
                    738: }
                    739: 
                    740: static void rtl8129_tx_timeout(struct device *dev)
                    741: {
                    742:        struct rtl8129_private *tp = (struct rtl8129_private *)dev->priv;
                    743:        int ioaddr = dev->base_addr;
                    744:        int i;
                    745: 
                    746:        /* Disable interrupts by clearing the interrupt mask. */
                    747:        outw(0x0000, ioaddr + IntrMask);
                    748: 
                    749:        if (rtl8129_debug > 0)
                    750:                printk(KERN_WARNING "%s: Transmit timeout, status %2.2x %4.4x.\n",
                    751:                           dev->name, inb(ioaddr + ChipCmd), inw(ioaddr + IntrStatus));
                    752:        /* Emit info to figure out what went wrong. */
                    753:        for (i = 0; i < NUM_TX_DESC; i++)
                    754:                printk(KERN_DEBUG"%s:  Tx descriptor %d is %8.8x.%s\n",
                    755:                           dev->name, i, inl(ioaddr + TxStat0 + i*4),
                    756:                           i == tp->dirty_tx % NUM_TX_DESC ? " (queue head)" : "");
                    757:        if (tp->chip_id == 0x8129) {
                    758:                int mii_reg;
                    759:                printk(KERN_DEBUG"%s: MII #%d registers are:", dev->name, tp->phys[0]);
                    760:                for (mii_reg = 0; mii_reg < 8; mii_reg++)
                    761:                        printk(" %4.4x", mdio_read(ioaddr, tp->phys[0], mii_reg));
                    762:                printk(".\n");
                    763:        } else {
                    764:                printk(KERN_DEBUG"%s: MII status register is %4.4x.\n",
                    765:                           dev->name, inw(ioaddr + BMSR));
                    766:        }
                    767: 
                    768:        /* Soft reset the chip. */
                    769:        outb(CmdReset, ioaddr + ChipCmd);
                    770:        for (i = 0; i < 6; i++)
                    771:                outb(dev->dev_addr[i], ioaddr + MAC0 + i);
                    772: 
                    773:        {                                                       /* Save the unsent Tx packets. */
                    774:                struct sk_buff *saved_skb[NUM_TX_DESC], *skb;
                    775:                int j = 0;
                    776:                for (; tp->cur_tx - tp->dirty_tx > 0 ; tp->dirty_tx++)
                    777:                        saved_skb[j++] = tp->tx_skbuff[tp->dirty_tx % NUM_TX_DESC];
                    778:                tp->dirty_tx = tp->cur_tx = 0;
                    779: 
                    780:                for (i = 0; i < j; i++) {
                    781:                        skb = tp->tx_skbuff[i] = saved_skb[i];
                    782:                        if ((long)skb->data & 3) {              /* Must use alignment buffer. */
                    783:                                memcpy(tp->tx_buf[i], skb->data, skb->len);
                    784:                                outl(virt_to_bus(tp->tx_buf[i]), ioaddr + TxAddr0 + i*4);
                    785:                        } else
                    786:                                outl(virt_to_bus(skb->data), ioaddr + TxAddr0 + i*4);
                    787:                        /* Note: the chip doesn't have auto-pad! */
                    788:                        outl(((TX_FIFO_THRESH<<11) & 0x003f0000) |
                    789:                                 (skb->len >= ETH_ZLEN ? skb->len : ETH_ZLEN),
                    790:                                 ioaddr + TxStat0 + i*4);
                    791:                }
                    792:                tp->cur_tx = i;
                    793:                while (i < NUM_TX_DESC)
                    794:                        tp->tx_skbuff[i] = 0;
                    795:                if (tp->cur_tx - tp->dirty_tx < NUM_TX_DESC) {/* Typical path */
                    796:                        dev->tbusy = 0;
                    797:                } else {
                    798:                        tp->tx_full = 1;
                    799:                }
                    800:        }
                    801: 
                    802:        /* Must enable Tx/Rx before setting transfer thresholds! */
                    803:        set_rx_mode(dev);
                    804:        outb(CmdRxEnb | CmdTxEnb, ioaddr + ChipCmd);
                    805:        outl((RX_FIFO_THRESH << 13) | (RX_BUF_LEN_IDX << 11) | (RX_DMA_BURST<<8),
                    806:                 ioaddr + RxConfig);
                    807:        outl((TX_DMA_BURST<<8), ioaddr + TxConfig);
                    808: 
                    809:        dev->trans_start = jiffies;
                    810:        tp->stats.tx_errors++;
                    811:        /* Enable all known interrupts by setting the interrupt mask. */
                    812:        outw(PCIErr | PCSTimeout | RxUnderrun | RxOverflow | RxFIFOOver
                    813:                 | TxErr | TxOK | RxErr | RxOK, ioaddr + IntrMask);
                    814:        return;
                    815: }
                    816: 
                    817: 
                    818: /* Initialize the Rx and Tx rings, along with various 'dev' bits. */
                    819: static void
                    820: rtl8129_init_ring(struct device *dev)
                    821: {
                    822:        struct rtl8129_private *tp = (struct rtl8129_private *)dev->priv;
                    823:        int i;
                    824: 
                    825:        tp->tx_full = 0;
                    826:        tp->cur_rx = tp->cur_tx = 0;
                    827:        tp->dirty_rx = tp->dirty_tx = 0;
                    828: 
                    829:        for (i = 0; i < NUM_TX_DESC; i++) {
                    830:                tp->tx_skbuff[i] = 0;
                    831:                tp->tx_buf[i] = &tp->tx_bufs[i*TX_BUF_SIZE];
                    832:        }
                    833: }
                    834: 
                    835: static int
                    836: rtl8129_start_xmit(struct sk_buff *skb, struct device *dev)
                    837: {
                    838:        struct rtl8129_private *tp = (struct rtl8129_private *)dev->priv;
                    839:        int ioaddr = dev->base_addr;
                    840:        int entry;
                    841: 
                    842:        /* Block a timer-based transmit from overlapping.  This could better be
                    843:           done with atomic_swap(1, dev->tbusy), but set_bit() works as well. */
                    844:        if (test_and_set_bit(0, (void*)&dev->tbusy) != 0) {
                    845:                if (jiffies - dev->trans_start < TX_TIMEOUT)
                    846:                        return 1;
                    847:                rtl8129_tx_timeout(dev);
                    848:                return 1;
                    849:        }
                    850: 
                    851:        /* Calculate the next Tx descriptor entry. */
                    852:        entry = tp->cur_tx % NUM_TX_DESC;
                    853: 
                    854:        tp->tx_skbuff[entry] = skb;
                    855:        if ((long)skb->data & 3) {                      /* Must use alignment buffer. */
                    856:                memcpy(tp->tx_buf[entry], skb->data, skb->len);
                    857:                outl(virt_to_bus(tp->tx_buf[entry]), ioaddr + TxAddr0 + entry*4);
                    858:        } else
                    859:                outl(virt_to_bus(skb->data), ioaddr + TxAddr0 + entry*4);
                    860:        /* Note: the chip doesn't have auto-pad! */
                    861:        outl(((TX_FIFO_THRESH<<11) & 0x003f0000) |
                    862:                 (skb->len >= ETH_ZLEN ? skb->len : ETH_ZLEN),
                    863:                 ioaddr + TxStat0 + entry*4);
                    864: 
                    865:        if (++tp->cur_tx - tp->dirty_tx < NUM_TX_DESC) {/* Typical path */
                    866:                dev->tbusy = 0;
                    867:        } else {
                    868:                tp->tx_full = 1;
                    869:        }
                    870: 
                    871:        dev->trans_start = jiffies;
                    872:        if (rtl8129_debug > 4)
                    873:                printk(KERN_DEBUG"%s: Queued Tx packet at %p size %ld to slot %d.\n",
                    874:                           dev->name, skb->data, skb->len, entry);
                    875: 
                    876:        return 0;
                    877: }
                    878: 
                    879: /* The interrupt handler does all of the Rx thread work and cleans up
                    880:    after the Tx thread. */
                    881: static void rtl8129_interrupt(int irq, void *dev_instance, struct pt_regs *regs)
                    882: {
                    883:        struct device *dev = (struct device *)dev_instance;
                    884:        struct rtl8129_private *tp;
                    885:        int ioaddr, boguscnt = max_interrupt_work;
                    886:        int status;
                    887: 
                    888:        if (dev == NULL) {
                    889:                printk (KERN_ERR"rtl8139_interrupt(): IRQ %d for unknown device.\n",
                    890:                                irq);
                    891:                return;
                    892:        }
                    893: 
                    894:        ioaddr = dev->base_addr;
                    895:        tp = (struct rtl8129_private *)dev->priv;
                    896:        if (test_and_set_bit(0, (void*)&tp->in_interrupt)) {
                    897:                printk(KERN_ERR "%s: Re-entering the interrupt handler.\n", dev->name);
                    898:                return;
                    899:        }
                    900:        dev->interrupt = 1;
                    901: 
                    902:        do {
                    903:                status = inw(ioaddr + IntrStatus);
                    904:                /* Acknowledge all of the current interrupt sources ASAP. */
                    905:                outw(status, ioaddr + IntrStatus);
                    906: 
                    907:                if (rtl8129_debug > 4)
                    908:                        printk(KERN_DEBUG"%s: interrupt  status=%#4.4x new intstat=%#4.4x.\n",
                    909:                                   dev->name, status, inw(ioaddr + IntrStatus));
                    910: 
                    911:                if ((status & (PCIErr|PCSTimeout|RxUnderrun|RxOverflow|RxFIFOOver
                    912:                                           |TxErr|TxOK|RxErr|RxOK)) == 0)
                    913:                        break;
                    914: 
                    915:                if (status & (RxOK|RxUnderrun|RxOverflow|RxFIFOOver))/* Rx interrupt */
                    916:                        rtl8129_rx(dev);
                    917: 
                    918:                if (status & (TxOK | TxErr)) {
                    919:                        unsigned int dirty_tx;
                    920: 
                    921:                        for (dirty_tx = tp->dirty_tx; dirty_tx < tp->cur_tx; dirty_tx++) {
                    922:                                int entry = dirty_tx % NUM_TX_DESC;
                    923:                                int txstatus = inl(ioaddr + TxStat0 + entry*4);
                    924: 
                    925:                                if ( ! (txstatus & TxHostOwns))
                    926:                                        break;                  /* It still hasn't been Txed */
                    927: 
                    928:                                /* Note: TxCarrierLost is always asserted at 100mbps. */
                    929:                                if (txstatus & (TxOutOfWindow | TxAborted)) {
                    930:                                        /* There was an major error, log it. */
                    931: #ifndef final_version
                    932:                                        if (rtl8129_debug > 1)
                    933:                                                printk(KERN_NOTICE"%s: Transmit error, Tx status %8.8x.\n",
                    934:                                                           dev->name, txstatus);
                    935: #endif
                    936:                                        tp->stats.tx_errors++;
                    937:                                        if (txstatus&TxAborted) {
                    938:                                                tp->stats.tx_aborted_errors++;
                    939:                                                outl((TX_DMA_BURST<<8)|0x03000001, ioaddr + TxConfig);
                    940:                                        }
                    941:                                        if (txstatus&TxCarrierLost) tp->stats.tx_carrier_errors++;
                    942:                                        if (txstatus&TxOutOfWindow) tp->stats.tx_window_errors++;
                    943: #ifdef ETHER_STATS
                    944:                                        if ((txstatus & 0x0f000000) == 0x0f000000)
                    945:                                                tp->stats.collisions16++;
                    946: #endif
                    947:                                } else {
                    948: #ifdef ETHER_STATS
                    949:                                        /* No count for tp->stats.tx_deferred */
                    950: #endif
                    951:                                        if (txstatus & TxUnderrun) {
                    952:                                                /* Todo: increase the Tx FIFO threshold. */
                    953:                                                tp->stats.tx_fifo_errors++;
                    954:                                        }
                    955:                                        tp->stats.collisions += (txstatus >> 24) & 15;
                    956: #if LINUX_VERSION_CODE > 0x20119
                    957:                                        tp->stats.tx_bytes += txstatus & 0x7ff;
                    958: #endif
                    959:                                        tp->stats.tx_packets++;
                    960:                                }
                    961: 
                    962:                                /* Free the original skb. */
                    963:                                dev_kfree_skb(tp->tx_skbuff[entry], FREE_WRITE);
                    964:                                tp->tx_skbuff[entry] = 0;
                    965:                        }
                    966: 
                    967: #ifndef final_version
                    968:                        if (tp->cur_tx - dirty_tx > NUM_TX_DESC) {
                    969:                                printk(KERN_ERR"%s: Out-of-sync dirty pointer, %d vs. %d, full=%d.\n",
                    970:                                           dev->name, dirty_tx, tp->cur_tx, tp->tx_full);
                    971:                                dirty_tx += NUM_TX_DESC;
                    972:                        }
                    973: #endif
                    974: 
                    975:                        if (tp->tx_full && dev->tbusy
                    976:                                && dirty_tx > tp->cur_tx - NUM_TX_DESC) {
                    977:                                /* The ring is no longer full, clear tbusy. */
                    978:                                tp->tx_full = 0;
                    979:                                dev->tbusy = 0;
                    980:                                mark_bh(NET_BH);
                    981:                        }
                    982: 
                    983:                        tp->dirty_tx = dirty_tx;
                    984:                }
                    985: 
                    986:                /* Check uncommon events with one test. */
                    987:                if (status & (PCIErr|PCSTimeout |RxUnderrun|RxOverflow|RxFIFOOver
                    988:                                          |TxErr|RxErr)) {
                    989:                        /* Update the error count. */
                    990:                        tp->stats.rx_missed_errors += inl(ioaddr + RxMissed);
                    991:                        outl(0, ioaddr + RxMissed);
                    992: 
                    993:                        if (status & (RxUnderrun | RxOverflow | RxErr | RxFIFOOver))
                    994:                                tp->stats.rx_errors++;
                    995: 
                    996:                        if (status & (PCSTimeout)) tp->stats.rx_length_errors++;
                    997:                        if (status & (RxUnderrun|RxFIFOOver)) tp->stats.rx_fifo_errors++;
                    998:                        if (status & RxOverflow) {
                    999:                                tp->stats.rx_over_errors++;
                   1000:                                tp->cur_rx = inw(ioaddr + RxBufAddr) % RX_BUF_LEN;
                   1001:                                outw(tp->cur_rx - 16, ioaddr + RxBufPtr);
                   1002:                        }
                   1003:                        /* Error sources cleared above. */
                   1004:                }
                   1005:                if (--boguscnt < 0) {
                   1006:                        printk(KERN_WARNING"%s: Too much work at interrupt, "
                   1007:                                   "IntrStatus=0x%4.4x.\n",
                   1008:                                   dev->name, status);
                   1009:                        /* Clear all interrupt sources. */
                   1010:                        outw(0xffff, ioaddr + IntrStatus);
                   1011:                        break;
                   1012:                }
                   1013:        } while (1);
                   1014: 
                   1015:        if (rtl8129_debug > 3)
                   1016:                printk(KERN_DEBUG"%s: exiting interrupt, intr_status=%#4.4x.\n",
                   1017:                           dev->name, inl(ioaddr + IntrStatus));
                   1018: 
                   1019:        dev->interrupt = 0;
                   1020:        clear_bit(0, (void*)&tp->in_interrupt);
                   1021:        return;
                   1022: }
                   1023: 
                   1024: /* The data sheet doesn't describe the Rx ring at all, so I'm guessing at the
                   1025:    field alignments and semantics. */
                   1026: static int
                   1027: rtl8129_rx(struct device *dev)
                   1028: {
                   1029:        struct rtl8129_private *tp = (struct rtl8129_private *)dev->priv;
                   1030:        int ioaddr = dev->base_addr;
                   1031:        unsigned char *rx_ring = tp->rx_ring;
                   1032:        u16 cur_rx = tp->cur_rx;
                   1033: 
                   1034:        if (rtl8129_debug > 4)
                   1035:                printk(KERN_DEBUG"%s: In rtl8129_rx(), current %4.4x BufAddr %4.4x,"
                   1036:                           " free to %4.4x, Cmd %2.2x.\n",
                   1037:                           dev->name, cur_rx, inw(ioaddr + RxBufAddr),
                   1038:                           inw(ioaddr + RxBufPtr), inb(ioaddr + ChipCmd));
                   1039: 
                   1040:        while ((inb(ioaddr + ChipCmd) & 1) == 0) {
                   1041:                int ring_offset = cur_rx % RX_BUF_LEN;
                   1042:                u32 rx_status = *(u32*)(rx_ring + ring_offset);
                   1043:                int rx_size = rx_status >> 16;
                   1044: 
                   1045:                if (rtl8129_debug > 4) {
                   1046:                        int i;
                   1047:                        printk(KERN_DEBUG"%s:  rtl8129_rx() status %4.4x, size %4.4x, cur %4.4x.\n",
                   1048:                                   dev->name, rx_status, rx_size, cur_rx);
                   1049:                        printk(KERN_DEBUG"%s: Frame contents ", dev->name);
                   1050:                        for (i = 0; i < 70; i++)
                   1051:                                printk(" %2.2x", rx_ring[ring_offset + i]);
                   1052:                        printk(".\n");
                   1053:                }
                   1054:                if (rx_status & RxTooLong) {
                   1055:                        if (rtl8129_debug > 0)
                   1056:                                printk(KERN_NOTICE"%s: Oversized Ethernet frame, status %4.4x!\n",
                   1057:                                           dev->name, rx_status);
                   1058:                        tp->stats.rx_length_errors++;
                   1059:                } else if (rx_status &
                   1060:                                   (RxBadSymbol|RxRunt|RxTooLong|RxCRCErr|RxBadAlign)) {
                   1061:                        if (rtl8129_debug > 1)
                   1062:                                printk(KERN_DEBUG"%s: Ethernet frame had errors,"
                   1063:                                           " status %4.4x.\n", dev->name, rx_status);
                   1064:                        tp->stats.rx_errors++;
                   1065:                        if (rx_status & (RxBadSymbol|RxBadAlign))
                   1066:                                tp->stats.rx_frame_errors++;
                   1067:                        if (rx_status & (RxRunt|RxTooLong)) tp->stats.rx_length_errors++;
                   1068:                        if (rx_status & RxCRCErr) tp->stats.rx_crc_errors++;
                   1069:                        /* Reset the receiver, based on RealTek recommendation. (Bug?) */
                   1070:                        tp->cur_rx = 0;
                   1071:                        outb(CmdTxEnb, ioaddr + ChipCmd);
                   1072:                        outb(CmdRxEnb | CmdTxEnb, ioaddr + ChipCmd);
                   1073:                        outl((RX_FIFO_THRESH << 13) | (RX_BUF_LEN_IDX << 11) |
                   1074:                                 (RX_DMA_BURST<<8), ioaddr + RxConfig);
                   1075:                } else {
                   1076:                        /* Malloc up new buffer, compatible with net-2e. */
                   1077:                        /* Omit the four octet CRC from the length. */
                   1078:                        struct sk_buff *skb;
                   1079: 
                   1080:                        skb = dev_alloc_skb(rx_size + 2);
                   1081:                        if (skb == NULL) {
                   1082:                                printk(KERN_WARNING"%s: Memory squeeze, deferring packet.\n",
                   1083:                                           dev->name);
                   1084:                                /* We should check that some rx space is free.
                   1085:                                   If not, free one and mark stats->rx_dropped++. */
                   1086:                                tp->stats.rx_dropped++;
                   1087:                                break;
                   1088:                        }
                   1089:                        skb->dev = dev;
                   1090:                        skb_reserve(skb, 2);    /* 16 byte align the IP fields. */
                   1091:                        if (ring_offset+rx_size+4 > RX_BUF_LEN) {
                   1092:                                int semi_count = RX_BUF_LEN - ring_offset - 4;
                   1093:                                memcpy(skb_put(skb, semi_count), &rx_ring[ring_offset + 4],
                   1094:                                           semi_count);
                   1095:                                memcpy(skb_put(skb, rx_size-semi_count), rx_ring,
                   1096:                                           rx_size-semi_count);
                   1097:                                if (rtl8129_debug > 4) {
                   1098:                                        int i;
                   1099:                                        printk(KERN_DEBUG"%s:  Frame wrap @%d",
                   1100:                                                   dev->name, semi_count);
                   1101:                                        for (i = 0; i < 16; i++)
                   1102:                                                printk(" %2.2x", rx_ring[i]);
                   1103:                                        printk(".\n");
                   1104:                                        memset(rx_ring, 0xcc, 16);
                   1105:                                }
                   1106:                        } else
                   1107:                                memcpy(skb_put(skb, rx_size), &rx_ring[ring_offset + 4],
                   1108:                                           rx_size);
                   1109:                        skb->protocol = eth_type_trans(skb, dev);
                   1110:                        netif_rx(skb);
                   1111: #if LINUX_VERSION_CODE > 0x20119
                   1112:                        tp->stats.rx_bytes += rx_size;
                   1113: #endif
                   1114:                        tp->stats.rx_packets++;
                   1115:                }
                   1116: 
                   1117:                cur_rx += rx_size + 4;
                   1118:                cur_rx = (cur_rx + 3) & ~3;
                   1119:                outw(cur_rx - 16, ioaddr + RxBufPtr);
                   1120:        }
                   1121:        if (rtl8129_debug > 4)
                   1122:                printk(KERN_DEBUG"%s: Done rtl8129_rx(), current %4.4x BufAddr %4.4x,"
                   1123:                           " free to %4.4x, Cmd %2.2x.\n",
                   1124:                           dev->name, cur_rx, inw(ioaddr + RxBufAddr),
                   1125:                           inw(ioaddr + RxBufPtr), inb(ioaddr + ChipCmd));
                   1126:        tp->cur_rx = cur_rx;
                   1127:        return 0;
                   1128: }
                   1129: 
                   1130: static int
                   1131: rtl8129_close(struct device *dev)
                   1132: {
                   1133:        int ioaddr = dev->base_addr;
                   1134:        struct rtl8129_private *tp = (struct rtl8129_private *)dev->priv;
                   1135:        int i;
                   1136: 
                   1137:        dev->start = 0;
                   1138:        dev->tbusy = 1;
                   1139: 
                   1140:        if (rtl8129_debug > 1)
                   1141:                printk(KERN_DEBUG"%s: Shutting down ethercard, status was 0x%4.4x.\n",
                   1142:                           dev->name, inw(ioaddr + IntrStatus));
                   1143: 
                   1144:        /* Disable interrupts by clearing the interrupt mask. */
                   1145:        outw(0x0000, ioaddr + IntrMask);
                   1146: 
                   1147:        /* Stop the chip's Tx and Rx DMA processes. */
                   1148:        outb(0x00, ioaddr + ChipCmd);
                   1149: 
                   1150:        /* Update the error counts. */
                   1151:        tp->stats.rx_missed_errors += inl(ioaddr + RxMissed);
                   1152:        outl(0, ioaddr + RxMissed);
                   1153: 
                   1154:        del_timer(&tp->timer);
                   1155: 
                   1156:        free_irq(dev->irq, dev);
                   1157: 
                   1158:        for (i = 0; i < NUM_TX_DESC; i++) {
                   1159:                if (tp->tx_skbuff[i])
                   1160:                        dev_kfree_skb(tp->tx_skbuff[i], FREE_WRITE);
                   1161:                tp->tx_skbuff[i] = 0;
                   1162:        }
                   1163:        kfree(tp->rx_ring);
                   1164:        kfree(tp->tx_bufs);
                   1165: 
                   1166:        /* Green! Put the chip in low-power mode. */
                   1167:        outb(0xC0, ioaddr + Cfg9346);
                   1168:        outb(0x03, ioaddr + Config1);
                   1169:        outb('H', ioaddr + HltClk);             /* 'R' would leave the clock running. */
                   1170: 
                   1171:        MOD_DEC_USE_COUNT;
                   1172: 
                   1173:        return 0;
                   1174: }
                   1175: 
                   1176: static struct enet_statistics *
                   1177: rtl8129_get_stats(struct device *dev)
                   1178: {
                   1179:        struct rtl8129_private *tp = (struct rtl8129_private *)dev->priv;
                   1180:        int ioaddr = dev->base_addr;
                   1181: 
                   1182:        if (dev->start) {
                   1183:                tp->stats.rx_missed_errors += inl(ioaddr + RxMissed);
                   1184:                outl(0, ioaddr + RxMissed);
                   1185:        }
                   1186: 
                   1187:        return &tp->stats;
                   1188: }
                   1189: 
                   1190: /* Set or clear the multicast filter for this adaptor.
                   1191:    Note that we only use exclusion around actually queueing the
                   1192:    new frame, not around filling tp->setup_frame.  This is non-deterministic
                   1193:    when re-entered but still correct. */
                   1194: 
                   1195: /* The little-endian AUTODIN II ethernet CRC calculation.
                   1196:    N.B. Do not use for bulk data, use a table-based routine instead.
                   1197:    This is common code and should be moved to net/core/crc.c */
                   1198: static unsigned const ethernet_polynomial_le = 0xedb88320U;
                   1199: static inline unsigned ether_crc_le(int length, unsigned char *data)
                   1200: {
                   1201:        unsigned int crc = 0xffffffff;  /* Initial value. */
                   1202:        while(--length >= 0) {
                   1203:                unsigned char current_octet = *data++;
                   1204:                int bit;
                   1205:                for (bit = 8; --bit >= 0; current_octet >>= 1) {
                   1206:                        if ((crc ^ current_octet) & 1) {
                   1207:                                crc >>= 1;
                   1208:                                crc ^= ethernet_polynomial_le;
                   1209:                        } else
                   1210:                                crc >>= 1;
                   1211:                }
                   1212:        }
                   1213:        return crc;
                   1214: }
                   1215: 
                   1216: static void set_rx_mode(struct device *dev)
                   1217: {
                   1218:        int ioaddr = dev->base_addr;
                   1219:        struct rtl8129_private *tp = (struct rtl8129_private *)dev->priv;
                   1220:        unsigned char mc_filter[8];              /* Multicast hash filter */
                   1221:        int i;
                   1222: 
                   1223:        if (dev->flags & IFF_PROMISC) {                 /* Set promiscuous. */
                   1224:                /* Unconditionally log net taps. */
                   1225:                printk(KERN_NOTICE"%s: Promiscuous mode enabled.\n", dev->name);
                   1226:                memset(mc_filter, 0xff, sizeof(mc_filter));
                   1227:                outb(0x0F, ioaddr + RxConfig);
                   1228:        } else if ((dev->mc_count > 1000)  ||  (dev->flags & IFF_ALLMULTI)) {
                   1229:                /* Too many to filter perfectly -- accept all multicasts. */
                   1230:                memset(mc_filter, 0xff, sizeof(mc_filter));
                   1231:                outb(0x0E, ioaddr + RxConfig);
                   1232:        } else if (dev->mc_count == 0) {
                   1233:                outb(0x0A, ioaddr + RxConfig);
                   1234:                return;
                   1235:        } else {
                   1236:                struct dev_mc_list *mclist;
                   1237: 
                   1238:                memset(mc_filter, 0, sizeof(mc_filter));
                   1239:                for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
                   1240:                         i++, mclist = mclist->next)
                   1241:                        set_bit(ether_crc_le(ETH_ALEN, mclist->dmi_addr) & 0x3f,
                   1242:                                        mc_filter);
                   1243:        }
                   1244:        /* ToDo: perhaps we need to stop the Tx and Rx process here? */
                   1245:        if (memcmp(mc_filter, tp->mc_filter, sizeof(mc_filter))) {
                   1246:                for (i = 0; i < 2; i++)
                   1247:                        outl(((u32 *)mc_filter)[i], ioaddr + MAR0 + i*4);
                   1248:                memcpy(tp->mc_filter, mc_filter, sizeof(mc_filter));
                   1249:        }
                   1250:        if (rtl8129_debug > 3)
                   1251:                printk(KERN_DEBUG"%s:   set_rx_mode(%4.4x) done -- Rx config %8.8x.\n",
                   1252:                           dev->name, dev->flags, inl(ioaddr + RxConfig));
                   1253:        return;
                   1254: }
                   1255: 
                   1256: #ifdef MODULE
                   1257: 
                   1258: /* An additional parameter that may be passed in... */
                   1259: static int debug = -1;
                   1260: 
                   1261: int
                   1262: init_module(void)
                   1263: {
                   1264:        int cards_found;
                   1265: 
                   1266:        if (debug >= 0)
                   1267:                rtl8129_debug = debug;
                   1268: 
                   1269:        root_rtl8129_dev = NULL;
                   1270:        cards_found = rtl8139_probe(0);
                   1271: 
                   1272:        return cards_found ? 0 : -ENODEV;
                   1273: }
                   1274: 
                   1275: void
                   1276: cleanup_module(void)
                   1277: {
                   1278:        struct device *next_dev;
                   1279: 
                   1280:        /* No need to check MOD_IN_USE, as sys_delete_module() checks. */
                   1281:        while (root_rtl8129_dev) {
                   1282:                next_dev = ((struct rtl8129_private *)root_rtl8129_dev->priv)->next_module;
                   1283:                unregister_netdev(root_rtl8129_dev);
                   1284:                release_region(root_rtl8129_dev->base_addr, RTL8129_TOTAL_SIZE);
                   1285:                kfree(root_rtl8129_dev);
                   1286:                root_rtl8129_dev = next_dev;
                   1287:        }
                   1288: }
                   1289: 
                   1290: #endif  /* MODULE */
                   1291: 
                   1292: /*
                   1293:  * Local variables:
                   1294:  *  compile-command: "gcc -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -c rtl8139.c `[ -f /usr/include/linux/modversions.h ] && echo -DMODVERSIONS`"
                   1295:  *  SMP-compile-command: "gcc -D__SMP__ -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -c rtl8139.c `[ -f /usr/include/linux/modversions.h ] && echo -DMODVERSIONS`"
                   1296:  *  c-indent-level: 4
                   1297:  *  c-basic-offset: 4
                   1298:  *  tab-width: 4
                   1299:  * End:
                   1300:  */

unix.superglobalmegacorp.com

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