linux/drivers/net/pcmcia/3c589_cs.c
<<
>>
Prefs
   1/*======================================================================
   2
   3    A PCMCIA ethernet driver for the 3com 3c589 card.
   4    
   5    Copyright (C) 1999 David A. Hinds -- dahinds@users.sourceforge.net
   6
   7    3c589_cs.c 1.162 2001/10/13 00:08:50
   8
   9    The network driver code is based on Donald Becker's 3c589 code:
  10    
  11    Written 1994 by Donald Becker.
  12    Copyright 1993 United States Government as represented by the
  13    Director, National Security Agency.  This software may be used and
  14    distributed according to the terms of the GNU General Public License,
  15    incorporated herein by reference.
  16    Donald Becker may be reached at becker@scyld.com
  17    
  18    Updated for 2.5.x by Alan Cox <alan@lxorguk.ukuu.org.uk>
  19
  20======================================================================*/
  21
  22#define DRV_NAME        "3c589_cs"
  23#define DRV_VERSION     "1.162-ac"
  24
  25#include <linux/module.h>
  26#include <linux/init.h>
  27#include <linux/kernel.h>
  28#include <linux/ptrace.h>
  29#include <linux/slab.h>
  30#include <linux/string.h>
  31#include <linux/timer.h>
  32#include <linux/interrupt.h>
  33#include <linux/in.h>
  34#include <linux/delay.h>
  35#include <linux/ethtool.h>
  36#include <linux/netdevice.h>
  37#include <linux/etherdevice.h>
  38#include <linux/skbuff.h>
  39#include <linux/if_arp.h>
  40#include <linux/ioport.h>
  41#include <linux/bitops.h>
  42#include <linux/jiffies.h>
  43
  44#include <pcmcia/cs_types.h>
  45#include <pcmcia/cs.h>
  46#include <pcmcia/cistpl.h>
  47#include <pcmcia/cisreg.h>
  48#include <pcmcia/ciscode.h>
  49#include <pcmcia/ds.h>
  50
  51#include <asm/uaccess.h>
  52#include <asm/io.h>
  53#include <asm/system.h>
  54
  55/* To minimize the size of the driver source I only define operating
  56   constants if they are used several times.  You'll need the manual
  57   if you want to understand driver details. */
  58/* Offsets from base I/O address. */
  59#define EL3_DATA        0x00
  60#define EL3_TIMER       0x0a
  61#define EL3_CMD         0x0e
  62#define EL3_STATUS      0x0e
  63
  64#define EEPROM_READ     0x0080
  65#define EEPROM_BUSY     0x8000
  66
  67#define EL3WINDOW(win_num) outw(SelectWindow + (win_num), ioaddr + EL3_CMD)
  68
  69/* The top five bits written to EL3_CMD are a command, the lower
  70   11 bits are the parameter, if applicable. */
  71enum c509cmd {
  72    TotalReset = 0<<11, SelectWindow = 1<<11, StartCoax = 2<<11,
  73    RxDisable = 3<<11, RxEnable = 4<<11, RxReset = 5<<11, RxDiscard = 8<<11,
  74    TxEnable = 9<<11, TxDisable = 10<<11, TxReset = 11<<11,
  75    FakeIntr = 12<<11, AckIntr = 13<<11, SetIntrEnb = 14<<11,
  76    SetStatusEnb = 15<<11, SetRxFilter = 16<<11, SetRxThreshold = 17<<11,
  77    SetTxThreshold = 18<<11, SetTxStart = 19<<11, StatsEnable = 21<<11,
  78    StatsDisable = 22<<11, StopCoax = 23<<11,
  79};
  80
  81enum c509status {
  82    IntLatch = 0x0001, AdapterFailure = 0x0002, TxComplete = 0x0004,
  83    TxAvailable = 0x0008, RxComplete = 0x0010, RxEarly = 0x0020,
  84    IntReq = 0x0040, StatsFull = 0x0080, CmdBusy = 0x1000
  85};
  86
  87/* The SetRxFilter command accepts the following classes: */
  88enum RxFilter {
  89    RxStation = 1, RxMulticast = 2, RxBroadcast = 4, RxProm = 8
  90};
  91
  92/* Register window 1 offsets, the window used in normal operation. */
  93#define TX_FIFO         0x00
  94#define RX_FIFO         0x00
  95#define RX_STATUS       0x08
  96#define TX_STATUS       0x0B
  97#define TX_FREE         0x0C    /* Remaining free bytes in Tx buffer. */
  98
  99#define WN0_IRQ         0x08    /* Window 0: Set IRQ line in bits 12-15. */
 100#define WN4_MEDIA       0x0A    /* Window 4: Various transcvr/media bits. */
 101#define MEDIA_TP        0x00C0  /* Enable link beat and jabber for 10baseT. */
 102#define MEDIA_LED       0x0001  /* Enable link light on 3C589E cards. */
 103
 104/* Time in jiffies before concluding Tx hung */
 105#define TX_TIMEOUT      ((400*HZ)/1000)
 106
 107struct el3_private {
 108        struct pcmcia_device    *p_dev;
 109    dev_node_t          node;
 110    /* For transceiver monitoring */
 111    struct timer_list   media;
 112    u16                 media_status;
 113    u16                 fast_poll;
 114    unsigned long       last_irq;
 115    spinlock_t          lock;
 116};
 117
 118static const char *if_names[] = { "auto", "10baseT", "10base2", "AUI" };
 119
 120/*====================================================================*/
 121
 122/* Module parameters */
 123
 124MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
 125MODULE_DESCRIPTION("3Com 3c589 series PCMCIA ethernet driver");
 126MODULE_LICENSE("GPL");
 127
 128#define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0)
 129
 130/* Special hook for setting if_port when module is loaded */
 131INT_MODULE_PARM(if_port, 0);
 132
 133#ifdef PCMCIA_DEBUG
 134INT_MODULE_PARM(pc_debug, PCMCIA_DEBUG);
 135#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
 136static char *version =
 137DRV_NAME ".c " DRV_VERSION " 2001/10/13 00:08:50 (David Hinds)";
 138#else
 139#define DEBUG(n, args...)
 140#endif
 141
 142/*====================================================================*/
 143
 144static int tc589_config(struct pcmcia_device *link);
 145static void tc589_release(struct pcmcia_device *link);
 146
 147static u16 read_eeprom(unsigned int ioaddr, int index);
 148static void tc589_reset(struct net_device *dev);
 149static void media_check(unsigned long arg);
 150static int el3_config(struct net_device *dev, struct ifmap *map);
 151static int el3_open(struct net_device *dev);
 152static netdev_tx_t el3_start_xmit(struct sk_buff *skb,
 153                                        struct net_device *dev);
 154static irqreturn_t el3_interrupt(int irq, void *dev_id);
 155static void update_stats(struct net_device *dev);
 156static struct net_device_stats *el3_get_stats(struct net_device *dev);
 157static int el3_rx(struct net_device *dev);
 158static int el3_close(struct net_device *dev);
 159static void el3_tx_timeout(struct net_device *dev);
 160static void set_rx_mode(struct net_device *dev);
 161static void set_multicast_list(struct net_device *dev);
 162static const struct ethtool_ops netdev_ethtool_ops;
 163
 164static void tc589_detach(struct pcmcia_device *p_dev);
 165
 166/*======================================================================
 167
 168    tc589_attach() creates an "instance" of the driver, allocating
 169    local data structures for one device.  The device is registered
 170    with Card Services.
 171
 172======================================================================*/
 173
 174static const struct net_device_ops el3_netdev_ops = {
 175        .ndo_open               = el3_open,
 176        .ndo_stop               = el3_close,
 177        .ndo_start_xmit         = el3_start_xmit,
 178        .ndo_tx_timeout         = el3_tx_timeout,
 179        .ndo_set_config         = el3_config,
 180        .ndo_get_stats          = el3_get_stats,
 181        .ndo_set_multicast_list = set_multicast_list,
 182        .ndo_change_mtu         = eth_change_mtu,
 183        .ndo_set_mac_address    = eth_mac_addr,
 184        .ndo_validate_addr      = eth_validate_addr,
 185};
 186
 187static int tc589_probe(struct pcmcia_device *link)
 188{
 189    struct el3_private *lp;
 190    struct net_device *dev;
 191
 192    DEBUG(0, "3c589_attach()\n");
 193
 194    /* Create new ethernet device */
 195    dev = alloc_etherdev(sizeof(struct el3_private));
 196    if (!dev)
 197         return -ENOMEM;
 198    lp = netdev_priv(dev);
 199    link->priv = dev;
 200    lp->p_dev = link;
 201
 202    spin_lock_init(&lp->lock);
 203    link->io.NumPorts1 = 16;
 204    link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
 205    link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING|IRQ_HANDLE_PRESENT;
 206    link->irq.IRQInfo1 = IRQ_LEVEL_ID;
 207    link->irq.Handler = &el3_interrupt;
 208    link->irq.Instance = dev;
 209    link->conf.Attributes = CONF_ENABLE_IRQ;
 210    link->conf.IntType = INT_MEMORY_AND_IO;
 211    link->conf.ConfigIndex = 1;
 212
 213    dev->netdev_ops = &el3_netdev_ops;
 214    dev->watchdog_timeo = TX_TIMEOUT;
 215
 216    SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
 217
 218    return tc589_config(link);
 219} /* tc589_attach */
 220
 221/*======================================================================
 222
 223    This deletes a driver "instance".  The device is de-registered
 224    with Card Services.  If it has been released, all local data
 225    structures are freed.  Otherwise, the structures will be freed
 226    when the device is released.
 227
 228======================================================================*/
 229
 230static void tc589_detach(struct pcmcia_device *link)
 231{
 232    struct net_device *dev = link->priv;
 233
 234    DEBUG(0, "3c589_detach(0x%p)\n", link);
 235
 236    if (link->dev_node)
 237        unregister_netdev(dev);
 238
 239    tc589_release(link);
 240
 241    free_netdev(dev);
 242} /* tc589_detach */
 243
 244/*======================================================================
 245
 246    tc589_config() is scheduled to run after a CARD_INSERTION event
 247    is received, to configure the PCMCIA socket, and to make the
 248    ethernet device available to the system.
 249    
 250======================================================================*/
 251
 252#define CS_CHECK(fn, ret) \
 253do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
 254
 255static int tc589_config(struct pcmcia_device *link)
 256{
 257    struct net_device *dev = link->priv;
 258    struct el3_private *lp = netdev_priv(dev);
 259    tuple_t tuple;
 260    __le16 buf[32];
 261    __be16 *phys_addr;
 262    int last_fn, last_ret, i, j, multi = 0, fifo;
 263    unsigned int ioaddr;
 264    char *ram_split[] = {"5:3", "3:1", "1:1", "3:5"};
 265    
 266    DEBUG(0, "3c589_config(0x%p)\n", link);
 267
 268    phys_addr = (__be16 *)dev->dev_addr;
 269    tuple.Attributes = 0;
 270    tuple.TupleData = (cisdata_t *)buf;
 271    tuple.TupleDataMax = sizeof(buf);
 272    tuple.TupleOffset = 0;
 273    tuple.Attributes = TUPLE_RETURN_COMMON;
 274
 275    /* Is this a 3c562? */
 276    if (link->manf_id != MANFID_3COM)
 277            printk(KERN_INFO "3c589_cs: hmmm, is this really a "
 278                   "3Com card??\n");
 279    multi = (link->card_id == PRODID_3COM_3C562);
 280
 281    /* For the 3c562, the base address must be xx00-xx7f */
 282    link->io.IOAddrLines = 16;
 283    for (i = j = 0; j < 0x400; j += 0x10) {
 284        if (multi && (j & 0x80)) continue;
 285        link->io.BasePort1 = j ^ 0x300;
 286        i = pcmcia_request_io(link, &link->io);
 287        if (i == 0)
 288                break;
 289    }
 290    if (i != 0) {
 291        cs_error(link, RequestIO, i);
 292        goto failed;
 293    }
 294    CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));
 295    CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));
 296        
 297    dev->irq = link->irq.AssignedIRQ;
 298    dev->base_addr = link->io.BasePort1;
 299    ioaddr = dev->base_addr;
 300    EL3WINDOW(0);
 301
 302    /* The 3c589 has an extra EEPROM for configuration info, including
 303       the hardware address.  The 3c562 puts the address in the CIS. */
 304    tuple.DesiredTuple = 0x88;
 305    if (pcmcia_get_first_tuple(link, &tuple) == 0) {
 306        pcmcia_get_tuple_data(link, &tuple);
 307        for (i = 0; i < 3; i++)
 308            phys_addr[i] = htons(le16_to_cpu(buf[i]));
 309    } else {
 310        for (i = 0; i < 3; i++)
 311            phys_addr[i] = htons(read_eeprom(ioaddr, i));
 312        if (phys_addr[0] == htons(0x6060)) {
 313            printk(KERN_ERR "3c589_cs: IO port conflict at 0x%03lx"
 314                   "-0x%03lx\n", dev->base_addr, dev->base_addr+15);
 315            goto failed;
 316        }
 317    }
 318
 319    /* The address and resource configuration register aren't loaded from
 320       the EEPROM and *must* be set to 0 and IRQ3 for the PCMCIA version. */
 321    outw(0x3f00, ioaddr + 8);
 322    fifo = inl(ioaddr);
 323
 324    /* The if_port symbol can be set when the module is loaded */
 325    if ((if_port >= 0) && (if_port <= 3))
 326        dev->if_port = if_port;
 327    else
 328        printk(KERN_ERR "3c589_cs: invalid if_port requested\n");
 329    
 330    link->dev_node = &lp->node;
 331    SET_NETDEV_DEV(dev, &handle_to_dev(link));
 332
 333    if (register_netdev(dev) != 0) {
 334        printk(KERN_ERR "3c589_cs: register_netdev() failed\n");
 335        link->dev_node = NULL;
 336        goto failed;
 337    }
 338
 339    strcpy(lp->node.dev_name, dev->name);
 340
 341    printk(KERN_INFO "%s: 3Com 3c%s, io %#3lx, irq %d, "
 342           "hw_addr %pM\n",
 343           dev->name, (multi ? "562" : "589"), dev->base_addr, dev->irq,
 344           dev->dev_addr);
 345    printk(KERN_INFO "  %dK FIFO split %s Rx:Tx, %s xcvr\n",
 346           (fifo & 7) ? 32 : 8, ram_split[(fifo >> 16) & 3],
 347           if_names[dev->if_port]);
 348    return 0;
 349
 350cs_failed:
 351    cs_error(link, last_fn, last_ret);
 352failed:
 353    tc589_release(link);
 354    return -ENODEV;
 355} /* tc589_config */
 356
 357/*======================================================================
 358
 359    After a card is removed, tc589_release() will unregister the net
 360    device, and release the PCMCIA configuration.  If the device is
 361    still open, this will be postponed until it is closed.
 362    
 363======================================================================*/
 364
 365static void tc589_release(struct pcmcia_device *link)
 366{
 367        pcmcia_disable_device(link);
 368}
 369
 370static int tc589_suspend(struct pcmcia_device *link)
 371{
 372        struct net_device *dev = link->priv;
 373
 374        if (link->open)
 375                netif_device_detach(dev);
 376
 377        return 0;
 378}
 379
 380static int tc589_resume(struct pcmcia_device *link)
 381{
 382        struct net_device *dev = link->priv;
 383
 384        if (link->open) {
 385                tc589_reset(dev);
 386                netif_device_attach(dev);
 387        }
 388
 389        return 0;
 390}
 391
 392/*====================================================================*/
 393
 394/*
 395  Use this for commands that may take time to finish
 396*/
 397static void tc589_wait_for_completion(struct net_device *dev, int cmd)
 398{
 399    int i = 100;
 400    outw(cmd, dev->base_addr + EL3_CMD);
 401    while (--i > 0)
 402        if (!(inw(dev->base_addr + EL3_STATUS) & 0x1000)) break;
 403    if (i == 0)
 404        printk(KERN_WARNING "%s: command 0x%04x did not complete!\n",
 405               dev->name, cmd);
 406}
 407
 408/*
 409  Read a word from the EEPROM using the regular EEPROM access register.
 410  Assume that we are in register window zero.
 411*/
 412static u16 read_eeprom(unsigned int ioaddr, int index)
 413{
 414    int i;
 415    outw(EEPROM_READ + index, ioaddr + 10);
 416    /* Reading the eeprom takes 162 us */
 417    for (i = 1620; i >= 0; i--)
 418        if ((inw(ioaddr + 10) & EEPROM_BUSY) == 0)
 419            break;
 420    return inw(ioaddr + 12);
 421}
 422
 423/*
 424  Set transceiver type, perhaps to something other than what the user
 425  specified in dev->if_port.
 426*/
 427static void tc589_set_xcvr(struct net_device *dev, int if_port)
 428{
 429    struct el3_private *lp = netdev_priv(dev);
 430    unsigned int ioaddr = dev->base_addr;
 431    
 432    EL3WINDOW(0);
 433    switch (if_port) {
 434    case 0: case 1: outw(0, ioaddr + 6); break;
 435    case 2: outw(3<<14, ioaddr + 6); break;
 436    case 3: outw(1<<14, ioaddr + 6); break;
 437    }
 438    /* On PCMCIA, this just turns on the LED */
 439    outw((if_port == 2) ? StartCoax : StopCoax, ioaddr + EL3_CMD);
 440    /* 10baseT interface, enable link beat and jabber check. */
 441    EL3WINDOW(4);
 442    outw(MEDIA_LED | ((if_port < 2) ? MEDIA_TP : 0), ioaddr + WN4_MEDIA);
 443    EL3WINDOW(1);
 444    if (if_port == 2)
 445        lp->media_status = ((dev->if_port == 0) ? 0x8000 : 0x4000);
 446    else
 447        lp->media_status = ((dev->if_port == 0) ? 0x4010 : 0x8800);
 448}
 449
 450static void dump_status(struct net_device *dev)
 451{
 452    unsigned int ioaddr = dev->base_addr;
 453    EL3WINDOW(1);
 454    printk(KERN_INFO "  irq status %04x, rx status %04x, tx status "
 455           "%02x  tx free %04x\n", inw(ioaddr+EL3_STATUS),
 456           inw(ioaddr+RX_STATUS), inb(ioaddr+TX_STATUS),
 457           inw(ioaddr+TX_FREE));
 458    EL3WINDOW(4);
 459    printk(KERN_INFO "  diagnostics: fifo %04x net %04x ethernet %04x"
 460           " media %04x\n", inw(ioaddr+0x04), inw(ioaddr+0x06),
 461           inw(ioaddr+0x08), inw(ioaddr+0x0a));
 462    EL3WINDOW(1);
 463}
 464
 465/* Reset and restore all of the 3c589 registers. */
 466static void tc589_reset(struct net_device *dev)
 467{
 468    unsigned int ioaddr = dev->base_addr;
 469    int i;
 470    
 471    EL3WINDOW(0);
 472    outw(0x0001, ioaddr + 4);                   /* Activate board. */ 
 473    outw(0x3f00, ioaddr + 8);                   /* Set the IRQ line. */
 474    
 475    /* Set the station address in window 2. */
 476    EL3WINDOW(2);
 477    for (i = 0; i < 6; i++)
 478        outb(dev->dev_addr[i], ioaddr + i);
 479
 480    tc589_set_xcvr(dev, dev->if_port);
 481    
 482    /* Switch to the stats window, and clear all stats by reading. */
 483    outw(StatsDisable, ioaddr + EL3_CMD);
 484    EL3WINDOW(6);
 485    for (i = 0; i < 9; i++)
 486        inb(ioaddr+i);
 487    inw(ioaddr + 10);
 488    inw(ioaddr + 12);
 489    
 490    /* Switch to register set 1 for normal use. */
 491    EL3WINDOW(1);
 492
 493    set_rx_mode(dev);
 494    outw(StatsEnable, ioaddr + EL3_CMD); /* Turn on statistics. */
 495    outw(RxEnable, ioaddr + EL3_CMD); /* Enable the receiver. */
 496    outw(TxEnable, ioaddr + EL3_CMD); /* Enable transmitter. */
 497    /* Allow status bits to be seen. */
 498    outw(SetStatusEnb | 0xff, ioaddr + EL3_CMD);
 499    /* Ack all pending events, and set active indicator mask. */
 500    outw(AckIntr | IntLatch | TxAvailable | RxEarly | IntReq,
 501         ioaddr + EL3_CMD);
 502    outw(SetIntrEnb | IntLatch | TxAvailable | RxComplete | StatsFull
 503         | AdapterFailure, ioaddr + EL3_CMD);
 504}
 505
 506static void netdev_get_drvinfo(struct net_device *dev,
 507                               struct ethtool_drvinfo *info)
 508{
 509        strcpy(info->driver, DRV_NAME);
 510        strcpy(info->version, DRV_VERSION);
 511        sprintf(info->bus_info, "PCMCIA 0x%lx", dev->base_addr);
 512}
 513
 514#ifdef PCMCIA_DEBUG
 515static u32 netdev_get_msglevel(struct net_device *dev)
 516{
 517        return pc_debug;
 518}
 519
 520static void netdev_set_msglevel(struct net_device *dev, u32 level)
 521{
 522        pc_debug = level;
 523}
 524#endif /* PCMCIA_DEBUG */
 525
 526static const struct ethtool_ops netdev_ethtool_ops = {
 527        .get_drvinfo            = netdev_get_drvinfo,
 528#ifdef PCMCIA_DEBUG
 529        .get_msglevel           = netdev_get_msglevel,
 530        .set_msglevel           = netdev_set_msglevel,
 531#endif /* PCMCIA_DEBUG */
 532};
 533
 534static int el3_config(struct net_device *dev, struct ifmap *map)
 535{
 536    if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) {
 537        if (map->port <= 3) {
 538            dev->if_port = map->port;
 539            printk(KERN_INFO "%s: switched to %s port\n",
 540                   dev->name, if_names[dev->if_port]);
 541            tc589_set_xcvr(dev, dev->if_port);
 542        } else
 543            return -EINVAL;
 544    }
 545    return 0;
 546}
 547
 548static int el3_open(struct net_device *dev)
 549{
 550    struct el3_private *lp = netdev_priv(dev);
 551    struct pcmcia_device *link = lp->p_dev;
 552    
 553    if (!pcmcia_dev_present(link))
 554        return -ENODEV;
 555
 556    link->open++;
 557    netif_start_queue(dev);
 558    
 559    tc589_reset(dev);
 560    init_timer(&lp->media);
 561    lp->media.function = &media_check;
 562    lp->media.data = (unsigned long) dev;
 563    lp->media.expires = jiffies + HZ;
 564    add_timer(&lp->media);
 565
 566    DEBUG(1, "%s: opened, status %4.4x.\n",
 567          dev->name, inw(dev->base_addr + EL3_STATUS));
 568    
 569    return 0;
 570}
 571
 572static void el3_tx_timeout(struct net_device *dev)
 573{
 574    unsigned int ioaddr = dev->base_addr;
 575    
 576    printk(KERN_WARNING "%s: Transmit timed out!\n", dev->name);
 577    dump_status(dev);
 578    dev->stats.tx_errors++;
 579    dev->trans_start = jiffies;
 580    /* Issue TX_RESET and TX_START commands. */
 581    tc589_wait_for_completion(dev, TxReset);
 582    outw(TxEnable, ioaddr + EL3_CMD);
 583    netif_wake_queue(dev);
 584}
 585
 586static void pop_tx_status(struct net_device *dev)
 587{
 588    unsigned int ioaddr = dev->base_addr;
 589    int i;
 590    
 591    /* Clear the Tx status stack. */
 592    for (i = 32; i > 0; i--) {
 593        u_char tx_status = inb(ioaddr + TX_STATUS);
 594        if (!(tx_status & 0x84)) break;
 595        /* reset transmitter on jabber error or underrun */
 596        if (tx_status & 0x30)
 597            tc589_wait_for_completion(dev, TxReset);
 598        if (tx_status & 0x38) {
 599            DEBUG(1, "%s: transmit error: status 0x%02x\n",
 600                  dev->name, tx_status);
 601            outw(TxEnable, ioaddr + EL3_CMD);
 602            dev->stats.tx_aborted_errors++;
 603        }
 604        outb(0x00, ioaddr + TX_STATUS); /* Pop the status stack. */
 605    }
 606}
 607
 608static netdev_tx_t el3_start_xmit(struct sk_buff *skb,
 609                                        struct net_device *dev)
 610{
 611    unsigned int ioaddr = dev->base_addr;
 612    struct el3_private *priv = netdev_priv(dev);
 613    unsigned long flags;
 614
 615    DEBUG(3, "%s: el3_start_xmit(length = %ld) called, "
 616          "status %4.4x.\n", dev->name, (long)skb->len,
 617          inw(ioaddr + EL3_STATUS));
 618
 619    spin_lock_irqsave(&priv->lock, flags);    
 620
 621    dev->stats.tx_bytes += skb->len;
 622
 623    /* Put out the doubleword header... */
 624    outw(skb->len, ioaddr + TX_FIFO);
 625    outw(0x00, ioaddr + TX_FIFO);
 626    /* ... and the packet rounded to a doubleword. */
 627    outsl(ioaddr + TX_FIFO, skb->data, (skb->len + 3) >> 2);
 628
 629    dev->trans_start = jiffies;
 630    if (inw(ioaddr + TX_FREE) <= 1536) {
 631        netif_stop_queue(dev);
 632        /* Interrupt us when the FIFO has room for max-sized packet. */
 633        outw(SetTxThreshold + 1536, ioaddr + EL3_CMD);
 634    }
 635
 636    pop_tx_status(dev);
 637    spin_unlock_irqrestore(&priv->lock, flags);    
 638    dev_kfree_skb(skb);
 639    
 640    return NETDEV_TX_OK;
 641}
 642
 643/* The EL3 interrupt handler. */
 644static irqreturn_t el3_interrupt(int irq, void *dev_id)
 645{
 646    struct net_device *dev = (struct net_device *) dev_id;
 647    struct el3_private *lp = netdev_priv(dev);
 648    unsigned int ioaddr;
 649    __u16 status;
 650    int i = 0, handled = 1;
 651    
 652    if (!netif_device_present(dev))
 653        return IRQ_NONE;
 654
 655    ioaddr = dev->base_addr;
 656
 657    DEBUG(3, "%s: interrupt, status %4.4x.\n",
 658          dev->name, inw(ioaddr + EL3_STATUS));
 659
 660    spin_lock(&lp->lock);    
 661    while ((status = inw(ioaddr + EL3_STATUS)) &
 662        (IntLatch | RxComplete | StatsFull)) {
 663        if ((status & 0xe000) != 0x2000) {
 664            DEBUG(1, "%s: interrupt from dead card\n", dev->name);
 665            handled = 0;
 666            break;
 667        }
 668        
 669        if (status & RxComplete)
 670            el3_rx(dev);
 671        
 672        if (status & TxAvailable) {
 673            DEBUG(3, "    TX room bit was handled.\n");
 674            /* There's room in the FIFO for a full-sized packet. */
 675            outw(AckIntr | TxAvailable, ioaddr + EL3_CMD);
 676            netif_wake_queue(dev);
 677        }
 678        
 679        if (status & TxComplete)
 680            pop_tx_status(dev);
 681
 682        if (status & (AdapterFailure | RxEarly | StatsFull)) {
 683            /* Handle all uncommon interrupts. */
 684            if (status & StatsFull)             /* Empty statistics. */
 685                update_stats(dev);
 686            if (status & RxEarly) {             /* Rx early is unused. */
 687                el3_rx(dev);
 688                outw(AckIntr | RxEarly, ioaddr + EL3_CMD);
 689            }
 690            if (status & AdapterFailure) {
 691                u16 fifo_diag;
 692                EL3WINDOW(4);
 693                fifo_diag = inw(ioaddr + 4);
 694                EL3WINDOW(1);
 695                printk(KERN_WARNING "%s: adapter failure, FIFO diagnostic"
 696                       " register %04x.\n", dev->name, fifo_diag);
 697                if (fifo_diag & 0x0400) {
 698                    /* Tx overrun */
 699                    tc589_wait_for_completion(dev, TxReset);
 700                    outw(TxEnable, ioaddr + EL3_CMD);
 701                }
 702                if (fifo_diag & 0x2000) {
 703                    /* Rx underrun */
 704                    tc589_wait_for_completion(dev, RxReset);
 705                    set_rx_mode(dev);
 706                    outw(RxEnable, ioaddr + EL3_CMD);
 707                }
 708                outw(AckIntr | AdapterFailure, ioaddr + EL3_CMD);
 709            }
 710        }
 711        
 712        if (++i > 10) {
 713            printk(KERN_ERR "%s: infinite loop in interrupt, "
 714                   "status %4.4x.\n", dev->name, status);
 715            /* Clear all interrupts */
 716            outw(AckIntr | 0xFF, ioaddr + EL3_CMD);
 717            break;
 718        }
 719        /* Acknowledge the IRQ. */
 720        outw(AckIntr | IntReq | IntLatch, ioaddr + EL3_CMD);
 721    }
 722
 723    lp->last_irq = jiffies;
 724    spin_unlock(&lp->lock);    
 725    DEBUG(3, "%s: exiting interrupt, status %4.4x.\n",
 726          dev->name, inw(ioaddr + EL3_STATUS));
 727    return IRQ_RETVAL(handled);
 728}
 729
 730static void media_check(unsigned long arg)
 731{
 732    struct net_device *dev = (struct net_device *)(arg);
 733    struct el3_private *lp = netdev_priv(dev);
 734    unsigned int ioaddr = dev->base_addr;
 735    u16 media, errs;
 736    unsigned long flags;
 737
 738    if (!netif_device_present(dev)) goto reschedule;
 739
 740    /* Check for pending interrupt with expired latency timer: with
 741       this, we can limp along even if the interrupt is blocked */
 742    if ((inw(ioaddr + EL3_STATUS) & IntLatch) &&
 743        (inb(ioaddr + EL3_TIMER) == 0xff)) {
 744        if (!lp->fast_poll)
 745            printk(KERN_WARNING "%s: interrupt(s) dropped!\n", dev->name);
 746        el3_interrupt(dev->irq, dev);
 747        lp->fast_poll = HZ;
 748    }
 749    if (lp->fast_poll) {
 750        lp->fast_poll--;
 751        lp->media.expires = jiffies + HZ/100;
 752        add_timer(&lp->media);
 753        return;
 754    }
 755
 756    /* lp->lock guards the EL3 window. Window should always be 1 except
 757       when the lock is held */
 758    spin_lock_irqsave(&lp->lock, flags);    
 759    EL3WINDOW(4);
 760    media = inw(ioaddr+WN4_MEDIA) & 0xc810;
 761
 762    /* Ignore collisions unless we've had no irq's recently */
 763    if (time_before(jiffies, lp->last_irq + HZ)) {
 764        media &= ~0x0010;
 765    } else {
 766        /* Try harder to detect carrier errors */
 767        EL3WINDOW(6);
 768        outw(StatsDisable, ioaddr + EL3_CMD);
 769        errs = inb(ioaddr + 0);
 770        outw(StatsEnable, ioaddr + EL3_CMD);
 771        dev->stats.tx_carrier_errors += errs;
 772        if (errs || (lp->media_status & 0x0010)) media |= 0x0010;
 773    }
 774
 775    if (media != lp->media_status) {
 776        if ((media & lp->media_status & 0x8000) &&
 777            ((lp->media_status ^ media) & 0x0800))
 778            printk(KERN_INFO "%s: %s link beat\n", dev->name,
 779                   (lp->media_status & 0x0800 ? "lost" : "found"));
 780        else if ((media & lp->media_status & 0x4000) &&
 781                 ((lp->media_status ^ media) & 0x0010))
 782            printk(KERN_INFO "%s: coax cable %s\n", dev->name,
 783                   (lp->media_status & 0x0010 ? "ok" : "problem"));
 784        if (dev->if_port == 0) {
 785            if (media & 0x8000) {
 786                if (media & 0x0800)
 787                    printk(KERN_INFO "%s: flipped to 10baseT\n",
 788                           dev->name);
 789                else
 790                    tc589_set_xcvr(dev, 2);
 791            } else if (media & 0x4000) {
 792                if (media & 0x0010)
 793                    tc589_set_xcvr(dev, 1);
 794                else
 795                    printk(KERN_INFO "%s: flipped to 10base2\n",
 796                           dev->name);
 797            }
 798        }
 799        lp->media_status = media;
 800    }
 801    
 802    EL3WINDOW(1);
 803    spin_unlock_irqrestore(&lp->lock, flags);    
 804
 805reschedule:
 806    lp->media.expires = jiffies + HZ;
 807    add_timer(&lp->media);
 808}
 809
 810static struct net_device_stats *el3_get_stats(struct net_device *dev)
 811{
 812    struct el3_private *lp = netdev_priv(dev);
 813    unsigned long flags;
 814    struct pcmcia_device *link = lp->p_dev;
 815
 816    if (pcmcia_dev_present(link)) {
 817        spin_lock_irqsave(&lp->lock, flags);
 818        update_stats(dev);
 819        spin_unlock_irqrestore(&lp->lock, flags);
 820    }
 821    return &dev->stats;
 822}
 823
 824/*
 825  Update statistics.  We change to register window 6, so this should be run
 826  single-threaded if the device is active. This is expected to be a rare
 827  operation, and it's simpler for the rest of the driver to assume that
 828  window 1 is always valid rather than use a special window-state variable.
 829  
 830  Caller must hold the lock for this
 831*/
 832static void update_stats(struct net_device *dev)
 833{
 834    unsigned int ioaddr = dev->base_addr;
 835
 836    DEBUG(2, "%s: updating the statistics.\n", dev->name);
 837    /* Turn off statistics updates while reading. */
 838    outw(StatsDisable, ioaddr + EL3_CMD);
 839    /* Switch to the stats window, and read everything. */
 840    EL3WINDOW(6);
 841    dev->stats.tx_carrier_errors        += inb(ioaddr + 0);
 842    dev->stats.tx_heartbeat_errors      += inb(ioaddr + 1);
 843    /* Multiple collisions. */          inb(ioaddr + 2);
 844    dev->stats.collisions               += inb(ioaddr + 3);
 845    dev->stats.tx_window_errors         += inb(ioaddr + 4);
 846    dev->stats.rx_fifo_errors           += inb(ioaddr + 5);
 847    dev->stats.tx_packets               += inb(ioaddr + 6);
 848    /* Rx packets   */                  inb(ioaddr + 7);
 849    /* Tx deferrals */                  inb(ioaddr + 8);
 850    /* Rx octets */                     inw(ioaddr + 10);
 851    /* Tx octets */                     inw(ioaddr + 12);
 852    
 853    /* Back to window 1, and turn statistics back on. */
 854    EL3WINDOW(1);
 855    outw(StatsEnable, ioaddr + EL3_CMD);
 856}
 857
 858static int el3_rx(struct net_device *dev)
 859{
 860    unsigned int ioaddr = dev->base_addr;
 861    int worklimit = 32;
 862    short rx_status;
 863    
 864    DEBUG(3, "%s: in rx_packet(), status %4.4x, rx_status %4.4x.\n",
 865          dev->name, inw(ioaddr+EL3_STATUS), inw(ioaddr+RX_STATUS));
 866    while (!((rx_status = inw(ioaddr + RX_STATUS)) & 0x8000) &&
 867                    worklimit > 0) {
 868        worklimit--;
 869        if (rx_status & 0x4000) { /* Error, update stats. */
 870            short error = rx_status & 0x3800;
 871            dev->stats.rx_errors++;
 872            switch (error) {
 873            case 0x0000:        dev->stats.rx_over_errors++; break;
 874            case 0x0800:        dev->stats.rx_length_errors++; break;
 875            case 0x1000:        dev->stats.rx_frame_errors++; break;
 876            case 0x1800:        dev->stats.rx_length_errors++; break;
 877            case 0x2000:        dev->stats.rx_frame_errors++; break;
 878            case 0x2800:        dev->stats.rx_crc_errors++; break;
 879            }
 880        } else {
 881            short pkt_len = rx_status & 0x7ff;
 882            struct sk_buff *skb;
 883            
 884            skb = dev_alloc_skb(pkt_len+5);
 885            
 886            DEBUG(3, "    Receiving packet size %d status %4.4x.\n",
 887                  pkt_len, rx_status);
 888            if (skb != NULL) {
 889                skb_reserve(skb, 2);
 890                insl(ioaddr+RX_FIFO, skb_put(skb, pkt_len),
 891                        (pkt_len+3)>>2);
 892                skb->protocol = eth_type_trans(skb, dev);
 893                netif_rx(skb);
 894                dev->stats.rx_packets++;
 895                dev->stats.rx_bytes += pkt_len;
 896            } else {
 897                DEBUG(1, "%s: couldn't allocate a sk_buff of"
 898                      " size %d.\n", dev->name, pkt_len);
 899                dev->stats.rx_dropped++;
 900            }
 901        }
 902        /* Pop the top of the Rx FIFO */
 903        tc589_wait_for_completion(dev, RxDiscard);
 904    }
 905    if (worklimit == 0)
 906        printk(KERN_WARNING "%s: too much work in el3_rx!\n", dev->name);
 907    return 0;
 908}
 909
 910static void set_rx_mode(struct net_device *dev)
 911{
 912    unsigned int ioaddr = dev->base_addr;
 913    u16 opts = SetRxFilter | RxStation | RxBroadcast;
 914
 915    if (dev->flags & IFF_PROMISC)
 916        opts |= RxMulticast | RxProm;
 917    else if (dev->mc_count || (dev->flags & IFF_ALLMULTI))
 918        opts |= RxMulticast;
 919    outw(opts, ioaddr + EL3_CMD);
 920}
 921
 922static void set_multicast_list(struct net_device *dev)
 923{
 924        struct el3_private *priv = netdev_priv(dev);
 925        unsigned long flags;
 926
 927        spin_lock_irqsave(&priv->lock, flags);
 928        set_rx_mode(dev);
 929        spin_unlock_irqrestore(&priv->lock, flags);
 930}
 931
 932static int el3_close(struct net_device *dev)
 933{
 934    struct el3_private *lp = netdev_priv(dev);
 935    struct pcmcia_device *link = lp->p_dev;
 936    unsigned int ioaddr = dev->base_addr;
 937    
 938    DEBUG(1, "%s: shutting down ethercard.\n", dev->name);
 939
 940    if (pcmcia_dev_present(link)) {
 941        /* Turn off statistics ASAP.  We update dev->stats below. */
 942        outw(StatsDisable, ioaddr + EL3_CMD);
 943        
 944        /* Disable the receiver and transmitter. */
 945        outw(RxDisable, ioaddr + EL3_CMD);
 946        outw(TxDisable, ioaddr + EL3_CMD);
 947        
 948        if (dev->if_port == 2)
 949            /* Turn off thinnet power.  Green! */
 950            outw(StopCoax, ioaddr + EL3_CMD);
 951        else if (dev->if_port == 1) {
 952            /* Disable link beat and jabber */
 953            EL3WINDOW(4);
 954            outw(0, ioaddr + WN4_MEDIA);
 955        }
 956        
 957        /* Switching back to window 0 disables the IRQ. */
 958        EL3WINDOW(0);
 959        /* But we explicitly zero the IRQ line select anyway. */
 960        outw(0x0f00, ioaddr + WN0_IRQ);
 961        
 962        /* Check if the card still exists */
 963        if ((inw(ioaddr+EL3_STATUS) & 0xe000) == 0x2000)
 964            update_stats(dev);
 965    }
 966
 967    link->open--;
 968    netif_stop_queue(dev);
 969    del_timer_sync(&lp->media);
 970    
 971    return 0;
 972}
 973
 974static struct pcmcia_device_id tc589_ids[] = {
 975        PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x0101, 0x0562),
 976        PCMCIA_MFC_DEVICE_PROD_ID1(0, "Motorola MARQUIS", 0xf03e4e77),
 977        PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0589),
 978        PCMCIA_DEVICE_PROD_ID12("Farallon", "ENet", 0x58d93fc4, 0x992c2202),
 979        PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0101, 0x0035, "cis/3CXEM556.cis"),
 980        PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0101, 0x003d, "cis/3CXEM556.cis"),
 981        PCMCIA_DEVICE_NULL,
 982};
 983MODULE_DEVICE_TABLE(pcmcia, tc589_ids);
 984
 985static struct pcmcia_driver tc589_driver = {
 986        .owner          = THIS_MODULE,
 987        .drv            = {
 988                .name   = "3c589_cs",
 989        },
 990        .probe          = tc589_probe,
 991        .remove         = tc589_detach,
 992        .id_table       = tc589_ids,
 993        .suspend        = tc589_suspend,
 994        .resume         = tc589_resume,
 995};
 996
 997static int __init init_tc589(void)
 998{
 999        return pcmcia_register_driver(&tc589_driver);
1000}
1001
1002static void __exit exit_tc589(void)
1003{
1004        pcmcia_unregister_driver(&tc589_driver);
1005}
1006
1007module_init(init_tc589);
1008module_exit(exit_tc589);
1009