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