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)
138 printk("Address %04x:\n", start);
139 for (z = 0; z < len; z++) {
142 printk(" %02x", isa_readb(dev->mem_start + start + z));
150 /* print exact time - ditto */
152 static void PrTime(void)
156 do_gettimeofday(&tv);
157 printk("%9d:%06d: ", (int) tv.tv_sec, (int) tv.tv_usec);
161 /* deduce resources out of POS registers */
163 static void getaddrs(int slot, int *base, int *memlen, int *iobase,
164 int *irq, ibmlana_medium * medium)
168 pos0 = mca_read_stored_pos(slot, 2);
169 pos1 = mca_read_stored_pos(slot, 3);
171 *base = 0xc0000 + ((pos1 & 0xf0) << 9);
172 *memlen = (pos1 & 0x01) ? 0x8000 : 0x4000;
173 *iobase = (pos0 & 0xe0) << 7;
174 switch (pos0 & 0x06) {
188 *medium = (pos0 & 0x18) >> 3;
191 /* wait on register value with mask and timeout */
193 static int wait_timeout(struct net_device *dev, int regoffs, u16 mask,
194 u16 value, int timeout)
196 unsigned long fin = jiffies + timeout;
198 while (time_before(jiffies,fin))
199 if ((inw(dev->base_addr + regoffs) & mask) == value)
206 /* reset the whole board */
208 static void ResetBoard(struct net_device *dev)
210 unsigned char bcmval;
212 /* read original board control value */
214 bcmval = inb(dev->base_addr + BCMREG);
216 /* set reset bit for a while */
218 bcmval |= BCMREG_RESET;
219 outb(bcmval, dev->base_addr + BCMREG);
221 bcmval &= ~BCMREG_RESET;
222 outb(bcmval, dev->base_addr + BCMREG);
224 /* switch over to RAM again */
226 bcmval |= BCMREG_RAMEN | BCMREG_RAMWIN;
227 outb(bcmval, dev->base_addr + BCMREG);
230 /* calculate RAM layout & set up descriptors in RAM */
232 static void InitDscrs(struct net_device *dev)
234 ibmlana_priv *priv = (ibmlana_priv *) dev->priv;
235 u32 addr, baddr, raddr;
243 isa_memset_io(dev->mem_start, 0xaa,
244 dev->mem_start - dev->mem_start);
246 /* setup n TX descriptors - independent of RAM size */
248 priv->tdastart = addr = 0;
249 priv->txbufstart = baddr = sizeof(tda_t) * TXBUFCNT;
250 for (z = 0; z < TXBUFCNT; z++) {
258 if (z == TXBUFCNT - 1)
259 tda.link = priv->tdastart;
261 tda.link = addr + sizeof(tda_t);
263 isa_memcpy_toio(dev->mem_start + addr, &tda, sizeof(tda_t));
264 addr += sizeof(tda_t);
268 /* calculate how many receive buffers fit into remaining memory */
270 priv->rxbufcnt = (dev->mem_end - dev->mem_start - baddr) / (sizeof(rra_t) + sizeof(rda_t) + PKTSIZE);
272 /* calculate receive addresses */
274 priv->rrastart = raddr = priv->txbufstart + (TXBUFCNT * PKTSIZE);
275 priv->rdastart = addr = priv->rrastart + (priv->rxbufcnt * sizeof(rra_t));
276 priv->rxbufstart = baddr = priv->rdastart + (priv->rxbufcnt * sizeof(rda_t));
278 for (z = 0; z < priv->rxbufcnt; z++) {
281 rra.cntlo = PKTSIZE >> 1;
283 isa_memcpy_toio(dev->mem_start + raddr, &rra, sizeof(rra_t));
290 if (z < priv->rxbufcnt - 1)
291 rda.link = addr + sizeof(rda_t);
295 isa_memcpy_toio(dev->mem_start + addr, &rda, sizeof(rda_t));
298 raddr += sizeof(rra_t);
299 addr += sizeof(rda_t);
302 /* initialize current pointers */
304 priv->nextrxdescr = 0;
305 priv->lastrxdescr = priv->rxbufcnt - 1;
306 priv->nexttxdescr = 0;
307 priv->currtxdescr = 0;
309 memset(priv->txused, 0, sizeof(priv->txused));
312 /* set up Rx + Tx descriptors in SONIC */
314 static int InitSONIC(struct net_device *dev)
316 ibmlana_priv *priv = (ibmlana_priv *) dev->priv;
318 /* set up start & end of resource area */
321 outw(priv->rrastart, dev->base_addr + SONIC_RSA);
322 outw(priv->rrastart + (priv->rxbufcnt * sizeof(rra_t)), dev->base_addr + SONIC_REA);
323 outw(priv->rrastart, dev->base_addr + SONIC_RRP);
324 outw(priv->rrastart, dev->base_addr + SONIC_RWP);
326 /* set EOBC so that only one packet goes into one buffer */
328 outw((PKTSIZE - 4) >> 1, dev->base_addr + SONIC_EOBC);
330 /* let SONIC read the first RRA descriptor */
332 outw(CMDREG_RRRA, dev->base_addr + SONIC_CMDREG);
333 if (!wait_timeout(dev, SONIC_CMDREG, CMDREG_RRRA, 0, 2)) {
334 printk(KERN_ERR "%s: SONIC did not respond on RRRA command - giving up.", dev->name);
338 /* point SONIC to the first RDA */
340 outw(0, dev->base_addr + SONIC_URDA);
341 outw(priv->rdastart, dev->base_addr + SONIC_CRDA);
343 /* set upper half of TDA address */
345 outw(0, dev->base_addr + SONIC_UTDA);
350 /* stop SONIC so we can reinitialize it */
352 static void StopSONIC(struct net_device *dev)
354 /* disable interrupts */
356 outb(inb(dev->base_addr + BCMREG) & (~BCMREG_IEN), dev->base_addr + BCMREG);
357 outb(0, dev->base_addr + SONIC_IMREG);
359 /* reset the SONIC */
361 outw(CMDREG_RST, dev->base_addr + SONIC_CMDREG);
363 outw(CMDREG_RST, dev->base_addr + SONIC_CMDREG);
366 /* initialize card and SONIC for proper operation */
368 static void putcam(camentry_t * cams, int *camcnt, char *addr)
370 camentry_t *pcam = cams + (*camcnt);
371 u8 *uaddr = (u8 *) addr;
373 pcam->index = *camcnt;
374 pcam->addr0 = (((u16) uaddr[1]) << 8) | uaddr[0];
375 pcam->addr1 = (((u16) uaddr[3]) << 8) | uaddr[2];
376 pcam->addr2 = (((u16) uaddr[5]) << 8) | uaddr[4];
380 static void InitBoard(struct net_device *dev)
385 struct dev_mc_list *mcptr;
388 /* reset the SONIC */
390 outw(CMDREG_RST, dev->base_addr + SONIC_CMDREG);
393 /* clear all spurious interrupts */
395 outw(inw(dev->base_addr + SONIC_ISREG), dev->base_addr + SONIC_ISREG);
397 /* set up the SONIC's bus interface - constant for this adapter -
398 must be done while the SONIC is in reset */
400 outw(DCREG_USR1 | DCREG_USR0 | DCREG_WC1 | DCREG_DW32, dev->base_addr + SONIC_DCREG);
401 outw(0, dev->base_addr + SONIC_DCREG2);
403 /* remove reset form the SONIC */
405 outw(0, dev->base_addr + SONIC_CMDREG);
408 /* data sheet requires URRA to be programmed before setting up the CAM contents */
410 outw(0, dev->base_addr + SONIC_URRA);
412 /* program the CAM entry 0 to the device address */
415 putcam(cams, &camcnt, dev->dev_addr);
417 /* start putting the multicast addresses into the CAM list. Stop if
420 for (mcptr = dev->mc_list; mcptr != NULL; mcptr = mcptr->next) {
421 putcam(cams, &camcnt, mcptr->dmi_addr);
426 /* calculate CAM mask */
428 cammask = (1 << camcnt) - 1;
430 /* feed CDA into SONIC, initialize RCR value (always get broadcasts) */
432 isa_memcpy_toio(dev->mem_start, cams, sizeof(camentry_t) * camcnt);
433 isa_memcpy_toio(dev->mem_start + (sizeof(camentry_t) * camcnt), &cammask, sizeof(cammask));
436 printk("CAM setup:\n");
437 dumpmem(dev, 0, sizeof(camentry_t) * camcnt + sizeof(cammask));
440 outw(0, dev->base_addr + SONIC_CAMPTR);
441 outw(camcnt, dev->base_addr + SONIC_CAMCNT);
442 outw(CMDREG_LCAM, dev->base_addr + SONIC_CMDREG);
443 if (!wait_timeout(dev, SONIC_CMDREG, CMDREG_LCAM, 0, 2)) {
444 printk(KERN_ERR "%s:SONIC did not respond on LCAM command - giving up.", dev->name);
447 /* clear interrupt condition */
449 outw(ISREG_LCD, dev->base_addr + SONIC_ISREG);
452 printk("Loading CAM done, address pointers %04x:%04x\n",
453 inw(dev->base_addr + SONIC_URRA),
454 inw(dev->base_addr + SONIC_CAMPTR));
458 printk("\n-->CAM: PTR %04x CNT %04x\n",
459 inw(dev->base_addr + SONIC_CAMPTR),
460 inw(dev->base_addr + SONIC_CAMCNT));
461 outw(CMDREG_RST, dev->base_addr + SONIC_CMDREG);
462 for (z = 0; z < camcnt; z++) {
463 outw(z, dev->base_addr + SONIC_CAMEPTR);
464 printk("Entry %d: %04x %04x %04x\n", z,
465 inw(dev->base_addr + SONIC_CAMADDR0),
466 inw(dev->base_addr + SONIC_CAMADDR1),
467 inw(dev->base_addr + SONIC_CAMADDR2));
469 outw(0, dev->base_addr + SONIC_CMDREG);
474 rcrval = RCREG_BRD | RCREG_LB_NONE;
476 /* if still multicast addresses left or ALLMULTI is set, set the multicast
479 if ((dev->flags & IFF_ALLMULTI) || (mcptr != NULL))
482 /* promiscous mode ? */
484 if (dev->flags & IFF_PROMISC)
487 /* program receive mode */
489 outw(rcrval, dev->base_addr + SONIC_RCREG);
491 printk("\nRCRVAL: %04x\n", rcrval);
494 /* set up descriptors in shared memory + feed them into SONIC registers */
500 /* reset all pending interrupts */
502 outw(0xffff, dev->base_addr + SONIC_ISREG);
504 /* enable transmitter + receiver interrupts */
506 outw(CMDREG_RXEN, dev->base_addr + SONIC_CMDREG);
507 outw(IMREG_PRXEN | IMREG_RBEEN | IMREG_PTXEN | IMREG_TXEREN, dev->base_addr + SONIC_IMREG);
509 /* turn on card interrupts */
511 outb(inb(dev->base_addr + BCMREG) | BCMREG_IEN, dev->base_addr + BCMREG);
514 printk("Register dump after initialization:\n");
519 /* start transmission of a descriptor */
521 static void StartTx(struct net_device *dev, int descr)
523 ibmlana_priv *priv = (ibmlana_priv *) dev->priv;
526 addr = priv->tdastart + (descr * sizeof(tda_t));
528 /* put descriptor address into SONIC */
530 outw(addr, dev->base_addr + SONIC_CTDA);
532 /* trigger transmitter */
534 priv->currtxdescr = descr;
535 outw(CMDREG_TXP, dev->base_addr + SONIC_CMDREG);
538 /* ------------------------------------------------------------------------
539 * interrupt handler(s)
540 * ------------------------------------------------------------------------ */
542 /* receive buffer area exhausted */
544 static void irqrbe_handler(struct net_device *dev)
546 ibmlana_priv *priv = (ibmlana_priv *) dev->priv;
548 /* point the SONIC back to the RRA start */
550 outw(priv->rrastart, dev->base_addr + SONIC_RRP);
551 outw(priv->rrastart, dev->base_addr + SONIC_RWP);
554 /* receive interrupt */
556 static void irqrx_handler(struct net_device *dev)
558 ibmlana_priv *priv = (ibmlana_priv *) dev->priv;
560 u32 rdaaddr, lrdaaddr;
565 /* read descriptor that was next to be filled by SONIC */
567 rdaaddr = priv->rdastart + (priv->nextrxdescr * sizeof(rda_t));
568 lrdaaddr = priv->rdastart + (priv->lastrxdescr * sizeof(rda_t));
569 isa_memcpy_fromio(&rda, dev->mem_start + rdaaddr, sizeof(rda_t));
571 /* iron out upper word halves of fields we use - SONIC will duplicate
572 bits 0..15 to 16..31 */
574 rda.status &= 0xffff;
575 rda.length &= 0xffff;
576 rda.startlo &= 0xffff;
578 /* stop if the SONIC still owns it, i.e. there is no data for us */
585 else if (rda.status & RCREG_PRX) {
590 skb = dev_alloc_skb(rda.length + 2);
592 priv->stat.rx_dropped++;
596 isa_memcpy_fromio(skb_put(skb, rda.length),
598 rda.startlo, rda.length);
600 /* set up skb fields */
603 skb->protocol = eth_type_trans(skb, dev);
604 skb->ip_summed = CHECKSUM_NONE;
607 dev->last_rx = jiffies;
608 priv->stat.rx_packets++;
609 priv->stat.rx_bytes += rda.length;
611 /* pass to the upper layers */
616 /* otherwise check error status bits and increase statistics */
619 priv->stat.rx_errors++;
620 if (rda.status & RCREG_FAER)
621 priv->stat.rx_frame_errors++;
622 if (rda.status & RCREG_CRCR)
623 priv->stat.rx_crc_errors++;
626 /* descriptor processed, will become new last descriptor in queue */
630 isa_memcpy_toio(dev->mem_start + rdaaddr, &rda,
633 /* set up link and EOL = 0 in currently last descriptor. Only write
634 the link field since the SONIC may currently already access the
637 isa_memcpy_toio(dev->mem_start + lrdaaddr + 20, &rdaaddr, 4);
639 /* advance indices */
641 priv->lastrxdescr = priv->nextrxdescr;
642 if ((++priv->nextrxdescr) >= priv->rxbufcnt)
643 priv->nextrxdescr = 0;
647 /* transmit interrupt */
649 static void irqtx_handler(struct net_device *dev)
651 ibmlana_priv *priv = (ibmlana_priv *) dev->priv;
654 /* fetch descriptor (we forgot the size ;-) */
655 isa_memcpy_fromio(&tda, dev->mem_start + priv->tdastart + (priv->currtxdescr * sizeof(tda_t)), sizeof(tda_t));
657 /* update statistics */
658 priv->stat.tx_packets++;
659 priv->stat.tx_bytes += tda.length;
661 /* update our pointers */
662 priv->txused[priv->currtxdescr] = 0;
665 /* if there are more descriptors present in RAM, start them */
666 if (priv->txusedcnt > 0)
667 StartTx(dev, (priv->currtxdescr + 1) % TXBUFCNT);
669 /* tell the upper layer we can go on transmitting */
670 netif_wake_queue(dev);
673 static void irqtxerr_handler(struct net_device *dev)
675 ibmlana_priv *priv = (ibmlana_priv *) dev->priv;
678 /* fetch descriptor to check status */
679 isa_memcpy_fromio(&tda, dev->mem_start + priv->tdastart + (priv->currtxdescr * sizeof(tda_t)), sizeof(tda_t));
681 /* update statistics */
682 priv->stat.tx_errors++;
683 if (tda.status & (TCREG_NCRS | TCREG_CRSL))
684 priv->stat.tx_carrier_errors++;
685 if (tda.status & TCREG_EXC)
686 priv->stat.tx_aborted_errors++;
687 if (tda.status & TCREG_OWC)
688 priv->stat.tx_window_errors++;
689 if (tda.status & TCREG_FU)
690 priv->stat.tx_fifo_errors++;
692 /* update our pointers */
693 priv->txused[priv->currtxdescr] = 0;
696 /* if there are more descriptors present in RAM, start them */
697 if (priv->txusedcnt > 0)
698 StartTx(dev, (priv->currtxdescr + 1) % TXBUFCNT);
700 /* tell the upper layer we can go on transmitting */
701 netif_wake_queue(dev);
704 /* general interrupt entry */
706 static irqreturn_t irq_handler(int irq, void *device, struct pt_regs *regs)
708 struct net_device *dev = (struct net_device *) device;
711 /* in case we're not meant... */
712 if (!(inb(dev->base_addr + BCMREG) & BCMREG_IPEND))
715 /* loop through the interrupt bits until everything is clear */
717 ival = inw(dev->base_addr + SONIC_ISREG);
719 if (ival & ISREG_RBE) {
721 outw(ISREG_RBE, dev->base_addr + SONIC_ISREG);
723 if (ival & ISREG_PKTRX) {
725 outw(ISREG_PKTRX, dev->base_addr + SONIC_ISREG);
727 if (ival & ISREG_TXDN) {
729 outw(ISREG_TXDN, dev->base_addr + SONIC_ISREG);
731 if (ival & ISREG_TXER) {
732 irqtxerr_handler(dev);
733 outw(ISREG_TXER, dev->base_addr + SONIC_ISREG);
740 /* ------------------------------------------------------------------------
742 * ------------------------------------------------------------------------ */
746 static int ibmlana_getinfo(char *buf, int slot, void *d)
749 struct net_device *dev = (struct net_device *) d;
752 /* can't say anything about an uninitialized device... */
756 if (dev->priv == NULL)
758 priv = (ibmlana_priv *) dev->priv;
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 = (ibmlana_priv *) dev->priv;
783 /* register resources - only necessary for IRQ */
785 result = request_irq(priv->realirq, irq_handler, SA_SHIRQ | SA_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 = (ibmlana_priv *) dev->priv;
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 isa_memcpy_toio(dev->mem_start + 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 isa_memcpy_toio(dev->mem_start + baddr + destoffs, fill, l);
854 /* set up the new frame descriptor */
855 addr = priv->tdastart + (priv->nexttxdescr * sizeof(tda_t));
856 isa_memcpy_fromio(&tda, dev->mem_start + addr, sizeof(tda_t));
857 tda.length = tda.fraglength = tmplen;
858 isa_memcpy_toio(dev->mem_start + 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 = (ibmlana_priv *) dev->priv;
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)
906 int force_detect = 0;
908 int base = 0, irq = 0, iobase = 0, memlen = 0;
910 ibmlana_medium medium;
912 SET_MODULE_OWNER(dev);
914 /* can't work without an MCA bus ;-) */
918 /* start address of 1 --> forced detection */
919 if (dev->mem_start == 1)
922 base = dev->mem_start;
925 for (slot = startslot; (slot = mca_find_adapter(IBM_LANA_ID, slot)) != -1; slot++) {
926 /* deduce card addresses */
927 getaddrs(slot, &base, &memlen, &iobase, &irq, &medium);
929 /* slot already in use ? */
930 if (mca_is_adapter_used(slot))
932 /* were we looking for something different ? */
933 if (dev->irq && dev->irq != irq)
935 if (dev->mem_start && dev->mem_start != base)
937 /* found something that matches */
941 /* nothing found ? */
943 return (base != 0 || irq != 0) ? -ENXIO : -ENODEV;
945 /* announce success */
946 printk(KERN_INFO "%s: IBM LAN Adapter/A found in slot %d\n", dev->name, slot + 1);
948 /* try to obtain I/O range */
949 if (!request_region(iobase, IBM_LANA_IORANGE, DRV_NAME)) {
950 printk(KERN_ERR "%s: cannot allocate I/O range at %#x!\n", DRV_NAME, iobase);
951 startslot = slot + 1;
955 /* make procfs entries */
956 mca_set_adapter_name(slot, "IBM LAN Adapter/A");
957 mca_set_adapter_procfn(slot, (MCA_ProcFn) ibmlana_getinfo, dev);
959 mca_mark_as_used(slot);
961 /* allocate structure */
965 priv->medium = medium;
966 spin_lock_init(&priv->lock);
968 /* set base + irq for this device (irq not allocated so far) */
971 dev->mem_start = base;
972 dev->mem_end = base + memlen;
973 dev->base_addr = iobase;
977 dev->open = ibmlana_open;
978 dev->stop = ibmlana_close;
979 dev->hard_start_xmit = ibmlana_tx;
980 dev->do_ioctl = NULL;
981 dev->get_stats = ibmlana_stats;
982 dev->set_multicast_list = ibmlana_set_multicast_list;
983 dev->flags |= IFF_MULTICAST;
985 /* copy out MAC address */
987 for (z = 0; z < sizeof(dev->dev_addr); z++)
988 dev->dev_addr[z] = inb(dev->base_addr + MACADDRPROM + z);
992 printk(KERN_INFO "%s: IRQ %d, I/O %#lx, memory %#lx-%#lx, "
993 "MAC address %02x:%02x:%02x:%02x:%02x:%02x.\n",
994 dev->name, priv->realirq, dev->base_addr,
995 dev->mem_start, dev->mem_end - 1,
996 dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
997 dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
998 printk(KERN_INFO "%s: %s medium\n", dev->name, MediaNames[priv->medium]);
1004 /* next probe will start at next slot */
1006 startslot = slot + 1;
1011 /* ------------------------------------------------------------------------
1012 * modularization support
1013 * ------------------------------------------------------------------------ */
1019 static struct net_device *moddevs[DEVMAX];
1023 module_param(irq, int, 0);
1024 module_param(io, int, 0);
1025 MODULE_PARM_DESC(irq, "IBM LAN/A IRQ number");
1026 MODULE_PARM_DESC(io, "IBM LAN/A I/O base address");
1027 MODULE_LICENSE("GPL");
1029 int init_module(void)
1034 for (z = 0; z < DEVMAX; z++) {
1035 struct net_device *dev = alloc_etherdev(sizeof(ibmlana_priv));
1039 dev->base_addr = io;
1040 if (ibmlana_probe(dev)) {
1044 if (register_netdev(dev)) {
1045 ibmlana_priv *priv = dev->priv;
1046 release_region(dev->base_addr, IBM_LANA_IORANGE);
1047 mca_mark_as_unused(priv->slot);
1048 mca_set_adapter_name(priv->slot, "");
1049 mca_set_adapter_procfn(priv->slot, NULL, NULL);
1055 return (z > 0) ? 0 : -EIO;
1058 void cleanup_module(void)
1061 for (z = 0; z < DEVMAX; z++) {
1062 struct net_device *dev = moddevs[z];
1064 ibmlana_priv *priv = (ibmlana_priv *) dev->priv;
1065 unregister_netdev(dev);
1066 /*DeinitBoard(dev); */
1067 release_region(dev->base_addr, IBM_LANA_IORANGE);
1068 mca_mark_as_unused(priv->slot);
1069 mca_set_adapter_name(priv->slot, "");
1070 mca_set_adapter_procfn(priv->slot, NULL, NULL);