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