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