2 net-3-driver for the SKNET MCA-based cards
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, aarnold@elsa.de)
9 This driver is based both on the 3C523 driver and the SK_G16 driver.
12 'PC Hardware: Aufbau, Funktionsweise, Programmierung' by
13 Hans-Peter Messmer for the basic Microchannel stuff
15 'Linux Geraetetreiber' by Allesandro Rubini, Kalle Dalheimer
16 for help on Ethernet driver programming
18 'Ethernet/IEEE 802.3 Family 1992 World Network Data Book/Handbook' by AMD
19 for documentation on the AM7990 LANCE
21 'SKNET Personal Technisches Manual', Version 1.2 by Schneider&Koch
22 for documentation on the Junior board
24 'SK-NET MC2+ Technical Manual", Version 1.1 by Schneider&Koch for
25 documentation on the MC2 bord
27 A big thank you to the S&K support for providing me so quickly with
30 Also see http://www.syskonnect.com/
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
43 added private structure, methods
44 begun building data structures in RAM
46 can receive frames, send frames
48 modularized intialization of LANCE
53 support for multiple devices
54 display media type for MC2+
56 fixed problem in GetLANCE leaving interrupts turned off
57 increase TX queue to 4 packets to improve send performance
59 a few corrections in statistics, caught rcvr overruns
60 reinitialization of LANCE/board in critical situations
62 implemented LANCE multicast filter
64 additions for Linux 2.2
66 unfortunately there seem to be newer MC2+ boards that react
67 on IRQ 3/5/9/10 instead of 3/5/10/11, so we have to autoprobe
68 in questionable cases...
70 integrated patches from David Weinehall & Bill Wendling for 2.3
71 kernels (isa_...functions). Things are defined in a way that
72 it still works with 2.0.x 8-)
74 added handling of the remaining interrupt conditions. That
75 should cure the spurious hangs.
77 newer kernels automatically probe more than one board, so the
78 'startslot' as a variable is also needed here
80 added changes for recent 2.3 kernels
82 *************************************************************************/
84 #include <linux/kernel.h>
85 #include <linux/string.h>
86 #include <linux/errno.h>
87 #include <linux/ioport.h>
88 #include <linux/slab.h>
89 #include <linux/interrupt.h>
90 #include <linux/delay.h>
91 #include <linux/time.h>
92 #include <linux/mca.h>
93 #include <linux/init.h>
94 #include <linux/module.h>
95 #include <linux/version.h>
96 #include <linux/netdevice.h>
97 #include <linux/etherdevice.h>
98 #include <linux/skbuff.h>
100 #include <asm/processor.h>
101 #include <asm/bitops.h>
104 #define _SK_MCA_DRIVER_
107 /* ------------------------------------------------------------------------
108 * global static data - not more since we can handle multiple boards and
109 * have to pack all state info into the device struct!
110 * ------------------------------------------------------------------------ */
112 static char *MediaNames
[Media_Count
] =
113 { "10Base2", "10BaseT", "10Base5", "Unknown" };
115 static unsigned char poly
[] =
116 { 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0,
117 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0
120 /* ------------------------------------------------------------------------
121 * private subfunctions
122 * ------------------------------------------------------------------------ */
124 /* dump parts of shared memory - only needed during debugging */
127 static void dumpmem(struct SKMCA_NETDEV
*dev
, u32 start
, u32 len
)
131 for (z
= 0; z
< len
; z
++) {
134 printk(" %02x", SKMCA_READB(dev
->mem_start
+ start
+ z
));
140 /* print exact time - ditto */
142 static void PrTime(void)
146 do_gettimeofday(&tv
);
147 printk("%9d:%06d: ", tv
.tv_sec
, tv
.tv_usec
);
151 /* deduce resources out of POS registers */
153 static void __init
getaddrs(int slot
, int junior
, int *base
, int *irq
,
154 skmca_medium
* medium
)
156 u_char pos0
, pos1
, pos2
;
159 pos0
= mca_read_stored_pos(slot
, 2);
160 *base
= ((pos0
& 0x0e) << 13) + 0xc0000;
161 *irq
= ((pos0
& 0x10) >> 4) + 10;
162 *medium
= Media_Unknown
;
164 /* reset POS 104 Bits 0+1 so the shared memory region goes to the
165 configured area between 640K and 1M. Afterwards, enable the MC2.
166 I really don't know what rode SK to do this... */
168 mca_write_pos(slot
, 4,
169 mca_read_stored_pos(slot
, 4) & 0xfc);
170 mca_write_pos(slot
, 2,
171 mca_read_stored_pos(slot
, 2) | 0x01);
173 pos1
= mca_read_stored_pos(slot
, 3);
174 pos2
= mca_read_stored_pos(slot
, 4);
175 *base
= ((pos1
& 0x07) << 14) + 0xc0000;
176 switch (pos2
& 0x0c) {
190 *medium
= (pos2
>> 6) & 3;
194 /* check for both cards:
195 When the MC2 is turned off, it was configured for more than 15MB RAM,
196 is disabled and won't get detected using the standard probe. We
197 therefore have to scan the slots manually :-( */
199 static int __init
dofind(int *junior
, int firstslot
)
204 for (slot
= firstslot
; slot
< MCA_MAX_SLOT_NR
; slot
++) {
205 id
= mca_read_stored_pos(slot
, 0)
206 + (((unsigned int) mca_read_stored_pos(slot
, 1)) << 8);
209 if (id
== SKNET_MCA_ID
)
212 if (id
== SKNET_JUNIOR_MCA_ID
)
218 /* reset the whole board */
220 static void ResetBoard(struct SKMCA_NETDEV
*dev
)
222 skmca_priv
*priv
= (skmca_priv
*) dev
->priv
;
224 SKMCA_WRITEB(CTRL_RESET_ON
, priv
->ctrladdr
);
226 SKMCA_WRITEB(CTRL_RESET_OFF
, priv
->ctrladdr
);
229 /* wait for LANCE interface to become not busy */
231 static int WaitLANCE(struct SKMCA_NETDEV
*dev
)
233 skmca_priv
*priv
= (skmca_priv
*) dev
->priv
;
236 while ((SKMCA_READB(priv
->ctrladdr
) & STAT_IO_BUSY
) ==
240 printk("%s: LANCE access timeout", dev
->name
);
248 /* set LANCE register - must be atomic */
250 static void SetLANCE(struct SKMCA_NETDEV
*dev
, u16 addr
, u16 value
)
252 skmca_priv
*priv
= (skmca_priv
*) dev
->priv
;
255 /* disable interrupts */
260 /* wait until no transfer is pending */
264 /* transfer register address to RAP */
266 SKMCA_WRITEB(CTRL_RESET_OFF
| CTRL_RW_WRITE
| CTRL_ADR_RAP
,
268 SKMCA_WRITEW(addr
, priv
->ioregaddr
);
269 SKMCA_WRITEB(IOCMD_GO
, priv
->cmdaddr
);
273 /* transfer data to register */
275 SKMCA_WRITEB(CTRL_RESET_OFF
| CTRL_RW_WRITE
| CTRL_ADR_DATA
,
277 SKMCA_WRITEW(value
, priv
->ioregaddr
);
278 SKMCA_WRITEB(IOCMD_GO
, priv
->cmdaddr
);
282 /* reenable interrupts */
284 restore_flags(flags
);
287 /* get LANCE register */
289 static u16
GetLANCE(struct SKMCA_NETDEV
*dev
, u16 addr
)
291 skmca_priv
*priv
= (skmca_priv
*) dev
->priv
;
295 /* disable interrupts */
300 /* wait until no transfer is pending */
304 /* transfer register address to RAP */
306 SKMCA_WRITEB(CTRL_RESET_OFF
| CTRL_RW_WRITE
| CTRL_ADR_RAP
,
308 SKMCA_WRITEW(addr
, priv
->ioregaddr
);
309 SKMCA_WRITEB(IOCMD_GO
, priv
->cmdaddr
);
313 /* transfer data from register */
315 SKMCA_WRITEB(CTRL_RESET_OFF
| CTRL_RW_READ
| CTRL_ADR_DATA
,
317 SKMCA_WRITEB(IOCMD_GO
, priv
->cmdaddr
);
320 res
= SKMCA_READW(priv
->ioregaddr
);
322 /* reenable interrupts */
324 restore_flags(flags
);
329 /* build up descriptors in shared RAM */
331 static void InitDscrs(struct SKMCA_NETDEV
*dev
)
335 /* Set up Tx descriptors. The board has only 16K RAM so bits 16..23
338 bufaddr
= RAM_DATABASE
;
343 for (z
= 0; z
< TXCOUNT
; z
++) {
344 descr
.LowAddr
= bufaddr
;
348 SKMCA_TOIO(dev
->mem_start
+ RAM_TXBASE
+
349 (z
* sizeof(LANCE_TxDescr
)), &descr
,
350 sizeof(LANCE_TxDescr
));
351 SKMCA_SETIO(dev
->mem_start
+ bufaddr
, 0,
353 bufaddr
+= RAM_BUFSIZE
;
357 /* do the same for the Rx descriptors */
363 for (z
= 0; z
< RXCOUNT
; z
++) {
364 descr
.LowAddr
= bufaddr
;
365 descr
.Flags
= RXDSCR_FLAGS_OWN
;
366 descr
.MaxLen
= -RAM_BUFSIZE
;
368 SKMCA_TOIO(dev
->mem_start
+ RAM_RXBASE
+
369 (z
* sizeof(LANCE_RxDescr
)), &descr
,
370 sizeof(LANCE_RxDescr
));
371 SKMCA_SETIO(dev
->mem_start
+ bufaddr
, 0,
373 bufaddr
+= RAM_BUFSIZE
;
378 /* calculate the hash bit position for a given multicast address
379 taken more or less directly from the AMD datasheet... */
381 static void UpdateCRC(unsigned char *CRC
, int bit
)
385 /* shift CRC one bit */
387 memmove(CRC
+ 1, CRC
, 32 * sizeof(unsigned char));
390 /* if bit XOR controlbit = 1, set CRC = CRC XOR polynomial */
393 for (j
= 0; j
< 32; j
++)
397 static unsigned int GetHash(char *address
)
399 unsigned char CRC
[33];
400 int i
, byte
, hashcode
;
402 /* a multicast address has bit 0 in the first byte set */
404 if ((address
[0] & 1) == 0)
409 memset(CRC
, 1, sizeof(CRC
));
411 /* loop through address bits */
413 for (byte
= 0; byte
< 6; byte
++)
414 for (i
= 0; i
< 8; i
++)
415 UpdateCRC(CRC
, (address
[byte
] >> i
) & 1);
417 /* hashcode is the 6 least significant bits of the CRC */
420 for (i
= 0; i
< 6; i
++)
421 hashcode
= (hashcode
<< 1) + CRC
[i
];
425 /* feed ready-built initialization block into LANCE */
427 static void InitLANCE(struct SKMCA_NETDEV
*dev
)
429 skmca_priv
*priv
= (skmca_priv
*) dev
->priv
;
431 /* build up descriptors. */
435 /* next RX descriptor to be read is the first one. Since the LANCE
436 will start from the beginning after initialization, we have to
437 reset out pointers too. */
441 /* no TX descriptors active */
443 priv
->nexttxput
= priv
->nexttxdone
= priv
->txbusy
= 0;
445 /* set up the LANCE bus control register - constant for SKnet boards */
447 SetLANCE(dev
, LANCE_CSR3
,
448 CSR3_BSWAP_OFF
| CSR3_ALE_LOW
| CSR3_BCON_HOLD
);
450 /* write address of initialization block into LANCE */
452 SetLANCE(dev
, LANCE_CSR1
, RAM_INITBASE
& 0xffff);
453 SetLANCE(dev
, LANCE_CSR2
, (RAM_INITBASE
>> 16) & 0xff);
455 /* we don't get ready until the LANCE has read the init block */
457 #if (LINUX_VERSION_CODE >= 0x02032a)
458 netif_stop_queue(dev
);
463 /* let LANCE read the initialization block. LANCE is ready
464 when we receive the corresponding interrupt. */
466 SetLANCE(dev
, LANCE_CSR0
, CSR0_INEA
| CSR0_INIT
);
469 /* stop the LANCE so we can reinitialize it */
471 static void StopLANCE(struct SKMCA_NETDEV
*dev
)
473 /* can't take frames any more */
475 #if (LINUX_VERSION_CODE >= 0x02032a)
476 netif_stop_queue(dev
);
481 /* disable interrupts, stop it */
483 SetLANCE(dev
, LANCE_CSR0
, CSR0_STOP
);
486 /* initialize card and LANCE for proper operation */
488 static void InitBoard(struct SKMCA_NETDEV
*dev
)
490 LANCE_InitBlock block
;
492 /* Lay out the shared RAM - first we create the init block for the LANCE.
493 We do not overwrite it later because we need it again when we switch
494 promiscous mode on/off. */
497 if (dev
->flags
& IFF_PROMISC
)
498 block
.Mode
|= LANCE_INIT_PROM
;
499 memcpy(block
.PAdr
, dev
->dev_addr
, 6);
500 memset(block
.LAdrF
, 0, sizeof(block
.LAdrF
));
501 block
.RdrP
= (RAM_RXBASE
& 0xffffff) | (LRXCOUNT
<< 29);
502 block
.TdrP
= (RAM_TXBASE
& 0xffffff) | (LTXCOUNT
<< 29);
504 SKMCA_TOIO(dev
->mem_start
+ RAM_INITBASE
, &block
, sizeof(block
));
506 /* initialize LANCE. Implicitly sets up other structures in RAM. */
511 /* deinitialize card and LANCE */
513 static void DeinitBoard(struct SKMCA_NETDEV
*dev
)
524 /* probe for device's irq */
526 static int __init
ProbeIRQ(struct SKMCA_NETDEV
*dev
)
528 unsigned long imaskval
, njiffies
, irq
;
531 /* enable all interrupts */
533 imaskval
= probe_irq_on();
535 /* initialize the board. Wait for interrupt 'Initialization done'. */
540 njiffies
= jiffies
+ 100;
542 csr0val
= GetLANCE(dev
, LANCE_CSR0
);
544 while (((csr0val
& CSR0_IDON
) == 0) && (jiffies
!= njiffies
));
546 /* turn of interrupts again */
548 irq
= probe_irq_off(imaskval
);
550 /* if we found something, ack the interrupt */
553 SetLANCE(dev
, LANCE_CSR0
, csr0val
| CSR0_IDON
);
555 /* back to idle state */
562 /* ------------------------------------------------------------------------
563 * interrupt handler(s)
564 * ------------------------------------------------------------------------ */
566 /* LANCE has read initialization block -> start it */
568 static u16
irqstart_handler(struct SKMCA_NETDEV
*dev
, u16 oldcsr0
)
570 /* now we're ready to transmit */
572 #if (LINUX_VERSION_CODE >= 0x02032a)
573 netif_wake_queue(dev
);
578 /* reset IDON bit, start LANCE */
580 SetLANCE(dev
, LANCE_CSR0
, oldcsr0
| CSR0_IDON
| CSR0_STRT
);
581 return GetLANCE(dev
, LANCE_CSR0
);
584 /* did we loose blocks due to a FIFO overrun ? */
586 static u16
irqmiss_handler(struct SKMCA_NETDEV
*dev
, u16 oldcsr0
)
588 skmca_priv
*priv
= (skmca_priv
*) dev
->priv
;
590 /* update statistics */
592 priv
->stat
.rx_fifo_errors
++;
596 SetLANCE(dev
, LANCE_CSR0
, oldcsr0
| CSR0_MISS
);
597 return GetLANCE(dev
, LANCE_CSR0
);
600 /* receive interrupt */
602 static u16
irqrx_handler(struct SKMCA_NETDEV
*dev
, u16 oldcsr0
)
604 skmca_priv
*priv
= (skmca_priv
*) dev
->priv
;
606 unsigned int descraddr
;
608 /* run through queue until we reach a descriptor we do not own */
610 descraddr
= RAM_RXBASE
+ (priv
->nextrx
* sizeof(LANCE_RxDescr
));
612 /* read descriptor */
613 SKMCA_FROMIO(&descr
, dev
->mem_start
+ descraddr
,
614 sizeof(LANCE_RxDescr
));
616 /* if we reach a descriptor we do not own, we're done */
617 if ((descr
.Flags
& RXDSCR_FLAGS_OWN
) != 0)
622 printk("Receive packet on descr %d len %d\n", priv
->nextrx
,
626 /* erroneous packet ? */
627 if ((descr
.Flags
& RXDSCR_FLAGS_ERR
) != 0) {
628 priv
->stat
.rx_errors
++;
629 if ((descr
.Flags
& RXDSCR_FLAGS_CRC
) != 0)
630 priv
->stat
.rx_crc_errors
++;
631 else if ((descr
.Flags
& RXDSCR_FLAGS_CRC
) != 0)
632 priv
->stat
.rx_frame_errors
++;
633 else if ((descr
.Flags
& RXDSCR_FLAGS_OFLO
) != 0)
634 priv
->stat
.rx_fifo_errors
++;
641 skb
= dev_alloc_skb(descr
.Len
+ 2);
643 priv
->stat
.rx_dropped
++;
645 SKMCA_FROMIO(skb_put(skb
, descr
.Len
),
647 descr
.LowAddr
, descr
.Len
);
649 skb
->protocol
= eth_type_trans(skb
, dev
);
650 skb
->ip_summed
= CHECKSUM_NONE
;
651 priv
->stat
.rx_packets
++;
652 #if LINUX_VERSION_CODE >= 0x020119 /* byte counters for >= 2.1.25 */
653 priv
->stat
.rx_bytes
+= descr
.Len
;
656 dev
->last_rx
= jiffies
;
660 /* give descriptor back to LANCE */
662 descr
.Flags
|= RXDSCR_FLAGS_OWN
;
664 /* update descriptor in shared RAM */
665 SKMCA_TOIO(dev
->mem_start
+ descraddr
, &descr
,
666 sizeof(LANCE_RxDescr
));
668 /* go to next descriptor */
670 descraddr
+= sizeof(LANCE_RxDescr
);
671 if (priv
->nextrx
>= RXCOUNT
) {
673 descraddr
= RAM_RXBASE
;
679 SetLANCE(dev
, LANCE_CSR0
, oldcsr0
| CSR0_RINT
);
680 return GetLANCE(dev
, LANCE_CSR0
);
683 /* transmit interrupt */
685 static u16
irqtx_handler(struct SKMCA_NETDEV
*dev
, u16 oldcsr0
)
687 skmca_priv
*priv
= (skmca_priv
*) dev
->priv
;
689 unsigned int descraddr
;
691 /* check descriptors at most until no busy one is left */
694 RAM_TXBASE
+ (priv
->nexttxdone
* sizeof(LANCE_TxDescr
));
695 while (priv
->txbusy
> 0) {
696 /* read descriptor */
697 SKMCA_FROMIO(&descr
, dev
->mem_start
+ descraddr
,
698 sizeof(LANCE_TxDescr
));
700 /* if the LANCE still owns this one, we've worked out all sent packets */
701 if ((descr
.Flags
& TXDSCR_FLAGS_OWN
) != 0)
706 printk("Send packet done on descr %d\n", priv
->nexttxdone
);
709 /* update statistics */
710 if ((descr
.Flags
& TXDSCR_FLAGS_ERR
) == 0) {
711 priv
->stat
.tx_packets
++;
712 #if LINUX_VERSION_CODE >= 0x020119 /* byte counters for >= 2.1.25 */
713 priv
->stat
.tx_bytes
++;
716 priv
->stat
.tx_errors
++;
717 if ((descr
.Status
& TXDSCR_STATUS_UFLO
) != 0) {
718 priv
->stat
.tx_fifo_errors
++;
722 if ((descr
.Status
& TXDSCR_STATUS_LCOL
) !=
723 0) priv
->stat
.tx_window_errors
++;
724 else if ((descr
.Status
& TXDSCR_STATUS_LCAR
) != 0)
725 priv
->stat
.tx_carrier_errors
++;
726 else if ((descr
.Status
& TXDSCR_STATUS_RTRY
) != 0)
727 priv
->stat
.tx_aborted_errors
++;
730 /* go to next descriptor */
732 descraddr
+= sizeof(LANCE_TxDescr
);
733 if (priv
->nexttxdone
>= TXCOUNT
) {
734 priv
->nexttxdone
= 0;
735 descraddr
= RAM_TXBASE
;
740 /* reset TX interrupt bit */
742 SetLANCE(dev
, LANCE_CSR0
, oldcsr0
| CSR0_TINT
);
743 oldcsr0
= GetLANCE(dev
, LANCE_CSR0
);
745 /* at least one descriptor is freed. Therefore we can accept
747 /* inform upper layers we're in business again */
749 #if (LINUX_VERSION_CODE >= 0x02032a)
750 netif_wake_queue(dev
);
759 /* general interrupt entry */
761 static void irq_handler(int irq
, void *device
, struct pt_regs
*regs
)
763 struct SKMCA_NETDEV
*dev
= (struct SKMCA_NETDEV
*) device
;
766 /* read CSR0 to get interrupt cause */
768 csr0val
= GetLANCE(dev
, LANCE_CSR0
);
770 /* in case we're not meant... */
772 if ((csr0val
& CSR0_INTR
) == 0)
775 #if (LINUX_VERSION_CODE >= 0x02032a)
777 set_bit(LINK_STATE_RXSEM
, &dev
->state
);
783 /* loop through the interrupt bits until everything is clear */
786 if ((csr0val
& CSR0_IDON
) != 0)
787 csr0val
= irqstart_handler(dev
, csr0val
);
788 if ((csr0val
& CSR0_RINT
) != 0)
789 csr0val
= irqrx_handler(dev
, csr0val
);
790 if ((csr0val
& CSR0_MISS
) != 0)
791 csr0val
= irqmiss_handler(dev
, csr0val
);
792 if ((csr0val
& CSR0_TINT
) != 0)
793 csr0val
= irqtx_handler(dev
, csr0val
);
794 if ((csr0val
& CSR0_MERR
) != 0) {
795 SetLANCE(dev
, LANCE_CSR0
, csr0val
| CSR0_MERR
);
796 csr0val
= GetLANCE(dev
, LANCE_CSR0
);
798 if ((csr0val
& CSR0_BABL
) != 0) {
799 SetLANCE(dev
, LANCE_CSR0
, csr0val
| CSR0_BABL
);
800 csr0val
= GetLANCE(dev
, LANCE_CSR0
);
803 while ((csr0val
& CSR0_INTR
) != 0);
805 #if (LINUX_VERSION_CODE >= 0x02032a)
807 clear_bit(LINK_STATE_RXSEM
, &dev
->state
);
814 /* ------------------------------------------------------------------------
816 * ------------------------------------------------------------------------ */
820 static int skmca_getinfo(char *buf
, int slot
, void *d
)
823 struct SKMCA_NETDEV
*dev
= (struct SKMCA_NETDEV
*) d
;
826 /* can't say anything about an uninitialized device... */
830 if (dev
->priv
== NULL
)
832 priv
= (skmca_priv
*) dev
->priv
;
836 len
+= sprintf(buf
+ len
, "IRQ: %d\n", priv
->realirq
);
837 len
+= sprintf(buf
+ len
, "Memory: %#lx-%#lx\n", dev
->mem_start
,
840 sprintf(buf
+ len
, "Transceiver: %s\n",
841 MediaNames
[priv
->medium
]);
842 len
+= sprintf(buf
+ len
, "Device: %s\n", dev
->name
);
843 len
+= sprintf(buf
+ len
, "MAC address:");
844 for (i
= 0; i
< 6; i
++)
845 len
+= sprintf(buf
+ len
, " %02x", dev
->dev_addr
[i
]);
852 /* open driver. Means also initialization and start of LANCE */
854 static int skmca_open(struct SKMCA_NETDEV
*dev
)
857 skmca_priv
*priv
= (skmca_priv
*) dev
->priv
;
859 /* register resources - only necessary for IRQ */
861 request_irq(priv
->realirq
, irq_handler
,
862 SA_SHIRQ
| SA_SAMPLE_RANDOM
, "sk_mca", dev
);
864 printk("%s: failed to register irq %d\n", dev
->name
,
868 dev
->irq
= priv
->realirq
;
870 /* set up the card and LANCE */
876 #if (LINUX_VERSION_CODE >= 0x02032a)
877 netif_start_queue(dev
);
888 /* close driver. Shut down board and free allocated resources */
890 static int skmca_close(struct SKMCA_NETDEV
*dev
)
895 /* release resources */
897 free_irq(dev
->irq
, dev
);
900 #if (LINUX_VERSION_CODE < 0x02032a)
907 /* transmit a block. */
909 static int skmca_tx(struct sk_buff
*skb
, struct SKMCA_NETDEV
*dev
)
911 skmca_priv
*priv
= (skmca_priv
*) dev
->priv
;
913 unsigned int address
;
914 int tmplen
, retval
= 0;
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: */
923 return 0; /* don't try to free the block here ;-) */
926 /* is there space in the Tx queue ? If no, the upper layer gave us a
927 packet in spite of us not being ready and is really in trouble.
928 We'll do the dropping for him: */
929 if (priv
->txbusy
>= TXCOUNT
) {
930 priv
->stat
.tx_dropped
++;
935 /* get TX descriptor */
936 address
= RAM_TXBASE
+ (priv
->nexttxput
* sizeof(LANCE_TxDescr
));
937 SKMCA_FROMIO(&descr
, dev
->mem_start
+ address
,
938 sizeof(LANCE_TxDescr
));
940 /* enter packet length as 2s complement - assure minimum length */
944 descr
.Len
= 65536 - tmplen
;
946 /* copy filler into RAM - in case we're filling up...
947 we're filling a bit more than necessary, but that doesn't harm
948 since the buffer is far larger... */
949 if (tmplen
> skb
->len
) {
950 char *fill
= "NetBSD is a nice OS too! ";
951 unsigned int destoffs
= 0, l
= strlen(fill
);
953 while (destoffs
< tmplen
) {
954 SKMCA_TOIO(dev
->mem_start
+ descr
.LowAddr
+
960 /* do the real data copying */
961 SKMCA_TOIO(dev
->mem_start
+ descr
.LowAddr
, skb
->data
, skb
->len
);
963 /* hand descriptor over to LANCE - this is the first and last chunk */
965 TXDSCR_FLAGS_OWN
| TXDSCR_FLAGS_STP
| TXDSCR_FLAGS_ENP
;
969 printk("Send packet on descr %d len %d\n", priv
->nexttxput
,
973 /* one more descriptor busy */
977 if (priv
->nexttxput
>= TXCOUNT
)
981 /* are we saturated ? */
983 if (priv
->txbusy
>= TXCOUNT
)
984 #if (LINUX_VERSION_CODE >= 0x02032a)
985 netif_stop_queue(dev
);
990 /* write descriptor back to RAM */
991 SKMCA_TOIO(dev
->mem_start
+ address
, &descr
,
992 sizeof(LANCE_TxDescr
));
994 /* if no descriptors were active, give the LANCE a hint to read it
997 if (priv
->txbusy
== 0)
998 SetLANCE(dev
, LANCE_CSR0
, CSR0_INEA
| CSR0_TDMD
);
1000 restore_flags(flags
);
1004 /* When did that change exactly ? */
1006 #if LINUX_VERSION_CODE >= 0x020200
1009 dev_kfree_skb(skb
, FREE_WRITE
);
1014 /* return pointer to Ethernet statistics */
1016 static struct net_device_stats
*skmca_stats(struct SKMCA_NETDEV
*dev
)
1018 skmca_priv
*priv
= (skmca_priv
*) dev
->priv
;
1020 return &(priv
->stat
);
1023 /* we don't support runtime reconfiguration, since an MCA card can
1024 be unambigously identified by its POS registers. */
1026 static int skmca_config(struct SKMCA_NETDEV
*dev
, struct ifmap
*map
)
1031 /* switch receiver mode. We use the LANCE's multicast filter to prefilter
1032 multicast addresses. */
1034 static void skmca_set_multicast_list(struct SKMCA_NETDEV
*dev
)
1036 LANCE_InitBlock block
;
1038 /* first stop the LANCE... */
1041 /* ...then modify the initialization block... */
1042 SKMCA_FROMIO(&block
, dev
->mem_start
+ RAM_INITBASE
, sizeof(block
));
1043 if (dev
->flags
& IFF_PROMISC
)
1044 block
.Mode
|= LANCE_INIT_PROM
;
1046 block
.Mode
&= ~LANCE_INIT_PROM
;
1048 if (dev
->flags
& IFF_ALLMULTI
) { /* get all multicasts */
1049 memset(block
.LAdrF
, 8, 0xff);
1050 } else { /* get selected/no multicasts */
1052 struct dev_mc_list
*mptr
;
1055 memset(block
.LAdrF
, 8, 0x00);
1056 for (mptr
= dev
->mc_list
; mptr
!= NULL
; mptr
= mptr
->next
) {
1057 code
= GetHash(mptr
->dmi_addr
);
1058 block
.LAdrF
[(code
>> 3) & 7] |= 1 << (code
& 7);
1062 SKMCA_TOIO(dev
->mem_start
+ RAM_INITBASE
, &block
, sizeof(block
));
1064 /* ...then reinit LANCE with the correct flags */
1068 /* ------------------------------------------------------------------------
1070 * ------------------------------------------------------------------------ */
1072 static int startslot
; /* counts through slots when probing multiple devices */
1074 int __init
skmca_probe(struct SKMCA_NETDEV
*dev
)
1076 int force_detect
= 0;
1077 int junior
, slot
, i
;
1078 int base
= 0, irq
= 0;
1080 skmca_medium medium
;
1082 /* can't work without an MCA bus ;-) */
1087 SET_MODULE_OWNER(dev
);
1089 /* start address of 1 --> forced detection */
1091 if (dev
->mem_start
== 1)
1094 /* search through slots */
1097 base
= dev
->mem_start
;
1100 slot
= dofind(&junior
, startslot
);
1102 while (slot
!= -1) {
1103 /* deduce card addresses */
1105 getaddrs(slot
, junior
, &base
, &irq
, &medium
);
1107 #if LINUX_VERSION_CODE >= 0x020300
1108 /* slot already in use ? */
1110 if (mca_is_adapter_used(slot
)) {
1111 slot
= dofind(&junior
, slot
+ 1);
1116 /* were we looking for something different ? */
1118 if ((dev
->irq
!= 0) || (dev
->mem_start
!= 0)) {
1119 if ((dev
->irq
!= 0) && (dev
->irq
!= irq
)) {
1120 slot
= dofind(&junior
, slot
+ 1);
1123 if ((dev
->mem_start
!= 0)
1124 && (dev
->mem_start
!= base
)) {
1125 slot
= dofind(&junior
, slot
+ 1);
1130 /* found something that matches */
1135 /* nothing found ? */
1138 return ((base
!= 0) || (irq
!= 0)) ? ENXIO
: ENODEV
;
1140 /* make procfs entries */
1143 mca_set_adapter_name(slot
,
1144 "SKNET junior MC2 Ethernet Adapter");
1146 mca_set_adapter_name(slot
, "SKNET MC2+ Ethernet Adapter");
1147 mca_set_adapter_procfn(slot
, (MCA_ProcFn
) skmca_getinfo
, dev
);
1149 #if LINUX_VERSION_CODE >= 0x020200
1150 mca_mark_as_used(slot
);
1153 /* announce success */
1154 printk("%s: SKNet %s adapter found in slot %d\n", dev
->name
,
1155 junior
? "Junior MC2" : "MC2+", slot
+ 1);
1157 /* allocate structure */
1159 (skmca_priv
*) kmalloc(sizeof(skmca_priv
), GFP_KERNEL
);
1163 priv
->macbase
= base
+ 0x3fc0;
1164 priv
->ioregaddr
= base
+ 0x3ff0;
1165 priv
->ctrladdr
= base
+ 0x3ff2;
1166 priv
->cmdaddr
= base
+ 0x3ff3;
1167 priv
->medium
= medium
;
1168 memset(&(priv
->stat
), 0, sizeof(struct net_device_stats
));
1170 /* set base + irq for this device (irq not allocated so far) */
1172 dev
->mem_start
= base
;
1173 dev
->mem_end
= base
+ 0x4000;
1180 ("%s: ambigous POS bit combination, must probe for IRQ...\n",
1182 nirq
= ProbeIRQ(dev
);
1184 printk("%s: IRQ probe failed, assuming IRQ %d",
1185 dev
->name
, priv
->realirq
= -irq
);
1187 priv
->realirq
= nirq
;
1189 priv
->realirq
= irq
;
1192 dev
->open
= skmca_open
;
1193 dev
->stop
= skmca_close
;
1194 dev
->set_config
= skmca_config
;
1195 dev
->hard_start_xmit
= skmca_tx
;
1196 dev
->do_ioctl
= NULL
;
1197 dev
->get_stats
= skmca_stats
;
1198 dev
->set_multicast_list
= skmca_set_multicast_list
;
1199 dev
->flags
|= IFF_MULTICAST
;
1204 /* copy out MAC address */
1205 for (i
= 0; i
< 6; i
++)
1206 dev
->dev_addr
[i
] = SKMCA_READB(priv
->macbase
+ (i
<< 1));
1209 printk("%s: IRQ %d, memory %#lx-%#lx, "
1210 "MAC address %02x:%02x:%02x:%02x:%02x:%02x.\n",
1211 dev
->name
, priv
->realirq
, dev
->mem_start
, dev
->mem_end
- 1,
1212 dev
->dev_addr
[0], dev
->dev_addr
[1], dev
->dev_addr
[2],
1213 dev
->dev_addr
[3], dev
->dev_addr
[4], dev
->dev_addr
[5]);
1214 printk("%s: %s medium\n", dev
->name
, MediaNames
[priv
->medium
]);
1220 startslot
= slot
+ 1;
1225 /* ------------------------------------------------------------------------
1226 * modularization support
1227 * ------------------------------------------------------------------------ */
1230 MODULE_LICENSE("GPL");
1234 #if (LINUX_VERSION_CODE >= 0x020369)
1235 static struct SKMCA_NETDEV moddevs
[DEVMAX
] =
1236 { {" ", 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL
, skmca_probe
},
1237 {" ", 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL
, skmca_probe
},
1238 {" ", 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL
, skmca_probe
},
1239 {" ", 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL
, skmca_probe
},
1240 {" ", 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL
, skmca_probe
}
1243 static char NameSpace
[8 * DEVMAX
];
1244 static struct SKMCA_NETDEV moddevs
[DEVMAX
] =
1245 { {NameSpace
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL
, skmca_probe
},
1246 {NameSpace
+ 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL
, skmca_probe
},
1247 {NameSpace
+ 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL
, skmca_probe
},
1248 {NameSpace
+ 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL
, skmca_probe
},
1249 {NameSpace
+ 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL
, skmca_probe
}
1256 int init_module(void)
1261 for (z
= 0; z
< DEVMAX
; z
++) {
1262 strcpy(moddevs
[z
].name
, " ");
1263 res
= register_netdev(moddevs
+ z
);
1265 return (z
> 0) ? 0 : -EIO
;
1271 void cleanup_module(void)
1273 struct SKMCA_NETDEV
*dev
;
1277 for (z
= 0; z
< DEVMAX
; z
++) {
1279 if (dev
->priv
!= NULL
) {
1280 priv
= (skmca_priv
*) dev
->priv
;
1283 free_irq(dev
->irq
, dev
);
1285 unregister_netdev(dev
);
1286 #if LINUX_VERSION_CODE >= 0x020200
1287 mca_mark_as_unused(priv
->slot
);
1289 mca_set_adapter_procfn(priv
->slot
, NULL
, NULL
);