2 net-3-driver for the IBM LAN Adapter/A
4 This is an extension to the Linux operating system, and is covered by the
5 same GNU General Public License that covers that work.
7 Copyright 1999 by Alfred Arnold (alfred@ccac.rwth-aachen.de,
8 alfred.arnold@lancom.de)
10 This driver is based both on the SK_MCA driver, which is itself based on the
11 SK_G16 and 3C523 driver.
14 'PC Hardware: Aufbau, Funktionsweise, Programmierung' by
15 Hans-Peter Messmer for the basic Microchannel stuff
17 'Linux Geraetetreiber' by Allesandro Rubini, Kalle Dalheimer
18 for help on Ethernet driver programming
20 'DP83934CVUL-20/25 MHz SONIC-T Ethernet Controller Datasheet' by National
21 Semiconductor for info on the MAC chip
23 'LAN Technical Reference Ethernet Adapter Interface Version 1 Release 1.0
24 Document Number SC30-3661-00' by IBM for info on the adapter itself
26 Also see http://www.natsemi.com/
28 special acknowledgements to:
29 - Bob Eager for helping me out with documentation from IBM
30 - Jim Shorney for his endless patience with me while I was using
31 him as a beta tester to trace down the address filter bug ;-)
35 -> set debug level via ioctl instead of compile-time switches
36 -> I didn't follow the development of the 2.1.x kernels, so my
37 assumptions about which things changed with which kernel version
42 startup from SK_MCA driver
44 finally got docs about the card. A big thank you to Bob Eager!
48 recv queue done, tcpdump works
50 transmission part works
52 added usage of the isa_functions for Linux 2.3 . Things should
53 still work with 2.0.x....
55 in Linux 2.2.13, the version.h file mysteriously didn't get
56 included. Added a workaround for this. Futhermore, it now
57 not only compiles as a modules ;-)
59 newer kernels automatically probe more than one board, so the
60 'startslot' as a variable is also needed here
62 the interrupt mask register is not set 'hard' instead of individually
63 setting registers, since this seems to set bits that shouldn't be
66 reset interrupt status immediately after CAM load
67 add a recovery delay after releasing the chip's reset line
69 finally found the bug in the address filter setup - damned signed
72 corrected version codes, added support for the latest 2.3 changes
74 cleaned up for the 2.5 tree <alan@redhat.com>
76 *************************************************************************/
78 #include <linux/kernel.h>
79 #include <linux/string.h>
80 #include <linux/errno.h>
81 #include <linux/ioport.h>
82 #include <linux/slab.h>
83 #include <linux/interrupt.h>
84 #include <linux/delay.h>
85 #include <linux/time.h>
86 #include <linux/mca-legacy.h>
87 #include <linux/module.h>
88 #include <linux/netdevice.h>
89 #include <linux/etherdevice.h>
90 #include <linux/skbuff.h>
91 #include <linux/bitops.h>
93 #include <asm/processor.h>
96 #define _IBM_LANA_DRIVER_
101 #define DRV_NAME "ibmlana"
103 /* ------------------------------------------------------------------------
104 * global static data - not more since we can handle multiple boards and
105 * have to pack all state info into the device struct!
106 * ------------------------------------------------------------------------ */
108 static char *MediaNames[Media_Count] = {
109 "10BaseT", "10Base5", "Unknown", "10Base2"
112 /* ------------------------------------------------------------------------
113 * private subfunctions
114 * ------------------------------------------------------------------------ */
117 /* dump all registers */
119 static void dumpregs(struct net_device *dev)
123 for (z = 0; z < 160; z += 2) {
125 printk("REGS: %04x:", z);
126 printk(" %04x", inw(dev->base_addr + z));
132 /* dump parts of shared memory - only needed during debugging */
134 static void dumpmem(struct net_device *dev, u32 start, u32 len)
136 ibmlana_priv *priv = netdev_priv(dev);
139 printk("Address %04x:\n", start);
140 for (z = 0; z < len; z++) {
143 printk(" %02x", readb(priv->base + start + z));
151 /* print exact time - ditto */
153 static void PrTime(void)
157 do_gettimeofday(&tv);
158 printk("%9d:%06d: ", (int) tv.tv_sec, (int) tv.tv_usec);
162 /* deduce resources out of POS registers */
164 static void getaddrs(int slot, int *base, int *memlen, int *iobase,
165 int *irq, ibmlana_medium * medium)
169 pos0 = mca_read_stored_pos(slot, 2);
170 pos1 = mca_read_stored_pos(slot, 3);
172 *base = 0xc0000 + ((pos1 & 0xf0) << 9);
173 *memlen = (pos1 & 0x01) ? 0x8000 : 0x4000;
174 *iobase = (pos0 & 0xe0) << 7;
175 switch (pos0 & 0x06) {
189 *medium = (pos0 & 0x18) >> 3;
192 /* wait on register value with mask and timeout */
194 static int wait_timeout(struct net_device *dev, int regoffs, u16 mask,
195 u16 value, int timeout)
197 unsigned long fin = jiffies + timeout;
199 while (time_before(jiffies,fin))
200 if ((inw(dev->base_addr + regoffs) & mask) == value)
207 /* reset the whole board */
209 static void ResetBoard(struct net_device *dev)
211 unsigned char bcmval;
213 /* read original board control value */
215 bcmval = inb(dev->base_addr + BCMREG);
217 /* set reset bit for a while */
219 bcmval |= BCMREG_RESET;
220 outb(bcmval, dev->base_addr + BCMREG);
222 bcmval &= ~BCMREG_RESET;
223 outb(bcmval, dev->base_addr + BCMREG);
225 /* switch over to RAM again */
227 bcmval |= BCMREG_RAMEN | BCMREG_RAMWIN;
228 outb(bcmval, dev->base_addr + BCMREG);
231 /* calculate RAM layout & set up descriptors in RAM */
233 static void InitDscrs(struct net_device *dev)
235 ibmlana_priv *priv = netdev_priv(dev);
236 u32 addr, baddr, raddr;
244 memset_io(priv->base, 0xaa,
245 dev->mem_start - dev->mem_start); /* XXX: typo? */
247 /* setup n TX descriptors - independent of RAM size */
249 priv->tdastart = addr = 0;
250 priv->txbufstart = baddr = sizeof(tda_t) * TXBUFCNT;
251 for (z = 0; z < TXBUFCNT; z++) {
259 if (z == TXBUFCNT - 1)
260 tda.link = priv->tdastart;
262 tda.link = addr + sizeof(tda_t);
264 memcpy_toio(priv->base + addr, &tda, sizeof(tda_t));
265 addr += sizeof(tda_t);
269 /* calculate how many receive buffers fit into remaining memory */
271 priv->rxbufcnt = (dev->mem_end - dev->mem_start - baddr) / (sizeof(rra_t) + sizeof(rda_t) + PKTSIZE);
273 /* calculate receive addresses */
275 priv->rrastart = raddr = priv->txbufstart + (TXBUFCNT * PKTSIZE);
276 priv->rdastart = addr = priv->rrastart + (priv->rxbufcnt * sizeof(rra_t));
277 priv->rxbufstart = baddr = priv->rdastart + (priv->rxbufcnt * sizeof(rda_t));
279 for (z = 0; z < priv->rxbufcnt; z++) {
282 rra.cntlo = PKTSIZE >> 1;
284 memcpy_toio(priv->base + raddr, &rra, sizeof(rra_t));
291 if (z < priv->rxbufcnt - 1)
292 rda.link = addr + sizeof(rda_t);
296 memcpy_toio(priv->base + addr, &rda, sizeof(rda_t));
299 raddr += sizeof(rra_t);
300 addr += sizeof(rda_t);
303 /* initialize current pointers */
305 priv->nextrxdescr = 0;
306 priv->lastrxdescr = priv->rxbufcnt - 1;
307 priv->nexttxdescr = 0;
308 priv->currtxdescr = 0;
310 memset(priv->txused, 0, sizeof(priv->txused));
313 /* set up Rx + Tx descriptors in SONIC */
315 static int InitSONIC(struct net_device *dev)
317 ibmlana_priv *priv = netdev_priv(dev);
319 /* set up start & end of resource area */
322 outw(priv->rrastart, dev->base_addr + SONIC_RSA);
323 outw(priv->rrastart + (priv->rxbufcnt * sizeof(rra_t)), dev->base_addr + SONIC_REA);
324 outw(priv->rrastart, dev->base_addr + SONIC_RRP);
325 outw(priv->rrastart, dev->base_addr + SONIC_RWP);
327 /* set EOBC so that only one packet goes into one buffer */
329 outw((PKTSIZE - 4) >> 1, dev->base_addr + SONIC_EOBC);
331 /* let SONIC read the first RRA descriptor */
333 outw(CMDREG_RRRA, dev->base_addr + SONIC_CMDREG);
334 if (!wait_timeout(dev, SONIC_CMDREG, CMDREG_RRRA, 0, 2)) {
335 printk(KERN_ERR "%s: SONIC did not respond on RRRA command - giving up.", dev->name);
339 /* point SONIC to the first RDA */
341 outw(0, dev->base_addr + SONIC_URDA);
342 outw(priv->rdastart, dev->base_addr + SONIC_CRDA);
344 /* set upper half of TDA address */
346 outw(0, dev->base_addr + SONIC_UTDA);
351 /* stop SONIC so we can reinitialize it */
353 static void StopSONIC(struct net_device *dev)
355 /* disable interrupts */
357 outb(inb(dev->base_addr + BCMREG) & (~BCMREG_IEN), dev->base_addr + BCMREG);
358 outb(0, dev->base_addr + SONIC_IMREG);
360 /* reset the SONIC */
362 outw(CMDREG_RST, dev->base_addr + SONIC_CMDREG);
364 outw(CMDREG_RST, dev->base_addr + SONIC_CMDREG);
367 /* initialize card and SONIC for proper operation */
369 static void putcam(camentry_t * cams, int *camcnt, char *addr)
371 camentry_t *pcam = cams + (*camcnt);
372 u8 *uaddr = (u8 *) addr;
374 pcam->index = *camcnt;
375 pcam->addr0 = (((u16) uaddr[1]) << 8) | uaddr[0];
376 pcam->addr1 = (((u16) uaddr[3]) << 8) | uaddr[2];
377 pcam->addr2 = (((u16) uaddr[5]) << 8) | uaddr[4];
381 static void InitBoard(struct net_device *dev)
383 ibmlana_priv *priv = netdev_priv(dev);
387 struct dev_mc_list *mcptr;
390 /* reset the SONIC */
392 outw(CMDREG_RST, dev->base_addr + SONIC_CMDREG);
395 /* clear all spurious interrupts */
397 outw(inw(dev->base_addr + SONIC_ISREG), dev->base_addr + SONIC_ISREG);
399 /* set up the SONIC's bus interface - constant for this adapter -
400 must be done while the SONIC is in reset */
402 outw(DCREG_USR1 | DCREG_USR0 | DCREG_WC1 | DCREG_DW32, dev->base_addr + SONIC_DCREG);
403 outw(0, dev->base_addr + SONIC_DCREG2);
405 /* remove reset form the SONIC */
407 outw(0, dev->base_addr + SONIC_CMDREG);
410 /* data sheet requires URRA to be programmed before setting up the CAM contents */
412 outw(0, dev->base_addr + SONIC_URRA);
414 /* program the CAM entry 0 to the device address */
417 putcam(cams, &camcnt, dev->dev_addr);
419 /* start putting the multicast addresses into the CAM list. Stop if
422 for (mcptr = dev->mc_list; mcptr != NULL; mcptr = mcptr->next) {
423 putcam(cams, &camcnt, mcptr->dmi_addr);
428 /* calculate CAM mask */
430 cammask = (1 << camcnt) - 1;
432 /* feed CDA into SONIC, initialize RCR value (always get broadcasts) */
434 memcpy_toio(priv->base, cams, sizeof(camentry_t) * camcnt);
435 memcpy_toio(priv->base + (sizeof(camentry_t) * camcnt), &cammask, sizeof(cammask));
438 printk("CAM setup:\n");
439 dumpmem(dev, 0, sizeof(camentry_t) * camcnt + sizeof(cammask));
442 outw(0, dev->base_addr + SONIC_CAMPTR);
443 outw(camcnt, dev->base_addr + SONIC_CAMCNT);
444 outw(CMDREG_LCAM, dev->base_addr + SONIC_CMDREG);
445 if (!wait_timeout(dev, SONIC_CMDREG, CMDREG_LCAM, 0, 2)) {
446 printk(KERN_ERR "%s:SONIC did not respond on LCAM command - giving up.", dev->name);
449 /* clear interrupt condition */
451 outw(ISREG_LCD, dev->base_addr + SONIC_ISREG);
454 printk("Loading CAM done, address pointers %04x:%04x\n",
455 inw(dev->base_addr + SONIC_URRA),
456 inw(dev->base_addr + SONIC_CAMPTR));
460 printk("\n-->CAM: PTR %04x CNT %04x\n",
461 inw(dev->base_addr + SONIC_CAMPTR),
462 inw(dev->base_addr + SONIC_CAMCNT));
463 outw(CMDREG_RST, dev->base_addr + SONIC_CMDREG);
464 for (z = 0; z < camcnt; z++) {
465 outw(z, dev->base_addr + SONIC_CAMEPTR);
466 printk("Entry %d: %04x %04x %04x\n", z,
467 inw(dev->base_addr + SONIC_CAMADDR0),
468 inw(dev->base_addr + SONIC_CAMADDR1),
469 inw(dev->base_addr + SONIC_CAMADDR2));
471 outw(0, dev->base_addr + SONIC_CMDREG);
476 rcrval = RCREG_BRD | RCREG_LB_NONE;
478 /* if still multicast addresses left or ALLMULTI is set, set the multicast
481 if ((dev->flags & IFF_ALLMULTI) || (mcptr != NULL))
484 /* promiscous mode ? */
486 if (dev->flags & IFF_PROMISC)
489 /* program receive mode */
491 outw(rcrval, dev->base_addr + SONIC_RCREG);
493 printk("\nRCRVAL: %04x\n", rcrval);
496 /* set up descriptors in shared memory + feed them into SONIC registers */
502 /* reset all pending interrupts */
504 outw(0xffff, dev->base_addr + SONIC_ISREG);
506 /* enable transmitter + receiver interrupts */
508 outw(CMDREG_RXEN, dev->base_addr + SONIC_CMDREG);
509 outw(IMREG_PRXEN | IMREG_RBEEN | IMREG_PTXEN | IMREG_TXEREN, dev->base_addr + SONIC_IMREG);
511 /* turn on card interrupts */
513 outb(inb(dev->base_addr + BCMREG) | BCMREG_IEN, dev->base_addr + BCMREG);
516 printk("Register dump after initialization:\n");
521 /* start transmission of a descriptor */
523 static void StartTx(struct net_device *dev, int descr)
525 ibmlana_priv *priv = netdev_priv(dev);
528 addr = priv->tdastart + (descr * sizeof(tda_t));
530 /* put descriptor address into SONIC */
532 outw(addr, dev->base_addr + SONIC_CTDA);
534 /* trigger transmitter */
536 priv->currtxdescr = descr;
537 outw(CMDREG_TXP, dev->base_addr + SONIC_CMDREG);
540 /* ------------------------------------------------------------------------
541 * interrupt handler(s)
542 * ------------------------------------------------------------------------ */
544 /* receive buffer area exhausted */
546 static void irqrbe_handler(struct net_device *dev)
548 ibmlana_priv *priv = netdev_priv(dev);
550 /* point the SONIC back to the RRA start */
552 outw(priv->rrastart, dev->base_addr + SONIC_RRP);
553 outw(priv->rrastart, dev->base_addr + SONIC_RWP);
556 /* receive interrupt */
558 static void irqrx_handler(struct net_device *dev)
560 ibmlana_priv *priv = netdev_priv(dev);
562 u32 rdaaddr, lrdaaddr;
567 /* read descriptor that was next to be filled by SONIC */
569 rdaaddr = priv->rdastart + (priv->nextrxdescr * sizeof(rda_t));
570 lrdaaddr = priv->rdastart + (priv->lastrxdescr * sizeof(rda_t));
571 memcpy_fromio(&rda, priv->base + rdaaddr, sizeof(rda_t));
573 /* iron out upper word halves of fields we use - SONIC will duplicate
574 bits 0..15 to 16..31 */
576 rda.status &= 0xffff;
577 rda.length &= 0xffff;
578 rda.startlo &= 0xffff;
580 /* stop if the SONIC still owns it, i.e. there is no data for us */
587 else if (rda.status & RCREG_PRX) {
592 skb = dev_alloc_skb(rda.length + 2);
594 priv->stat.rx_dropped++;
598 memcpy_fromio(skb_put(skb, rda.length),
600 rda.startlo, rda.length);
602 /* set up skb fields */
605 skb->protocol = eth_type_trans(skb, dev);
606 skb->ip_summed = CHECKSUM_NONE;
609 dev->last_rx = jiffies;
610 priv->stat.rx_packets++;
611 priv->stat.rx_bytes += rda.length;
613 /* pass to the upper layers */
618 /* otherwise check error status bits and increase statistics */
621 priv->stat.rx_errors++;
622 if (rda.status & RCREG_FAER)
623 priv->stat.rx_frame_errors++;
624 if (rda.status & RCREG_CRCR)
625 priv->stat.rx_crc_errors++;
628 /* descriptor processed, will become new last descriptor in queue */
632 memcpy_toio(priv->base + rdaaddr, &rda,
635 /* set up link and EOL = 0 in currently last descriptor. Only write
636 the link field since the SONIC may currently already access the
639 memcpy_toio(priv->base + lrdaaddr + 20, &rdaaddr, 4);
641 /* advance indices */
643 priv->lastrxdescr = priv->nextrxdescr;
644 if ((++priv->nextrxdescr) >= priv->rxbufcnt)
645 priv->nextrxdescr = 0;
649 /* transmit interrupt */
651 static void irqtx_handler(struct net_device *dev)
653 ibmlana_priv *priv = netdev_priv(dev);
656 /* fetch descriptor (we forgot the size ;-) */
657 memcpy_fromio(&tda, priv->base + priv->tdastart + (priv->currtxdescr * sizeof(tda_t)), sizeof(tda_t));
659 /* update statistics */
660 priv->stat.tx_packets++;
661 priv->stat.tx_bytes += tda.length;
663 /* update our pointers */
664 priv->txused[priv->currtxdescr] = 0;
667 /* if there are more descriptors present in RAM, start them */
668 if (priv->txusedcnt > 0)
669 StartTx(dev, (priv->currtxdescr + 1) % TXBUFCNT);
671 /* tell the upper layer we can go on transmitting */
672 netif_wake_queue(dev);
675 static void irqtxerr_handler(struct net_device *dev)
677 ibmlana_priv *priv = netdev_priv(dev);
680 /* fetch descriptor to check status */
681 memcpy_fromio(&tda, priv->base + priv->tdastart + (priv->currtxdescr * sizeof(tda_t)), sizeof(tda_t));
683 /* update statistics */
684 priv->stat.tx_errors++;
685 if (tda.status & (TCREG_NCRS | TCREG_CRSL))
686 priv->stat.tx_carrier_errors++;
687 if (tda.status & TCREG_EXC)
688 priv->stat.tx_aborted_errors++;
689 if (tda.status & TCREG_OWC)
690 priv->stat.tx_window_errors++;
691 if (tda.status & TCREG_FU)
692 priv->stat.tx_fifo_errors++;
694 /* update our pointers */
695 priv->txused[priv->currtxdescr] = 0;
698 /* if there are more descriptors present in RAM, start them */
699 if (priv->txusedcnt > 0)
700 StartTx(dev, (priv->currtxdescr + 1) % TXBUFCNT);
702 /* tell the upper layer we can go on transmitting */
703 netif_wake_queue(dev);
706 /* general interrupt entry */
708 static irqreturn_t irq_handler(int irq, void *device)
710 struct net_device *dev = (struct net_device *) device;
713 /* in case we're not meant... */
714 if (!(inb(dev->base_addr + BCMREG) & BCMREG_IPEND))
717 /* loop through the interrupt bits until everything is clear */
719 ival = inw(dev->base_addr + SONIC_ISREG);
721 if (ival & ISREG_RBE) {
723 outw(ISREG_RBE, dev->base_addr + SONIC_ISREG);
725 if (ival & ISREG_PKTRX) {
727 outw(ISREG_PKTRX, dev->base_addr + SONIC_ISREG);
729 if (ival & ISREG_TXDN) {
731 outw(ISREG_TXDN, dev->base_addr + SONIC_ISREG);
733 if (ival & ISREG_TXER) {
734 irqtxerr_handler(dev);
735 outw(ISREG_TXER, dev->base_addr + SONIC_ISREG);
742 /* ------------------------------------------------------------------------
744 * ------------------------------------------------------------------------ */
748 static int ibmlana_getinfo(char *buf, int slot, void *d)
751 struct net_device *dev = (struct net_device *) d;
754 /* can't say anything about an uninitialized device... */
758 priv = netdev_priv(dev);
762 len += sprintf(buf + len, "IRQ: %d\n", priv->realirq);
763 len += sprintf(buf + len, "I/O: %#lx\n", dev->base_addr);
764 len += sprintf(buf + len, "Memory: %#lx-%#lx\n", dev->mem_start, dev->mem_end - 1);
765 len += sprintf(buf + len, "Transceiver: %s\n", MediaNames[priv->medium]);
766 len += sprintf(buf + len, "Device: %s\n", dev->name);
767 len += sprintf(buf + len, "MAC address:");
768 for (i = 0; i < 6; i++)
769 len += sprintf(buf + len, " %02x", dev->dev_addr[i]);
776 /* open driver. Means also initialization and start of LANCE */
778 static int ibmlana_open(struct net_device *dev)
781 ibmlana_priv *priv = netdev_priv(dev);
783 /* register resources - only necessary for IRQ */
785 result = request_irq(priv->realirq, irq_handler, IRQF_SHARED | IRQF_SAMPLE_RANDOM, dev->name, dev);
787 printk(KERN_ERR "%s: failed to register irq %d\n", dev->name, dev->irq);
790 dev->irq = priv->realirq;
792 /* set up the card and SONIC */
795 /* initialize operational flags */
796 netif_start_queue(dev);
800 /* close driver. Shut down board and free allocated resources */
802 static int ibmlana_close(struct net_device *dev)
806 /* release resources */
808 free_irq(dev->irq, dev);
813 /* transmit a block. */
815 static int ibmlana_tx(struct sk_buff *skb, struct net_device *dev)
817 ibmlana_priv *priv = netdev_priv(dev);
818 int retval = 0, tmplen, addr;
823 /* find out if there are free slots for a frame to transmit. If not,
824 the upper layer is in deep desperation and we simply ignore the frame. */
826 if (priv->txusedcnt >= TXBUFCNT) {
828 priv->stat.tx_dropped++;
832 /* copy the frame data into the next free transmit buffer - fillup missing */
836 baddr = priv->txbufstart + (priv->nexttxdescr * PKTSIZE);
837 memcpy_toio(priv->base + baddr, skb->data, skb->len);
839 /* copy filler into RAM - in case we're filling up...
840 we're filling a bit more than necessary, but that doesn't harm
841 since the buffer is far larger...
842 Sorry Linus for the filler string but I couldn't resist ;-) */
844 if (tmplen > skb->len) {
845 char *fill = "NetBSD is a nice OS too! ";
846 unsigned int destoffs = skb->len, l = strlen(fill);
848 while (destoffs < tmplen) {
849 memcpy_toio(priv->base + baddr + destoffs, fill, l);
854 /* set up the new frame descriptor */
855 addr = priv->tdastart + (priv->nexttxdescr * sizeof(tda_t));
856 memcpy_fromio(&tda, priv->base + addr, sizeof(tda_t));
857 tda.length = tda.fraglength = tmplen;
858 memcpy_toio(priv->base + addr, &tda, sizeof(tda_t));
860 /* if there were no active descriptors, trigger the SONIC */
861 spin_lock_irqsave(&priv->lock, flags);
864 priv->txused[priv->nexttxdescr] = 1;
866 /* are all transmission slots used up ? */
867 if (priv->txusedcnt >= TXBUFCNT)
868 netif_stop_queue(dev);
870 if (priv->txusedcnt == 1)
871 StartTx(dev, priv->nexttxdescr);
872 priv->nexttxdescr = (priv->nexttxdescr + 1) % TXBUFCNT;
874 spin_unlock_irqrestore(&priv->lock, flags);
880 /* return pointer to Ethernet statistics */
882 static struct net_device_stats *ibmlana_stats(struct net_device *dev)
884 ibmlana_priv *priv = netdev_priv(dev);
888 /* switch receiver mode. */
890 static void ibmlana_set_multicast_list(struct net_device *dev)
892 /* first stop the SONIC... */
894 /* ...then reinit it with the new flags */
898 /* ------------------------------------------------------------------------
900 * ------------------------------------------------------------------------ */
902 static int startslot; /* counts through slots when probing multiple devices */
904 static int ibmlana_probe(struct net_device *dev)
907 int base = 0, irq = 0, iobase = 0, memlen = 0;
909 ibmlana_medium medium;
911 SET_MODULE_OWNER(dev);
913 /* can't work without an MCA bus ;-) */
917 base = dev->mem_start;
920 for (slot = startslot; (slot = mca_find_adapter(IBM_LANA_ID, slot)) != -1; slot++) {
921 /* deduce card addresses */
922 getaddrs(slot, &base, &memlen, &iobase, &irq, &medium);
924 /* slot already in use ? */
925 if (mca_is_adapter_used(slot))
927 /* were we looking for something different ? */
928 if (dev->irq && dev->irq != irq)
930 if (dev->mem_start && dev->mem_start != base)
932 /* found something that matches */
936 /* nothing found ? */
938 return (base != 0 || irq != 0) ? -ENXIO : -ENODEV;
940 /* announce success */
941 printk(KERN_INFO "%s: IBM LAN Adapter/A found in slot %d\n", dev->name, slot + 1);
943 /* try to obtain I/O range */
944 if (!request_region(iobase, IBM_LANA_IORANGE, DRV_NAME)) {
945 printk(KERN_ERR "%s: cannot allocate I/O range at %#x!\n", DRV_NAME, iobase);
946 startslot = slot + 1;
950 priv = netdev_priv(dev);
953 priv->medium = medium;
954 spin_lock_init(&priv->lock);
957 /* set base + irq for this device (irq not allocated so far) */
960 dev->mem_start = base;
961 dev->mem_end = base + memlen;
962 dev->base_addr = iobase;
964 priv->base = ioremap(base, memlen);
966 printk(KERN_ERR "%s: cannot remap memory!\n", DRV_NAME);
967 startslot = slot + 1;
968 release_region(iobase, IBM_LANA_IORANGE);
972 /* make procfs entries */
973 mca_set_adapter_name(slot, "IBM LAN Adapter/A");
974 mca_set_adapter_procfn(slot, (MCA_ProcFn) ibmlana_getinfo, dev);
976 mca_mark_as_used(slot);
980 dev->open = ibmlana_open;
981 dev->stop = ibmlana_close;
982 dev->hard_start_xmit = ibmlana_tx;
983 dev->do_ioctl = NULL;
984 dev->get_stats = ibmlana_stats;
985 dev->set_multicast_list = ibmlana_set_multicast_list;
986 dev->flags |= IFF_MULTICAST;
988 /* copy out MAC address */
990 for (z = 0; z < sizeof(dev->dev_addr); z++)
991 dev->dev_addr[z] = inb(dev->base_addr + MACADDRPROM + z);
995 printk(KERN_INFO "%s: IRQ %d, I/O %#lx, memory %#lx-%#lx, "
996 "MAC address %02x:%02x:%02x:%02x:%02x:%02x.\n",
997 dev->name, priv->realirq, dev->base_addr,
998 dev->mem_start, dev->mem_end - 1,
999 dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
1000 dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
1001 printk(KERN_INFO "%s: %s medium\n", dev->name, MediaNames[priv->medium]);
1007 /* next probe will start at next slot */
1009 startslot = slot + 1;
1014 /* ------------------------------------------------------------------------
1015 * modularization support
1016 * ------------------------------------------------------------------------ */
1022 static struct net_device *moddevs[DEVMAX];
1026 module_param(irq, int, 0);
1027 module_param(io, int, 0);
1028 MODULE_PARM_DESC(irq, "IBM LAN/A IRQ number");
1029 MODULE_PARM_DESC(io, "IBM LAN/A I/O base address");
1030 MODULE_LICENSE("GPL");
1032 int init_module(void)
1037 for (z = 0; z < DEVMAX; z++) {
1038 struct net_device *dev = alloc_etherdev(sizeof(ibmlana_priv));
1042 dev->base_addr = io;
1043 if (ibmlana_probe(dev)) {
1047 if (register_netdev(dev)) {
1048 ibmlana_priv *priv = netdev_priv(dev);
1049 release_region(dev->base_addr, IBM_LANA_IORANGE);
1050 mca_mark_as_unused(priv->slot);
1051 mca_set_adapter_name(priv->slot, "");
1052 mca_set_adapter_procfn(priv->slot, NULL, NULL);
1053 iounmap(priv->base);
1059 return (z > 0) ? 0 : -EIO;
1062 void cleanup_module(void)
1065 for (z = 0; z < DEVMAX; z++) {
1066 struct net_device *dev = moddevs[z];
1068 ibmlana_priv *priv = netdev_priv(dev);
1069 unregister_netdev(dev);
1070 /*DeinitBoard(dev); */
1071 release_region(dev->base_addr, IBM_LANA_IORANGE);
1072 mca_mark_as_unused(priv->slot);
1073 mca_set_adapter_name(priv->slot, "");
1074 mca_set_adapter_procfn(priv->slot, NULL, NULL);
1075 iounmap(priv->base);