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