pcmcia: convert pcmcia_request_configuration to pcmcia_enable_device
[pandora-kernel.git] / drivers / net / pcmcia / 3c589_cs.c
1 /*======================================================================
2
3     A PCMCIA ethernet driver for the 3com 3c589 card.
4
5     Copyright (C) 1999 David A. Hinds -- dahinds@users.sourceforge.net
6
7     3c589_cs.c 1.162 2001/10/13 00:08:50
8
9     The network driver code is based on Donald Becker's 3c589 code:
10
11     Written 1994 by Donald Becker.
12     Copyright 1993 United States Government as represented by the
13     Director, National Security Agency.  This software may be used and
14     distributed according to the terms of the GNU General Public License,
15     incorporated herein by reference.
16     Donald Becker may be reached at becker@scyld.com
17
18     Updated for 2.5.x by Alan Cox <alan@lxorguk.ukuu.org.uk>
19
20 ======================================================================*/
21
22 #define DRV_NAME        "3c589_cs"
23 #define DRV_VERSION     "1.162-ac"
24
25 #include <linux/module.h>
26 #include <linux/init.h>
27 #include <linux/kernel.h>
28 #include <linux/ptrace.h>
29 #include <linux/slab.h>
30 #include <linux/string.h>
31 #include <linux/timer.h>
32 #include <linux/interrupt.h>
33 #include <linux/in.h>
34 #include <linux/delay.h>
35 #include <linux/ethtool.h>
36 #include <linux/netdevice.h>
37 #include <linux/etherdevice.h>
38 #include <linux/skbuff.h>
39 #include <linux/if_arp.h>
40 #include <linux/ioport.h>
41 #include <linux/bitops.h>
42 #include <linux/jiffies.h>
43
44 #include <pcmcia/cistpl.h>
45 #include <pcmcia/cisreg.h>
46 #include <pcmcia/ciscode.h>
47 #include <pcmcia/ds.h>
48
49 #include <asm/uaccess.h>
50 #include <asm/io.h>
51 #include <asm/system.h>
52
53 /* To minimize the size of the driver source I only define operating
54    constants if they are used several times.  You'll need the manual
55    if you want to understand driver details. */
56 /* Offsets from base I/O address. */
57 #define EL3_DATA        0x00
58 #define EL3_TIMER       0x0a
59 #define EL3_CMD         0x0e
60 #define EL3_STATUS      0x0e
61
62 #define EEPROM_READ     0x0080
63 #define EEPROM_BUSY     0x8000
64
65 #define EL3WINDOW(win_num) outw(SelectWindow + (win_num), ioaddr + EL3_CMD)
66
67 /* The top five bits written to EL3_CMD are a command, the lower
68    11 bits are the parameter, if applicable. */
69 enum c509cmd {
70         TotalReset      = 0<<11,
71         SelectWindow    = 1<<11,
72         StartCoax       = 2<<11,
73         RxDisable       = 3<<11,
74         RxEnable        = 4<<11,
75         RxReset         = 5<<11,
76         RxDiscard       = 8<<11,
77         TxEnable        = 9<<11,
78         TxDisable       = 10<<11,
79         TxReset         = 11<<11,
80         FakeIntr        = 12<<11,
81         AckIntr         = 13<<11,
82         SetIntrEnb      = 14<<11,
83         SetStatusEnb    = 15<<11,
84         SetRxFilter     = 16<<11,
85         SetRxThreshold  = 17<<11,
86         SetTxThreshold  = 18<<11,
87         SetTxStart      = 19<<11,
88         StatsEnable     = 21<<11,
89         StatsDisable    = 22<<11,
90         StopCoax        = 23<<11
91 };
92
93 enum c509status {
94         IntLatch        = 0x0001,
95         AdapterFailure  = 0x0002,
96         TxComplete      = 0x0004,
97         TxAvailable     = 0x0008,
98         RxComplete      = 0x0010,
99         RxEarly         = 0x0020,
100         IntReq          = 0x0040,
101         StatsFull       = 0x0080,
102         CmdBusy         = 0x1000
103 };
104
105 /* The SetRxFilter command accepts the following classes: */
106 enum RxFilter {
107         RxStation       = 1,
108         RxMulticast     = 2,
109         RxBroadcast     = 4,
110         RxProm          = 8
111 };
112
113 /* Register window 1 offsets, the window used in normal operation. */
114 #define TX_FIFO         0x00
115 #define RX_FIFO         0x00
116 #define RX_STATUS       0x08
117 #define TX_STATUS       0x0B
118 #define TX_FREE         0x0C    /* Remaining free bytes in Tx buffer. */
119
120 #define WN0_IRQ         0x08    /* Window 0: Set IRQ line in bits 12-15. */
121 #define WN4_MEDIA       0x0A    /* Window 4: Various transcvr/media bits. */
122 #define MEDIA_TP        0x00C0  /* Enable link beat and jabber for 10baseT. */
123 #define MEDIA_LED       0x0001  /* Enable link light on 3C589E cards. */
124
125 /* Time in jiffies before concluding Tx hung */
126 #define TX_TIMEOUT      ((400*HZ)/1000)
127
128 struct el3_private {
129         struct pcmcia_device    *p_dev;
130         /* For transceiver monitoring */
131         struct timer_list       media;
132         u16                     media_status;
133         u16                     fast_poll;
134         unsigned long           last_irq;
135         spinlock_t              lock;
136 };
137
138 static const char *if_names[] = { "auto", "10baseT", "10base2", "AUI" };
139
140 /*====================================================================*/
141
142 /* Module parameters */
143
144 MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
145 MODULE_DESCRIPTION("3Com 3c589 series PCMCIA ethernet driver");
146 MODULE_LICENSE("GPL");
147
148 #define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0)
149
150 /* Special hook for setting if_port when module is loaded */
151 INT_MODULE_PARM(if_port, 0);
152
153
154 /*====================================================================*/
155
156 static int tc589_config(struct pcmcia_device *link);
157 static void tc589_release(struct pcmcia_device *link);
158
159 static u16 read_eeprom(unsigned int ioaddr, int index);
160 static void tc589_reset(struct net_device *dev);
161 static void media_check(unsigned long arg);
162 static int el3_config(struct net_device *dev, struct ifmap *map);
163 static int el3_open(struct net_device *dev);
164 static netdev_tx_t el3_start_xmit(struct sk_buff *skb,
165                                         struct net_device *dev);
166 static irqreturn_t el3_interrupt(int irq, void *dev_id);
167 static void update_stats(struct net_device *dev);
168 static struct net_device_stats *el3_get_stats(struct net_device *dev);
169 static int el3_rx(struct net_device *dev);
170 static int el3_close(struct net_device *dev);
171 static void el3_tx_timeout(struct net_device *dev);
172 static void set_rx_mode(struct net_device *dev);
173 static void set_multicast_list(struct net_device *dev);
174 static const struct ethtool_ops netdev_ethtool_ops;
175
176 static void tc589_detach(struct pcmcia_device *p_dev);
177
178 /*======================================================================
179
180     tc589_attach() creates an "instance" of the driver, allocating
181     local data structures for one device.  The device is registered
182     with Card Services.
183
184 ======================================================================*/
185
186 static const struct net_device_ops el3_netdev_ops = {
187         .ndo_open               = el3_open,
188         .ndo_stop               = el3_close,
189         .ndo_start_xmit         = el3_start_xmit,
190         .ndo_tx_timeout         = el3_tx_timeout,
191         .ndo_set_config         = el3_config,
192         .ndo_get_stats          = el3_get_stats,
193         .ndo_set_multicast_list = set_multicast_list,
194         .ndo_change_mtu         = eth_change_mtu,
195         .ndo_set_mac_address    = eth_mac_addr,
196         .ndo_validate_addr      = eth_validate_addr,
197 };
198
199 static int tc589_probe(struct pcmcia_device *link)
200 {
201     struct el3_private *lp;
202     struct net_device *dev;
203
204     dev_dbg(&link->dev, "3c589_attach()\n");
205
206     /* Create new ethernet device */
207     dev = alloc_etherdev(sizeof(struct el3_private));
208     if (!dev)
209          return -ENOMEM;
210     lp = netdev_priv(dev);
211     link->priv = dev;
212     lp->p_dev = link;
213
214     spin_lock_init(&lp->lock);
215     link->resource[0]->end = 16;
216     link->resource[0]->flags |= IO_DATA_PATH_WIDTH_16;
217
218     link->config_flags |= CONF_ENABLE_IRQ;
219     link->config_index = 1;
220
221     dev->netdev_ops = &el3_netdev_ops;
222     dev->watchdog_timeo = TX_TIMEOUT;
223
224     SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
225
226     return tc589_config(link);
227 } /* tc589_attach */
228
229 /*======================================================================
230
231     This deletes a driver "instance".  The device is de-registered
232     with Card Services.  If it has been released, all local data
233     structures are freed.  Otherwise, the structures will be freed
234     when the device is released.
235
236 ======================================================================*/
237
238 static void tc589_detach(struct pcmcia_device *link)
239 {
240     struct net_device *dev = link->priv;
241
242     dev_dbg(&link->dev, "3c589_detach\n");
243
244     unregister_netdev(dev);
245
246     tc589_release(link);
247
248     free_netdev(dev);
249 } /* tc589_detach */
250
251 /*======================================================================
252
253     tc589_config() is scheduled to run after a CARD_INSERTION event
254     is received, to configure the PCMCIA socket, and to make the
255     ethernet device available to the system.
256
257 ======================================================================*/
258
259 static int tc589_config(struct pcmcia_device *link)
260 {
261     struct net_device *dev = link->priv;
262     __be16 *phys_addr;
263     int ret, i, j, multi = 0, fifo;
264     unsigned int ioaddr;
265     char *ram_split[] = {"5:3", "3:1", "1:1", "3:5"};
266     u8 *buf;
267     size_t len;
268
269     dev_dbg(&link->dev, "3c589_config\n");
270
271     phys_addr = (__be16 *)dev->dev_addr;
272     /* Is this a 3c562? */
273     if (link->manf_id != MANFID_3COM)
274             printk(KERN_INFO "3c589_cs: hmmm, is this really a "
275                    "3Com card??\n");
276     multi = (link->card_id == PRODID_3COM_3C562);
277
278     link->io_lines = 16;
279
280     /* For the 3c562, the base address must be xx00-xx7f */
281     for (i = j = 0; j < 0x400; j += 0x10) {
282         if (multi && (j & 0x80)) continue;
283         link->resource[0]->start = j ^ 0x300;
284         i = pcmcia_request_io(link);
285         if (i == 0)
286                 break;
287     }
288     if (i != 0)
289         goto failed;
290
291     ret = pcmcia_request_irq(link, el3_interrupt);
292     if (ret)
293             goto failed;
294
295     ret = pcmcia_enable_device(link);
296     if (ret)
297             goto failed;
298
299     dev->irq = link->irq;
300     dev->base_addr = link->resource[0]->start;
301     ioaddr = dev->base_addr;
302     EL3WINDOW(0);
303
304     /* The 3c589 has an extra EEPROM for configuration info, including
305        the hardware address.  The 3c562 puts the address in the CIS. */
306     len = pcmcia_get_tuple(link, 0x88, &buf);
307     if (buf && len >= 6) {
308             for (i = 0; i < 3; i++)
309                     phys_addr[i] = htons(le16_to_cpu(buf[i*2]));
310             kfree(buf);
311     } else {
312         kfree(buf); /* 0 < len < 6 */
313         for (i = 0; i < 3; i++)
314             phys_addr[i] = htons(read_eeprom(ioaddr, i));
315         if (phys_addr[0] == htons(0x6060)) {
316             printk(KERN_ERR "3c589_cs: IO port conflict at 0x%03lx"
317                    "-0x%03lx\n", dev->base_addr, dev->base_addr+15);
318             goto failed;
319         }
320     }
321
322     /* The address and resource configuration register aren't loaded from
323        the EEPROM and *must* be set to 0 and IRQ3 for the PCMCIA version. */
324     outw(0x3f00, ioaddr + 8);
325     fifo = inl(ioaddr);
326
327     /* The if_port symbol can be set when the module is loaded */
328     if ((if_port >= 0) && (if_port <= 3))
329         dev->if_port = if_port;
330     else
331         printk(KERN_ERR "3c589_cs: invalid if_port requested\n");
332
333     SET_NETDEV_DEV(dev, &link->dev);
334
335     if (register_netdev(dev) != 0) {
336         printk(KERN_ERR "3c589_cs: register_netdev() failed\n");
337         goto failed;
338     }
339
340     netdev_info(dev, "3Com 3c%s, io %#3lx, irq %d, hw_addr %pM\n",
341                 (multi ? "562" : "589"), dev->base_addr, dev->irq,
342                 dev->dev_addr);
343     netdev_info(dev, "  %dK FIFO split %s Rx:Tx, %s xcvr\n",
344                 (fifo & 7) ? 32 : 8, ram_split[(fifo >> 16) & 3],
345                 if_names[dev->if_port]);
346     return 0;
347
348 failed:
349     tc589_release(link);
350     return -ENODEV;
351 } /* tc589_config */
352
353 /*======================================================================
354
355     After a card is removed, tc589_release() will unregister the net
356     device, and release the PCMCIA configuration.  If the device is
357     still open, this will be postponed until it is closed.
358
359 ======================================================================*/
360
361 static void tc589_release(struct pcmcia_device *link)
362 {
363         pcmcia_disable_device(link);
364 }
365
366 static int tc589_suspend(struct pcmcia_device *link)
367 {
368         struct net_device *dev = link->priv;
369
370         if (link->open)
371                 netif_device_detach(dev);
372
373         return 0;
374 }
375
376 static int tc589_resume(struct pcmcia_device *link)
377 {
378         struct net_device *dev = link->priv;
379
380         if (link->open) {
381                 tc589_reset(dev);
382                 netif_device_attach(dev);
383         }
384
385         return 0;
386 }
387
388 /*====================================================================*/
389
390 /*
391   Use this for commands that may take time to finish
392 */
393 static void tc589_wait_for_completion(struct net_device *dev, int cmd)
394 {
395     int i = 100;
396     outw(cmd, dev->base_addr + EL3_CMD);
397     while (--i > 0)
398         if (!(inw(dev->base_addr + EL3_STATUS) & 0x1000)) break;
399     if (i == 0)
400         netdev_warn(dev, "command 0x%04x did not complete!\n", cmd);
401 }
402
403 /*
404   Read a word from the EEPROM using the regular EEPROM access register.
405   Assume that we are in register window zero.
406 */
407 static u16 read_eeprom(unsigned int ioaddr, int index)
408 {
409     int i;
410     outw(EEPROM_READ + index, ioaddr + 10);
411     /* Reading the eeprom takes 162 us */
412     for (i = 1620; i >= 0; i--)
413         if ((inw(ioaddr + 10) & EEPROM_BUSY) == 0)
414             break;
415     return inw(ioaddr + 12);
416 }
417
418 /*
419   Set transceiver type, perhaps to something other than what the user
420   specified in dev->if_port.
421 */
422 static void tc589_set_xcvr(struct net_device *dev, int if_port)
423 {
424     struct el3_private *lp = netdev_priv(dev);
425     unsigned int ioaddr = dev->base_addr;
426
427     EL3WINDOW(0);
428     switch (if_port) {
429     case 0: case 1: outw(0, ioaddr + 6); break;
430     case 2: outw(3<<14, ioaddr + 6); break;
431     case 3: outw(1<<14, ioaddr + 6); break;
432     }
433     /* On PCMCIA, this just turns on the LED */
434     outw((if_port == 2) ? StartCoax : StopCoax, ioaddr + EL3_CMD);
435     /* 10baseT interface, enable link beat and jabber check. */
436     EL3WINDOW(4);
437     outw(MEDIA_LED | ((if_port < 2) ? MEDIA_TP : 0), ioaddr + WN4_MEDIA);
438     EL3WINDOW(1);
439     if (if_port == 2)
440         lp->media_status = ((dev->if_port == 0) ? 0x8000 : 0x4000);
441     else
442         lp->media_status = ((dev->if_port == 0) ? 0x4010 : 0x8800);
443 }
444
445 static void dump_status(struct net_device *dev)
446 {
447     unsigned int ioaddr = dev->base_addr;
448     EL3WINDOW(1);
449     netdev_info(dev, "  irq status %04x, rx status %04x, tx status %02x  tx free %04x\n",
450                 inw(ioaddr+EL3_STATUS), inw(ioaddr+RX_STATUS),
451                 inb(ioaddr+TX_STATUS), inw(ioaddr+TX_FREE));
452     EL3WINDOW(4);
453     netdev_info(dev, "  diagnostics: fifo %04x net %04x ethernet %04x media %04x\n",
454                 inw(ioaddr+0x04), inw(ioaddr+0x06), inw(ioaddr+0x08),
455                 inw(ioaddr+0x0a));
456     EL3WINDOW(1);
457 }
458
459 /* Reset and restore all of the 3c589 registers. */
460 static void tc589_reset(struct net_device *dev)
461 {
462     unsigned int ioaddr = dev->base_addr;
463     int i;
464
465     EL3WINDOW(0);
466     outw(0x0001, ioaddr + 4);                   /* Activate board. */
467     outw(0x3f00, ioaddr + 8);                   /* Set the IRQ line. */
468
469     /* Set the station address in window 2. */
470     EL3WINDOW(2);
471     for (i = 0; i < 6; i++)
472         outb(dev->dev_addr[i], ioaddr + i);
473
474     tc589_set_xcvr(dev, dev->if_port);
475
476     /* Switch to the stats window, and clear all stats by reading. */
477     outw(StatsDisable, ioaddr + EL3_CMD);
478     EL3WINDOW(6);
479     for (i = 0; i < 9; i++)
480         inb(ioaddr+i);
481     inw(ioaddr + 10);
482     inw(ioaddr + 12);
483
484     /* Switch to register set 1 for normal use. */
485     EL3WINDOW(1);
486
487     set_rx_mode(dev);
488     outw(StatsEnable, ioaddr + EL3_CMD); /* Turn on statistics. */
489     outw(RxEnable, ioaddr + EL3_CMD); /* Enable the receiver. */
490     outw(TxEnable, ioaddr + EL3_CMD); /* Enable transmitter. */
491     /* Allow status bits to be seen. */
492     outw(SetStatusEnb | 0xff, ioaddr + EL3_CMD);
493     /* Ack all pending events, and set active indicator mask. */
494     outw(AckIntr | IntLatch | TxAvailable | RxEarly | IntReq,
495          ioaddr + EL3_CMD);
496     outw(SetIntrEnb | IntLatch | TxAvailable | RxComplete | StatsFull
497          | AdapterFailure, ioaddr + EL3_CMD);
498 }
499
500 static void netdev_get_drvinfo(struct net_device *dev,
501                                struct ethtool_drvinfo *info)
502 {
503         strcpy(info->driver, DRV_NAME);
504         strcpy(info->version, DRV_VERSION);
505         sprintf(info->bus_info, "PCMCIA 0x%lx", dev->base_addr);
506 }
507
508 static const struct ethtool_ops netdev_ethtool_ops = {
509         .get_drvinfo            = netdev_get_drvinfo,
510 };
511
512 static int el3_config(struct net_device *dev, struct ifmap *map)
513 {
514     if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) {
515         if (map->port <= 3) {
516             dev->if_port = map->port;
517             netdev_info(dev, "switched to %s port\n", if_names[dev->if_port]);
518             tc589_set_xcvr(dev, dev->if_port);
519         } else
520             return -EINVAL;
521     }
522     return 0;
523 }
524
525 static int el3_open(struct net_device *dev)
526 {
527     struct el3_private *lp = netdev_priv(dev);
528     struct pcmcia_device *link = lp->p_dev;
529
530     if (!pcmcia_dev_present(link))
531         return -ENODEV;
532
533     link->open++;
534     netif_start_queue(dev);
535
536     tc589_reset(dev);
537     init_timer(&lp->media);
538     lp->media.function = &media_check;
539     lp->media.data = (unsigned long) dev;
540     lp->media.expires = jiffies + HZ;
541     add_timer(&lp->media);
542
543     dev_dbg(&link->dev, "%s: opened, status %4.4x.\n",
544           dev->name, inw(dev->base_addr + EL3_STATUS));
545
546     return 0;
547 }
548
549 static void el3_tx_timeout(struct net_device *dev)
550 {
551     unsigned int ioaddr = dev->base_addr;
552
553     netdev_warn(dev, "Transmit timed out!\n");
554     dump_status(dev);
555     dev->stats.tx_errors++;
556     dev->trans_start = jiffies; /* prevent tx timeout */
557     /* Issue TX_RESET and TX_START commands. */
558     tc589_wait_for_completion(dev, TxReset);
559     outw(TxEnable, ioaddr + EL3_CMD);
560     netif_wake_queue(dev);
561 }
562
563 static void pop_tx_status(struct net_device *dev)
564 {
565     unsigned int ioaddr = dev->base_addr;
566     int i;
567
568     /* Clear the Tx status stack. */
569     for (i = 32; i > 0; i--) {
570         u_char tx_status = inb(ioaddr + TX_STATUS);
571         if (!(tx_status & 0x84)) break;
572         /* reset transmitter on jabber error or underrun */
573         if (tx_status & 0x30)
574                 tc589_wait_for_completion(dev, TxReset);
575         if (tx_status & 0x38) {
576                 netdev_dbg(dev, "transmit error: status 0x%02x\n", tx_status);
577                 outw(TxEnable, ioaddr + EL3_CMD);
578                 dev->stats.tx_aborted_errors++;
579         }
580         outb(0x00, ioaddr + TX_STATUS); /* Pop the status stack. */
581     }
582 }
583
584 static netdev_tx_t el3_start_xmit(struct sk_buff *skb,
585                                         struct net_device *dev)
586 {
587     unsigned int ioaddr = dev->base_addr;
588     struct el3_private *priv = netdev_priv(dev);
589     unsigned long flags;
590
591     netdev_dbg(dev, "el3_start_xmit(length = %ld) called, status %4.4x.\n",
592                (long)skb->len, inw(ioaddr + EL3_STATUS));
593
594     spin_lock_irqsave(&priv->lock, flags);
595
596     dev->stats.tx_bytes += skb->len;
597
598     /* Put out the doubleword header... */
599     outw(skb->len, ioaddr + TX_FIFO);
600     outw(0x00, ioaddr + TX_FIFO);
601     /* ... and the packet rounded to a doubleword. */
602     outsl(ioaddr + TX_FIFO, skb->data, (skb->len + 3) >> 2);
603
604     if (inw(ioaddr + TX_FREE) <= 1536) {
605         netif_stop_queue(dev);
606         /* Interrupt us when the FIFO has room for max-sized packet. */
607         outw(SetTxThreshold + 1536, ioaddr + EL3_CMD);
608     }
609
610     pop_tx_status(dev);
611     spin_unlock_irqrestore(&priv->lock, flags);
612     dev_kfree_skb(skb);
613
614     return NETDEV_TX_OK;
615 }
616
617 /* The EL3 interrupt handler. */
618 static irqreturn_t el3_interrupt(int irq, void *dev_id)
619 {
620     struct net_device *dev = (struct net_device *) dev_id;
621     struct el3_private *lp = netdev_priv(dev);
622     unsigned int ioaddr;
623     __u16 status;
624     int i = 0, handled = 1;
625
626     if (!netif_device_present(dev))
627         return IRQ_NONE;
628
629     ioaddr = dev->base_addr;
630
631     netdev_dbg(dev, "interrupt, status %4.4x.\n", inw(ioaddr + EL3_STATUS));
632
633     spin_lock(&lp->lock);
634     while ((status = inw(ioaddr + EL3_STATUS)) &
635         (IntLatch | RxComplete | StatsFull)) {
636         if ((status & 0xe000) != 0x2000) {
637                 netdev_dbg(dev, "interrupt from dead card\n");
638                 handled = 0;
639                 break;
640         }
641         if (status & RxComplete)
642                 el3_rx(dev);
643         if (status & TxAvailable) {
644                 netdev_dbg(dev, "    TX room bit was handled.\n");
645                 /* There's room in the FIFO for a full-sized packet. */
646                 outw(AckIntr | TxAvailable, ioaddr + EL3_CMD);
647                 netif_wake_queue(dev);
648         }
649         if (status & TxComplete)
650                 pop_tx_status(dev);
651         if (status & (AdapterFailure | RxEarly | StatsFull)) {
652             /* Handle all uncommon interrupts. */
653             if (status & StatsFull)             /* Empty statistics. */
654                 update_stats(dev);
655             if (status & RxEarly) {             /* Rx early is unused. */
656                 el3_rx(dev);
657                 outw(AckIntr | RxEarly, ioaddr + EL3_CMD);
658             }
659             if (status & AdapterFailure) {
660                 u16 fifo_diag;
661                 EL3WINDOW(4);
662                 fifo_diag = inw(ioaddr + 4);
663                 EL3WINDOW(1);
664                 netdev_warn(dev, "adapter failure, FIFO diagnostic register %04x.\n",
665                             fifo_diag);
666                 if (fifo_diag & 0x0400) {
667                     /* Tx overrun */
668                     tc589_wait_for_completion(dev, TxReset);
669                     outw(TxEnable, ioaddr + EL3_CMD);
670                 }
671                 if (fifo_diag & 0x2000) {
672                     /* Rx underrun */
673                     tc589_wait_for_completion(dev, RxReset);
674                     set_rx_mode(dev);
675                     outw(RxEnable, ioaddr + EL3_CMD);
676                 }
677                 outw(AckIntr | AdapterFailure, ioaddr + EL3_CMD);
678             }
679         }
680         if (++i > 10) {
681                 netdev_err(dev, "infinite loop in interrupt, status %4.4x.\n",
682                            status);
683                 /* Clear all interrupts */
684                 outw(AckIntr | 0xFF, ioaddr + EL3_CMD);
685                 break;
686         }
687         /* Acknowledge the IRQ. */
688         outw(AckIntr | IntReq | IntLatch, ioaddr + EL3_CMD);
689     }
690     lp->last_irq = jiffies;
691     spin_unlock(&lp->lock);
692     netdev_dbg(dev, "exiting interrupt, status %4.4x.\n",
693                inw(ioaddr + EL3_STATUS));
694     return IRQ_RETVAL(handled);
695 }
696
697 static void media_check(unsigned long arg)
698 {
699     struct net_device *dev = (struct net_device *)(arg);
700     struct el3_private *lp = netdev_priv(dev);
701     unsigned int ioaddr = dev->base_addr;
702     u16 media, errs;
703     unsigned long flags;
704
705     if (!netif_device_present(dev)) goto reschedule;
706
707     /* Check for pending interrupt with expired latency timer: with
708        this, we can limp along even if the interrupt is blocked */
709     if ((inw(ioaddr + EL3_STATUS) & IntLatch) &&
710         (inb(ioaddr + EL3_TIMER) == 0xff)) {
711         if (!lp->fast_poll)
712                 netdev_warn(dev, "interrupt(s) dropped!\n");
713
714         local_irq_save(flags);
715         el3_interrupt(dev->irq, dev);
716         local_irq_restore(flags);
717
718         lp->fast_poll = HZ;
719     }
720     if (lp->fast_poll) {
721         lp->fast_poll--;
722         lp->media.expires = jiffies + HZ/100;
723         add_timer(&lp->media);
724         return;
725     }
726
727     /* lp->lock guards the EL3 window. Window should always be 1 except
728        when the lock is held */
729     spin_lock_irqsave(&lp->lock, flags);
730     EL3WINDOW(4);
731     media = inw(ioaddr+WN4_MEDIA) & 0xc810;
732
733     /* Ignore collisions unless we've had no irq's recently */
734     if (time_before(jiffies, lp->last_irq + HZ)) {
735         media &= ~0x0010;
736     } else {
737         /* Try harder to detect carrier errors */
738         EL3WINDOW(6);
739         outw(StatsDisable, ioaddr + EL3_CMD);
740         errs = inb(ioaddr + 0);
741         outw(StatsEnable, ioaddr + EL3_CMD);
742         dev->stats.tx_carrier_errors += errs;
743         if (errs || (lp->media_status & 0x0010)) media |= 0x0010;
744     }
745
746     if (media != lp->media_status) {
747         if ((media & lp->media_status & 0x8000) &&
748             ((lp->media_status ^ media) & 0x0800))
749                 netdev_info(dev, "%s link beat\n",
750                             (lp->media_status & 0x0800 ? "lost" : "found"));
751         else if ((media & lp->media_status & 0x4000) &&
752                  ((lp->media_status ^ media) & 0x0010))
753                 netdev_info(dev, "coax cable %s\n",
754                             (lp->media_status & 0x0010 ? "ok" : "problem"));
755         if (dev->if_port == 0) {
756             if (media & 0x8000) {
757                 if (media & 0x0800)
758                         netdev_info(dev, "flipped to 10baseT\n");
759                 else
760                         tc589_set_xcvr(dev, 2);
761             } else if (media & 0x4000) {
762                 if (media & 0x0010)
763                     tc589_set_xcvr(dev, 1);
764                 else
765                     netdev_info(dev, "flipped to 10base2\n");
766             }
767         }
768         lp->media_status = media;
769     }
770
771     EL3WINDOW(1);
772     spin_unlock_irqrestore(&lp->lock, flags);
773
774 reschedule:
775     lp->media.expires = jiffies + HZ;
776     add_timer(&lp->media);
777 }
778
779 static struct net_device_stats *el3_get_stats(struct net_device *dev)
780 {
781     struct el3_private *lp = netdev_priv(dev);
782     unsigned long flags;
783     struct pcmcia_device *link = lp->p_dev;
784
785     if (pcmcia_dev_present(link)) {
786         spin_lock_irqsave(&lp->lock, flags);
787         update_stats(dev);
788         spin_unlock_irqrestore(&lp->lock, flags);
789     }
790     return &dev->stats;
791 }
792
793 /*
794   Update statistics.  We change to register window 6, so this should be run
795   single-threaded if the device is active. This is expected to be a rare
796   operation, and it's simpler for the rest of the driver to assume that
797   window 1 is always valid rather than use a special window-state variable.
798
799   Caller must hold the lock for this
800 */
801 static void update_stats(struct net_device *dev)
802 {
803     unsigned int ioaddr = dev->base_addr;
804
805     netdev_dbg(dev, "updating the statistics.\n");
806     /* Turn off statistics updates while reading. */
807     outw(StatsDisable, ioaddr + EL3_CMD);
808     /* Switch to the stats window, and read everything. */
809     EL3WINDOW(6);
810     dev->stats.tx_carrier_errors        += inb(ioaddr + 0);
811     dev->stats.tx_heartbeat_errors      += inb(ioaddr + 1);
812     /* Multiple collisions. */          inb(ioaddr + 2);
813     dev->stats.collisions               += inb(ioaddr + 3);
814     dev->stats.tx_window_errors         += inb(ioaddr + 4);
815     dev->stats.rx_fifo_errors           += inb(ioaddr + 5);
816     dev->stats.tx_packets               += inb(ioaddr + 6);
817     /* Rx packets   */                  inb(ioaddr + 7);
818     /* Tx deferrals */                  inb(ioaddr + 8);
819     /* Rx octets */                     inw(ioaddr + 10);
820     /* Tx octets */                     inw(ioaddr + 12);
821
822     /* Back to window 1, and turn statistics back on. */
823     EL3WINDOW(1);
824     outw(StatsEnable, ioaddr + EL3_CMD);
825 }
826
827 static int el3_rx(struct net_device *dev)
828 {
829     unsigned int ioaddr = dev->base_addr;
830     int worklimit = 32;
831     short rx_status;
832
833     netdev_dbg(dev, "in rx_packet(), status %4.4x, rx_status %4.4x.\n",
834                inw(ioaddr+EL3_STATUS), inw(ioaddr+RX_STATUS));
835     while (!((rx_status = inw(ioaddr + RX_STATUS)) & 0x8000) &&
836                     worklimit > 0) {
837         worklimit--;
838         if (rx_status & 0x4000) { /* Error, update stats. */
839             short error = rx_status & 0x3800;
840             dev->stats.rx_errors++;
841             switch (error) {
842             case 0x0000:        dev->stats.rx_over_errors++; break;
843             case 0x0800:        dev->stats.rx_length_errors++; break;
844             case 0x1000:        dev->stats.rx_frame_errors++; break;
845             case 0x1800:        dev->stats.rx_length_errors++; break;
846             case 0x2000:        dev->stats.rx_frame_errors++; break;
847             case 0x2800:        dev->stats.rx_crc_errors++; break;
848             }
849         } else {
850             short pkt_len = rx_status & 0x7ff;
851             struct sk_buff *skb;
852
853             skb = dev_alloc_skb(pkt_len+5);
854
855             netdev_dbg(dev, "    Receiving packet size %d status %4.4x.\n",
856                        pkt_len, rx_status);
857             if (skb != NULL) {
858                 skb_reserve(skb, 2);
859                 insl(ioaddr+RX_FIFO, skb_put(skb, pkt_len),
860                         (pkt_len+3)>>2);
861                 skb->protocol = eth_type_trans(skb, dev);
862                 netif_rx(skb);
863                 dev->stats.rx_packets++;
864                 dev->stats.rx_bytes += pkt_len;
865             } else {
866                 netdev_dbg(dev, "couldn't allocate a sk_buff of size %d.\n",
867                            pkt_len);
868                 dev->stats.rx_dropped++;
869             }
870         }
871         /* Pop the top of the Rx FIFO */
872         tc589_wait_for_completion(dev, RxDiscard);
873     }
874     if (worklimit == 0)
875         netdev_warn(dev, "too much work in el3_rx!\n");
876     return 0;
877 }
878
879 static void set_rx_mode(struct net_device *dev)
880 {
881     unsigned int ioaddr = dev->base_addr;
882     u16 opts = SetRxFilter | RxStation | RxBroadcast;
883
884     if (dev->flags & IFF_PROMISC)
885         opts |= RxMulticast | RxProm;
886     else if (!netdev_mc_empty(dev) || (dev->flags & IFF_ALLMULTI))
887         opts |= RxMulticast;
888     outw(opts, ioaddr + EL3_CMD);
889 }
890
891 static void set_multicast_list(struct net_device *dev)
892 {
893         struct el3_private *priv = netdev_priv(dev);
894         unsigned long flags;
895
896         spin_lock_irqsave(&priv->lock, flags);
897         set_rx_mode(dev);
898         spin_unlock_irqrestore(&priv->lock, flags);
899 }
900
901 static int el3_close(struct net_device *dev)
902 {
903     struct el3_private *lp = netdev_priv(dev);
904     struct pcmcia_device *link = lp->p_dev;
905     unsigned int ioaddr = dev->base_addr;
906
907     dev_dbg(&link->dev, "%s: shutting down ethercard.\n", dev->name);
908
909     if (pcmcia_dev_present(link)) {
910         /* Turn off statistics ASAP.  We update dev->stats below. */
911         outw(StatsDisable, ioaddr + EL3_CMD);
912
913         /* Disable the receiver and transmitter. */
914         outw(RxDisable, ioaddr + EL3_CMD);
915         outw(TxDisable, ioaddr + EL3_CMD);
916
917         if (dev->if_port == 2)
918             /* Turn off thinnet power.  Green! */
919             outw(StopCoax, ioaddr + EL3_CMD);
920         else if (dev->if_port == 1) {
921             /* Disable link beat and jabber */
922             EL3WINDOW(4);
923             outw(0, ioaddr + WN4_MEDIA);
924         }
925
926         /* Switching back to window 0 disables the IRQ. */
927         EL3WINDOW(0);
928         /* But we explicitly zero the IRQ line select anyway. */
929         outw(0x0f00, ioaddr + WN0_IRQ);
930
931         /* Check if the card still exists */
932         if ((inw(ioaddr+EL3_STATUS) & 0xe000) == 0x2000)
933             update_stats(dev);
934     }
935
936     link->open--;
937     netif_stop_queue(dev);
938     del_timer_sync(&lp->media);
939
940     return 0;
941 }
942
943 static struct pcmcia_device_id tc589_ids[] = {
944         PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x0101, 0x0562),
945         PCMCIA_MFC_DEVICE_PROD_ID1(0, "Motorola MARQUIS", 0xf03e4e77),
946         PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0589),
947         PCMCIA_DEVICE_PROD_ID12("Farallon", "ENet", 0x58d93fc4, 0x992c2202),
948         PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0101, 0x0035, "cis/3CXEM556.cis"),
949         PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0101, 0x003d, "cis/3CXEM556.cis"),
950         PCMCIA_DEVICE_NULL,
951 };
952 MODULE_DEVICE_TABLE(pcmcia, tc589_ids);
953
954 static struct pcmcia_driver tc589_driver = {
955         .owner          = THIS_MODULE,
956         .drv            = {
957                 .name   = "3c589_cs",
958         },
959         .probe          = tc589_probe,
960         .remove         = tc589_detach,
961         .id_table       = tc589_ids,
962         .suspend        = tc589_suspend,
963         .resume         = tc589_resume,
964 };
965
966 static int __init init_tc589(void)
967 {
968         return pcmcia_register_driver(&tc589_driver);
969 }
970
971 static void __exit exit_tc589(void)
972 {
973         pcmcia_unregister_driver(&tc589_driver);
974 }
975
976 module_init(init_tc589);
977 module_exit(exit_tc589);