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