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