linux/drivers/net/ethernet/3com/3c509.c
<<
>>
Prefs
   1/* 3c509.c: A 3c509 EtherLink3 ethernet driver for linux. */
   2/*
   3        Written 1993-2000 by Donald Becker.
   4
   5        Copyright 1994-2000 by Donald Becker.
   6        Copyright 1993 United States Government as represented by the
   7        Director, National Security Agency.      This software may be used and
   8        distributed according to the terms of the GNU General Public License,
   9        incorporated herein by reference.
  10
  11        This driver is for the 3Com EtherLinkIII series.
  12
  13        The author may be reached as becker@scyld.com, or C/O
  14        Scyld Computing Corporation
  15        410 Severn Ave., Suite 210
  16        Annapolis MD 21403
  17
  18        Known limitations:
  19        Because of the way 3c509 ISA detection works it's difficult to predict
  20        a priori which of several ISA-mode cards will be detected first.
  21
  22        This driver does not use predictive interrupt mode, resulting in higher
  23        packet latency but lower overhead.  If interrupts are disabled for an
  24        unusually long time it could also result in missed packets, but in
  25        practice this rarely happens.
  26
  27
  28        FIXES:
  29                Alan Cox:       Removed the 'Unexpected interrupt' bug.
  30                Michael Meskes: Upgraded to Donald Becker's version 1.07.
  31                Alan Cox:       Increased the eeprom delay. Regardless of
  32                                what the docs say some people definitely
  33                                get problems with lower (but in card spec)
  34                                delays
  35                v1.10 4/21/97 Fixed module code so that multiple cards may be detected,
  36                                other cleanups.  -djb
  37                Andrea Arcangeli:       Upgraded to Donald Becker's version 1.12.
  38                Rick Payne:     Fixed SMP race condition
  39                v1.13 9/8/97 Made 'max_interrupt_work' an insmod-settable variable -djb
  40                v1.14 10/15/97 Avoided waiting..discard message for fast machines -djb
  41                v1.15 1/31/98 Faster recovery for Tx errors. -djb
  42                v1.16 2/3/98 Different ID port handling to avoid sound cards. -djb
  43                v1.18 12Mar2001 Andrew Morton
  44                        - Avoid bogus detect of 3c590's (Andrzej Krzysztofowicz)
  45                        - Reviewed against 1.18 from scyld.com
  46                v1.18a 17Nov2001 Jeff Garzik <jgarzik@pobox.com>
  47                        - ethtool support
  48                v1.18b 1Mar2002 Zwane Mwaikambo <zwane@commfireservices.com>
  49                        - Power Management support
  50                v1.18c 1Mar2002 David Ruggiero <jdr@farfalle.com>
  51                        - Full duplex support
  52                v1.19  16Oct2002 Zwane Mwaikambo <zwane@linuxpower.ca>
  53                        - Additional ethtool features
  54                v1.19a 28Oct2002 Davud Ruggiero <jdr@farfalle.com>
  55                        - Increase *read_eeprom udelay to workaround oops with 2 cards.
  56                v1.19b 08Nov2002 Marc Zyngier <maz@wild-wind.fr.eu.org>
  57                        - Introduce driver model for EISA cards.
  58                v1.20  04Feb2008 Ondrej Zary <linux@rainbow-software.org>
  59                        - convert to isa_driver and pnp_driver and some cleanups
  60*/
  61
  62#define DRV_NAME        "3c509"
  63#define DRV_VERSION     "1.20"
  64#define DRV_RELDATE     "04Feb2008"
  65
  66/* A few values that may be tweaked. */
  67
  68/* Time in jiffies before concluding the transmitter is hung. */
  69#define TX_TIMEOUT  (400*HZ/1000)
  70
  71#include <linux/module.h>
  72#include <linux/isa.h>
  73#include <linux/pnp.h>
  74#include <linux/string.h>
  75#include <linux/interrupt.h>
  76#include <linux/errno.h>
  77#include <linux/in.h>
  78#include <linux/ioport.h>
  79#include <linux/init.h>
  80#include <linux/netdevice.h>
  81#include <linux/etherdevice.h>
  82#include <linux/pm.h>
  83#include <linux/skbuff.h>
  84#include <linux/delay.h>        /* for udelay() */
  85#include <linux/spinlock.h>
  86#include <linux/ethtool.h>
  87#include <linux/device.h>
  88#include <linux/eisa.h>
  89#include <linux/bitops.h>
  90
  91#include <asm/uaccess.h>
  92#include <asm/io.h>
  93#include <asm/irq.h>
  94
  95static char version[] __devinitdata = DRV_NAME ".c:" DRV_VERSION " " DRV_RELDATE " becker@scyld.com\n";
  96
  97#ifdef EL3_DEBUG
  98static int el3_debug = EL3_DEBUG;
  99#else
 100static int el3_debug = 2;
 101#endif
 102
 103/* Used to do a global count of all the cards in the system.  Must be
 104 * a global variable so that the eisa probe routines can increment
 105 * it */
 106static int el3_cards = 0;
 107#define EL3_MAX_CARDS 8
 108
 109/* To minimize the size of the driver source I only define operating
 110   constants if they are used several times.  You'll need the manual
 111   anyway if you want to understand driver details. */
 112/* Offsets from base I/O address. */
 113#define EL3_DATA 0x00
 114#define EL3_CMD 0x0e
 115#define EL3_STATUS 0x0e
 116#define EEPROM_READ 0x80
 117
 118#define EL3_IO_EXTENT   16
 119
 120#define EL3WINDOW(win_num) outw(SelectWindow + (win_num), ioaddr + EL3_CMD)
 121
 122
 123/* The top five bits written to EL3_CMD are a command, the lower
 124   11 bits are the parameter, if applicable. */
 125enum c509cmd {
 126        TotalReset = 0<<11, SelectWindow = 1<<11, StartCoax = 2<<11,
 127        RxDisable = 3<<11, RxEnable = 4<<11, RxReset = 5<<11, RxDiscard = 8<<11,
 128        TxEnable = 9<<11, TxDisable = 10<<11, TxReset = 11<<11,
 129        FakeIntr = 12<<11, AckIntr = 13<<11, SetIntrEnb = 14<<11,
 130        SetStatusEnb = 15<<11, SetRxFilter = 16<<11, SetRxThreshold = 17<<11,
 131        SetTxThreshold = 18<<11, SetTxStart = 19<<11, StatsEnable = 21<<11,
 132        StatsDisable = 22<<11, StopCoax = 23<<11, PowerUp = 27<<11,
 133        PowerDown = 28<<11, PowerAuto = 29<<11};
 134
 135enum c509status {
 136        IntLatch = 0x0001, AdapterFailure = 0x0002, TxComplete = 0x0004,
 137        TxAvailable = 0x0008, RxComplete = 0x0010, RxEarly = 0x0020,
 138        IntReq = 0x0040, StatsFull = 0x0080, CmdBusy = 0x1000, };
 139
 140/* The SetRxFilter command accepts the following classes: */
 141enum RxFilter {
 142        RxStation = 1, RxMulticast = 2, RxBroadcast = 4, RxProm = 8 };
 143
 144/* Register window 1 offsets, the window used in normal operation. */
 145#define TX_FIFO         0x00
 146#define RX_FIFO         0x00
 147#define RX_STATUS       0x08
 148#define TX_STATUS       0x0B
 149#define TX_FREE         0x0C            /* Remaining free bytes in Tx buffer. */
 150
 151#define WN0_CONF_CTRL   0x04            /* Window 0: Configuration control register */
 152#define WN0_ADDR_CONF   0x06            /* Window 0: Address configuration register */
 153#define WN0_IRQ         0x08            /* Window 0: Set IRQ line in bits 12-15. */
 154#define WN4_MEDIA       0x0A            /* Window 4: Various transcvr/media bits. */
 155#define MEDIA_TP        0x00C0          /* Enable link beat and jabber for 10baseT. */
 156#define WN4_NETDIAG     0x06            /* Window 4: Net diagnostic */
 157#define FD_ENABLE       0x8000          /* Enable full-duplex ("external loopback") */
 158
 159/*
 160 * Must be a power of two (we use a binary and in the
 161 * circular queue)
 162 */
 163#define SKB_QUEUE_SIZE  64
 164
 165enum el3_cardtype { EL3_ISA, EL3_PNP, EL3_EISA };
 166
 167struct el3_private {
 168        spinlock_t lock;
 169        /* skb send-queue */
 170        int head, size;
 171        struct sk_buff *queue[SKB_QUEUE_SIZE];
 172        enum el3_cardtype type;
 173};
 174static int id_port;
 175static int current_tag;
 176static struct net_device *el3_devs[EL3_MAX_CARDS];
 177
 178/* Parameters that may be passed into the module. */
 179static int debug = -1;
 180static int irq[] = {-1, -1, -1, -1, -1, -1, -1, -1};
 181/* Maximum events (Rx packets, etc.) to handle at each interrupt. */
 182static int max_interrupt_work = 10;
 183#ifdef CONFIG_PNP
 184static int nopnp;
 185#endif
 186
 187static int __devinit el3_common_init(struct net_device *dev);
 188static void el3_common_remove(struct net_device *dev);
 189static ushort id_read_eeprom(int index);
 190static ushort read_eeprom(int ioaddr, int index);
 191static int el3_open(struct net_device *dev);
 192static netdev_tx_t el3_start_xmit(struct sk_buff *skb, struct net_device *dev);
 193static irqreturn_t el3_interrupt(int irq, void *dev_id);
 194static void update_stats(struct net_device *dev);
 195static struct net_device_stats *el3_get_stats(struct net_device *dev);
 196static int el3_rx(struct net_device *dev);
 197static int el3_close(struct net_device *dev);
 198static void set_multicast_list(struct net_device *dev);
 199static void el3_tx_timeout (struct net_device *dev);
 200static void el3_down(struct net_device *dev);
 201static void el3_up(struct net_device *dev);
 202static const struct ethtool_ops ethtool_ops;
 203#ifdef CONFIG_PM
 204static int el3_suspend(struct device *, pm_message_t);
 205static int el3_resume(struct device *);
 206#else
 207#define el3_suspend NULL
 208#define el3_resume NULL
 209#endif
 210
 211
 212/* generic device remove for all device types */
 213static int el3_device_remove (struct device *device);
 214#ifdef CONFIG_NET_POLL_CONTROLLER
 215static void el3_poll_controller(struct net_device *dev);
 216#endif
 217
 218/* Return 0 on success, 1 on error, 2 when found already detected PnP card */
 219static int el3_isa_id_sequence(__be16 *phys_addr)
 220{
 221        short lrs_state = 0xff;
 222        int i;
 223
 224        /* ISA boards are detected by sending the ID sequence to the
 225           ID_PORT.  We find cards past the first by setting the 'current_tag'
 226           on cards as they are found.  Cards with their tag set will not
 227           respond to subsequent ID sequences. */
 228
 229        outb(0x00, id_port);
 230        outb(0x00, id_port);
 231        for (i = 0; i < 255; i++) {
 232                outb(lrs_state, id_port);
 233                lrs_state <<= 1;
 234                lrs_state = lrs_state & 0x100 ? lrs_state ^ 0xcf : lrs_state;
 235        }
 236        /* For the first probe, clear all board's tag registers. */
 237        if (current_tag == 0)
 238                outb(0xd0, id_port);
 239        else                    /* Otherwise kill off already-found boards. */
 240                outb(0xd8, id_port);
 241        if (id_read_eeprom(7) != 0x6d50)
 242                return 1;
 243        /* Read in EEPROM data, which does contention-select.
 244           Only the lowest address board will stay "on-line".
 245           3Com got the byte order backwards. */
 246        for (i = 0; i < 3; i++)
 247                phys_addr[i] = htons(id_read_eeprom(i));
 248#ifdef CONFIG_PNP
 249        if (!nopnp) {
 250                /* The ISA PnP 3c509 cards respond to the ID sequence too.
 251                   This check is needed in order not to register them twice. */
 252                for (i = 0; i < el3_cards; i++) {
 253                        struct el3_private *lp = netdev_priv(el3_devs[i]);
 254                        if (lp->type == EL3_PNP &&
 255                            !memcmp(phys_addr, el3_devs[i]->dev_addr,
 256                                    ETH_ALEN)) {
 257                                if (el3_debug > 3)
 258                                        pr_debug("3c509 with address %02x %02x %02x %02x %02x %02x was found by ISAPnP\n",
 259                                                phys_addr[0] & 0xff, phys_addr[0] >> 8,
 260                                                phys_addr[1] & 0xff, phys_addr[1] >> 8,
 261                                                phys_addr[2] & 0xff, phys_addr[2] >> 8);
 262                                /* Set the adaptor tag so that the next card can be found. */
 263                                outb(0xd0 + ++current_tag, id_port);
 264                                return 2;
 265                        }
 266                }
 267        }
 268#endif /* CONFIG_PNP */
 269        return 0;
 270
 271}
 272
 273static void __devinit el3_dev_fill(struct net_device *dev, __be16 *phys_addr,
 274                                   int ioaddr, int irq, int if_port,
 275                                   enum el3_cardtype type)
 276{
 277        struct el3_private *lp = netdev_priv(dev);
 278
 279        memcpy(dev->dev_addr, phys_addr, ETH_ALEN);
 280        dev->base_addr = ioaddr;
 281        dev->irq = irq;
 282        dev->if_port = if_port;
 283        lp->type = type;
 284}
 285
 286static int __devinit el3_isa_match(struct device *pdev,
 287                                   unsigned int ndev)
 288{
 289        struct net_device *dev;
 290        int ioaddr, isa_irq, if_port, err;
 291        unsigned int iobase;
 292        __be16 phys_addr[3];
 293
 294        while ((err = el3_isa_id_sequence(phys_addr)) == 2)
 295                ;       /* Skip to next card when PnP card found */
 296        if (err == 1)
 297                return 0;
 298
 299        iobase = id_read_eeprom(8);
 300        if_port = iobase >> 14;
 301        ioaddr = 0x200 + ((iobase & 0x1f) << 4);
 302        if (irq[el3_cards] > 1 && irq[el3_cards] < 16)
 303                isa_irq = irq[el3_cards];
 304        else
 305                isa_irq = id_read_eeprom(9) >> 12;
 306
 307        dev = alloc_etherdev(sizeof(struct el3_private));
 308        if (!dev)
 309                return -ENOMEM;
 310
 311        netdev_boot_setup_check(dev);
 312
 313        if (!request_region(ioaddr, EL3_IO_EXTENT, "3c509-isa")) {
 314                free_netdev(dev);
 315                return 0;
 316        }
 317
 318        /* Set the adaptor tag so that the next card can be found. */
 319        outb(0xd0 + ++current_tag, id_port);
 320
 321        /* Activate the adaptor at the EEPROM location. */
 322        outb((ioaddr >> 4) | 0xe0, id_port);
 323
 324        EL3WINDOW(0);
 325        if (inw(ioaddr) != 0x6d50) {
 326                free_netdev(dev);
 327                return 0;
 328        }
 329
 330        /* Free the interrupt so that some other card can use it. */
 331        outw(0x0f00, ioaddr + WN0_IRQ);
 332
 333        el3_dev_fill(dev, phys_addr, ioaddr, isa_irq, if_port, EL3_ISA);
 334        dev_set_drvdata(pdev, dev);
 335        if (el3_common_init(dev)) {
 336                free_netdev(dev);
 337                return 0;
 338        }
 339
 340        el3_devs[el3_cards++] = dev;
 341        return 1;
 342}
 343
 344static int __devexit el3_isa_remove(struct device *pdev,
 345                                    unsigned int ndev)
 346{
 347        el3_device_remove(pdev);
 348        dev_set_drvdata(pdev, NULL);
 349        return 0;
 350}
 351
 352#ifdef CONFIG_PM
 353static int el3_isa_suspend(struct device *dev, unsigned int n,
 354                           pm_message_t state)
 355{
 356        current_tag = 0;
 357        return el3_suspend(dev, state);
 358}
 359
 360static int el3_isa_resume(struct device *dev, unsigned int n)
 361{
 362        struct net_device *ndev = dev_get_drvdata(dev);
 363        int ioaddr = ndev->base_addr, err;
 364        __be16 phys_addr[3];
 365
 366        while ((err = el3_isa_id_sequence(phys_addr)) == 2)
 367                ;       /* Skip to next card when PnP card found */
 368        if (err == 1)
 369                return 0;
 370        /* Set the adaptor tag so that the next card can be found. */
 371        outb(0xd0 + ++current_tag, id_port);
 372        /* Enable the card */
 373        outb((ioaddr >> 4) | 0xe0, id_port);
 374        EL3WINDOW(0);
 375        if (inw(ioaddr) != 0x6d50)
 376                return 1;
 377        /* Free the interrupt so that some other card can use it. */
 378        outw(0x0f00, ioaddr + WN0_IRQ);
 379        return el3_resume(dev);
 380}
 381#endif
 382
 383static struct isa_driver el3_isa_driver = {
 384        .match          = el3_isa_match,
 385        .remove         = __devexit_p(el3_isa_remove),
 386#ifdef CONFIG_PM
 387        .suspend        = el3_isa_suspend,
 388        .resume         = el3_isa_resume,
 389#endif
 390        .driver         = {
 391                .name   = "3c509"
 392        },
 393};
 394static int isa_registered;
 395
 396#ifdef CONFIG_PNP
 397static struct pnp_device_id el3_pnp_ids[] = {
 398        { .id = "TCM5090" }, /* 3Com Etherlink III (TP) */
 399        { .id = "TCM5091" }, /* 3Com Etherlink III */
 400        { .id = "TCM5094" }, /* 3Com Etherlink III (combo) */
 401        { .id = "TCM5095" }, /* 3Com Etherlink III (TPO) */
 402        { .id = "TCM5098" }, /* 3Com Etherlink III (TPC) */
 403        { .id = "PNP80f7" }, /* 3Com Etherlink III compatible */
 404        { .id = "PNP80f8" }, /* 3Com Etherlink III compatible */
 405        { .id = "" }
 406};
 407MODULE_DEVICE_TABLE(pnp, el3_pnp_ids);
 408
 409static int __devinit el3_pnp_probe(struct pnp_dev *pdev,
 410                                    const struct pnp_device_id *id)
 411{
 412        short i;
 413        int ioaddr, irq, if_port;
 414        __be16 phys_addr[3];
 415        struct net_device *dev = NULL;
 416        int err;
 417
 418        ioaddr = pnp_port_start(pdev, 0);
 419        if (!request_region(ioaddr, EL3_IO_EXTENT, "3c509-pnp"))
 420                return -EBUSY;
 421        irq = pnp_irq(pdev, 0);
 422        EL3WINDOW(0);
 423        for (i = 0; i < 3; i++)
 424                phys_addr[i] = htons(read_eeprom(ioaddr, i));
 425        if_port = read_eeprom(ioaddr, 8) >> 14;
 426        dev = alloc_etherdev(sizeof(struct el3_private));
 427        if (!dev) {
 428                release_region(ioaddr, EL3_IO_EXTENT);
 429                return -ENOMEM;
 430        }
 431        SET_NETDEV_DEV(dev, &pdev->dev);
 432        netdev_boot_setup_check(dev);
 433
 434        el3_dev_fill(dev, phys_addr, ioaddr, irq, if_port, EL3_PNP);
 435        pnp_set_drvdata(pdev, dev);
 436        err = el3_common_init(dev);
 437
 438        if (err) {
 439                pnp_set_drvdata(pdev, NULL);
 440                free_netdev(dev);
 441                return err;
 442        }
 443
 444        el3_devs[el3_cards++] = dev;
 445        return 0;
 446}
 447
 448static void __devexit el3_pnp_remove(struct pnp_dev *pdev)
 449{
 450        el3_common_remove(pnp_get_drvdata(pdev));
 451        pnp_set_drvdata(pdev, NULL);
 452}
 453
 454#ifdef CONFIG_PM
 455static int el3_pnp_suspend(struct pnp_dev *pdev, pm_message_t state)
 456{
 457        return el3_suspend(&pdev->dev, state);
 458}
 459
 460static int el3_pnp_resume(struct pnp_dev *pdev)
 461{
 462        return el3_resume(&pdev->dev);
 463}
 464#endif
 465
 466static struct pnp_driver el3_pnp_driver = {
 467        .name           = "3c509",
 468        .id_table       = el3_pnp_ids,
 469        .probe          = el3_pnp_probe,
 470        .remove         = __devexit_p(el3_pnp_remove),
 471#ifdef CONFIG_PM
 472        .suspend        = el3_pnp_suspend,
 473        .resume         = el3_pnp_resume,
 474#endif
 475};
 476static int pnp_registered;
 477#endif /* CONFIG_PNP */
 478
 479#ifdef CONFIG_EISA
 480static struct eisa_device_id el3_eisa_ids[] = {
 481                { "TCM5090" },
 482                { "TCM5091" },
 483                { "TCM5092" },
 484                { "TCM5093" },
 485                { "TCM5094" },
 486                { "TCM5095" },
 487                { "TCM5098" },
 488                { "" }
 489};
 490MODULE_DEVICE_TABLE(eisa, el3_eisa_ids);
 491
 492static int el3_eisa_probe (struct device *device);
 493
 494static struct eisa_driver el3_eisa_driver = {
 495                .id_table = el3_eisa_ids,
 496                .driver   = {
 497                                .name    = "3c579",
 498                                .probe   = el3_eisa_probe,
 499                                .remove  = __devexit_p (el3_device_remove),
 500                                .suspend = el3_suspend,
 501                                .resume  = el3_resume,
 502                }
 503};
 504static int eisa_registered;
 505#endif
 506
 507static const struct net_device_ops netdev_ops = {
 508        .ndo_open               = el3_open,
 509        .ndo_stop               = el3_close,
 510        .ndo_start_xmit         = el3_start_xmit,
 511        .ndo_get_stats          = el3_get_stats,
 512        .ndo_set_rx_mode        = set_multicast_list,
 513        .ndo_tx_timeout         = el3_tx_timeout,
 514        .ndo_change_mtu         = eth_change_mtu,
 515        .ndo_set_mac_address    = eth_mac_addr,
 516        .ndo_validate_addr      = eth_validate_addr,
 517#ifdef CONFIG_NET_POLL_CONTROLLER
 518        .ndo_poll_controller    = el3_poll_controller,
 519#endif
 520};
 521
 522static int __devinit el3_common_init(struct net_device *dev)
 523{
 524        struct el3_private *lp = netdev_priv(dev);
 525        int err;
 526        const char *if_names[] = {"10baseT", "AUI", "undefined", "BNC"};
 527
 528        spin_lock_init(&lp->lock);
 529
 530        if (dev->mem_start & 0x05) { /* xcvr codes 1/3/4/12 */
 531                dev->if_port = (dev->mem_start & 0x0f);
 532        } else { /* xcvr codes 0/8 */
 533                /* use eeprom value, but save user's full-duplex selection */
 534                dev->if_port |= (dev->mem_start & 0x08);
 535        }
 536
 537        /* The EL3-specific entries in the device structure. */
 538        dev->netdev_ops = &netdev_ops;
 539        dev->watchdog_timeo = TX_TIMEOUT;
 540        SET_ETHTOOL_OPS(dev, &ethtool_ops);
 541
 542        err = register_netdev(dev);
 543        if (err) {
 544                pr_err("Failed to register 3c5x9 at %#3.3lx, IRQ %d.\n",
 545                        dev->base_addr, dev->irq);
 546                release_region(dev->base_addr, EL3_IO_EXTENT);
 547                return err;
 548        }
 549
 550        pr_info("%s: 3c5x9 found at %#3.3lx, %s port, address %pM, IRQ %d.\n",
 551               dev->name, dev->base_addr, if_names[(dev->if_port & 0x03)],
 552               dev->dev_addr, dev->irq);
 553
 554        if (el3_debug > 0)
 555                pr_info("%s", version);
 556        return 0;
 557
 558}
 559
 560static void el3_common_remove (struct net_device *dev)
 561{
 562        unregister_netdev (dev);
 563        release_region(dev->base_addr, EL3_IO_EXTENT);
 564        free_netdev (dev);
 565}
 566
 567#ifdef CONFIG_EISA
 568static int __init el3_eisa_probe (struct device *device)
 569{
 570        short i;
 571        int ioaddr, irq, if_port;
 572        __be16 phys_addr[3];
 573        struct net_device *dev = NULL;
 574        struct eisa_device *edev;
 575        int err;
 576
 577        /* Yeepee, The driver framework is calling us ! */
 578        edev = to_eisa_device (device);
 579        ioaddr = edev->base_addr;
 580
 581        if (!request_region(ioaddr, EL3_IO_EXTENT, "3c579-eisa"))
 582                return -EBUSY;
 583
 584        /* Change the register set to the configuration window 0. */
 585        outw(SelectWindow | 0, ioaddr + 0xC80 + EL3_CMD);
 586
 587        irq = inw(ioaddr + WN0_IRQ) >> 12;
 588        if_port = inw(ioaddr + 6)>>14;
 589        for (i = 0; i < 3; i++)
 590                phys_addr[i] = htons(read_eeprom(ioaddr, i));
 591
 592        /* Restore the "Product ID" to the EEPROM read register. */
 593        read_eeprom(ioaddr, 3);
 594
 595        dev = alloc_etherdev(sizeof (struct el3_private));
 596        if (dev == NULL) {
 597                release_region(ioaddr, EL3_IO_EXTENT);
 598                return -ENOMEM;
 599        }
 600
 601        netdev_boot_setup_check(dev);
 602
 603        el3_dev_fill(dev, phys_addr, ioaddr, irq, if_port, EL3_EISA);
 604        eisa_set_drvdata (edev, dev);
 605        err = el3_common_init(dev);
 606
 607        if (err) {
 608                eisa_set_drvdata (edev, NULL);
 609                free_netdev(dev);
 610                return err;
 611        }
 612
 613        el3_devs[el3_cards++] = dev;
 614        return 0;
 615}
 616#endif
 617
 618/* This remove works for all device types.
 619 *
 620 * The net dev must be stored in the driver data field */
 621static int __devexit el3_device_remove (struct device *device)
 622{
 623        struct net_device *dev;
 624
 625        dev = dev_get_drvdata(device);
 626
 627        el3_common_remove (dev);
 628        return 0;
 629}
 630
 631/* Read a word from the EEPROM using the regular EEPROM access register.
 632   Assume that we are in register window zero.
 633 */
 634static ushort read_eeprom(int ioaddr, int index)
 635{
 636        outw(EEPROM_READ + index, ioaddr + 10);
 637        /* Pause for at least 162 us. for the read to take place.
 638           Some chips seem to require much longer */
 639        mdelay(2);
 640        return inw(ioaddr + 12);
 641}
 642
 643/* Read a word from the EEPROM when in the ISA ID probe state. */
 644static ushort id_read_eeprom(int index)
 645{
 646        int bit, word = 0;
 647
 648        /* Issue read command, and pause for at least 162 us. for it to complete.
 649           Assume extra-fast 16Mhz bus. */
 650        outb(EEPROM_READ + index, id_port);
 651
 652        /* Pause for at least 162 us. for the read to take place. */
 653        /* Some chips seem to require much longer */
 654        mdelay(4);
 655
 656        for (bit = 15; bit >= 0; bit--)
 657                word = (word << 1) + (inb(id_port) & 0x01);
 658
 659        if (el3_debug > 3)
 660                pr_debug("  3c509 EEPROM word %d %#4.4x.\n", index, word);
 661
 662        return word;
 663}
 664
 665
 666static int
 667el3_open(struct net_device *dev)
 668{
 669        int ioaddr = dev->base_addr;
 670        int i;
 671
 672        outw(TxReset, ioaddr + EL3_CMD);
 673        outw(RxReset, ioaddr + EL3_CMD);
 674        outw(SetStatusEnb | 0x00, ioaddr + EL3_CMD);
 675
 676        i = request_irq(dev->irq, el3_interrupt, 0, dev->name, dev);
 677        if (i)
 678                return i;
 679
 680        EL3WINDOW(0);
 681        if (el3_debug > 3)
 682                pr_debug("%s: Opening, IRQ %d    status@%x %4.4x.\n", dev->name,
 683                           dev->irq, ioaddr + EL3_STATUS, inw(ioaddr + EL3_STATUS));
 684
 685        el3_up(dev);
 686
 687        if (el3_debug > 3)
 688                pr_debug("%s: Opened 3c509  IRQ %d  status %4.4x.\n",
 689                           dev->name, dev->irq, inw(ioaddr + EL3_STATUS));
 690
 691        return 0;
 692}
 693
 694static void
 695el3_tx_timeout (struct net_device *dev)
 696{
 697        int ioaddr = dev->base_addr;
 698
 699        /* Transmitter timeout, serious problems. */
 700        pr_warning("%s: transmit timed out, Tx_status %2.2x status %4.4x Tx FIFO room %d.\n",
 701                   dev->name, inb(ioaddr + TX_STATUS), inw(ioaddr + EL3_STATUS),
 702                   inw(ioaddr + TX_FREE));
 703        dev->stats.tx_errors++;
 704        dev->trans_start = jiffies; /* prevent tx timeout */
 705        /* Issue TX_RESET and TX_START commands. */
 706        outw(TxReset, ioaddr + EL3_CMD);
 707        outw(TxEnable, ioaddr + EL3_CMD);
 708        netif_wake_queue(dev);
 709}
 710
 711
 712static netdev_tx_t
 713el3_start_xmit(struct sk_buff *skb, struct net_device *dev)
 714{
 715        struct el3_private *lp = netdev_priv(dev);
 716        int ioaddr = dev->base_addr;
 717        unsigned long flags;
 718
 719        netif_stop_queue (dev);
 720
 721        dev->stats.tx_bytes += skb->len;
 722
 723        if (el3_debug > 4) {
 724                pr_debug("%s: el3_start_xmit(length = %u) called, status %4.4x.\n",
 725                           dev->name, skb->len, inw(ioaddr + EL3_STATUS));
 726        }
 727#if 0
 728#ifndef final_version
 729        {       /* Error-checking code, delete someday. */
 730                ushort status = inw(ioaddr + EL3_STATUS);
 731                if (status & 0x0001 &&          /* IRQ line active, missed one. */
 732                    inw(ioaddr + EL3_STATUS) & 1) {                     /* Make sure. */
 733                        pr_debug("%s: Missed interrupt, status then %04x now %04x"
 734                                   "  Tx %2.2x Rx %4.4x.\n", dev->name, status,
 735                                   inw(ioaddr + EL3_STATUS), inb(ioaddr + TX_STATUS),
 736                                   inw(ioaddr + RX_STATUS));
 737                        /* Fake interrupt trigger by masking, acknowledge interrupts. */
 738                        outw(SetStatusEnb | 0x00, ioaddr + EL3_CMD);
 739                        outw(AckIntr | IntLatch | TxAvailable | RxEarly | IntReq,
 740                                 ioaddr + EL3_CMD);
 741                        outw(SetStatusEnb | 0xff, ioaddr + EL3_CMD);
 742                }
 743        }
 744#endif
 745#endif
 746        /*
 747         *      We lock the driver against other processors. Note
 748         *      we don't need to lock versus the IRQ as we suspended
 749         *      that. This means that we lose the ability to take
 750         *      an RX during a TX upload. That sucks a bit with SMP
 751         *      on an original 3c509 (2K buffer)
 752         *
 753         *      Using disable_irq stops us crapping on other
 754         *      time sensitive devices.
 755         */
 756
 757        spin_lock_irqsave(&lp->lock, flags);
 758
 759        /* Put out the doubleword header... */
 760        outw(skb->len, ioaddr + TX_FIFO);
 761        outw(0x00, ioaddr + TX_FIFO);
 762        /* ... and the packet rounded to a doubleword. */
 763        outsl(ioaddr + TX_FIFO, skb->data, (skb->len + 3) >> 2);
 764
 765        if (inw(ioaddr + TX_FREE) > 1536)
 766                netif_start_queue(dev);
 767        else
 768                /* Interrupt us when the FIFO has room for max-sized packet. */
 769                outw(SetTxThreshold + 1536, ioaddr + EL3_CMD);
 770
 771        spin_unlock_irqrestore(&lp->lock, flags);
 772
 773        dev_kfree_skb (skb);
 774
 775        /* Clear the Tx status stack. */
 776        {
 777                short tx_status;
 778                int i = 4;
 779
 780                while (--i > 0  &&      (tx_status = inb(ioaddr + TX_STATUS)) > 0) {
 781                        if (tx_status & 0x38) dev->stats.tx_aborted_errors++;
 782                        if (tx_status & 0x30) outw(TxReset, ioaddr + EL3_CMD);
 783                        if (tx_status & 0x3C) outw(TxEnable, ioaddr + EL3_CMD);
 784                        outb(0x00, ioaddr + TX_STATUS); /* Pop the status stack. */
 785                }
 786        }
 787        return NETDEV_TX_OK;
 788}
 789
 790/* The EL3 interrupt handler. */
 791static irqreturn_t
 792el3_interrupt(int irq, void *dev_id)
 793{
 794        struct net_device *dev = dev_id;
 795        struct el3_private *lp;
 796        int ioaddr, status;
 797        int i = max_interrupt_work;
 798
 799        lp = netdev_priv(dev);
 800        spin_lock(&lp->lock);
 801
 802        ioaddr = dev->base_addr;
 803
 804        if (el3_debug > 4) {
 805                status = inw(ioaddr + EL3_STATUS);
 806                pr_debug("%s: interrupt, status %4.4x.\n", dev->name, status);
 807        }
 808
 809        while ((status = inw(ioaddr + EL3_STATUS)) &
 810                   (IntLatch | RxComplete | StatsFull)) {
 811
 812                if (status & RxComplete)
 813                        el3_rx(dev);
 814
 815                if (status & TxAvailable) {
 816                        if (el3_debug > 5)
 817                                pr_debug("      TX room bit was handled.\n");
 818                        /* There's room in the FIFO for a full-sized packet. */
 819                        outw(AckIntr | TxAvailable, ioaddr + EL3_CMD);
 820                        netif_wake_queue (dev);
 821                }
 822                if (status & (AdapterFailure | RxEarly | StatsFull | TxComplete)) {
 823                        /* Handle all uncommon interrupts. */
 824                        if (status & StatsFull)                         /* Empty statistics. */
 825                                update_stats(dev);
 826                        if (status & RxEarly) {                         /* Rx early is unused. */
 827                                el3_rx(dev);
 828                                outw(AckIntr | RxEarly, ioaddr + EL3_CMD);
 829                        }
 830                        if (status & TxComplete) {                      /* Really Tx error. */
 831                                short tx_status;
 832                                int i = 4;
 833
 834                                while (--i>0 && (tx_status = inb(ioaddr + TX_STATUS)) > 0) {
 835                                        if (tx_status & 0x38) dev->stats.tx_aborted_errors++;
 836                                        if (tx_status & 0x30) outw(TxReset, ioaddr + EL3_CMD);
 837                                        if (tx_status & 0x3C) outw(TxEnable, ioaddr + EL3_CMD);
 838                                        outb(0x00, ioaddr + TX_STATUS); /* Pop the status stack. */
 839                                }
 840                        }
 841                        if (status & AdapterFailure) {
 842                                /* Adapter failure requires Rx reset and reinit. */
 843                                outw(RxReset, ioaddr + EL3_CMD);
 844                                /* Set the Rx filter to the current state. */
 845                                outw(SetRxFilter | RxStation | RxBroadcast
 846                                         | (dev->flags & IFF_ALLMULTI ? RxMulticast : 0)
 847                                         | (dev->flags & IFF_PROMISC ? RxProm : 0),
 848                                         ioaddr + EL3_CMD);
 849                                outw(RxEnable, ioaddr + EL3_CMD); /* Re-enable the receiver. */
 850                                outw(AckIntr | AdapterFailure, ioaddr + EL3_CMD);
 851                        }
 852                }
 853
 854                if (--i < 0) {
 855                        pr_err("%s: Infinite loop in interrupt, status %4.4x.\n",
 856                                   dev->name, status);
 857                        /* Clear all interrupts. */
 858                        outw(AckIntr | 0xFF, ioaddr + EL3_CMD);
 859                        break;
 860                }
 861                /* Acknowledge the IRQ. */
 862                outw(AckIntr | IntReq | IntLatch, ioaddr + EL3_CMD); /* Ack IRQ */
 863        }
 864
 865        if (el3_debug > 4) {
 866                pr_debug("%s: exiting interrupt, status %4.4x.\n", dev->name,
 867                           inw(ioaddr + EL3_STATUS));
 868        }
 869        spin_unlock(&lp->lock);
 870        return IRQ_HANDLED;
 871}
 872
 873
 874#ifdef CONFIG_NET_POLL_CONTROLLER
 875/*
 876 * Polling receive - used by netconsole and other diagnostic tools
 877 * to allow network i/o with interrupts disabled.
 878 */
 879static void el3_poll_controller(struct net_device *dev)
 880{
 881        disable_irq(dev->irq);
 882        el3_interrupt(dev->irq, dev);
 883        enable_irq(dev->irq);
 884}
 885#endif
 886
 887static struct net_device_stats *
 888el3_get_stats(struct net_device *dev)
 889{
 890        struct el3_private *lp = netdev_priv(dev);
 891        unsigned long flags;
 892
 893        /*
 894         *      This is fast enough not to bother with disable IRQ
 895         *      stuff.
 896         */
 897
 898        spin_lock_irqsave(&lp->lock, flags);
 899        update_stats(dev);
 900        spin_unlock_irqrestore(&lp->lock, flags);
 901        return &dev->stats;
 902}
 903
 904/*  Update statistics.  We change to register window 6, so this should be run
 905        single-threaded if the device is active. This is expected to be a rare
 906        operation, and it's simpler for the rest of the driver to assume that
 907        window 1 is always valid rather than use a special window-state variable.
 908        */
 909static void update_stats(struct net_device *dev)
 910{
 911        int ioaddr = dev->base_addr;
 912
 913        if (el3_debug > 5)
 914                pr_debug("   Updating the statistics.\n");
 915        /* Turn off statistics updates while reading. */
 916        outw(StatsDisable, ioaddr + EL3_CMD);
 917        /* Switch to the stats window, and read everything. */
 918        EL3WINDOW(6);
 919        dev->stats.tx_carrier_errors    += inb(ioaddr + 0);
 920        dev->stats.tx_heartbeat_errors  += inb(ioaddr + 1);
 921        /* Multiple collisions. */         inb(ioaddr + 2);
 922        dev->stats.collisions           += inb(ioaddr + 3);
 923        dev->stats.tx_window_errors     += inb(ioaddr + 4);
 924        dev->stats.rx_fifo_errors       += inb(ioaddr + 5);
 925        dev->stats.tx_packets           += inb(ioaddr + 6);
 926        /* Rx packets   */                 inb(ioaddr + 7);
 927        /* Tx deferrals */                 inb(ioaddr + 8);
 928        inw(ioaddr + 10);       /* Total Rx and Tx octets. */
 929        inw(ioaddr + 12);
 930
 931        /* Back to window 1, and turn statistics back on. */
 932        EL3WINDOW(1);
 933        outw(StatsEnable, ioaddr + EL3_CMD);
 934}
 935
 936static int
 937el3_rx(struct net_device *dev)
 938{
 939        int ioaddr = dev->base_addr;
 940        short rx_status;
 941
 942        if (el3_debug > 5)
 943                pr_debug("   In rx_packet(), status %4.4x, rx_status %4.4x.\n",
 944                           inw(ioaddr+EL3_STATUS), inw(ioaddr+RX_STATUS));
 945        while ((rx_status = inw(ioaddr + RX_STATUS)) > 0) {
 946                if (rx_status & 0x4000) { /* Error, update stats. */
 947                        short error = rx_status & 0x3800;
 948
 949                        outw(RxDiscard, ioaddr + EL3_CMD);
 950                        dev->stats.rx_errors++;
 951                        switch (error) {
 952                        case 0x0000:            dev->stats.rx_over_errors++; break;
 953                        case 0x0800:            dev->stats.rx_length_errors++; break;
 954                        case 0x1000:            dev->stats.rx_frame_errors++; break;
 955                        case 0x1800:            dev->stats.rx_length_errors++; break;
 956                        case 0x2000:            dev->stats.rx_frame_errors++; break;
 957                        case 0x2800:            dev->stats.rx_crc_errors++; break;
 958                        }
 959                } else {
 960                        short pkt_len = rx_status & 0x7ff;
 961                        struct sk_buff *skb;
 962
 963                        skb = netdev_alloc_skb(dev, pkt_len + 5);
 964                        if (el3_debug > 4)
 965                                pr_debug("Receiving packet size %d status %4.4x.\n",
 966                                           pkt_len, rx_status);
 967                        if (skb != NULL) {
 968                                skb_reserve(skb, 2);     /* Align IP on 16 byte */
 969
 970                                /* 'skb->data' points to the start of sk_buff data area. */
 971                                insl(ioaddr + RX_FIFO, skb_put(skb,pkt_len),
 972                                         (pkt_len + 3) >> 2);
 973
 974                                outw(RxDiscard, ioaddr + EL3_CMD); /* Pop top Rx packet. */
 975                                skb->protocol = eth_type_trans(skb,dev);
 976                                netif_rx(skb);
 977                                dev->stats.rx_bytes += pkt_len;
 978                                dev->stats.rx_packets++;
 979                                continue;
 980                        }
 981                        outw(RxDiscard, ioaddr + EL3_CMD);
 982                        dev->stats.rx_dropped++;
 983                        if (el3_debug)
 984                                pr_debug("%s: Couldn't allocate a sk_buff of size %d.\n",
 985                                           dev->name, pkt_len);
 986                }
 987                inw(ioaddr + EL3_STATUS);                               /* Delay. */
 988                while (inw(ioaddr + EL3_STATUS) & 0x1000)
 989                        pr_debug("      Waiting for 3c509 to discard packet, status %x.\n",
 990                                   inw(ioaddr + EL3_STATUS) );
 991        }
 992
 993        return 0;
 994}
 995
 996/*
 997 *     Set or clear the multicast filter for this adaptor.
 998 */
 999static void
