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