root/drivers/net/ethernet/3com/3c574_cs.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. tc574_probe
  2. tc574_detach
  3. tc574_config
  4. tc574_release
  5. tc574_suspend
  6. tc574_resume
  7. dump_status
  8. tc574_wait_for_completion
  9. read_eeprom
  10. mdio_sync
  11. mdio_read
  12. mdio_write
  13. tc574_reset
  14. el3_open
  15. el3_tx_timeout
  16. pop_tx_status
  17. el3_start_xmit
  18. el3_interrupt
  19. media_check
  20. el3_get_stats
  21. update_stats
  22. el3_rx
  23. el3_ioctl
  24. set_rx_mode
  25. set_multicast_list
  26. el3_close

   1 /* 3c574.c: A PCMCIA ethernet driver for the 3com 3c574 "RoadRunner".
   2 
   3         Written 1993-1998 by
   4         Donald Becker, becker@scyld.com, (driver core) and
   5         David Hinds, dahinds@users.sourceforge.net (from his PC card code).
   6         Locking fixes (C) Copyright 2003 Red Hat Inc
   7 
   8         This software may be used and distributed according to the terms of
   9         the GNU General Public License, incorporated herein by reference.
  10 
  11         This driver derives from Donald Becker's 3c509 core, which has the
  12         following copyright:
  13         Copyright 1993 United States Government as represented by the
  14         Director, National Security Agency.
  15         
  16 
  17 */
  18 
  19 /*
  20                                 Theory of Operation
  21 
  22 I. Board Compatibility
  23 
  24 This device driver is designed for the 3Com 3c574 PC card Fast Ethernet
  25 Adapter.
  26 
  27 II. Board-specific settings
  28 
  29 None -- PC cards are autoconfigured.
  30 
  31 III. Driver operation
  32 
  33 The 3c574 uses a Boomerang-style interface, without the bus-master capability.
  34 See the Boomerang driver and documentation for most details.
  35 
  36 IV. Notes and chip documentation.
  37 
  38 Two added registers are used to enhance PIO performance, RunnerRdCtrl and
  39 RunnerWrCtrl.  These are 11 bit down-counters that are preloaded with the
  40 count of word (16 bits) reads or writes the driver is about to do to the Rx
  41 or Tx FIFO.  The chip is then able to hide the internal-PCI-bus to PC-card
  42 translation latency by buffering the I/O operations with an 8 word FIFO.
  43 Note: No other chip accesses are permitted when this buffer is used.
  44 
  45 A second enhancement is that both attribute and common memory space
  46 0x0800-0x0fff can translated to the PIO FIFO.  Thus memory operations (faster
  47 with *some* PCcard bridges) may be used instead of I/O operations.
  48 This is enabled by setting the 0x10 bit in the PCMCIA LAN COR.
  49 
  50 Some slow PC card bridges work better if they never see a WAIT signal.
  51 This is configured by setting the 0x20 bit in the PCMCIA LAN COR.
  52 Only do this after testing that it is reliable and improves performance.
  53 
  54 The upper five bits of RunnerRdCtrl are used to window into PCcard
  55 configuration space registers.  Window 0 is the regular Boomerang/Odie
  56 register set, 1-5 are various PC card control registers, and 16-31 are
  57 the (reversed!) CIS table.
  58 
  59 A final note: writing the InternalConfig register in window 3 with an
  60 invalid ramWidth is Very Bad.
  61 
  62 V. References
  63 
  64 http://www.scyld.com/expert/NWay.html
  65 http://www.national.com/opf/DP/DP83840A.html
  66 
  67 Thanks to Terry Murphy of 3Com for providing development information for
  68 earlier 3Com products.
  69 
  70 */
  71 
  72 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  73 
  74 #include <linux/module.h>
  75 #include <linux/kernel.h>
  76 #include <linux/slab.h>
  77 #include <linux/string.h>
  78 #include <linux/timer.h>
  79 #include <linux/interrupt.h>
  80 #include <linux/in.h>
  81 #include <linux/delay.h>
  82 #include <linux/netdevice.h>
  83 #include <linux/etherdevice.h>
  84 #include <linux/skbuff.h>
  85 #include <linux/if_arp.h>
  86 #include <linux/ioport.h>
  87 #include <linux/bitops.h>
  88 #include <linux/mii.h>
  89 
  90 #include <pcmcia/cistpl.h>
  91 #include <pcmcia/cisreg.h>
  92 #include <pcmcia/ciscode.h>
  93 #include <pcmcia/ds.h>
  94 
  95 #include <linux/uaccess.h>
  96 #include <asm/io.h>
  97 
  98 /*====================================================================*/
  99 
 100 /* Module parameters */
 101 
 102 MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
 103 MODULE_DESCRIPTION("3Com 3c574 series PCMCIA ethernet driver");
 104 MODULE_LICENSE("GPL");
 105 
 106 #define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0)
 107 
 108 /* Maximum events (Rx packets, etc.) to handle at each interrupt. */
 109 INT_MODULE_PARM(max_interrupt_work, 32);
 110 
 111 /* Force full duplex modes? */
 112 INT_MODULE_PARM(full_duplex, 0);
 113 
 114 /* Autodetect link polarity reversal? */
 115 INT_MODULE_PARM(auto_polarity, 1);
 116 
 117 
 118 /*====================================================================*/
 119 
 120 /* Time in jiffies before concluding the transmitter is hung. */
 121 #define TX_TIMEOUT  ((800*HZ)/1000)
 122 
 123 /* To minimize the size of the driver source and make the driver more
 124    readable not all constants are symbolically defined.
 125    You'll need the manual if you want to understand driver details anyway. */
 126 /* Offsets from base I/O address. */
 127 #define EL3_DATA        0x00
 128 #define EL3_CMD         0x0e
 129 #define EL3_STATUS      0x0e
 130 
 131 #define EL3WINDOW(win_num) outw(SelectWindow + (win_num), ioaddr + EL3_CMD)
 132 
 133 /* The top five bits written to EL3_CMD are a command, the lower
 134    11 bits are the parameter, if applicable. */
 135 enum el3_cmds {
 136         TotalReset = 0<<11, SelectWindow = 1<<11, StartCoax = 2<<11,
 137         RxDisable = 3<<11, RxEnable = 4<<11, RxReset = 5<<11, RxDiscard = 8<<11,
 138         TxEnable = 9<<11, TxDisable = 10<<11, TxReset = 11<<11,
 139         FakeIntr = 12<<11, AckIntr = 13<<11, SetIntrEnb = 14<<11,
 140         SetStatusEnb = 15<<11, SetRxFilter = 16<<11, SetRxThreshold = 17<<11,
 141         SetTxThreshold = 18<<11, SetTxStart = 19<<11, StatsEnable = 21<<11,
 142         StatsDisable = 22<<11, StopCoax = 23<<11,
 143 };
 144 
 145 enum elxl_status {
 146         IntLatch = 0x0001, AdapterFailure = 0x0002, TxComplete = 0x0004,
 147         TxAvailable = 0x0008, RxComplete = 0x0010, RxEarly = 0x0020,
 148         IntReq = 0x0040, StatsFull = 0x0080, CmdBusy = 0x1000 };
 149 
 150 /* The SetRxFilter command accepts the following classes: */
 151 enum RxFilter {
 152         RxStation = 1, RxMulticast = 2, RxBroadcast = 4, RxProm = 8
 153 };
 154 
 155 enum Window0 {
 156         Wn0EepromCmd = 10, Wn0EepromData = 12, /* EEPROM command/address, data. */
 157         IntrStatus=0x0E,                /* Valid in all windows. */
 158 };
 159 /* These assumes the larger EEPROM. */
 160 enum Win0_EEPROM_cmds {
 161         EEPROM_Read = 0x200, EEPROM_WRITE = 0x100, EEPROM_ERASE = 0x300,
 162         EEPROM_EWENB = 0x30,            /* Enable erasing/writing for 10 msec. */
 163         EEPROM_EWDIS = 0x00,            /* Disable EWENB before 10 msec timeout. */
 164 };
 165 
 166 /* Register window 1 offsets, the window used in normal operation.
 167    On the "Odie" this window is always mapped at offsets 0x10-0x1f.
 168    Except for TxFree, which is overlapped by RunnerWrCtrl. */
 169 enum Window1 {
 170         TX_FIFO = 0x10,  RX_FIFO = 0x10,  RxErrors = 0x14,
 171         RxStatus = 0x18,  Timer=0x1A, TxStatus = 0x1B,
 172         TxFree = 0x0C, /* Remaining free bytes in Tx buffer. */
 173         RunnerRdCtrl = 0x16, RunnerWrCtrl = 0x1c,
 174 };
 175 
 176 enum Window3 {                  /* Window 3: MAC/config bits. */
 177         Wn3_Config=0, Wn3_MAC_Ctrl=6, Wn3_Options=8,
 178 };
 179 enum wn3_config {
 180         Ram_size = 7,
 181         Ram_width = 8,
 182         Ram_speed = 0x30,
 183         Rom_size = 0xc0,
 184         Ram_split_shift = 16,
 185         Ram_split = 3 << Ram_split_shift,
 186         Xcvr_shift = 20,
 187         Xcvr = 7 << Xcvr_shift,
 188         Autoselect = 0x1000000,
 189 };
 190 
 191 enum Window4 {          /* Window 4: Xcvr/media bits. */
 192         Wn4_FIFODiag = 4, Wn4_NetDiag = 6, Wn4_PhysicalMgmt=8, Wn4_Media = 10,
 193 };
 194 
 195 #define MEDIA_TP        0x00C0  /* Enable link beat and jabber for 10baseT. */
 196 
 197 struct el3_private {
 198         struct pcmcia_device    *p_dev;
 199         u16 advertising, partner;               /* NWay media advertisement */
 200         unsigned char phys;                     /* MII device address */
 201         unsigned int autoselect:1, default_media:3;     /* Read from the EEPROM/Wn3_Config. */
 202         /* for transceiver monitoring */
 203         struct timer_list media;
 204         unsigned short media_status;
 205         unsigned short fast_poll;
 206         unsigned long last_irq;
 207         spinlock_t window_lock;                 /* Guards the Window selection */
 208 };
 209 
 210 /* Set iff a MII transceiver on any interface requires mdio preamble.
 211    This only set with the original DP83840 on older 3c905 boards, so the extra
 212    code size of a per-interface flag is not worthwhile. */
 213 static char mii_preamble_required = 0;
 214 
 215 /* Index of functions. */
 216 
 217 static int tc574_config(struct pcmcia_device *link);
 218 static void tc574_release(struct pcmcia_device *link);
 219 
 220 static void mdio_sync(unsigned int ioaddr, int bits);
 221 static int mdio_read(unsigned int ioaddr, int phy_id, int location);
 222 static void mdio_write(unsigned int ioaddr, int phy_id, int location,
 223                        int value);
 224 static unsigned short read_eeprom(unsigned int ioaddr, int index);
 225 static void tc574_wait_for_completion(struct net_device *dev, int cmd);
 226 
 227 static void tc574_reset(struct net_device *dev);
 228 static void media_check(struct timer_list *t);
 229 static int el3_open(struct net_device *dev);
 230 static netdev_tx_t el3_start_xmit(struct sk_buff *skb,
 231                                         struct net_device *dev);
 232 static irqreturn_t el3_interrupt(int irq, void *dev_id);
 233 static void update_stats(struct net_device *dev);
 234 static struct net_device_stats *el3_get_stats(struct net_device *dev);
 235 static int el3_rx(struct net_device *dev, int worklimit);
 236 static int el3_close(struct net_device *dev);
 237 static void el3_tx_timeout(struct net_device *dev);
 238 static int el3_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
 239 static void set_rx_mode(struct net_device *dev);
 240 static void set_multicast_list(struct net_device *dev);
 241 
 242 static void tc574_detach(struct pcmcia_device *p_dev);
 243 
 244 /*
 245         tc574_attach() creates an "instance" of the driver, allocating
 246         local data structures for one device.  The device is registered
 247         with Card Services.
 248 */
 249 static const struct net_device_ops el3_netdev_ops = {
 250         .ndo_open               = el3_open,
 251         .ndo_stop               = el3_close,
 252         .ndo_start_xmit         = el3_start_xmit,
 253         .ndo_tx_timeout         = el3_tx_timeout,
 254         .ndo_get_stats          = el3_get_stats,
 255         .ndo_do_ioctl           = el3_ioctl,
 256         .ndo_set_rx_mode        = set_multicast_list,
 257         .ndo_set_mac_address    = eth_mac_addr,
 258         .ndo_validate_addr      = eth_validate_addr,
 259 };
 260 
 261 static int tc574_probe(struct pcmcia_device *link)
 262 {
 263         struct el3_private *lp;
 264         struct net_device *dev;
 265 
 266         dev_dbg(&link->dev, "3c574_attach()\n");
 267 
 268         /* Create the PC card device object. */
 269         dev = alloc_etherdev(sizeof(struct el3_private));
 270         if (!dev)
 271                 return -ENOMEM;
 272         lp = netdev_priv(dev);
 273         link->priv = dev;
 274         lp->p_dev = link;
 275 
 276         spin_lock_init(&lp->window_lock);
 277         link->resource[0]->end = 32;
 278         link->resource[0]->flags |= IO_DATA_PATH_WIDTH_16;
 279         link->config_flags |= CONF_ENABLE_IRQ;
 280         link->config_index = 1;
 281 
 282         dev->netdev_ops = &el3_netdev_ops;
 283         dev->watchdog_timeo = TX_TIMEOUT;
 284 
 285         return tc574_config(link);
 286 }
 287 
 288 static void tc574_detach(struct pcmcia_device *link)
 289 {
 290         struct net_device *dev = link->priv;
 291 
 292         dev_dbg(&link->dev, "3c574_detach()\n");
 293 
 294         unregister_netdev(dev);
 295 
 296         tc574_release(link);
 297 
 298         free_netdev(dev);
 299 } /* tc574_detach */
 300 
 301 static const char *ram_split[] = {"5:3", "3:1", "1:1", "3:5"};
 302 
 303 static int tc574_config(struct pcmcia_device *link)
 304 {
 305         struct net_device *dev = link->priv;
 306         struct el3_private *lp = netdev_priv(dev);
 307         int ret, i, j;
 308         unsigned int ioaddr;
 309         __be16 *phys_addr;
 310         char *cardname;
 311         __u32 config;
 312         u8 *buf;
 313         size_t len;
 314 
 315         phys_addr = (__be16 *)dev->dev_addr;
 316 
 317         dev_dbg(&link->dev, "3c574_config()\n");
 318 
 319         link->io_lines = 16;
 320 
 321         for (i = j = 0; j < 0x400; j += 0x20) {
 322                 link->resource[0]->start = j ^ 0x300;
 323                 i = pcmcia_request_io(link);
 324                 if (i == 0)
 325                         break;
 326         }
 327         if (i != 0)
 328                 goto failed;
 329 
 330         ret = pcmcia_request_irq(link, el3_interrupt);
 331         if (ret)
 332                 goto failed;
 333 
 334         ret = pcmcia_enable_device(link);
 335         if (ret)
 336                 goto failed;
 337 
 338         dev->irq = link->irq;
 339         dev->base_addr = link->resource[0]->start;
 340 
 341         ioaddr = dev->base_addr;
 342 
 343         /* The 3c574 normally uses an EEPROM for configuration info, including
 344            the hardware address.  The future products may include a modem chip
 345            and put the address in the CIS. */
 346 
 347         len = pcmcia_get_tuple(link, 0x88, &buf);
 348         if (buf && len >= 6) {
 349                 for (i = 0; i < 3; i++)
 350                         phys_addr[i] = htons(le16_to_cpu(buf[i * 2]));
 351                 kfree(buf);
 352         } else {
 353                 kfree(buf); /* 0 < len < 6 */
 354                 EL3WINDOW(0);
 355                 for (i = 0; i < 3; i++)
 356                         phys_addr[i] = htons(read_eeprom(ioaddr, i + 10));
 357                 if (phys_addr[0] == htons(0x6060)) {
 358                         pr_notice("IO port conflict at 0x%03lx-0x%03lx\n",
 359                                   dev->base_addr, dev->base_addr+15);
 360                         goto failed;
 361                 }
 362         }
 363         if (link->prod_id[1])
 364                 cardname = link->prod_id[1];
 365         else
 366                 cardname = "3Com 3c574";
 367 
 368         {
 369                 u_char mcr;
 370                 outw(2<<11, ioaddr + RunnerRdCtrl);
 371                 mcr = inb(ioaddr + 2);
 372                 outw(0<<11, ioaddr + RunnerRdCtrl);
 373                 pr_info("  ASIC rev %d,", mcr>>3);
 374                 EL3WINDOW(3);
 375                 config = inl(ioaddr + Wn3_Config);
 376                 lp->default_media = (config & Xcvr) >> Xcvr_shift;
 377                 lp->autoselect = config & Autoselect ? 1 : 0;
 378         }
 379 
 380         timer_setup(&lp->media, media_check, 0);
 381 
 382         {
 383                 int phy;
 384                 
 385                 /* Roadrunner only: Turn on the MII transceiver */
 386                 outw(0x8040, ioaddr + Wn3_Options);
 387                 mdelay(1);
 388                 outw(0xc040, ioaddr + Wn3_Options);
 389                 tc574_wait_for_completion(dev, TxReset);
 390                 tc574_wait_for_completion(dev, RxReset);
 391                 mdelay(1);
 392                 outw(0x8040, ioaddr + Wn3_Options);
 393                 
 394                 EL3WINDOW(4);
 395                 for (phy = 1; phy <= 32; phy++) {
 396                         int mii_status;
 397                         mdio_sync(ioaddr, 32);
 398                         mii_status = mdio_read(ioaddr, phy & 0x1f, 1);
 399                         if (mii_status != 0xffff) {
 400                                 lp->phys = phy & 0x1f;
 401                                 dev_dbg(&link->dev, "  MII transceiver at "
 402                                         "index %d, status %x.\n",
 403                                           phy, mii_status);
 404                                 if ((mii_status & 0x0040) == 0)
 405                                         mii_preamble_required = 1;
 406                                 break;
 407                         }
 408                 }
 409                 if (phy > 32) {
 410                         pr_notice("  No MII transceivers found!\n");
 411                         goto failed;
 412                 }
 413                 i = mdio_read(ioaddr, lp->phys, 16) | 0x40;
 414                 mdio_write(ioaddr, lp->phys, 16, i);
 415                 lp->advertising = mdio_read(ioaddr, lp->phys, 4);
 416                 if (full_duplex) {
 417                         /* Only advertise the FD media types. */
 418                         lp->advertising &= ~0x02a0;
 419                         mdio_write(ioaddr, lp->phys, 4, lp->advertising);
 420                 }
 421         }
 422 
 423         SET_NETDEV_DEV(dev, &link->dev);
 424 
 425         if (register_netdev(dev) != 0) {
 426                 pr_notice("register_netdev() failed\n");
 427                 goto failed;
 428         }
 429 
 430         netdev_info(dev, "%s at io %#3lx, irq %d, hw_addr %pM\n",
 431                     cardname, dev->base_addr, dev->irq, dev->dev_addr);
 432         netdev_info(dev, " %dK FIFO split %s Rx:Tx, %sMII interface.\n",
 433                     8 << (config & Ram_size),
 434                     ram_split[(config & Ram_split) >> Ram_split_shift],
 435                     config & Autoselect ? "autoselect " : "");
 436 
 437         return 0;
 438 
 439 failed:
 440         tc574_release(link);
 441         return -ENODEV;
 442 
 443 } /* tc574_config */
 444 
 445 static void tc574_release(struct pcmcia_device *link)
 446 {
 447         pcmcia_disable_device(link);
 448 }
 449 
 450 static int tc574_suspend(struct pcmcia_device *link)
 451 {
 452         struct net_device *dev = link->priv;
 453 
 454         if (link->open)
 455                 netif_device_detach(dev);
 456 
 457         return 0;
 458 }
 459 
 460 static int tc574_resume(struct pcmcia_device *link)
 461 {
 462         struct net_device *dev = link->priv;
 463 
 464         if (link->open) {
 465                 tc574_reset(dev);
 466                 netif_device_attach(dev);
 467         }
 468 
 469         return 0;
 470 }
 471 
 472 static void dump_status(struct net_device *dev)
 473 {
 474         unsigned int ioaddr = dev->base_addr;
 475         EL3WINDOW(1);
 476         netdev_info(dev, "  irq status %04x, rx status %04x, tx status %02x, tx free %04x\n",
 477                     inw(ioaddr+EL3_STATUS),
 478                     inw(ioaddr+RxStatus), inb(ioaddr+TxStatus),
 479                     inw(ioaddr+TxFree));
 480         EL3WINDOW(4);
 481         netdev_info(dev, "  diagnostics: fifo %04x net %04x ethernet %04x media %04x\n",
 482                     inw(ioaddr+0x04), inw(ioaddr+0x06),
 483                     inw(ioaddr+0x08), inw(ioaddr+0x0a));
 484         EL3WINDOW(1);
 485 }
 486 
 487 /*
 488   Use this for commands that may take time to finish
 489 */
 490 static void tc574_wait_for_completion(struct net_device *dev, int cmd)
 491 {
 492         int i = 1500;
 493         outw(cmd, dev->base_addr + EL3_CMD);
 494         while (--i > 0)
 495                 if (!(inw(dev->base_addr + EL3_STATUS) & 0x1000)) break;
 496         if (i == 0)
 497                 netdev_notice(dev, "command 0x%04x did not complete!\n", cmd);
 498 }
 499 
 500 /* Read a word from the EEPROM using the regular EEPROM access register.
 501    Assume that we are in register window zero.
 502  */
 503 static unsigned short read_eeprom(unsigned int ioaddr, int index)
 504 {
 505         int timer;
 506         outw(EEPROM_Read + index, ioaddr + Wn0EepromCmd);
 507         /* Pause for at least 162 usec for the read to take place. */
 508         for (timer = 1620; timer >= 0; timer--) {
 509                 if ((inw(ioaddr + Wn0EepromCmd) & 0x8000) == 0)
 510                         break;
 511         }
 512         return inw(ioaddr + Wn0EepromData);
 513 }
 514 
 515 /* MII transceiver control section.
 516    Read and write the MII registers using software-generated serial
 517    MDIO protocol.  See the MII specifications or DP83840A data sheet
 518    for details.
 519    The maxium data clock rate is 2.5 Mhz.  The timing is easily met by the
 520    slow PC card interface. */
 521 
 522 #define MDIO_SHIFT_CLK  0x01
 523 #define MDIO_DIR_WRITE  0x04
 524 #define MDIO_DATA_WRITE0 (0x00 | MDIO_DIR_WRITE)
 525 #define MDIO_DATA_WRITE1 (0x02 | MDIO_DIR_WRITE)
 526 #define MDIO_DATA_READ  0x02
 527 #define MDIO_ENB_IN             0x00
 528 
 529 /* Generate the preamble required for initial synchronization and
 530    a few older transceivers. */
 531 static void mdio_sync(unsigned int ioaddr, int bits)
 532 {
 533         unsigned int mdio_addr = ioaddr + Wn4_PhysicalMgmt;
 534 
 535         /* Establish sync by sending at least 32 logic ones. */
 536         while (-- bits >= 0) {
 537                 outw(MDIO_DATA_WRITE1, mdio_addr);
 538                 outw(MDIO_DATA_WRITE1 | MDIO_SHIFT_CLK, mdio_addr);
 539         }
 540 }
 541 
 542 static int mdio_read(unsigned int ioaddr, int phy_id, int location)
 543 {
 544         int i;
 545         int read_cmd = (0xf6 << 10) | (phy_id << 5) | location;
 546         unsigned int retval = 0;
 547         unsigned int mdio_addr = ioaddr + Wn4_PhysicalMgmt;
 548 
 549         if (mii_preamble_required)
 550                 mdio_sync(ioaddr, 32);
 551 
 552         /* Shift the read command bits out. */
 553         for (i = 14; i >= 0; i--) {
 554                 int dataval = (read_cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0;
 555                 outw(dataval, mdio_addr);
 556                 outw(dataval | MDIO_SHIFT_CLK, mdio_addr);
 557         }
 558         /* Read the two transition, 16 data, and wire-idle bits. */
 559         for (i = 19; i > 0; i--) {
 560                 outw(MDIO_ENB_IN, mdio_addr);
 561                 retval = (retval << 1) | ((inw(mdio_addr) & MDIO_DATA_READ) ? 1 : 0);
 562                 outw(MDIO_ENB_IN | MDIO_SHIFT_CLK, mdio_addr);
 563         }
 564         return (retval>>1) & 0xffff;
 565 }
 566 
 567 static void mdio_write(unsigned int ioaddr, int phy_id, int location, int value)
 568 {
 569         int write_cmd = 0x50020000 | (phy_id << 23) | (location << 18) | value;
 570         unsigned int mdio_addr = ioaddr + Wn4_PhysicalMgmt;
 571         int i;
 572 
 573         if (mii_preamble_required)
 574                 mdio_sync(ioaddr, 32);
 575 
 576         /* Shift the command bits out. */
 577         for (i = 31; i >= 0; i--) {
 578                 int dataval = (write_cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0;
 579                 outw(dataval, mdio_addr);
 580                 outw(dataval | MDIO_SHIFT_CLK, mdio_addr);
 581         }
 582         /* Leave the interface idle. */
 583         for (i = 1; i >= 0; i--) {
 584                 outw(MDIO_ENB_IN, mdio_addr);
 585                 outw(MDIO_ENB_IN | MDIO_SHIFT_CLK, mdio_addr);
 586         }
 587 }
 588 
 589 /* Reset and restore all of the 3c574 registers. */
 590 static void tc574_reset(struct net_device *dev)
 591 {
 592         struct el3_private *lp = netdev_priv(dev);
 593         int i;
 594         unsigned int ioaddr = dev->base_addr;
 595         unsigned long flags;
 596 
 597         tc574_wait_for_completion(dev, TotalReset|0x10);
 598 
 599         spin_lock_irqsave(&lp->window_lock, flags);
 600         /* Clear any transactions in progress. */
 601         outw(0, ioaddr + RunnerWrCtrl);
 602         outw(0, ioaddr + RunnerRdCtrl);
 603 
 604         /* Set the station address and mask. */
 605         EL3WINDOW(2);
 606         for (i = 0; i < 6; i++)
 607                 outb(dev->dev_addr[i], ioaddr + i);
 608         for (; i < 12; i+=2)
 609                 outw(0, ioaddr + i);
 610 
 611         /* Reset config options */
 612         EL3WINDOW(3);
 613         outb((dev->mtu > 1500 ? 0x40 : 0), ioaddr + Wn3_MAC_Ctrl);
 614         outl((lp->autoselect ? 0x01000000 : 0) | 0x0062001b,
 615                  ioaddr + Wn3_Config);
 616         /* Roadrunner only: Turn on the MII transceiver. */
 617         outw(0x8040, ioaddr + Wn3_Options);
 618         mdelay(1);
 619         outw(0xc040, ioaddr + Wn3_Options);
 620         EL3WINDOW(1);
 621         spin_unlock_irqrestore(&lp->window_lock, flags);
 622         
 623         tc574_wait_for_completion(dev, TxReset);
 624         tc574_wait_for_completion(dev, RxReset);
 625         mdelay(1);
 626         spin_lock_irqsave(&lp->window_lock, flags);
 627         EL3WINDOW(3);
 628         outw(0x8040, ioaddr + Wn3_Options);
 629 
 630         /* Switch to the stats window, and clear all stats by reading. */
 631         outw(StatsDisable, ioaddr + EL3_CMD);
 632         EL3WINDOW(6);
 633         for (i = 0; i < 10; i++)
 634                 inb(ioaddr + i);
 635         inw(ioaddr + 10);
 636         inw(ioaddr + 12);
 637         EL3WINDOW(4);
 638         inb(ioaddr + 12);
 639         inb(ioaddr + 13);
 640 
 641         /* .. enable any extra statistics bits.. */
 642         outw(0x0040, ioaddr + Wn4_NetDiag);
 643         
 644         EL3WINDOW(1);
 645         spin_unlock_irqrestore(&lp->window_lock, flags);
 646         
 647         /* .. re-sync MII and re-fill what NWay is advertising. */
 648         mdio_sync(ioaddr, 32);
 649         mdio_write(ioaddr, lp->phys, 4, lp->advertising);
 650         if (!auto_polarity) {
 651                 /* works for TDK 78Q2120 series MII's */
 652                 i = mdio_read(ioaddr, lp->phys, 16) | 0x20;
 653                 mdio_write(ioaddr, lp->phys, 16, i);
 654         }
 655 
 656         spin_lock_irqsave(&lp->window_lock, flags);
 657         /* Switch to register set 1 for normal use, just for TxFree. */
 658         set_rx_mode(dev);
 659         spin_unlock_irqrestore(&lp->window_lock, flags);
 660         outw(StatsEnable, ioaddr + EL3_CMD); /* Turn on statistics. */
 661         outw(RxEnable, ioaddr + EL3_CMD); /* Enable the receiver. */
 662         outw(TxEnable, ioaddr + EL3_CMD); /* Enable transmitter. */
 663         /* Allow status bits to be seen. */
 664         outw(SetStatusEnb | 0xff, ioaddr + EL3_CMD);
 665         /* Ack all pending events, and set active indicator mask. */
 666         outw(AckIntr | IntLatch | TxAvailable | RxEarly | IntReq,
 667                  ioaddr + EL3_CMD);
 668         outw(SetIntrEnb | IntLatch | TxAvailable | RxComplete | StatsFull
 669                  | AdapterFailure | RxEarly, ioaddr + EL3_CMD);
 670 }
 671 
 672 static int el3_open(struct net_device *dev)
 673 {
 674         struct el3_private *lp = netdev_priv(dev);
 675         struct pcmcia_device *link = lp->p_dev;
 676 
 677         if (!pcmcia_dev_present(link))
 678                 return -ENODEV;
 679         
 680         link->open++;
 681         netif_start_queue(dev);
 682         
 683         tc574_reset(dev);
 684         lp->media.expires = jiffies + HZ;
 685         add_timer(&lp->media);
 686         
 687         dev_dbg(&link->dev, "%s: opened, status %4.4x.\n",
 688                   dev->name, inw(dev->base_addr + EL3_STATUS));
 689         
 690         return 0;
 691 }
 692 
 693 static void el3_tx_timeout(struct net_device *dev)
 694 {
 695         unsigned int ioaddr = dev->base_addr;
 696         
 697         netdev_notice(dev, "Transmit timed out!\n");
 698         dump_status(dev);
 699         dev->stats.tx_errors++;
 700         netif_trans_update(dev); /* prevent tx timeout */
 701         /* Issue TX_RESET and TX_START commands. */
 702         tc574_wait_for_completion(dev, TxReset);
 703         outw(TxEnable, ioaddr + EL3_CMD);
 704         netif_wake_queue(dev);
 705 }
 706 
 707 static void pop_tx_status(struct net_device *dev)
 708 {
 709         unsigned int ioaddr = dev->base_addr;
 710         int i;
 711     
 712         /* Clear the Tx status stack. */
 713         for (i = 32; i > 0; i--) {
 714                 u_char tx_status = inb(ioaddr + TxStatus);
 715                 if (!(tx_status & 0x84))
 716                         break;
 717                 /* reset transmitter on jabber error or underrun */
 718                 if (tx_status & 0x30)
 719                         tc574_wait_for_completion(dev, TxReset);
 720                 if (tx_status & 0x38) {
 721                         pr_debug("%s: transmit error: status 0x%02x\n",
 722                                   dev->name, tx_status);
 723                         outw(TxEnable, ioaddr + EL3_CMD);
 724                         dev->stats.tx_aborted_errors++;
 725                 }
 726                 outb(0x00, ioaddr + TxStatus); /* Pop the status stack. */
 727         }
 728 }
 729 
 730 static netdev_tx_t el3_start_xmit(struct sk_buff *skb,
 731                                         struct net_device *dev)
 732 {
 733         unsigned int ioaddr = dev->base_addr;
 734         struct el3_private *lp = netdev_priv(dev);
 735         unsigned long flags;
 736 
 737         pr_debug("%s: el3_start_xmit(length = %ld) called, "
 738                   "status %4.4x.\n", dev->name, (long)skb->len,
 739                   inw(ioaddr + EL3_STATUS));
 740 
 741         spin_lock_irqsave(&lp->window_lock, flags);
 742 
 743         dev->stats.tx_bytes += skb->len;
 744 
 745         /* Put out the doubleword header... */
 746         outw(skb->len, ioaddr + TX_FIFO);
 747         outw(0, ioaddr + TX_FIFO);
 748         /* ... and the packet rounded to a doubleword. */
 749         outsl(ioaddr + TX_FIFO, skb->data, (skb->len+3)>>2);
 750 
 751         /* TxFree appears only in Window 1, not offset 0x1c. */
 752         if (inw(ioaddr + TxFree) <= 1536) {
 753                 netif_stop_queue(dev);
 754                 /* Interrupt us when the FIFO has room for max-sized packet. 
 755                    The threshold is in units of dwords. */
 756                 outw(SetTxThreshold + (1536>>2), ioaddr + EL3_CMD);
 757         }
 758 
 759         pop_tx_status(dev);
 760         spin_unlock_irqrestore(&lp->window_lock, flags);
 761         dev_kfree_skb(skb);
 762         return NETDEV_TX_OK;
 763 }
 764 
 765 /* The EL3 interrupt handler. */
 766 static irqreturn_t el3_interrupt(int irq, void *dev_id)
 767 {
 768         struct net_device *dev = (struct net_device *) dev_id;
 769         struct el3_private *lp = netdev_priv(dev);
 770         unsigned int ioaddr;
 771         unsigned status;
 772         int work_budget = max_interrupt_work;
 773         int handled = 0;
 774 
 775         if (!netif_device_present(dev))
 776                 return IRQ_NONE;
 777         ioaddr = dev->base_addr;
 778 
 779         pr_debug("%s: interrupt, status %4.4x.\n",
 780                   dev->name, inw(ioaddr + EL3_STATUS));
 781 
 782         spin_lock(&lp->window_lock);
 783         
 784         while ((status = inw(ioaddr + EL3_STATUS)) &
 785                    (IntLatch | RxComplete | RxEarly | StatsFull)) {
 786                 if (!netif_device_present(dev) ||
 787                         ((status & 0xe000) != 0x2000)) {
 788                         pr_debug("%s: Interrupt from dead card\n", dev->name);
 789                         break;
 790                 }
 791 
 792                 handled = 1;
 793 
 794                 if (status & RxComplete)
 795                         work_budget = el3_rx(dev, work_budget);
 796 
 797                 if (status & TxAvailable) {
 798                         pr_debug("  TX room bit was handled.\n");
 799                         /* There's room in the FIFO for a full-sized packet. */
 800                         outw(AckIntr | TxAvailable, ioaddr + EL3_CMD);
 801                         netif_wake_queue(dev);
 802                 }
 803 
 804                 if (status & TxComplete)
 805                         pop_tx_status(dev);
 806 
 807                 if (status & (AdapterFailure | RxEarly | StatsFull)) {
 808                         /* Handle all uncommon interrupts. */
 809                         if (status & StatsFull)
 810                                 update_stats(dev);
 811                         if (status & RxEarly) {
 812                                 work_budget = el3_rx(dev, work_budget);
 813                                 outw(AckIntr | RxEarly, ioaddr + EL3_CMD);
 814                         }
 815                         if (status & AdapterFailure) {
 816                                 u16 fifo_diag;
 817                                 EL3WINDOW(4);
 818                                 fifo_diag = inw(ioaddr + Wn4_FIFODiag);
 819                                 EL3WINDOW(1);
 820                                 netdev_notice(dev, "adapter failure, FIFO diagnostic register %04x\n",
 821                                               fifo_diag);
 822                                 if (fifo_diag & 0x0400) {
 823                                         /* Tx overrun */
 824                                         tc574_wait_for_completion(dev, TxReset);
 825                                         outw(TxEnable, ioaddr + EL3_CMD);
 826                                 }
 827                                 if (fifo_diag & 0x2000) {
 828                                         /* Rx underrun */
 829                                         tc574_wait_for_completion(dev, RxReset);
 830                                         set_rx_mode(dev);
 831                                         outw(RxEnable, ioaddr + EL3_CMD);
 832                                 }
 833                                 outw(AckIntr | AdapterFailure, ioaddr + EL3_CMD);
 834                         }
 835                 }
 836 
 837                 if (--work_budget < 0) {
 838                         pr_debug("%s: Too much work in interrupt, "
 839                                   "status %4.4x.\n", dev->name, status);
 840                         /* Clear all interrupts */
 841                         outw(AckIntr | 0xFF, ioaddr + EL3_CMD);
 842                         break;
 843                 }
 844                 /* Acknowledge the IRQ. */
 845                 outw(AckIntr | IntReq | IntLatch, ioaddr + EL3_CMD);
 846         }
 847 
 848         pr_debug("%s: exiting interrupt, status %4.4x.\n",
 849                   dev->name, inw(ioaddr + EL3_STATUS));
 850                   
 851         spin_unlock(&lp->window_lock);
 852         return IRQ_RETVAL(handled);
 853 }
 854 
 855 /*
 856     This timer serves two purposes: to check for missed interrupts
 857         (and as a last resort, poll the NIC for events), and to monitor
 858         the MII, reporting changes in cable status.
 859 */
 860 static void media_check(struct timer_list *t)
 861 {
 862         struct el3_private *lp = from_timer(lp, t, media);
 863         struct net_device *dev = lp->p_dev->priv;
 864         unsigned int ioaddr = dev->base_addr;
 865         unsigned long flags;
 866         unsigned short /* cable, */ media, partner;
 867 
 868         if (!netif_device_present(dev))
 869                 goto reschedule;
 870         
 871         /* Check for pending interrupt with expired latency timer: with
 872            this, we can limp along even if the interrupt is blocked */
 873         if ((inw(ioaddr + EL3_STATUS) & IntLatch) && (inb(ioaddr + Timer) == 0xff)) {
 874                 if (!lp->fast_poll)
 875                         netdev_info(dev, "interrupt(s) dropped!\n");
 876 
 877                 local_irq_save(flags);
 878                 el3_interrupt(dev->irq, dev);
 879                 local_irq_restore(flags);
 880 
 881                 lp->fast_poll = HZ;
 882         }
 883         if (lp->fast_poll) {
 884                 lp->fast_poll--;
 885                 lp->media.expires = jiffies + 2*HZ/100;
 886                 add_timer(&lp->media);
 887                 return;
 888         }
 889 
 890         spin_lock_irqsave(&lp->window_lock, flags);
 891         EL3WINDOW(4);
 892         media = mdio_read(ioaddr, lp->phys, 1);
 893         partner = mdio_read(ioaddr, lp->phys, 5);
 894         EL3WINDOW(1);
 895         
 896         if (media != lp->media_status) {
 897                 if ((media ^ lp->media_status) & 0x0004)
 898                         netdev_info(dev, "%s link beat\n",
 899                                     (lp->media_status & 0x0004) ? "lost" : "found");
 900                 if ((media ^ lp->media_status) & 0x0020) {
 901                         lp->partner = 0;
 902                         if (lp->media_status & 0x0020) {
 903                                 netdev_info(dev, "autonegotiation restarted\n");
 904                         } else if (partner) {
 905                                 partner &= lp->advertising;
 906                                 lp->partner = partner;
 907                                 netdev_info(dev, "autonegotiation complete: "
 908                                             "%dbaseT-%cD selected\n",
 909                                             (partner & 0x0180) ? 100 : 10,
 910                                             (partner & 0x0140) ? 'F' : 'H');
 911                         } else {
 912                                 netdev_info(dev, "link partner did not autonegotiate\n");
 913                         }
 914 
 915                         EL3WINDOW(3);
 916                         outb((partner & 0x0140 ? 0x20 : 0) |
 917                                  (dev->mtu > 1500 ? 0x40 : 0), ioaddr + Wn3_MAC_Ctrl);
 918                         EL3WINDOW(1);
 919 
 920                 }
 921                 if (media & 0x0010)
 922                         netdev_info(dev, "remote fault detected\n");
 923                 if (media & 0x0002)
 924                         netdev_info(dev, "jabber detected\n");
 925                 lp->media_status = media;
 926         }
 927         spin_unlock_irqrestore(&lp->window_lock, flags);
 928 
 929 reschedule:
 930         lp->media.expires = jiffies + HZ;
 931         add_timer(&lp->media);
 932 }
 933 
 934 static struct net_device_stats *el3_get_stats(struct net_device *dev)
 935 {
 936         struct el3_private *lp = netdev_priv(dev);
 937 
 938         if (netif_device_present(dev)) {
 939                 unsigned long flags;
 940                 spin_lock_irqsave(&lp->window_lock, flags);
 941                 update_stats(dev);
 942                 spin_unlock_irqrestore(&lp->window_lock, flags);
 943         }
 944         return &dev->stats;
 945 }
 946 
 947 /*  Update statistics.
 948         Surprisingly this need not be run single-threaded, but it effectively is.
 949         The counters clear when read, so the adds must merely be atomic.
 950  */
 951 static void update_stats(struct net_device *dev)
 952 {
 953         unsigned int ioaddr = dev->base_addr;
 954         u8 rx, tx, up;
 955 
 956         pr_debug("%s: updating the statistics.\n", dev->name);
 957 
 958         if (inw(ioaddr+EL3_STATUS) == 0xffff) /* No card. */
 959                 return;
 960                 
 961         /* Unlike the 3c509 we need not turn off stats updates while reading. */
 962         /* Switch to the stats window, and read everything. */
 963         EL3WINDOW(6);
 964         dev->stats.tx_carrier_errors            += inb(ioaddr + 0);
 965         dev->stats.tx_heartbeat_errors          += inb(ioaddr + 1);
 966         /* Multiple collisions. */              inb(ioaddr + 2);
 967         dev->stats.collisions                   += inb(ioaddr + 3);
 968         dev->stats.tx_window_errors             += inb(ioaddr + 4);
 969         dev->stats.rx_fifo_errors               += inb(ioaddr + 5);
 970         dev->stats.tx_packets                   += inb(ioaddr + 6);
 971         up                                       = inb(ioaddr + 9);
 972         dev->stats.tx_packets                   += (up&0x30) << 4;
 973         /* Rx packets   */                         inb(ioaddr + 7);
 974         /* Tx deferrals */                         inb(ioaddr + 8);
 975         rx                                       = inw(ioaddr + 10);
 976         tx                                       = inw(ioaddr + 12);
 977 
 978         EL3WINDOW(4);
 979         /* BadSSD */                               inb(ioaddr + 12);
 980         up                                       = inb(ioaddr + 13);
 981 
 982         EL3WINDOW(1);
 983 }
 984 
 985 static int el3_rx(struct net_device *dev, int worklimit)
 986 {
 987         unsigned int ioaddr = dev->base_addr;
 988         short rx_status;
 989         
 990         pr_debug("%s: in rx_packet(), status %4.4x, rx_status %4.4x.\n",
 991                   dev->name, inw(ioaddr+EL3_STATUS), inw(ioaddr+RxStatus));
 992         while (!((rx_status = inw(ioaddr + RxStatus)) & 0x8000) &&
 993                         worklimit > 0) {
 994                 worklimit--;
 995                 if (rx_status & 0x4000) { /* Error, update stats. */
 996                         short error = rx_status & 0x3800;
 997                         dev->stats.rx_errors++;
 998                         switch (error) {
 999                         case 0x0000:    dev->stats.rx_over_errors++; break;
1000                         case 0x0800:    dev->stats.rx_length_errors++; break;
1001                         case 0x1000:    dev->stats.rx_frame_errors++; break;
1002                         case 0x1800:    dev->stats.rx_length_errors++; break;
1003                         case 0x2000:    dev->stats.rx_frame_errors++; break;
1004                         case 0x2800:    dev->stats.rx_crc_errors++; break;
1005                         }
1006                 } else {
1007                         short pkt_len = rx_status & 0x7ff;
1008                         struct sk_buff *skb;
1009 
1010                         skb = netdev_alloc_skb(dev, pkt_len + 5);
1011 
1012                         pr_debug("  Receiving packet size %d status %4.4x.\n",
1013                                   pkt_len, rx_status);
1014                         if (skb != NULL) {
1015                                 skb_reserve(skb, 2);
1016                                 insl(ioaddr+RX_FIFO, skb_put(skb, pkt_len),
1017                                                 ((pkt_len+3)>>2));
1018                                 skb->protocol = eth_type_trans(skb, dev);
1019                                 netif_rx(skb);
1020                                 dev->stats.rx_packets++;
1021                                 dev->stats.rx_bytes += pkt_len;
1022                         } else {
1023                                 pr_debug("%s: couldn't allocate a sk_buff of"
1024                                           " size %d.\n", dev->name, pkt_len);
1025                                 dev->stats.rx_dropped++;
1026                         }
1027                 }
1028                 tc574_wait_for_completion(dev, RxDiscard);
1029         }
1030 
1031         return worklimit;
1032 }
1033 
1034 /* Provide ioctl() calls to examine the MII xcvr state. */
1035 static int el3_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1036 {
1037         struct el3_private *lp = netdev_priv(dev);
1038         unsigned int ioaddr = dev->base_addr;
1039         struct mii_ioctl_data *data = if_mii(rq);
1040         int phy = lp->phys & 0x1f;
1041 
1042         pr_debug("%s: In ioct(%-.6s, %#4.4x) %4.4x %4.4x %4.4x %4.4x.\n",
1043                   dev->name, rq->ifr_ifrn.ifrn_name, cmd,
1044                   data->phy_id, data->reg_num, data->val_in, data->val_out);
1045 
1046         switch(cmd) {
1047         case SIOCGMIIPHY:               /* Get the address of the PHY in use. */
1048                 data->phy_id = phy;
1049                 /* fall through */
1050         case SIOCGMIIREG:               /* Read the specified MII register. */
1051                 {
1052                         int saved_window;
1053                         unsigned long flags;
1054 
1055                         spin_lock_irqsave(&lp->window_lock, flags);
1056                         saved_window = inw(ioaddr + EL3_CMD) >> 13;
1057                         EL3WINDOW(4);
1058                         data->val_out = mdio_read(ioaddr, data->phy_id & 0x1f,
1059                                                   data->reg_num & 0x1f);
1060                         EL3WINDOW(saved_window);
1061                         spin_unlock_irqrestore(&lp->window_lock, flags);
1062                         return 0;
1063                 }
1064         case SIOCSMIIREG:               /* Write the specified MII register */
1065                 {
1066                         int saved_window;
1067                        unsigned long flags;
1068 
1069                         spin_lock_irqsave(&lp->window_lock, flags);
1070                         saved_window = inw(ioaddr + EL3_CMD) >> 13;
1071                         EL3WINDOW(4);
1072                         mdio_write(ioaddr, data->phy_id & 0x1f,
1073                                    data->reg_num & 0x1f, data->val_in);
1074                         EL3WINDOW(saved_window);
1075                         spin_unlock_irqrestore(&lp->window_lock, flags);
1076                         return 0;
1077                 }
1078         default:
1079                 return -EOPNOTSUPP;
1080         }
1081 }
1082 
1083 /* The Odie chip has a 64 bin multicast filter, but the bit layout is not
1084    documented.  Until it is we revert to receiving all multicast frames when
1085    any multicast reception is desired.
1086    Note: My other drivers emit a log message whenever promiscuous mode is
1087    entered to help detect password sniffers.  This is less desirable on
1088    typical PC card machines, so we omit the message.
1089    */
1090 
1091 static void set_rx_mode(struct net_device *dev)
1092 {
1093         unsigned int ioaddr = dev->base_addr;
1094 
1095         if (dev->flags & IFF_PROMISC)
1096                 outw(SetRxFilter | RxStation | RxMulticast | RxBroadcast | RxProm,
1097                          ioaddr + EL3_CMD);
1098         else if (!netdev_mc_empty(dev) || (dev->flags & IFF_ALLMULTI))
1099                 outw(SetRxFilter|RxStation|RxMulticast|RxBroadcast, ioaddr + EL3_CMD);
1100         else
1101                 outw(SetRxFilter | RxStation | RxBroadcast, ioaddr + EL3_CMD);
1102 }
1103 
1104 static void set_multicast_list(struct net_device *dev)
1105 {
1106         struct el3_private *lp = netdev_priv(dev);
1107         unsigned long flags;
1108 
1109         spin_lock_irqsave(&lp->window_lock, flags);
1110         set_rx_mode(dev);
1111         spin_unlock_irqrestore(&lp->window_lock, flags);
1112 }
1113 
1114 static int el3_close(struct net_device *dev)
1115 {
1116         unsigned int ioaddr = dev->base_addr;
1117         struct el3_private *lp = netdev_priv(dev);
1118         struct pcmcia_device *link = lp->p_dev;
1119 
1120         dev_dbg(&link->dev, "%s: shutting down ethercard.\n", dev->name);
1121         
1122         if (pcmcia_dev_present(link)) {
1123                 unsigned long flags;
1124 
1125                 /* Turn off statistics ASAP.  We update lp->stats below. */
1126                 outw(StatsDisable, ioaddr + EL3_CMD);
1127                 
1128                 /* Disable the receiver and transmitter. */
1129                 outw(RxDisable, ioaddr + EL3_CMD);
1130                 outw(TxDisable, ioaddr + EL3_CMD);
1131                 
1132                 /* Note: Switching to window 0 may disable the IRQ. */
1133                 EL3WINDOW(0);
1134                 spin_lock_irqsave(&lp->window_lock, flags);
1135                 update_stats(dev);
1136                 spin_unlock_irqrestore(&lp->window_lock, flags);
1137 
1138                 /* force interrupts off */
1139                 outw(SetIntrEnb | 0x0000, ioaddr + EL3_CMD);
1140         }
1141 
1142         link->open--;
1143         netif_stop_queue(dev);
1144         del_timer_sync(&lp->media);
1145 
1146         return 0;
1147 }
1148 
1149 static const struct pcmcia_device_id tc574_ids[] = {
1150         PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0574),
1151         PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0101, 0x0556, "cis/3CCFEM556.cis"),
1152         PCMCIA_DEVICE_NULL,
1153 };
1154 MODULE_DEVICE_TABLE(pcmcia, tc574_ids);
1155 
1156 static struct pcmcia_driver tc574_driver = {
1157         .owner          = THIS_MODULE,
1158         .name           = "3c574_cs",
1159         .probe          = tc574_probe,
1160         .remove         = tc574_detach,
1161         .id_table       = tc574_ids,
1162         .suspend        = tc574_suspend,
1163         .resume         = tc574_resume,
1164 };
1165 module_pcmcia_driver(tc574_driver);

/* [<][>][^][v][top][bottom][index][help] */