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