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