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 Public License that covers that work.
7 Copyright 1999 by Alfred Arnold (alfred@ccac.rwth-aachen.de, aarnold@elsa.de)
9 This driver is based both on the SK_MCA driver, which is itself based on the
10 SK_G16 and 3C523 driver.
13 'PC Hardware: Aufbau, Funktionsweise, Programmierung' by
14 Hans-Peter Messmer for the basic Microchannel stuff
16 'Linux Geraetetreiber' by Allesandro Rubini, Kalle Dalheimer
17 for help on Ethernet driver programming
19 'DP83934CVUL-20/25 MHz SONIC-T Ethernet Controller Datasheet' by National
20 Semiconductor for info on the MAC chip
22 'LAN Technical Reference Ethernet Adapter Interface Version 1 Release 1.0
23 Document Number SC30-3661-00' by IBM for info on the adapter itself
25 Also see http://www.natsemi.com/
27 special acknowledgements to:
28 - Bob Eager for helping me out with documentation from IBM
29 - Jim Shorney for his endless patience with me while I was using
30 him as a beta tester to trace down the address filter bug ;-)
34 -> set debug level via ioctl instead of compile-time switches
35 -> I didn't follow the development of the 2.1.x kernels, so my
36 assumptions about which things changed with which kernel version
41 startup from SK_MCA driver
43 finally got docs about the card. A big thank you to Bob Eager!
47 recv queue done, tcpdump works
49 transmission part works
51 added usage of the isa_functions for Linux 2.3 . Things should
52 still work with 2.0.x....
54 in Linux 2.2.13, the version.h file mysteriously didn't get
55 included. Added a workaround for this. Futhermore, it now
56 not only compiles as a modules ;-)
58 newer kernels automatically probe more than one board, so the
59 'startslot' as a variable is also needed here
61 the interrupt mask register is not set 'hard' instead of individually
62 setting registers, since this seems to set bits that shouldn't be
65 reset interrupt status immediately after CAM load
66 add a recovery delay after releasing the chip's reset line
68 finally found the bug in the address filter setup - damned signed
71 corrected version codes, added support for the latest 2.3 changes
73 *************************************************************************/
75 #include <linux/version.h>
76 #include <linux/kernel.h>
77 #include <linux/sched.h>
78 #include <linux/string.h>
79 #include <linux/errno.h>
80 #include <linux/ioport.h>
81 #include <linux/malloc.h>
82 #include <linux/interrupt.h>
83 #include <linux/delay.h>
84 #include <linux/time.h>
85 #include <linux/mca.h>
86 #include <asm/processor.h>
87 #include <asm/bitops.h>
91 #include <linux/module.h>
94 #include <linux/netdevice.h>
95 #include <linux/etherdevice.h>
96 #include <linux/skbuff.h>
98 #define _IBM_LANA_DRIVER_
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" };
111 /* ------------------------------------------------------------------------
112 * private subfunctions
113 * ------------------------------------------------------------------------ */
116 /* dump all registers */
118 static void dumpregs(struct IBMLANA_NETDEV
*dev
)
122 for (z
= 0; z
< 160; z
+= 2) {
124 printk("REGS: %04x:", z
);
125 printk(" %04x", inw(dev
->base_addr
+ z
));
131 /* dump parts of shared memory - only needed during debugging */
133 static void dumpmem(struct IBMLANA_NETDEV
*dev
, u32 start
, u32 len
)
137 printk("Address %04x:\n", start
);
138 for (z
= 0; z
< len
; z
++) {
141 printk(" %02x", IBMLANA_READB(dev
->mem_start
+ start
+ z
));
149 /* print exact time - ditto */
151 static void PrTime(void)
155 do_gettimeofday(&tv
);
156 printk("%9d:%06d: ", (int) tv
.tv_sec
, (int) tv
.tv_usec
);
160 /* deduce resources out of POS registers */
162 static void getaddrs(int slot
, int *base
, int *memlen
, int *iobase
,
163 int *irq
, ibmlana_medium
* medium
)
167 pos0
= mca_read_stored_pos(slot
, 2);
168 pos1
= mca_read_stored_pos(slot
, 3);
170 *base
= 0xc0000 + ((pos1
& 0xf0) << 9);
171 *memlen
= (pos1
& 0x01) ? 0x8000 : 0x4000;
172 *iobase
= (pos0
& 0xe0) << 7;
173 switch (pos0
& 0x06) {
187 *medium
= (pos0
& 0x18) >> 3;
190 /* wait on register value with mask and timeout */
192 static int wait_timeout(struct IBMLANA_NETDEV
*dev
, int regoffs
, u16 mask
,
193 u16 value
, int timeout
)
195 unsigned long fin
= jiffies
+ timeout
;
197 while (jiffies
!= fin
)
198 if ((inw(dev
->base_addr
+ regoffs
) & mask
) == value
)
205 /* reset the whole board */
207 static void ResetBoard(struct IBMLANA_NETDEV
*dev
)
209 unsigned char bcmval
;
211 /* read original board control value */
213 bcmval
= inb(dev
->base_addr
+ BCMREG
);
215 /* set reset bit for a while */
217 bcmval
|= BCMREG_RESET
;
218 outb(bcmval
, dev
->base_addr
+ BCMREG
);
220 bcmval
&= ~BCMREG_RESET
;
221 outb(bcmval
, dev
->base_addr
+ BCMREG
);
223 /* switch over to RAM again */
225 bcmval
|= BCMREG_RAMEN
| BCMREG_RAMWIN
;
226 outb(bcmval
, dev
->base_addr
+ BCMREG
);
229 /* calculate RAM layout & set up descriptors in RAM */
231 static void InitDscrs(struct IBMLANA_NETDEV
*dev
)
233 ibmlana_priv
*priv
= (ibmlana_priv
*) dev
->priv
;
234 u32 addr
, baddr
, raddr
;
242 IBMLANA_SETIO(dev
->mem_start
, 0xaa,
243 dev
->mem_start
- dev
->mem_start
);
245 /* setup n TX descriptors - independent of RAM size */
247 priv
->tdastart
= addr
= 0;
248 priv
->txbufstart
= baddr
= sizeof(tda_t
) * TXBUFCNT
;
249 for (z
= 0; z
< TXBUFCNT
; z
++) {
257 if (z
== TXBUFCNT
- 1)
258 tda
.link
= priv
->tdastart
;
260 tda
.link
= addr
+ sizeof(tda_t
);
262 IBMLANA_TOIO(dev
->mem_start
+ addr
, &tda
, sizeof(tda_t
));
263 addr
+= sizeof(tda_t
);
267 /* calculate how many receive buffers fit into remaining memory */
269 priv
->rxbufcnt
= (dev
->mem_end
- dev
->mem_start
- baddr
) /
270 (sizeof(rra_t
) + sizeof(rda_t
) + PKTSIZE
);
272 /* calculate receive addresses */
274 priv
->rrastart
= raddr
= priv
->txbufstart
+ (TXBUFCNT
* PKTSIZE
);
275 priv
->rdastart
= addr
=
276 priv
->rrastart
+ (priv
->rxbufcnt
* sizeof(rra_t
));
277 priv
->rxbufstart
= baddr
=
278 priv
->rdastart
+ (priv
->rxbufcnt
* sizeof(rda_t
));
279 for (z
= 0; z
< priv
->rxbufcnt
; z
++) {
282 rra
.cntlo
= PKTSIZE
>> 1;
284 IBMLANA_TOIO(dev
->mem_start
+ raddr
, &rra
, sizeof(rra_t
));
291 if (z
< priv
->rxbufcnt
- 1)
292 rda
.link
= addr
+ sizeof(rda_t
);
296 IBMLANA_TOIO(dev
->mem_start
+ 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 IBMLANA_NETDEV
*dev
)
317 ibmlana_priv
*priv
= (ibmlana_priv
*) dev
->priv
;
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
)),
324 dev
->base_addr
+ SONIC_REA
);
325 outw(priv
->rrastart
, dev
->base_addr
+ SONIC_RRP
);
326 outw(priv
->rrastart
, dev
->base_addr
+ SONIC_RWP
);
328 /* set EOBC so that only one packet goes into one buffer */
330 outw((PKTSIZE
- 4) >> 1, dev
->base_addr
+ SONIC_EOBC
);
332 /* let SONIC read the first RRA descriptor */
334 outw(CMDREG_RRRA
, dev
->base_addr
+ SONIC_CMDREG
);
335 if (!wait_timeout(dev
, SONIC_CMDREG
, CMDREG_RRRA
, 0, 2)) {
337 ("%s: SONIC did not respond on RRRA command - giving up.",
342 /* point SONIC to the first RDA */
344 outw(0, dev
->base_addr
+ SONIC_URDA
);
345 outw(priv
->rdastart
, dev
->base_addr
+ SONIC_CRDA
);
347 /* set upper half of TDA address */
349 outw(0, dev
->base_addr
+ SONIC_UTDA
);
354 /* stop SONIC so we can reinitialize it */
356 static void StopSONIC(struct IBMLANA_NETDEV
*dev
)
358 /* disable interrupts */
360 outb(inb(dev
->base_addr
+ BCMREG
) & (~BCMREG_IEN
),
361 dev
->base_addr
+ BCMREG
);
362 outb(0, dev
->base_addr
+ SONIC_IMREG
);
364 /* reset the SONIC */
366 outw(CMDREG_RST
, dev
->base_addr
+ SONIC_CMDREG
);
368 outw(CMDREG_RST
, dev
->base_addr
+ SONIC_CMDREG
);
371 /* initialize card and SONIC for proper operation */
373 static void putcam(camentry_t
* cams
, int *camcnt
, char *addr
)
375 camentry_t
*pcam
= cams
+ (*camcnt
);
376 u8
*uaddr
= (u8
*) addr
;
378 pcam
->index
= *camcnt
;
379 pcam
->addr0
= (((u16
) uaddr
[1]) << 8) | uaddr
[0];
380 pcam
->addr1
= (((u16
) uaddr
[3]) << 8) | uaddr
[2];
381 pcam
->addr2
= (((u16
) uaddr
[5]) << 8) | uaddr
[4];
385 static void InitBoard(struct IBMLANA_NETDEV
*dev
)
390 struct dev_mc_list
*mcptr
;
393 /* reset the SONIC */
395 outw(CMDREG_RST
, dev
->base_addr
+ SONIC_CMDREG
);
398 /* clear all spurious interrupts */
400 outw(inw(dev
->base_addr
+ SONIC_ISREG
),
401 dev
->base_addr
+ SONIC_ISREG
);
403 /* set up the SONIC's bus interface - constant for this adapter -
404 must be done while the SONIC is in reset */
406 outw(DCREG_USR1
| DCREG_USR0
| DCREG_WC1
| DCREG_DW32
,
407 dev
->base_addr
+ SONIC_DCREG
);
408 outw(0, dev
->base_addr
+ SONIC_DCREG2
);
410 /* remove reset form the SONIC */
412 outw(0, dev
->base_addr
+ SONIC_CMDREG
);
415 /* data sheet requires URRA to be programmed before setting up the CAM contents */
417 outw(0, dev
->base_addr
+ SONIC_URRA
);
419 /* program the CAM entry 0 to the device address */
422 putcam(cams
, &camcnt
, dev
->dev_addr
);
424 /* start putting the multicast addresses into the CAM list. Stop if
427 for (mcptr
= dev
->mc_list
; mcptr
!= NULL
; mcptr
= mcptr
->next
) {
428 putcam(cams
, &camcnt
, mcptr
->dmi_addr
);
433 /* calculate CAM mask */
435 cammask
= (1 << camcnt
) - 1;
437 /* feed CDA into SONIC, initialize RCR value (always get broadcasts) */
439 IBMLANA_TOIO(dev
->mem_start
, cams
, sizeof(camentry_t
) * camcnt
);
440 IBMLANA_TOIO(dev
->mem_start
+ (sizeof(camentry_t
) * camcnt
),
441 &cammask
, sizeof(cammask
));
444 printk("CAM setup:\n");
445 dumpmem(dev
, 0, sizeof(camentry_t
) * camcnt
+ sizeof(cammask
));
448 outw(0, dev
->base_addr
+ SONIC_CAMPTR
);
449 outw(camcnt
, dev
->base_addr
+ SONIC_CAMCNT
);
450 outw(CMDREG_LCAM
, dev
->base_addr
+ SONIC_CMDREG
);
451 if (!wait_timeout(dev
, SONIC_CMDREG
, CMDREG_LCAM
, 0, 2)) {
453 ("%s:SONIC did not respond on LCAM command - giving up.",
457 /* clear interrupt condition */
459 outw(ISREG_LCD
, dev
->base_addr
+ SONIC_ISREG
);
462 printk("Loading CAM done, address pointers %04x:%04x\n",
463 inw(dev
->base_addr
+ SONIC_URRA
),
464 inw(dev
->base_addr
+ SONIC_CAMPTR
));
468 printk("\n-->CAM: PTR %04x CNT %04x\n",
469 inw(dev
->base_addr
+ SONIC_CAMPTR
),
470 inw(dev
->base_addr
+ SONIC_CAMCNT
));
471 outw(CMDREG_RST
, dev
->base_addr
+ SONIC_CMDREG
);
472 for (z
= 0; z
< camcnt
; z
++) {
473 outw(z
, dev
->base_addr
+ SONIC_CAMEPTR
);
474 printk("Entry %d: %04x %04x %04x\n", z
,
482 outw(0, dev
->base_addr
+ SONIC_CMDREG
);
487 rcrval
= RCREG_BRD
| RCREG_LB_NONE
;
489 /* if still multicast addresses left or ALLMULTI is set, set the multicast
492 if ((dev
->flags
& IFF_ALLMULTI
) || (mcptr
!= NULL
))
495 /* promiscous mode ? */
497 if (dev
->flags
& IFF_PROMISC
)
500 /* program receive mode */
502 outw(rcrval
, dev
->base_addr
+ SONIC_RCREG
);
504 printk("\nRCRVAL: %04x\n", rcrval
);
507 /* set up descriptors in shared memory + feed them into SONIC registers */
513 /* reset all pending interrupts */
515 outw(0xffff, dev
->base_addr
+ SONIC_ISREG
);
517 /* enable transmitter + receiver interrupts */
519 outw(CMDREG_RXEN
, dev
->base_addr
+ SONIC_CMDREG
);
520 outw(IMREG_PRXEN
| IMREG_RBEEN
| IMREG_PTXEN
| IMREG_TXEREN
,
521 dev
->base_addr
+ SONIC_IMREG
);
523 /* turn on card interrupts */
525 outb(inb(dev
->base_addr
+ BCMREG
) | BCMREG_IEN
,
526 dev
->base_addr
+ BCMREG
);
529 printk("Register dump after initialization:\n");
534 /* start transmission of a descriptor */
536 static void StartTx(struct IBMLANA_NETDEV
*dev
, int descr
)
538 ibmlana_priv
*priv
= (ibmlana_priv
*) dev
->priv
;
541 addr
= priv
->tdastart
+ (descr
* sizeof(tda_t
));
543 /* put descriptor address into SONIC */
545 outw(addr
, dev
->base_addr
+ SONIC_CTDA
);
547 /* trigger transmitter */
549 priv
->currtxdescr
= descr
;
550 outw(CMDREG_TXP
, dev
->base_addr
+ SONIC_CMDREG
);
553 /* ------------------------------------------------------------------------
554 * interrupt handler(s)
555 * ------------------------------------------------------------------------ */
557 /* receive buffer area exhausted */
559 static void irqrbe_handler(struct IBMLANA_NETDEV
*dev
)
561 ibmlana_priv
*priv
= (ibmlana_priv
*) dev
->priv
;
563 /* point the SONIC back to the RRA start */
565 outw(priv
->rrastart
, dev
->base_addr
+ SONIC_RRP
);
566 outw(priv
->rrastart
, dev
->base_addr
+ SONIC_RWP
);
569 /* receive interrupt */
571 static void irqrx_handler(struct IBMLANA_NETDEV
*dev
)
573 ibmlana_priv
*priv
= (ibmlana_priv
*) dev
->priv
;
575 u32 rdaaddr
, lrdaaddr
;
580 /* read descriptor that was next to be filled by SONIC */
583 priv
->rdastart
+ (priv
->nextrxdescr
* sizeof(rda_t
));
585 priv
->rdastart
+ (priv
->lastrxdescr
* sizeof(rda_t
));
586 IBMLANA_FROMIO(&rda
, dev
->mem_start
+ rdaaddr
,
589 /* iron out upper word halves of fields we use - SONIC will duplicate
590 bits 0..15 to 16..31 */
592 rda
.status
&= 0xffff;
593 rda
.length
&= 0xffff;
594 rda
.startlo
&= 0xffff;
596 /* stop if the SONIC still owns it, i.e. there is no data for us */
603 else if (rda
.status
& RCREG_PRX
) {
608 skb
= dev_alloc_skb(rda
.length
+ 2);
610 priv
->stat
.rx_dropped
++;
614 IBMLANA_FROMIO(skb_put(skb
, rda
.length
),
616 rda
.startlo
, rda
.length
);
618 /* set up skb fields */
621 skb
->protocol
= eth_type_trans(skb
, dev
);
622 skb
->ip_summed
= CHECKSUM_NONE
;
626 priv
->stat
.rx_packets
++;
627 #if (LINUX_VERSION_CODE >= 0x20119) /* byte counters for kernel >= 2.1.25 */
628 priv
->stat
.rx_bytes
+= rda
.length
;
631 /* pass to the upper layers */
637 /* otherwise check error status bits and increase statistics */
640 priv
->stat
.rx_errors
++;
642 if (rda
.status
& RCREG_FAER
)
643 priv
->stat
.rx_frame_errors
++;
645 if (rda
.status
& RCREG_CRCR
)
646 priv
->stat
.rx_crc_errors
++;
649 /* descriptor processed, will become new last descriptor in queue */
653 IBMLANA_TOIO(dev
->mem_start
+ rdaaddr
, &rda
,
656 /* set up link and EOL = 0 in currently last descriptor. Only write
657 the link field since the SONIC may currently already access the
660 IBMLANA_TOIO(dev
->mem_start
+ lrdaaddr
+ 20, &rdaaddr
, 4);
662 /* advance indices */
664 priv
->lastrxdescr
= priv
->nextrxdescr
;
665 if ((++priv
->nextrxdescr
) >= priv
->rxbufcnt
)
666 priv
->nextrxdescr
= 0;
670 /* transmit interrupt */
672 static void irqtx_handler(struct IBMLANA_NETDEV
*dev
)
674 ibmlana_priv
*priv
= (ibmlana_priv
*) dev
->priv
;
677 /* fetch descriptor (we forgot the size ;-) */
680 dev
->mem_start
+ priv
->tdastart
+
681 (priv
->currtxdescr
* sizeof(tda_t
)), sizeof(tda_t
));
683 /* update statistics */
685 priv
->stat
.tx_packets
++;
686 #if (LINUX_VERSION_CODE >= 0x020119)
687 priv
->stat
.tx_bytes
+= tda
.length
;
690 /* update our pointers */
692 priv
->txused
[priv
->currtxdescr
] = 0;
695 /* 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 */
702 #if LINUX_VERSION_CODE >= 0x02032a
703 netif_wake_queue(dev
);
710 static void irqtxerr_handler(struct IBMLANA_NETDEV
*dev
)
712 ibmlana_priv
*priv
= (ibmlana_priv
*) dev
->priv
;
715 /* fetch descriptor to check status */
718 dev
->mem_start
+ priv
->tdastart
+
719 (priv
->currtxdescr
* sizeof(tda_t
)), sizeof(tda_t
));
721 /* update statistics */
723 priv
->stat
.tx_errors
++;
724 if (tda
.status
& (TCREG_NCRS
| TCREG_CRSL
))
725 priv
->stat
.tx_carrier_errors
++;
726 if (tda
.status
& TCREG_EXC
)
727 priv
->stat
.tx_aborted_errors
++;
728 if (tda
.status
& TCREG_OWC
)
729 priv
->stat
.tx_window_errors
++;
730 if (tda
.status
& TCREG_FU
)
731 priv
->stat
.tx_fifo_errors
++;
733 /* update our pointers */
735 priv
->txused
[priv
->currtxdescr
] = 0;
738 /* if there are more descriptors present in RAM, start them */
740 if (priv
->txusedcnt
> 0)
741 StartTx(dev
, (priv
->currtxdescr
+ 1) % TXBUFCNT
);
743 /* tell the upper layer we can go on transmitting */
745 #if LINUX_VERSION_CODE >= 0x02032a
746 netif_wake_queue(dev
);
753 /* general interrupt entry */
755 static void irq_handler(int irq
, void *device
, struct pt_regs
*regs
)
757 struct IBMLANA_NETDEV
*dev
= (struct IBMLANA_NETDEV
*) device
;
760 /* in case we're not meant... */
762 if (!(inb(dev
->base_addr
+ BCMREG
) & BCMREG_IPEND
))
765 #if (LINUX_VERSION_CODE >= 0x02032a)
767 set_bit(LINK_STATE_RXSEM
, &dev
->state
);
773 /* loop through the interrupt bits until everything is clear */
776 ival
= inw(dev
->base_addr
+ SONIC_ISREG
);
778 if (ival
& ISREG_RBE
) {
780 outw(ISREG_RBE
, dev
->base_addr
+ SONIC_ISREG
);
783 if (ival
& ISREG_PKTRX
) {
785 outw(ISREG_PKTRX
, dev
->base_addr
+ SONIC_ISREG
);
788 if (ival
& ISREG_TXDN
) {
790 outw(ISREG_TXDN
, dev
->base_addr
+ SONIC_ISREG
);
793 if (ival
& ISREG_TXER
) {
794 irqtxerr_handler(dev
);
795 outw(ISREG_TXER
, dev
->base_addr
+ SONIC_ISREG
);
801 #if (LINUX_VERSION_CODE >= 0x02032a)
803 clear_bit(LINK_STATE_RXSEM
, &dev
->state
);
810 /* ------------------------------------------------------------------------
812 * ------------------------------------------------------------------------ */
816 static int ibmlana_getinfo(char *buf
, int slot
, void *d
)
819 struct IBMLANA_NETDEV
*dev
= (struct IBMLANA_NETDEV
*) d
;
822 /* can't say anything about an uninitialized device... */
826 if (dev
->priv
== NULL
)
828 priv
= (ibmlana_priv
*) dev
->priv
;
832 len
+= sprintf(buf
+ len
, "IRQ: %d\n", priv
->realirq
);
833 len
+= sprintf(buf
+ len
, "I/O: %#lx\n", dev
->base_addr
);
834 len
+= sprintf(buf
+ len
, "Memory: %#lx-%#lx\n", dev
->mem_start
,
837 sprintf(buf
+ len
, "Transceiver: %s\n",
838 MediaNames
[priv
->medium
]);
839 len
+= sprintf(buf
+ len
, "Device: %s\n", dev
->name
);
840 len
+= sprintf(buf
+ len
, "MAC address:");
841 for (i
= 0; i
< 6; i
++)
842 len
+= sprintf(buf
+ len
, " %02x", dev
->dev_addr
[i
]);
849 /* open driver. Means also initialization and start of LANCE */
851 static int ibmlana_open(struct IBMLANA_NETDEV
*dev
)
854 ibmlana_priv
*priv
= (ibmlana_priv
*) dev
->priv
;
856 /* register resources - only necessary for IRQ */
859 request_irq(priv
->realirq
, irq_handler
,
860 SA_SHIRQ
| SA_SAMPLE_RANDOM
, dev
->name
, dev
);
862 printk("%s: failed to register irq %d\n", dev
->name
,
866 dev
->irq
= priv
->realirq
;
868 /* set up the card and SONIC */
872 /* initialize operational flags */
874 #if (LINUX_VERSION_CODE >= 0x02032a)
875 netif_start_queue(dev
);
889 /* close driver. Shut down board and free allocated resources */
891 static int ibmlana_close(struct IBMLANA_NETDEV
*dev
)
895 /* release resources */
897 free_irq(dev
->irq
, dev
);
907 /* transmit a block. */
909 static int ibmlana_tx(struct sk_buff
*skb
, struct IBMLANA_NETDEV
*dev
)
911 ibmlana_priv
*priv
= (ibmlana_priv
*) dev
->priv
;
912 int retval
= 0, tmplen
, addr
;
917 /* if we get called with a NULL descriptor, the Ethernet layer thinks
918 our card is stuck an we should reset it. We'll do this completely: */
921 printk("%s: Resetting SONIC\n", dev
->name
);
924 return 0; /* don't try to free the block here ;-) */
927 /* find out if there are free slots for a frame to transmit. If not,
928 the upper layer is in deep desperation and we simply ignore the frame. */
930 if (priv
->txusedcnt
>= TXBUFCNT
) {
932 priv
->stat
.tx_dropped
++;
936 /* copy the frame data into the next free transmit buffer - fillup missing */
941 baddr
= priv
->txbufstart
+ (priv
->nexttxdescr
* PKTSIZE
);
942 IBMLANA_TOIO(dev
->mem_start
+ baddr
, skb
->data
, skb
->len
);
944 /* copy filler into RAM - in case we're filling up...
945 we're filling a bit more than necessary, but that doesn't harm
946 since the buffer is far larger...
947 Sorry Linus for the filler string but I couldn't resist ;-) */
949 if (tmplen
> skb
->len
) {
950 char *fill
= "NetBSD is a nice OS too! ";
951 unsigned int destoffs
= skb
->len
, l
= strlen(fill
);
953 while (destoffs
< tmplen
) {
954 IBMLANA_TOIO(dev
->mem_start
+ baddr
+ destoffs
,
960 /* set up the new frame descriptor */
962 addr
= priv
->tdastart
+ (priv
->nexttxdescr
* sizeof(tda_t
));
963 IBMLANA_FROMIO(&tda
, dev
->mem_start
+ addr
, sizeof(tda_t
));
964 tda
.length
= tda
.fraglength
= tmplen
;
965 IBMLANA_TOIO(dev
->mem_start
+ addr
, &tda
, sizeof(tda_t
));
967 /* if there were no active descriptors, trigger the SONIC */
973 priv
->txused
[priv
->nexttxdescr
] = 1;
975 /* are all transmission slots used up ? */
977 if (priv
->txusedcnt
>= TXBUFCNT
)
978 #if (LINUX_VERSION_CODE >= 0x02032a)
979 netif_stop_queue(dev
);
984 if (priv
->txusedcnt
== 1)
985 StartTx(dev
, priv
->nexttxdescr
);
986 priv
->nexttxdescr
= (priv
->nexttxdescr
+ 1) % TXBUFCNT
;
988 restore_flags(flags
);
992 /* When did that change exactly ? */
994 #if (LINUX_VERSION_CODE >= 0x20200)
997 dev_kfree_skb(skb
, FREE_WRITE
);
1002 /* return pointer to Ethernet statistics */
1004 static struct net_device_stats
*ibmlana_stats(struct IBMLANA_NETDEV
*dev
)
1006 ibmlana_priv
*priv
= (ibmlana_priv
*) dev
->priv
;
1008 return &(priv
->stat
);
1011 /* we don't support runtime reconfiguration, since am MCA card can
1012 be unambigously identified by its POS registers. */
1014 static int ibmlana_config(struct IBMLANA_NETDEV
*dev
, struct ifmap
*map
)
1019 /* switch receiver mode. */
1021 static void ibmlana_set_multicast_list(struct IBMLANA_NETDEV
*dev
)
1023 /* first stop the SONIC... */
1027 /* ...then reinit it with the new flags */
1032 /* ------------------------------------------------------------------------
1034 * ------------------------------------------------------------------------ */
1036 static int startslot
; /* counts through slots when probing multiple devices */
1038 int ibmlana_probe(struct IBMLANA_NETDEV
*dev
)
1040 int force_detect
= 0;
1042 int base
= 0, irq
= 0, iobase
= 0, memlen
= 0;
1044 ibmlana_medium medium
;
1046 /* can't work without an MCA bus ;-) */
1051 /* start address of 1 --> forced detection */
1053 if (dev
->mem_start
== 1)
1056 /* search through slots */
1059 base
= dev
->mem_start
;
1062 slot
= mca_find_adapter(IBM_LANA_ID
, startslot
);
1064 while (slot
!= -1) {
1065 /* deduce card addresses */
1067 getaddrs(slot
, &base
, &memlen
, &iobase
, &irq
, &medium
);
1069 #if (LINUX_VERSION_CODE >= 0x20300)
1070 /* slot already in use ? */
1072 if (mca_is_adapter_used(slot
)) {
1073 slot
= mca_find_adapter(IBM_LANA_ID
, slot
+ 1);
1078 /* were we looking for something different ? */
1080 if ((dev
->irq
!= 0) || (dev
->mem_start
!= 0)) {
1081 if ((dev
->irq
!= 0) && (dev
->irq
!= irq
)) {
1083 mca_find_adapter(IBM_LANA_ID
,
1087 if ((dev
->mem_start
!= 0)
1088 && (dev
->mem_start
!= base
)) {
1090 mca_find_adapter(IBM_LANA_ID
,
1096 /* found something that matches */
1101 /* nothing found ? */
1104 return ((base
!= 0) || (irq
!= 0)) ? -ENXIO
: -ENODEV
;
1106 /* announce success */
1107 printk("%s: IBM LAN Adapter/A found in slot %d\n", dev
->name
,
1110 /* try to obtain I/O range */
1111 if (!request_region(iobase
, IBM_LANA_IORANGE
, dev
->name
)) {
1112 printk("%s: cannot allocate I/O range at %#x!\n", dev
->name
, iobase
);
1113 startslot
= slot
+ 1;
1117 /* make procfs entries */
1119 mca_set_adapter_name(slot
, "IBM LAN Adapter/A");
1120 mca_set_adapter_procfn(slot
, (MCA_ProcFn
) ibmlana_getinfo
, dev
);
1122 #if (LINUX_VERSION_CODE >= 0x20200)
1123 mca_mark_as_used(slot
);
1126 /* allocate structure */
1129 (ibmlana_priv
*) kmalloc(sizeof(ibmlana_priv
), GFP_KERNEL
);
1131 release_region(iobase
, IBM_LANA_IORANGE
);
1135 priv
->realirq
= irq
;
1136 priv
->medium
= medium
;
1137 memset(&(priv
->stat
), 0, sizeof(struct net_device_stats
));
1139 /* set base + irq for this device (irq not allocated so far) */
1142 dev
->mem_start
= base
;
1143 dev
->mem_end
= base
+ memlen
;
1144 dev
->base_addr
= iobase
;
1148 dev
->open
= ibmlana_open
;
1149 dev
->stop
= ibmlana_close
;
1150 dev
->set_config
= ibmlana_config
;
1151 dev
->hard_start_xmit
= ibmlana_tx
;
1152 dev
->do_ioctl
= NULL
;
1153 dev
->get_stats
= ibmlana_stats
;
1154 dev
->set_multicast_list
= ibmlana_set_multicast_list
;
1155 dev
->flags
|= IFF_MULTICAST
;
1161 /* copy out MAC address */
1163 for (z
= 0; z
< sizeof(dev
->dev_addr
); z
++)
1164 dev
->dev_addr
[z
] = inb(dev
->base_addr
+ MACADDRPROM
+ z
);
1168 printk("%s: IRQ %d, I/O %#lx, memory %#lx-%#lx, "
1169 "MAC address %02x:%02x:%02x:%02x:%02x:%02x.\n",
1170 dev
->name
, priv
->realirq
, dev
->base_addr
,
1171 dev
->mem_start
, dev
->mem_end
- 1,
1172 dev
->dev_addr
[0], dev
->dev_addr
[1], dev
->dev_addr
[2],
1173 dev
->dev_addr
[3], dev
->dev_addr
[4], dev
->dev_addr
[5]);
1174 printk("%s: %s medium\n", dev
->name
, MediaNames
[priv
->medium
]);
1180 /* next probe will start at next slot */
1182 startslot
= slot
+ 1;
1187 /* ------------------------------------------------------------------------
1188 * modularization support
1189 * ------------------------------------------------------------------------ */
1195 static struct IBMLANA_NETDEV moddevs
[DEVMAX
] = {
1196 { init
: ibmlana_probe
}, { init
: ibmlana_probe
},
1197 { init
: ibmlana_probe
}, { init
: ibmlana_probe
},
1198 { init
: ibmlana_probe
}
1204 int init_module(void)
1209 for (z
= 0; z
< DEVMAX
; z
++) {
1210 strcpy(moddevs
[z
].name
, " ");
1211 res
= register_netdev(moddevs
+ z
);
1213 return (z
> 0) ? 0 : -EIO
;
1219 void cleanup_module(void)
1221 struct IBMLANA_NETDEV
*dev
;
1226 printk("cannot unload, module in use\n");
1230 for (z
= 0; z
< DEVMAX
; z
++) {
1232 if (dev
->priv
!= NULL
) {
1233 priv
= (ibmlana_priv
*) dev
->priv
;
1234 /*DeinitBoard(dev); */
1236 free_irq(dev
->irq
, dev
);
1238 release_region(dev
->base_addr
, IBM_LANA_IORANGE
);
1239 unregister_netdev(dev
);
1240 #if (LINUX_VERSION_CODE >= 0x20200)
1241 mca_mark_as_unused(priv
->slot
);
1243 mca_set_adapter_name(priv
->slot
, "");
1244 mca_set_adapter_procfn(priv
->slot
, NULL
, NULL
);