1000set_multicast_list(struct net_device *dev)
1001{
1002        unsigned long flags;
1003        struct el3_private *lp = netdev_priv(dev);
1004        int ioaddr = dev->base_addr;
1005        int mc_count = netdev_mc_count(dev);
1006
1007        if (el3_debug > 1) {
1008                static int old;
1009                if (old != mc_count) {
1010                        old = mc_count;
1011                        pr_debug("%s: Setting Rx mode to %d addresses.\n",
1012                                 dev->name, mc_count);
1013                }
1014        }
1015        spin_lock_irqsave(&lp->lock, flags);
1016        if (dev->flags&IFF_PROMISC) {
1017                outw(SetRxFilter | RxStation | RxMulticast | RxBroadcast | RxProm,
1018                         ioaddr + EL3_CMD);
1019        }
1020        else if (mc_count || (dev->flags&IFF_ALLMULTI)) {
1021                outw(SetRxFilter | RxStation | RxMulticast | RxBroadcast, ioaddr + EL3_CMD);
1022        }
1023        else
1024                outw(SetRxFilter | RxStation | RxBroadcast, ioaddr + EL3_CMD);
1025        spin_unlock_irqrestore(&lp->lock, flags);
1026}
1027
1028static int
1029el3_close(struct net_device *dev)
1030{
1031        int ioaddr = dev->base_addr;
1032        struct el3_private *lp = netdev_priv(dev);
1033
1034        if (el3_debug > 2)
1035                pr_debug("%s: Shutting down ethercard.\n", dev->name);
1036
1037        el3_down(dev);
1038
1039        free_irq(dev->irq, dev);
1040        /* Switching back to window 0 disables the IRQ. */
1041        EL3WINDOW(0);
1042        if (lp->type != EL3_EISA) {
1043                /* But we explicitly zero the IRQ line select anyway. Don't do
1044                 * it on EISA cards, it prevents the module from getting an
1045                 * IRQ after unload+reload... */
1046                outw(0x0f00, ioaddr + WN0_IRQ);
1047        }
1048
1049        return 0;
1050}
1051
1052static int
1053el3_link_ok(struct net_device *dev)
1054{
1055        int ioaddr = dev->base_addr;
1056        u16 tmp;
1057
1058        EL3WINDOW(4);
1059        tmp = inw(ioaddr + WN4_MEDIA);
1060        EL3WINDOW(1);
1061        return tmp & (1<<11);
1062}
1063
1064static int
1065el3_netdev_get_ecmd(struct net_device *dev, struct ethtool_cmd *ecmd)
1066{
1067        u16 tmp;
1068        int ioaddr = dev->base_addr;
1069
1070        EL3WINDOW(0);
1071        /* obtain current transceiver via WN4_MEDIA? */
1072        tmp = inw(ioaddr + WN0_ADDR_CONF);
1073        ecmd->transceiver = XCVR_INTERNAL;
1074        switch (tmp >> 14) {
1075        case 0:
1076                ecmd->port = PORT_TP;
1077                break;
1078        case 1:
1079                ecmd->port = PORT_AUI;
1080                ecmd->transceiver = XCVR_EXTERNAL;
1081                break;
1082        case 3:
1083                ecmd->port = PORT_BNC;
1084        default:
1085                break;
1086        }
1087
1088        ecmd->duplex = DUPLEX_HALF;
1089        ecmd->supported = 0;
1090        tmp = inw(ioaddr + WN0_CONF_CTRL);
1091        if (tmp & (1<<13))
1092                ecmd->supported |= SUPPORTED_AUI;
1093        if (tmp & (1<<12))
1094                ecmd->supported |= SUPPORTED_BNC;
1095        if (tmp & (1<<9)) {
1096                ecmd->supported |= SUPPORTED_TP | SUPPORTED_10baseT_Half |
1097                                SUPPORTED_10baseT_Full; /* hmm... */
1098                EL3WINDOW(4);
1099                tmp = inw(ioaddr + WN4_NETDIAG);
1100                if (tmp & FD_ENABLE)
1101                        ecmd->duplex = DUPLEX_FULL;
1102        }
1103
1104        ethtool_cmd_speed_set(ecmd, SPEED_10);
1105        EL3WINDOW(1);
1106        return 0;
1107}
1108
1109static int
1110el3_netdev_set_ecmd(struct net_device *dev, struct ethtool_cmd *ecmd)
1111{
1112        u16 tmp;
1113        int ioaddr = dev->base_addr;
1114
1115        if (ecmd->speed != SPEED_10)
1116                return -EINVAL;
1117        if ((ecmd->duplex != DUPLEX_HALF) && (ecmd->duplex != DUPLEX_FULL))
1118                return -EINVAL;
1119        if ((ecmd->transceiver != XCVR_INTERNAL) && (ecmd->transceiver != XCVR_EXTERNAL))
1120                return -EINVAL;
1121
1122        /* change XCVR type */
1123        EL3WINDOW(0);
1124        tmp = inw(ioaddr + WN0_ADDR_CONF);
1125        switch (ecmd->port) {
1126        case PORT_TP:
1127                tmp &= ~(3<<14);
1128                dev->if_port = 0;
1129                break;
1130        case PORT_AUI:
1131                tmp |= (1<<14);
1132                dev->if_port = 1;
1133                break;
1134        case PORT_BNC:
1135                tmp |= (3<<14);
1136                dev->if_port = 3;
1137                break;
1138        default:
1139                return -EINVAL;
1140        }
1141
1142        outw(tmp, ioaddr + WN0_ADDR_CONF);
1143        if (dev->if_port == 3) {
1144                /* fire up the DC-DC convertor if BNC gets enabled */
1145                tmp = inw(ioaddr + WN0_ADDR_CONF);
1146                if (tmp & (3 << 14)) {
1147                        outw(StartCoax, ioaddr + EL3_CMD);
1148                        udelay(800);
1149                } else
1150                        return -EIO;
1151        }
1152
1153        EL3WINDOW(4);
1154        tmp = inw(ioaddr + WN4_NETDIAG);
1155        if (ecmd->duplex == DUPLEX_FULL)
1156                tmp |= FD_ENABLE;
1157        else
1158                tmp &= ~FD_ENABLE;
1159        outw(tmp, ioaddr + WN4_NETDIAG);
1160        EL3WINDOW(1);
1161
1162        return 0;
1163}
1164
1165static void el3_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
1166{
1167        strcpy(info->driver, DRV_NAME);
1168        strcpy(info->version, DRV_VERSION);
1169}
1170
1171static int el3_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
1172{
1173        struct el3_private *lp = netdev_priv(dev);
1174        int ret;
1175
1176        spin_lock_irq(&lp->lock);
1177        ret = el3_netdev_get_ecmd(dev, ecmd);
1178        spin_unlock_irq(&lp->lock);
1179        return ret;
1180}
1181
1182static int el3_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
1183{
1184        struct el3_private *lp = netdev_priv(dev);
1185        int ret;
1186
1187        spin_lock_irq(&lp->lock);
1188        ret = el3_netdev_set_ecmd(dev, ecmd);
1189        spin_unlock_irq(&lp->lock);
1190        return ret;
1191}
1192
1193static u32 el3_get_link(struct net_device *dev)
1194{
1195        struct el3_private *lp = netdev_priv(dev);
1196        u32 ret;
1197
1198        spin_lock_irq(&lp->lock);
1199        ret = el3_link_ok(dev);
1200        spin_unlock_irq(&lp->lock);
1201        return ret;
1202}
1203
1204static u32 el3_get_msglevel(struct net_device *dev)
1205{
1206        return el3_debug;
1207}
1208
1209static void el3_set_msglevel(struct net_device *dev, u32 v)
1210{
1211        el3_debug = v;
1212}
1213
1214static const struct ethtool_ops ethtool_ops = {
1215        .get_drvinfo = el3_get_drvinfo,
1216        .get_settings = el3_get_settings,
1217        .set_settings = el3_set_settings,
1218        .get_link = el3_get_link,
1219        .get_msglevel = el3_get_msglevel,
1220        .set_msglevel = el3_set_msglevel,
1221};
1222
1223static void
1224el3_down(struct net_device *dev)
1225{
1226        int ioaddr = dev->base_addr;
1227
1228        netif_stop_queue(dev);
1229
1230        /* Turn off statistics ASAP.  We update lp->stats below. */
1231        outw(StatsDisable, ioaddr + EL3_CMD);
1232
1233        /* Disable the receiver and transmitter. */
1234        outw(RxDisable, ioaddr + EL3_CMD);
1235        outw(TxDisable, ioaddr + EL3_CMD);
1236
1237        if (dev->if_port == 3)
1238                /* Turn off thinnet power.  Green! */
1239                outw(StopCoax, ioaddr + EL3_CMD);
1240        else if (dev->if_port == 0) {
1241                /* Disable link beat and jabber, if_port may change here next open(). */
1242                EL3WINDOW(4);
1243                outw(inw(ioaddr + WN4_MEDIA) & ~MEDIA_TP, ioaddr + WN4_MEDIA);
1244        }
1245
1246        outw(SetIntrEnb | 0x0000, ioaddr + EL3_CMD);
1247
1248        update_stats(dev);
1249}
1250
1251static void
1252el3_up(struct net_device *dev)
1253{
1254        int i, sw_info, net_diag;
1255        int ioaddr = dev->base_addr;
1256
1257        /* Activating the board required and does no harm otherwise */
1258        outw(0x0001, ioaddr + 4);
1259
1260        /* Set the IRQ line. */
1261        outw((dev->irq << 12) | 0x0f00, ioaddr + WN0_IRQ);
1262
1263        /* Set the station address in window 2 each time opened. */
1264        EL3WINDOW(2);
1265
1266        for (i = 0; i < 6; i++)
1267                outb(dev->dev_addr[i], ioaddr + i);
1268
1269        if ((dev->if_port & 0x03) == 3) /* BNC interface */
1270                /* Start the thinnet transceiver. We should really wait 50ms...*/
1271                outw(StartCoax, ioaddr + EL3_CMD);
1272        else if ((dev->if_port & 0x03) == 0) { /* 10baseT interface */
1273                /* Combine secondary sw_info word (the adapter level) and primary
1274                        sw_info word (duplex setting plus other useless bits) */
1275                EL3WINDOW(0);
1276                sw_info = (read_eeprom(ioaddr, 0x14) & 0x400f) |
1277                        (read_eeprom(ioaddr, 0x0d) & 0xBff0);
1278
1279                EL3WINDOW(4);
1280                net_diag = inw(ioaddr + WN4_NETDIAG);
1281                net_diag = (net_diag | FD_ENABLE); /* temporarily assume full-duplex will be set */
1282                pr_info("%s: ", dev->name);
1283                switch (dev->if_port & 0x0c) {
1284                        case 12:
1285                                /* force full-duplex mode if 3c5x9b */
1286                                if (sw_info & 0x000f) {
1287                                        pr_cont("Forcing 3c5x9b full-duplex mode");
1288                                        break;
1289                                }
1290                        case 8:
1291                                /* set full-duplex mode based on eeprom config setting */
1292                                if ((sw_info & 0x000f) && (sw_info & 0x8000)) {
1293                                        pr_cont("Setting 3c5x9b full-duplex mode (from EEPROM configuration bit)");
1294                                        break;
1295                                }
1296                        default:
1297                                /* xcvr=(0 || 4) OR user has an old 3c5x9 non "B" model */
1298                                pr_cont("Setting 3c5x9/3c5x9B half-duplex mode");
1299                                net_diag = (net_diag & ~FD_ENABLE); /* disable full duplex */
1300                }
1301
1302                outw(net_diag, ioaddr + WN4_NETDIAG);
1303                pr_cont(" if_port: %d, sw_info: %4.4x\n", dev->if_port, sw_info);
1304                if (el3_debug > 3)
1305                        pr_debug("%s: 3c5x9 net diag word is now: %4.4x.\n", dev->name, net_diag);
1306                /* Enable link beat and jabber check. */
1307                outw(inw(ioaddr + WN4_MEDIA) | MEDIA_TP, ioaddr + WN4_MEDIA);
1308        }
1309
1310        /* Switch to the stats window, and clear all stats by reading. */
1311        outw(StatsDisable, ioaddr + EL3_CMD);
1312        EL3WINDOW(6);
1313        for (i = 0; i < 9; i++)
1314                inb(ioaddr + i);
1315        inw(ioaddr + 10);
1316        inw(ioaddr + 12);
1317
1318        /* Switch to register set 1 for normal use. */
1319        EL3WINDOW(1);
1320
1321        /* Accept b-case and phys addr only. */
1322        outw(SetRxFilter | RxStation | RxBroadcast, ioaddr + EL3_CMD);
1323        outw(StatsEnable, ioaddr + EL3_CMD); /* Turn on statistics. */
1324
1325        outw(RxEnable, ioaddr + EL3_CMD); /* Enable the receiver. */
1326        outw(TxEnable, ioaddr + EL3_CMD); /* Enable transmitter. */
1327        /* Allow status bits to be seen. */
1328        outw(SetStatusEnb | 0xff, ioaddr + EL3_CMD);
1329        /* Ack all pending events, and set active indicator mask. */
1330        outw(AckIntr | IntLatch | TxAvailable | RxEarly | IntReq,
1331                 ioaddr + EL3_CMD);
1332        outw(SetIntrEnb | IntLatch|TxAvailable|TxComplete|RxComplete|StatsFull,
1333                 ioaddr + EL3_CMD);
1334
1335        netif_start_queue(dev);
1336}
1337
1338/* Power Management support functions */
1339#ifdef CONFIG_PM
1340
1341static int
1342el3_suspend(struct device *pdev, pm_message_t state)
1343{
1344        unsigned long flags;
1345        struct net_device *dev;
1346        struct el3_private *lp;
1347        int ioaddr;
1348
1349        dev = dev_get_drvdata(pdev);
1350        lp = netdev_priv(dev);
1351        ioaddr = dev->base_addr;
1352
1353        spin_lock_irqsave(&lp->lock, flags);
1354
1355        if (netif_running(dev))
1356                netif_device_detach(dev);
1357
1358        el3_down(dev);
1359        outw(PowerDown, ioaddr + EL3_CMD);
1360
1361        spin_unlock_irqrestore(&lp->lock, flags);
1362        return 0;
1363}
1364
1365static int
1366el3_resume(struct device *pdev)
1367{
1368        unsigned long flags;
1369        struct net_device *dev;
1370        struct el3_private *lp;
1371        int ioaddr;
1372
1373        dev = dev_get_drvdata(pdev);
1374        lp = netdev_priv(dev);
1375        ioaddr = dev->base_addr;
1376
1377        spin_lock_irqsave(&lp->lock, flags);
1378
1379        outw(PowerUp, ioaddr + EL3_CMD);
1380        EL3WINDOW(0);
1381        el3_up(dev);
1382
1383        if (netif_running(dev))
1384                netif_device_attach(dev);
1385
1386        spin_unlock_irqrestore(&lp->lock, flags);
1387        return 0;
1388}
1389
1390#endif /* CONFIG_PM */
1391
1392module_param(debug,int, 0);
1393module_param_array(irq, int, NULL, 0);
1394module_param(max_interrupt_work, int, 0);
1395MODULE_PARM_DESC(debug, "debug level (0-6)");
1396MODULE_PARM_DESC(irq, "IRQ number(s) (assigned)");
1397MODULE_PARM_DESC(max_interrupt_work, "maximum events handled per interrupt");
1398#ifdef CONFIG_PNP
1399module_param(nopnp, int, 0);
1400MODULE_PARM_DESC(nopnp, "disable ISA PnP support (0-1)");
1401#endif  /* CONFIG_PNP */
1402MODULE_DESCRIPTION("3Com Etherlink III (3c509, 3c509B, 3c529, 3c579) ethernet driver");
1403MODULE_LICENSE("GPL");
1404
1405static int __init el3_init_module(void)
1406{
1407        int ret = 0;
1408
1409        if (debug >= 0)
1410                el3_debug = debug;
1411
1412#ifdef CONFIG_PNP
1413        if (!nopnp) {
1414                ret = pnp_register_driver(&el3_pnp_driver);
1415                if (!ret)
1416                        pnp_registered = 1;
1417        }
1418#endif
1419        /* Select an open I/O location at 0x1*0 to do ISA contention select. */
1420        /* Start with 0x110 to avoid some sound cards.*/
1421        for (id_port = 0x110 ; id_port < 0x200; id_port += 0x10) {
1422                if (!request_region(id_port, 1, "3c509-control"))
1423                        continue;
1424                outb(0x00, id_port);
1425                outb(0xff, id_port);
1426                if (inb(id_port) & 0x01)
1427                        break;
1428                else
1429                        release_region(id_port, 1);
1430        }
1431        if (id_port >= 0x200) {
1432                id_port = 0;
1433                pr_err("No I/O port available for 3c509 activation.\n");
1434        } else {
1435                ret = isa_register_driver(&el3_isa_driver, EL3_MAX_CARDS);
1436                if (!ret)
1437                        isa_registered = 1;
1438        }
1439#ifdef CONFIG_EISA
1440        ret = eisa_driver_register(&el3_eisa_driver);
1441        if (!ret)
1442                eisa_registered = 1;
1443#endif
1444
1445#ifdef CONFIG_PNP
1446        if (pnp_registered)
1447                ret = 0;
1448#endif
1449        if (isa_registered)
1450                ret = 0;
1451#ifdef CONFIG_EISA
1452        if (eisa_registered)
1453                ret = 0;
1454#endif
1455        return ret;
1456}
1457
1458static void __exit el3_cleanup_module(void)
1459{
1460#ifdef CONFIG_PNP
1461        if (pnp_registered)
1462                pnp_unregister_driver(&el3_pnp_driver);
1463#endif
1464        if (isa_registered)
1465                isa_unregister_driver(&el3_isa_driver);
1466        if (id_port)
1467                release_region(id_port, 1);
1468#ifdef CONFIG_EISA
1469        if (eisa_registered)
1470                eisa_driver_unregister(&el3_eisa_driver);
1471#endif
1472}
1473
1474module_init (el3_init_module);
1475module_exit (el3_cleanup_module);
1476