1 /* 3c509.c: A 3c509 EtherLink3 ethernet driver for linux. */
3 Written 1993-2000 by Donald Becker.
5 Copyright 1994-2000 by Donald Becker.
6 Copyright 1993 United States Government as represented by the
7 Director, National Security Agency. This software may be used and
8 distributed according to the terms of the GNU General Public License,
9 incorporated herein by reference.
11 This driver is for the 3Com EtherLinkIII series.
13 The author may be reached as becker@scyld.com, or C/O
14 Scyld Computing Corporation
15 410 Severn Ave., Suite 210
19 Because of the way 3c509 ISA detection works it's difficult to predict
20 a priori which of several ISA-mode cards will be detected first.
22 This driver does not use predictive interrupt mode, resulting in higher
23 packet latency but lower overhead. If interrupts are disabled for an
24 unusually long time it could also result in missed packets, but in
25 practice this rarely happens.
29 Alan Cox: Removed the 'Unexpected interrupt' bug.
30 Michael Meskes: Upgraded to Donald Becker's version 1.07.
31 Alan Cox: Increased the eeprom delay. Regardless of
32 what the docs say some people definitely
33 get problems with lower (but in card spec)
35 v1.10 4/21/97 Fixed module code so that multiple cards may be detected,
37 Andrea Arcangeli: Upgraded to Donald Becker's version 1.12.
38 Rick Payne: Fixed SMP race condition
39 v1.13 9/8/97 Made 'max_interrupt_work' an insmod-settable variable -djb
40 v1.14 10/15/97 Avoided waiting..discard message for fast machines -djb
41 v1.15 1/31/98 Faster recovery for Tx errors. -djb
42 v1.16 2/3/98 Different ID port handling to avoid sound cards. -djb
43 v1.18 12Mar2001 Andrew Morton <andrewm@uow.edu.au>
44 - Avoid bogus detect of 3c590's (Andrzej Krzysztofowicz)
45 - Reviewed against 1.18 from scyld.com
46 v1.18a 17Nov2001 Jeff Garzik <jgarzik@pobox.com>
48 v1.18b 1Mar2002 Zwane Mwaikambo <zwane@commfireservices.com>
49 - Power Management support
50 v1.18c 1Mar2002 David Ruggiero <jdr@farfalle.com>
52 v1.19 16Oct2002 Zwane Mwaikambo <zwane@linuxpower.ca>
53 - Additional ethtool features
54 v1.19a 28Oct2002 Davud Ruggiero <jdr@farfalle.com>
55 - Increase *read_eeprom udelay to workaround oops with 2 cards.
56 v1.19b 08Nov2002 Marc Zyngier <maz@wild-wind.fr.eu.org>
57 - Introduce driver model for EISA cards.
60 #define DRV_NAME "3c509"
61 #define DRV_VERSION "1.19b"
62 #define DRV_RELDATE "08Nov2002"
64 /* A few values that may be tweaked. */
66 /* Time in jiffies before concluding the transmitter is hung. */
67 #define TX_TIMEOUT (400*HZ/1000)
68 /* Maximum events (Rx packets, etc.) to handle at each interrupt. */
69 static int max_interrupt_work = 10;
71 #include <linux/module.h>
73 #include <linux/mca.h>
75 #include <linux/isapnp.h>
76 #include <linux/string.h>
77 #include <linux/interrupt.h>
78 #include <linux/errno.h>
80 #include <linux/slab.h>
81 #include <linux/ioport.h>
82 #include <linux/init.h>
83 #include <linux/netdevice.h>
84 #include <linux/etherdevice.h>
86 #include <linux/skbuff.h>
87 #include <linux/delay.h> /* for udelay() */
88 #include <linux/spinlock.h>
89 #include <linux/ethtool.h>
90 #include <linux/device.h>
91 #include <linux/eisa.h>
92 #include <linux/bitops.h>
94 #include <asm/uaccess.h>
98 static char version[] __initdata = DRV_NAME ".c:" DRV_VERSION " " DRV_RELDATE " becker@scyld.com\n";
100 #if defined(CONFIG_PM) && (defined(CONFIG_MCA) || defined(CONFIG_EISA))
105 static int el3_debug = EL3_DEBUG;
107 static int el3_debug = 2;
110 /* Used to do a global count of all the cards in the system. Must be
111 * a global variable so that the mca/eisa probe routines can increment
113 static int el3_cards = 0;
115 /* To minimize the size of the driver source I only define operating
116 constants if they are used several times. You'll need the manual
117 anyway if you want to understand driver details. */
118 /* Offsets from base I/O address. */
119 #define EL3_DATA 0x00
121 #define EL3_STATUS 0x0e
122 #define EEPROM_READ 0x80
124 #define EL3_IO_EXTENT 16
126 #define EL3WINDOW(win_num) outw(SelectWindow + (win_num), ioaddr + EL3_CMD)
129 /* The top five bits written to EL3_CMD are a command, the lower
130 11 bits are the parameter, if applicable. */
132 TotalReset = 0<<11, SelectWindow = 1<<11, StartCoax = 2<<11,
133 RxDisable = 3<<11, RxEnable = 4<<11, RxReset = 5<<11, RxDiscard = 8<<11,
134 TxEnable = 9<<11, TxDisable = 10<<11, TxReset = 11<<11,
135 FakeIntr = 12<<11, AckIntr = 13<<11, SetIntrEnb = 14<<11,
136 SetStatusEnb = 15<<11, SetRxFilter = 16<<11, SetRxThreshold = 17<<11,
137 SetTxThreshold = 18<<11, SetTxStart = 19<<11, StatsEnable = 21<<11,
138 StatsDisable = 22<<11, StopCoax = 23<<11, PowerUp = 27<<11,
139 PowerDown = 28<<11, PowerAuto = 29<<11};
142 IntLatch = 0x0001, AdapterFailure = 0x0002, TxComplete = 0x0004,
143 TxAvailable = 0x0008, RxComplete = 0x0010, RxEarly = 0x0020,
144 IntReq = 0x0040, StatsFull = 0x0080, CmdBusy = 0x1000, };
146 /* The SetRxFilter command accepts the following classes: */
148 RxStation = 1, RxMulticast = 2, RxBroadcast = 4, RxProm = 8 };
150 /* Register window 1 offsets, the window used in normal operation. */
153 #define RX_STATUS 0x08
154 #define TX_STATUS 0x0B
155 #define TX_FREE 0x0C /* Remaining free bytes in Tx buffer. */
157 #define WN0_CONF_CTRL 0x04 /* Window 0: Configuration control register */
158 #define WN0_ADDR_CONF 0x06 /* Window 0: Address configuration register */
159 #define WN0_IRQ 0x08 /* Window 0: Set IRQ line in bits 12-15. */
160 #define WN4_MEDIA 0x0A /* Window 4: Various transcvr/media bits. */
161 #define MEDIA_TP 0x00C0 /* Enable link beat and jabber for 10baseT. */
162 #define WN4_NETDIAG 0x06 /* Window 4: Net diagnostic */
163 #define FD_ENABLE 0x8000 /* Enable full-duplex ("external loopback") */
166 * Must be a power of two (we use a binary and in the
169 #define SKB_QUEUE_SIZE 64
172 struct net_device_stats stats;
173 struct net_device *next_dev;
177 struct sk_buff *queue[SKB_QUEUE_SIZE];
182 } type; /* type of device */
185 static int id_port __initdata = 0x110; /* Start with 0x110 to avoid new sound cards.*/
186 static struct net_device *el3_root_dev;
188 static ushort id_read_eeprom(int index);
189 static ushort read_eeprom(int ioaddr, int index);
190 static int el3_open(struct net_device *dev);
191 static int el3_start_xmit(struct sk_buff *skb, struct net_device *dev);
192 static irqreturn_t el3_interrupt(int irq, void *dev_id);
193 static void update_stats(struct net_device *dev);
194 static struct net_device_stats *el3_get_stats(struct net_device *dev);
195 static int el3_rx(struct net_device *dev);
196 static int el3_close(struct net_device *dev);
197 static void set_multicast_list(struct net_device *dev);
198 static void el3_tx_timeout (struct net_device *dev);
199 static void el3_down(struct net_device *dev);
200 static void el3_up(struct net_device *dev);
201 static const struct ethtool_ops ethtool_ops;
203 static int el3_suspend(struct device *, pm_message_t);
204 static int el3_resume(struct device *);
206 #define el3_suspend NULL
207 #define el3_resume NULL
211 /* generic device remove for all device types */
212 #if defined(CONFIG_EISA) || defined(CONFIG_MCA)
213 static int el3_device_remove (struct device *device);
215 #ifdef CONFIG_NET_POLL_CONTROLLER
216 static void el3_poll_controller(struct net_device *dev);
220 static struct eisa_device_id el3_eisa_ids[] = {
226 MODULE_DEVICE_TABLE(eisa, el3_eisa_ids);
228 static int el3_eisa_probe (struct device *device);
230 static struct eisa_driver el3_eisa_driver = {
231 .id_table = el3_eisa_ids,
234 .probe = el3_eisa_probe,
235 .remove = __devexit_p (el3_device_remove),
236 .suspend = el3_suspend,
237 .resume = el3_resume,
243 static int el3_mca_probe(struct device *dev);
245 static short el3_mca_adapter_ids[] __initdata = {
254 static char *el3_mca_adapter_names[] __initdata = {
255 "3Com 3c529 EtherLink III (10base2)",
256 "3Com 3c529 EtherLink III (10baseT)",
257 "3Com 3c529 EtherLink III (test mode)",
258 "3Com 3c529 EtherLink III (TP or coax)",
259 "3Com 3c529 EtherLink III (TP)",
263 static struct mca_driver el3_mca_driver = {
264 .id_table = el3_mca_adapter_ids,
267 .bus = &mca_bus_type,
268 .probe = el3_mca_probe,
269 .remove = __devexit_p(el3_device_remove),
270 .suspend = el3_suspend,
271 .resume = el3_resume,
274 #endif /* CONFIG_MCA */
276 #if defined(__ISAPNP__)
277 static struct isapnp_device_id el3_isapnp_adapters[] __initdata = {
278 { ISAPNP_ANY_ID, ISAPNP_ANY_ID,
279 ISAPNP_VENDOR('T', 'C', 'M'), ISAPNP_FUNCTION(0x5090),
280 (long) "3Com Etherlink III (TP)" },
281 { ISAPNP_ANY_ID, ISAPNP_ANY_ID,
282 ISAPNP_VENDOR('T', 'C', 'M'), ISAPNP_FUNCTION(0x5091),
283 (long) "3Com Etherlink III" },
284 { ISAPNP_ANY_ID, ISAPNP_ANY_ID,
285 ISAPNP_VENDOR('T', 'C', 'M'), ISAPNP_FUNCTION(0x5094),
286 (long) "3Com Etherlink III (combo)" },
287 { ISAPNP_ANY_ID, ISAPNP_ANY_ID,
288 ISAPNP_VENDOR('T', 'C', 'M'), ISAPNP_FUNCTION(0x5095),
289 (long) "3Com Etherlink III (TPO)" },
290 { ISAPNP_ANY_ID, ISAPNP_ANY_ID,
291 ISAPNP_VENDOR('T', 'C', 'M'), ISAPNP_FUNCTION(0x5098),
292 (long) "3Com Etherlink III (TPC)" },
293 { ISAPNP_ANY_ID, ISAPNP_ANY_ID,
294 ISAPNP_VENDOR('P', 'N', 'P'), ISAPNP_FUNCTION(0x80f7),
295 (long) "3Com Etherlink III compatible" },
296 { ISAPNP_ANY_ID, ISAPNP_ANY_ID,
297 ISAPNP_VENDOR('P', 'N', 'P'), ISAPNP_FUNCTION(0x80f8),
298 (long) "3Com Etherlink III compatible" },
299 { } /* terminate list */
302 static __be16 el3_isapnp_phys_addr[8][3];
304 #endif /* __ISAPNP__ */
306 /* With the driver model introduction for EISA devices, both init
307 * and cleanup have been split :
308 * - EISA devices probe/remove starts in el3_eisa_probe/el3_device_remove
309 * - MCA/ISA still use el3_probe
311 * Both call el3_common_init/el3_common_remove. */
313 static int __init el3_common_init(struct net_device *dev)
315 struct el3_private *lp = netdev_priv(dev);
317 DECLARE_MAC_BUF(mac);
318 const char *if_names[] = {"10baseT", "AUI", "undefined", "BNC"};
320 spin_lock_init(&lp->lock);
322 if (dev->mem_start & 0x05) { /* xcvr codes 1/3/4/12 */
323 dev->if_port = (dev->mem_start & 0x0f);
324 } else { /* xcvr codes 0/8 */
325 /* use eeprom value, but save user's full-duplex selection */
326 dev->if_port |= (dev->mem_start & 0x08);
329 /* The EL3-specific entries in the device structure. */
330 dev->open = &el3_open;
331 dev->hard_start_xmit = &el3_start_xmit;
332 dev->stop = &el3_close;
333 dev->get_stats = &el3_get_stats;
334 dev->set_multicast_list = &set_multicast_list;
335 dev->tx_timeout = el3_tx_timeout;
336 dev->watchdog_timeo = TX_TIMEOUT;
337 #ifdef CONFIG_NET_POLL_CONTROLLER
338 dev->poll_controller = el3_poll_controller;
340 SET_ETHTOOL_OPS(dev, ðtool_ops);
342 err = register_netdev(dev);
344 printk(KERN_ERR "Failed to register 3c5x9 at %#3.3lx, IRQ %d.\n",
345 dev->base_addr, dev->irq);
346 release_region(dev->base_addr, EL3_IO_EXTENT);
350 printk(KERN_INFO "%s: 3c5x9 found at %#3.3lx, %s port, "
351 "address %s, IRQ %d.\n",
352 dev->name, dev->base_addr, if_names[(dev->if_port & 0x03)],
353 print_mac(mac, dev->dev_addr), dev->irq);
356 printk(KERN_INFO "%s", version);
361 static void el3_common_remove (struct net_device *dev)
363 struct el3_private *lp = netdev_priv(dev);
365 (void) lp; /* Keep gcc quiet... */
366 #if defined(__ISAPNP__)
367 if (lp->type == EL3_PNP)
368 pnp_device_detach(to_pnp_dev(lp->dev));
371 unregister_netdev (dev);
372 release_region(dev->base_addr, EL3_IO_EXTENT);
376 static int __init el3_probe(int card_idx)
378 struct net_device *dev;
379 struct el3_private *lp;
380 short lrs_state = 0xff, i;
381 int ioaddr, irq, if_port;
383 static int current_tag;
385 #if defined(__ISAPNP__)
386 static int pnp_cards;
387 struct pnp_dev *idev = NULL;
393 for (i=0; el3_isapnp_adapters[i].vendor != 0; i++) {
395 while ((idev = pnp_find_dev(NULL,
396 el3_isapnp_adapters[i].vendor,
397 el3_isapnp_adapters[i].function,
399 if (pnp_device_attach(idev) < 0)
401 if (pnp_activate_dev(idev) < 0) {
403 pnp_device_detach(idev);
406 if (!pnp_port_valid(idev, 0) || !pnp_irq_valid(idev, 0))
408 ioaddr = pnp_port_start(idev, 0);
409 if (!request_region(ioaddr, EL3_IO_EXTENT, "3c509 PnP")) {
410 pnp_device_detach(idev);
413 irq = pnp_irq(idev, 0);
415 printk ("ISAPnP reports %s at i/o 0x%x, irq %d\n",
416 (char*) el3_isapnp_adapters[i].driver_data, ioaddr, irq);
418 for (j = 0; j < 3; j++)
419 el3_isapnp_phys_addr[pnp_cards][j] =
421 htons(read_eeprom(ioaddr, j));
422 if_port = read_eeprom(ioaddr, 8) >> 14;
423 dev = alloc_etherdev(sizeof (struct el3_private));
425 release_region(ioaddr, EL3_IO_EXTENT);
426 pnp_device_detach(idev);
430 SET_NETDEV_DEV(dev, &idev->dev);
433 netdev_boot_setup_check(dev);
439 #endif /* __ISAPNP__ */
441 /* Select an open I/O location at 0x1*0 to do contention select. */
442 for ( ; id_port < 0x200; id_port += 0x10) {
443 if (!request_region(id_port, 1, "3c509"))
447 if (inb(id_port) & 0x01){
448 release_region(id_port, 1);
451 release_region(id_port, 1);
453 if (id_port >= 0x200) {
454 /* Rare -- do we really need a warning? */
455 printk(" WARNING: No I/O port available for 3c509 activation.\n");
459 /* Next check for all ISA bus boards by sending the ID sequence to the
460 ID_PORT. We find cards past the first by setting the 'current_tag'
461 on cards as they are found. Cards with their tag set will not
462 respond to subsequent ID sequences. */
466 for(i = 0; i < 255; i++) {
467 outb(lrs_state, id_port);
469 lrs_state = lrs_state & 0x100 ? lrs_state ^ 0xcf : lrs_state;
472 /* For the first probe, clear all board's tag registers. */
473 if (current_tag == 0)
475 else /* Otherwise kill off already-found boards. */
478 if (id_read_eeprom(7) != 0x6d50) {
482 /* Read in EEPROM data, which does contention-select.
483 Only the lowest address board will stay "on-line".
484 3Com got the byte order backwards. */
485 for (i = 0; i < 3; i++) {
486 phys_addr[i] = htons(id_read_eeprom(i));
489 #if defined(__ISAPNP__)
491 /* The ISA PnP 3c509 cards respond to the ID sequence.
492 This check is needed in order not to register them twice. */
493 for (i = 0; i < pnp_cards; i++) {
494 if (phys_addr[0] == el3_isapnp_phys_addr[i][0] &&
495 phys_addr[1] == el3_isapnp_phys_addr[i][1] &&
496 phys_addr[2] == el3_isapnp_phys_addr[i][2])
499 printk("3c509 with address %02x %02x %02x %02x %02x %02x was found by ISAPnP\n",
500 phys_addr[0] & 0xff, phys_addr[0] >> 8,
501 phys_addr[1] & 0xff, phys_addr[1] >> 8,
502 phys_addr[2] & 0xff, phys_addr[2] >> 8);
503 /* Set the adaptor tag so that the next card can be found. */
504 outb(0xd0 + ++current_tag, id_port);
509 #endif /* __ISAPNP__ */
512 unsigned int iobase = id_read_eeprom(8);
513 if_port = iobase >> 14;
514 ioaddr = 0x200 + ((iobase & 0x1f) << 4);
516 irq = id_read_eeprom(9) >> 12;
518 dev = alloc_etherdev(sizeof (struct el3_private));
522 netdev_boot_setup_check(dev);
524 /* Set passed-in IRQ or I/O Addr. */
525 if (dev->irq > 1 && dev->irq < 16)
528 if (dev->base_addr) {
529 if (dev->mem_end == 0x3c509 /* Magic key */
530 && dev->base_addr >= 0x200 && dev->base_addr <= 0x3e0)
531 ioaddr = dev->base_addr & 0x3f0;
532 else if (dev->base_addr != ioaddr)
536 if (!request_region(ioaddr, EL3_IO_EXTENT, "3c509")) {
541 /* Set the adaptor tag so that the next card can be found. */
542 outb(0xd0 + ++current_tag, id_port);
544 /* Activate the adaptor at the EEPROM location. */
545 outb((ioaddr >> 4) | 0xe0, id_port);
548 if (inw(ioaddr) != 0x6d50)
551 /* Free the interrupt so that some other card can use it. */
552 outw(0x0f00, ioaddr + WN0_IRQ);
554 #if defined(__ISAPNP__)
555 found: /* PNP jumps here... */
556 #endif /* __ISAPNP__ */
558 memcpy(dev->dev_addr, phys_addr, sizeof(phys_addr));
559 dev->base_addr = ioaddr;
561 dev->if_port = if_port;
562 lp = netdev_priv(dev);
563 #if defined(__ISAPNP__)
564 lp->dev = &idev->dev;
568 err = el3_common_init(dev);
574 lp->next_dev = el3_root_dev;
579 #if defined(__ISAPNP__)
581 pnp_device_detach(idev);
589 static int __init el3_mca_probe(struct device *device)
591 /* Based on Erik Nygren's (nygren@mit.edu) 3c529 patch,
592 * heavily modified by Chris Beauregard
593 * (cpbeaure@csclub.uwaterloo.ca) to support standard MCA
596 * redone for multi-card detection by ZP Gu (zpg@castle.net)
597 * now works as a module */
599 struct el3_private *lp;
601 int ioaddr, irq, if_port;
603 struct net_device *dev = NULL;
605 struct mca_device *mdev = to_mca_device(device);
606 int slot = mdev->slot;
609 pos4 = mca_device_read_stored_pos(mdev, 4);
610 pos5 = mca_device_read_stored_pos(mdev, 5);
612 ioaddr = ((short)((pos4&0xfc)|0x02)) << 8;
616 printk("3c529: found %s at slot %d\n",
617 el3_mca_adapter_names[mdev->index], slot + 1);
620 strncpy(mdev->name, el3_mca_adapter_names[mdev->index],
622 mca_device_set_claim(mdev, 1);
624 if_port = pos4 & 0x03;
626 irq = mca_device_transform_irq(mdev, irq);
627 ioaddr = mca_device_transform_ioport(mdev, ioaddr);
629 printk("3c529: irq %d ioaddr 0x%x ifport %d\n", irq, ioaddr, if_port);
632 for (i = 0; i < 3; i++) {
633 phys_addr[i] = htons(read_eeprom(ioaddr, i));
636 dev = alloc_etherdev(sizeof (struct el3_private));
638 release_region(ioaddr, EL3_IO_EXTENT);
642 netdev_boot_setup_check(dev);
644 memcpy(dev->dev_addr, phys_addr, sizeof(phys_addr));
645 dev->base_addr = ioaddr;
647 dev->if_port = if_port;
648 lp = netdev_priv(dev);
651 device->driver_data = dev;
652 err = el3_common_init(dev);
655 device->driver_data = NULL;
664 #endif /* CONFIG_MCA */
667 static int __init el3_eisa_probe (struct device *device)
669 struct el3_private *lp;
671 int ioaddr, irq, if_port;
673 struct net_device *dev = NULL;
674 struct eisa_device *edev;
677 /* Yeepee, The driver framework is calling us ! */
678 edev = to_eisa_device (device);
679 ioaddr = edev->base_addr;
681 if (!request_region(ioaddr, EL3_IO_EXTENT, "3c509"))
684 /* Change the register set to the configuration window 0. */
685 outw(SelectWindow | 0, ioaddr + 0xC80 + EL3_CMD);
687 irq = inw(ioaddr + WN0_IRQ) >> 12;
688 if_port = inw(ioaddr + 6)>>14;
689 for (i = 0; i < 3; i++)
690 phys_addr[i] = htons(read_eeprom(ioaddr, i));
692 /* Restore the "Product ID" to the EEPROM read register. */
693 read_eeprom(ioaddr, 3);
695 dev = alloc_etherdev(sizeof (struct el3_private));
697 release_region(ioaddr, EL3_IO_EXTENT);
701 netdev_boot_setup_check(dev);
703 memcpy(dev->dev_addr, phys_addr, sizeof(phys_addr));
704 dev->base_addr = ioaddr;
706 dev->if_port = if_port;
707 lp = netdev_priv(dev);
710 eisa_set_drvdata (edev, dev);
711 err = el3_common_init(dev);
714 eisa_set_drvdata (edev, NULL);
724 #if defined(CONFIG_EISA) || defined(CONFIG_MCA)
725 /* This remove works for all device types.
727 * The net dev must be stored in the driver_data field */
728 static int __devexit el3_device_remove (struct device *device)
730 struct net_device *dev;
732 dev = device->driver_data;
734 el3_common_remove (dev);
739 /* Read a word from the EEPROM using the regular EEPROM access register.
740 Assume that we are in register window zero.
742 static ushort read_eeprom(int ioaddr, int index)
744 outw(EEPROM_READ + index, ioaddr + 10);
745 /* Pause for at least 162 us. for the read to take place.
746 Some chips seem to require much longer */
748 return inw(ioaddr + 12);
751 /* Read a word from the EEPROM when in the ISA ID probe state. */
752 static ushort __init id_read_eeprom(int index)
756 /* Issue read command, and pause for at least 162 us. for it to complete.
757 Assume extra-fast 16Mhz bus. */
758 outb(EEPROM_READ + index, id_port);
760 /* Pause for at least 162 us. for the read to take place. */
761 /* Some chips seem to require much longer */
764 for (bit = 15; bit >= 0; bit--)
765 word = (word << 1) + (inb(id_port) & 0x01);
768 printk(" 3c509 EEPROM word %d %#4.4x.\n", index, word);
775 el3_open(struct net_device *dev)
777 int ioaddr = dev->base_addr;
780 outw(TxReset, ioaddr + EL3_CMD);
781 outw(RxReset, ioaddr + EL3_CMD);
782 outw(SetStatusEnb | 0x00, ioaddr + EL3_CMD);
784 i = request_irq(dev->irq, &el3_interrupt, 0, dev->name, dev);
790 printk("%s: Opening, IRQ %d status@%x %4.4x.\n", dev->name,
791 dev->irq, ioaddr + EL3_STATUS, inw(ioaddr + EL3_STATUS));
796 printk("%s: Opened 3c509 IRQ %d status %4.4x.\n",
797 dev->name, dev->irq, inw(ioaddr + EL3_STATUS));
803 el3_tx_timeout (struct net_device *dev)
805 struct el3_private *lp = netdev_priv(dev);
806 int ioaddr = dev->base_addr;
808 /* Transmitter timeout, serious problems. */
809 printk("%s: transmit timed out, Tx_status %2.2x status %4.4x "
810 "Tx FIFO room %d.\n",
811 dev->name, inb(ioaddr + TX_STATUS), inw(ioaddr + EL3_STATUS),
812 inw(ioaddr + TX_FREE));
813 lp->stats.tx_errors++;
814 dev->trans_start = jiffies;
815 /* Issue TX_RESET and TX_START commands. */
816 outw(TxReset, ioaddr + EL3_CMD);
817 outw(TxEnable, ioaddr + EL3_CMD);
818 netif_wake_queue(dev);
823 el3_start_xmit(struct sk_buff *skb, struct net_device *dev)
825 struct el3_private *lp = netdev_priv(dev);
826 int ioaddr = dev->base_addr;
829 netif_stop_queue (dev);
831 lp->stats.tx_bytes += skb->len;
834 printk("%s: el3_start_xmit(length = %u) called, status %4.4x.\n",
835 dev->name, skb->len, inw(ioaddr + EL3_STATUS));
838 #ifndef final_version
839 { /* Error-checking code, delete someday. */
840 ushort status = inw(ioaddr + EL3_STATUS);
841 if (status & 0x0001 /* IRQ line active, missed one. */
842 && inw(ioaddr + EL3_STATUS) & 1) { /* Make sure. */
843 printk("%s: Missed interrupt, status then %04x now %04x"
844 " Tx %2.2x Rx %4.4x.\n", dev->name, status,
845 inw(ioaddr + EL3_STATUS), inb(ioaddr + TX_STATUS),
846 inw(ioaddr + RX_STATUS));
847 /* Fake interrupt trigger by masking, acknowledge interrupts. */
848 outw(SetStatusEnb | 0x00, ioaddr + EL3_CMD);
849 outw(AckIntr | IntLatch | TxAvailable | RxEarly | IntReq,
851 outw(SetStatusEnb | 0xff, ioaddr + EL3_CMD);
857 * We lock the driver against other processors. Note
858 * we don't need to lock versus the IRQ as we suspended
859 * that. This means that we lose the ability to take
860 * an RX during a TX upload. That sucks a bit with SMP
861 * on an original 3c509 (2K buffer)
863 * Using disable_irq stops us crapping on other
864 * time sensitive devices.
867 spin_lock_irqsave(&lp->lock, flags);
869 /* Put out the doubleword header... */
870 outw(skb->len, ioaddr + TX_FIFO);
871 outw(0x00, ioaddr + TX_FIFO);
872 /* ... and the packet rounded to a doubleword. */
873 outsl(ioaddr + TX_FIFO, skb->data, (skb->len + 3) >> 2);
875 dev->trans_start = jiffies;
876 if (inw(ioaddr + TX_FREE) > 1536)
877 netif_start_queue(dev);
879 /* Interrupt us when the FIFO has room for max-sized packet. */
880 outw(SetTxThreshold + 1536, ioaddr + EL3_CMD);
882 spin_unlock_irqrestore(&lp->lock, flags);
886 /* Clear the Tx status stack. */
891 while (--i > 0 && (tx_status = inb(ioaddr + TX_STATUS)) > 0) {
892 if (tx_status & 0x38) lp->stats.tx_aborted_errors++;
893 if (tx_status & 0x30) outw(TxReset, ioaddr + EL3_CMD);
894 if (tx_status & 0x3C) outw(TxEnable, ioaddr + EL3_CMD);
895 outb(0x00, ioaddr + TX_STATUS); /* Pop the status stack. */
901 /* The EL3 interrupt handler. */
903 el3_interrupt(int irq, void *dev_id)
905 struct net_device *dev = dev_id;
906 struct el3_private *lp;
908 int i = max_interrupt_work;
910 lp = netdev_priv(dev);
911 spin_lock(&lp->lock);
913 ioaddr = dev->base_addr;
916 status = inw(ioaddr + EL3_STATUS);
917 printk("%s: interrupt, status %4.4x.\n", dev->name, status);
920 while ((status = inw(ioaddr + EL3_STATUS)) &
921 (IntLatch | RxComplete | StatsFull)) {
923 if (status & RxComplete)
926 if (status & TxAvailable) {
928 printk(" TX room bit was handled.\n");
929 /* There's room in the FIFO for a full-sized packet. */
930 outw(AckIntr | TxAvailable, ioaddr + EL3_CMD);
931 netif_wake_queue (dev);
933 if (status & (AdapterFailure | RxEarly | StatsFull | TxComplete)) {
934 /* Handle all uncommon interrupts. */
935 if (status & StatsFull) /* Empty statistics. */
937 if (status & RxEarly) { /* Rx early is unused. */
939 outw(AckIntr | RxEarly, ioaddr + EL3_CMD);
941 if (status & TxComplete) { /* Really Tx error. */
942 struct el3_private *lp = netdev_priv(dev);
946 while (--i>0 && (tx_status = inb(ioaddr + TX_STATUS)) > 0) {
947 if (tx_status & 0x38) lp->stats.tx_aborted_errors++;
948 if (tx_status & 0x30) outw(TxReset, ioaddr + EL3_CMD);
949 if (tx_status & 0x3C) outw(TxEnable, ioaddr + EL3_CMD);
950 outb(0x00, ioaddr + TX_STATUS); /* Pop the status stack. */
953 if (status & AdapterFailure) {
954 /* Adapter failure requires Rx reset and reinit. */
955 outw(RxReset, ioaddr + EL3_CMD);
956 /* Set the Rx filter to the current state. */
957 outw(SetRxFilter | RxStation | RxBroadcast
958 | (dev->flags & IFF_ALLMULTI ? RxMulticast : 0)
959 | (dev->flags & IFF_PROMISC ? RxProm : 0),
961 outw(RxEnable, ioaddr + EL3_CMD); /* Re-enable the receiver. */
962 outw(AckIntr | AdapterFailure, ioaddr + EL3_CMD);
967 printk("%s: Infinite loop in interrupt, status %4.4x.\n",
969 /* Clear all interrupts. */
970 outw(AckIntr | 0xFF, ioaddr + EL3_CMD);
973 /* Acknowledge the IRQ. */
974 outw(AckIntr | IntReq | IntLatch, ioaddr + EL3_CMD); /* Ack IRQ */
978 printk("%s: exiting interrupt, status %4.4x.\n", dev->name,
979 inw(ioaddr + EL3_STATUS));
981 spin_unlock(&lp->lock);
986 #ifdef CONFIG_NET_POLL_CONTROLLER
988 * Polling receive - used by netconsole and other diagnostic tools
989 * to allow network i/o with interrupts disabled.
991 static void el3_poll_controller(struct net_device *dev)
993 disable_irq(dev->irq);
994 el3_interrupt(dev->irq, dev);
995 enable_irq(dev->irq);
999 static struct net_device_stats *
1000 el3_get_stats(struct net_device *dev)
1002 struct el3_private *lp = netdev_priv(dev);
1003 unsigned long flags;
1006 * This is fast enough not to bother with disable IRQ
1010 spin_lock_irqsave(&lp->lock, flags);
1012 spin_unlock_irqrestore(&lp->lock, flags);
1016 /* Update statistics. We change to register window 6, so this should be run
1017 single-threaded if the device is active. This is expected to be a rare
1018 operation, and it's simpler for the rest of the driver to assume that
1019 window 1 is always valid rather than use a special window-state variable.
1021 static void update_stats(struct net_device *dev)
1023 struct el3_private *lp = netdev_priv(dev);
1024 int ioaddr = dev->base_addr;
1027 printk(" Updating the statistics.\n");
1028 /* Turn off statistics updates while reading. */
1029 outw(StatsDisable, ioaddr + EL3_CMD);
1030 /* Switch to the stats window, and read everything. */
1032 lp->stats.tx_carrier_errors += inb(ioaddr + 0);
1033 lp->stats.tx_heartbeat_errors += inb(ioaddr + 1);
1034 /* Multiple collisions. */ inb(ioaddr + 2);
1035 lp->stats.collisions += inb(ioaddr + 3);
1036 lp->stats.tx_window_errors += inb(ioaddr + 4);
1037 lp->stats.rx_fifo_errors += inb(ioaddr + 5);
1038 lp->stats.tx_packets += inb(ioaddr + 6);
1039 /* Rx packets */ inb(ioaddr + 7);
1040 /* Tx deferrals */ inb(ioaddr + 8);
1041 inw(ioaddr + 10); /* Total Rx and Tx octets. */
1044 /* Back to window 1, and turn statistics back on. */
1046 outw(StatsEnable, ioaddr + EL3_CMD);
1051 el3_rx(struct net_device *dev)
1053 struct el3_private *lp = netdev_priv(dev);
1054 int ioaddr = dev->base_addr;
1058 printk(" In rx_packet(), status %4.4x, rx_status %4.4x.\n",
1059 inw(ioaddr+EL3_STATUS), inw(ioaddr+RX_STATUS));
1060 while ((rx_status = inw(ioaddr + RX_STATUS)) > 0) {
1061 if (rx_status & 0x4000) { /* Error, update stats. */
1062 short error = rx_status & 0x3800;
1064 outw(RxDiscard, ioaddr + EL3_CMD);
1065 lp->stats.rx_errors++;
1067 case 0x0000: lp->stats.rx_over_errors++; break;
1068 case 0x0800: lp->stats.rx_length_errors++; break;
1069 case 0x1000: lp->stats.rx_frame_errors++; break;
1070 case 0x1800: lp->stats.rx_length_errors++; break;
1071 case 0x2000: lp->stats.rx_frame_errors++; break;
1072 case 0x2800: lp->stats.rx_crc_errors++; break;
1075 short pkt_len = rx_status & 0x7ff;
1076 struct sk_buff *skb;
1078 skb = dev_alloc_skb(pkt_len+5);
1079 lp->stats.rx_bytes += pkt_len;
1081 printk("Receiving packet size %d status %4.4x.\n",
1082 pkt_len, rx_status);
1084 skb_reserve(skb, 2); /* Align IP on 16 byte */
1086 /* 'skb->data' points to the start of sk_buff data area. */
1087 insl(ioaddr + RX_FIFO, skb_put(skb,pkt_len),
1088 (pkt_len + 3) >> 2);
1090 outw(RxDiscard, ioaddr + EL3_CMD); /* Pop top Rx packet. */
1091 skb->protocol = eth_type_trans(skb,dev);
1093 dev->last_rx = jiffies;
1094 lp->stats.rx_packets++;
1097 outw(RxDiscard, ioaddr + EL3_CMD);
1098 lp->stats.rx_dropped++;
1100 printk("%s: Couldn't allocate a sk_buff of size %d.\n",
1101 dev->name, pkt_len);
1103 inw(ioaddr + EL3_STATUS); /* Delay. */
1104 while (inw(ioaddr + EL3_STATUS) & 0x1000)
1105 printk(KERN_DEBUG " Waiting for 3c509 to discard packet, status %x.\n",
1106 inw(ioaddr + EL3_STATUS) );
1113 * Set or clear the multicast filter for this adaptor.
1116 set_multicast_list(struct net_device *dev)
1118 unsigned long flags;
1119 struct el3_private *lp = netdev_priv(dev);
1120 int ioaddr = dev->base_addr;
1122 if (el3_debug > 1) {
1124 if (old != dev->mc_count) {
1125 old = dev->mc_count;
1126 printk("%s: Setting Rx mode to %d addresses.\n", dev->name, dev->mc_count);
1129 spin_lock_irqsave(&lp->lock, flags);
1130 if (dev->flags&IFF_PROMISC) {
1131 outw(SetRxFilter | RxStation | RxMulticast | RxBroadcast | RxProm,
1134 else if (dev->mc_count || (dev->flags&IFF_ALLMULTI)) {
1135 outw(SetRxFilter | RxStation | RxMulticast | RxBroadcast, ioaddr + EL3_CMD);
1138 outw(SetRxFilter | RxStation | RxBroadcast, ioaddr + EL3_CMD);
1139 spin_unlock_irqrestore(&lp->lock, flags);
1143 el3_close(struct net_device *dev)
1145 int ioaddr = dev->base_addr;
1146 struct el3_private *lp = netdev_priv(dev);
1149 printk("%s: Shutting down ethercard.\n", dev->name);
1153 free_irq(dev->irq, dev);
1154 /* Switching back to window 0 disables the IRQ. */
1156 if (lp->type != EL3_EISA) {
1157 /* But we explicitly zero the IRQ line select anyway. Don't do
1158 * it on EISA cards, it prevents the module from getting an
1159 * IRQ after unload+reload... */
1160 outw(0x0f00, ioaddr + WN0_IRQ);
1167 el3_link_ok(struct net_device *dev)
1169 int ioaddr = dev->base_addr;
1173 tmp = inw(ioaddr + WN4_MEDIA);
1175 return tmp & (1<<11);
1179 el3_netdev_get_ecmd(struct net_device *dev, struct ethtool_cmd *ecmd)
1182 int ioaddr = dev->base_addr;
1185 /* obtain current transceiver via WN4_MEDIA? */
1186 tmp = inw(ioaddr + WN0_ADDR_CONF);
1187 ecmd->transceiver = XCVR_INTERNAL;
1188 switch (tmp >> 14) {
1190 ecmd->port = PORT_TP;
1193 ecmd->port = PORT_AUI;
1194 ecmd->transceiver = XCVR_EXTERNAL;
1197 ecmd->port = PORT_BNC;
1202 ecmd->duplex = DUPLEX_HALF;
1203 ecmd->supported = 0;
1204 tmp = inw(ioaddr + WN0_CONF_CTRL);
1206 ecmd->supported |= SUPPORTED_AUI;
1208 ecmd->supported |= SUPPORTED_BNC;
1210 ecmd->supported |= SUPPORTED_TP | SUPPORTED_10baseT_Half |
1211 SUPPORTED_10baseT_Full; /* hmm... */
1213 tmp = inw(ioaddr + WN4_NETDIAG);
1214 if (tmp & FD_ENABLE)
1215 ecmd->duplex = DUPLEX_FULL;
1218 ecmd->speed = SPEED_10;
1224 el3_netdev_set_ecmd(struct net_device *dev, struct ethtool_cmd *ecmd)
1227 int ioaddr = dev->base_addr;
1229 if (ecmd->speed != SPEED_10)
1231 if ((ecmd->duplex != DUPLEX_HALF) && (ecmd->duplex != DUPLEX_FULL))
1233 if ((ecmd->transceiver != XCVR_INTERNAL) && (ecmd->transceiver != XCVR_EXTERNAL))
1236 /* change XCVR type */
1238 tmp = inw(ioaddr + WN0_ADDR_CONF);
1239 switch (ecmd->port) {
1256 outw(tmp, ioaddr + WN0_ADDR_CONF);
1257 if (dev->if_port == 3) {
1258 /* fire up the DC-DC convertor if BNC gets enabled */
1259 tmp = inw(ioaddr + WN0_ADDR_CONF);
1260 if (tmp & (3 << 14)) {
1261 outw(StartCoax, ioaddr + EL3_CMD);
1268 tmp = inw(ioaddr + WN4_NETDIAG);
1269 if (ecmd->duplex == DUPLEX_FULL)
1273 outw(tmp, ioaddr + WN4_NETDIAG);
1279 static void el3_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
1281 strcpy(info->driver, DRV_NAME);
1282 strcpy(info->version, DRV_VERSION);
1285 static int el3_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
1287 struct el3_private *lp = netdev_priv(dev);
1290 spin_lock_irq(&lp->lock);
1291 ret = el3_netdev_get_ecmd(dev, ecmd);
1292 spin_unlock_irq(&lp->lock);
1296 static int el3_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
1298 struct el3_private *lp = netdev_priv(dev);
1301 spin_lock_irq(&lp->lock);
1302 ret = el3_netdev_set_ecmd(dev, ecmd);
1303 spin_unlock_irq(&lp->lock);
1307 static u32 el3_get_link(struct net_device *dev)
1309 struct el3_private *lp = netdev_priv(dev);
1312 spin_lock_irq(&lp->lock);
1313 ret = el3_link_ok(dev);
1314 spin_unlock_irq(&lp->lock);
1318 static u32 el3_get_msglevel(struct net_device *dev)
1323 static void el3_set_msglevel(struct net_device *dev, u32 v)
1328 static const struct ethtool_ops ethtool_ops = {
1329 .get_drvinfo = el3_get_drvinfo,
1330 .get_settings = el3_get_settings,
1331 .set_settings = el3_set_settings,
1332 .get_link = el3_get_link,
1333 .get_msglevel = el3_get_msglevel,
1334 .set_msglevel = el3_set_msglevel,
1338 el3_down(struct net_device *dev)
1340 int ioaddr = dev->base_addr;
1342 netif_stop_queue(dev);
1344 /* Turn off statistics ASAP. We update lp->stats below. */
1345 outw(StatsDisable, ioaddr + EL3_CMD);
1347 /* Disable the receiver and transmitter. */
1348 outw(RxDisable, ioaddr + EL3_CMD);
1349 outw(TxDisable, ioaddr + EL3_CMD);
1351 if (dev->if_port == 3)
1352 /* Turn off thinnet power. Green! */
1353 outw(StopCoax, ioaddr + EL3_CMD);
1354 else if (dev->if_port == 0) {
1355 /* Disable link beat and jabber, if_port may change here next open(). */
1357 outw(inw(ioaddr + WN4_MEDIA) & ~MEDIA_TP, ioaddr + WN4_MEDIA);
1360 outw(SetIntrEnb | 0x0000, ioaddr + EL3_CMD);
1366 el3_up(struct net_device *dev)
1368 int i, sw_info, net_diag;
1369 int ioaddr = dev->base_addr;
1371 /* Activating the board required and does no harm otherwise */
1372 outw(0x0001, ioaddr + 4);
1374 /* Set the IRQ line. */
1375 outw((dev->irq << 12) | 0x0f00, ioaddr + WN0_IRQ);
1377 /* Set the station address in window 2 each time opened. */
1380 for (i = 0; i < 6; i++)
1381 outb(dev->dev_addr[i], ioaddr + i);
1383 if ((dev->if_port & 0x03) == 3) /* BNC interface */
1384 /* Start the thinnet transceiver. We should really wait 50ms...*/
1385 outw(StartCoax, ioaddr + EL3_CMD);
1386 else if ((dev->if_port & 0x03) == 0) { /* 10baseT interface */
1387 /* Combine secondary sw_info word (the adapter level) and primary
1388 sw_info word (duplex setting plus other useless bits) */
1390 sw_info = (read_eeprom(ioaddr, 0x14) & 0x400f) |
1391 (read_eeprom(ioaddr, 0x0d) & 0xBff0);
1394 net_diag = inw(ioaddr + WN4_NETDIAG);
1395 net_diag = (net_diag | FD_ENABLE); /* temporarily assume full-duplex will be set */
1396 printk("%s: ", dev->name);
1397 switch (dev->if_port & 0x0c) {
1399 /* force full-duplex mode if 3c5x9b */
1400 if (sw_info & 0x000f) {
1401 printk("Forcing 3c5x9b full-duplex mode");
1405 /* set full-duplex mode based on eeprom config setting */
1406 if ((sw_info & 0x000f) && (sw_info & 0x8000)) {
1407 printk("Setting 3c5x9b full-duplex mode (from EEPROM configuration bit)");
1411 /* xcvr=(0 || 4) OR user has an old 3c5x9 non "B" model */
1412 printk("Setting 3c5x9/3c5x9B half-duplex mode");
1413 net_diag = (net_diag & ~FD_ENABLE); /* disable full duplex */
1416 outw(net_diag, ioaddr + WN4_NETDIAG);
1417 printk(" if_port: %d, sw_info: %4.4x\n", dev->if_port, sw_info);
1419 printk("%s: 3c5x9 net diag word is now: %4.4x.\n", dev->name, net_diag);
1420 /* Enable link beat and jabber check. */
1421 outw(inw(ioaddr + WN4_MEDIA) | MEDIA_TP, ioaddr + WN4_MEDIA);
1424 /* Switch to the stats window, and clear all stats by reading. */
1425 outw(StatsDisable, ioaddr + EL3_CMD);
1427 for (i = 0; i < 9; i++)
1432 /* Switch to register set 1 for normal use. */
1435 /* Accept b-case and phys addr only. */
1436 outw(SetRxFilter | RxStation | RxBroadcast, ioaddr + EL3_CMD);
1437 outw(StatsEnable, ioaddr + EL3_CMD); /* Turn on statistics. */
1439 outw(RxEnable, ioaddr + EL3_CMD); /* Enable the receiver. */
1440 outw(TxEnable, ioaddr + EL3_CMD); /* Enable transmitter. */
1441 /* Allow status bits to be seen. */
1442 outw(SetStatusEnb | 0xff, ioaddr + EL3_CMD);
1443 /* Ack all pending events, and set active indicator mask. */
1444 outw(AckIntr | IntLatch | TxAvailable | RxEarly | IntReq,
1446 outw(SetIntrEnb | IntLatch|TxAvailable|TxComplete|RxComplete|StatsFull,
1449 netif_start_queue(dev);
1452 /* Power Management support functions */
1456 el3_suspend(struct device *pdev, pm_message_t state)
1458 unsigned long flags;
1459 struct net_device *dev;
1460 struct el3_private *lp;
1463 dev = pdev->driver_data;
1464 lp = netdev_priv(dev);
1465 ioaddr = dev->base_addr;
1467 spin_lock_irqsave(&lp->lock, flags);
1469 if (netif_running(dev))
1470 netif_device_detach(dev);
1473 outw(PowerDown, ioaddr + EL3_CMD);
1475 spin_unlock_irqrestore(&lp->lock, flags);
1480 el3_resume(struct device *pdev)
1482 unsigned long flags;
1483 struct net_device *dev;
1484 struct el3_private *lp;
1487 dev = pdev->driver_data;
1488 lp = netdev_priv(dev);
1489 ioaddr = dev->base_addr;
1491 spin_lock_irqsave(&lp->lock, flags);
1493 outw(PowerUp, ioaddr + EL3_CMD);
1496 if (netif_running(dev))
1497 netif_device_attach(dev);
1499 spin_unlock_irqrestore(&lp->lock, flags);
1503 #endif /* EL3_SUSPEND */
1505 /* Parameters that may be passed into the module. */
1506 static int debug = -1;
1507 static int irq[] = {-1, -1, -1, -1, -1, -1, -1, -1};
1508 static int xcvr[] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
1510 module_param(debug,int, 0);
1511 module_param_array(irq, int, NULL, 0);
1512 module_param_array(xcvr, int, NULL, 0);
1513 module_param(max_interrupt_work, int, 0);
1514 MODULE_PARM_DESC(debug, "debug level (0-6)");
1515 MODULE_PARM_DESC(irq, "IRQ number(s) (assigned)");
1516 MODULE_PARM_DESC(xcvr,"transceiver(s) (0=internal, 1=external)");
1517 MODULE_PARM_DESC(max_interrupt_work, "maximum events handled per interrupt");
1518 #if defined(__ISAPNP__)
1519 module_param(nopnp, int, 0);
1520 MODULE_PARM_DESC(nopnp, "disable ISA PnP support (0-1)");
1521 MODULE_DEVICE_TABLE(isapnp, el3_isapnp_adapters);
1522 #endif /* __ISAPNP__ */
1523 MODULE_DESCRIPTION("3Com Etherlink III (3c509, 3c509B) ISA/PnP ethernet driver");
1524 MODULE_LICENSE("GPL");
1526 static int __init el3_init_module(void)
1534 el3_root_dev = NULL;
1535 while (el3_probe(el3_cards) == 0) {
1536 if (irq[el3_cards] > 1)
1537 el3_root_dev->irq = irq[el3_cards];
1538 if (xcvr[el3_cards] >= 0)
1539 el3_root_dev->if_port = xcvr[el3_cards];
1544 ret = eisa_driver_register(&el3_eisa_driver);
1548 int err = mca_register_driver(&el3_mca_driver);
1556 static void __exit el3_cleanup_module(void)
1558 struct net_device *next_dev;
1560 while (el3_root_dev) {
1561 struct el3_private *lp = netdev_priv(el3_root_dev);
1563 next_dev = lp->next_dev;
1564 el3_common_remove (el3_root_dev);
1565 el3_root_dev = next_dev;
1569 eisa_driver_unregister (&el3_eisa_driver);
1572 mca_unregister_driver(&el3_mca_driver);
1576 module_init (el3_init_module);
1577 module_exit (el3_cleanup_module);