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,
8 alfred.arnold@lancom.de)
10 This driver is based both on the 3C523 driver and the SK_G16 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 'Ethernet/IEEE 802.3 Family 1992 World Network Data Book/Handbook' by AMD
20 for documentation on the AM7990 LANCE
22 'SKNET Personal Technisches Manual', Version 1.2 by Schneider&Koch
23 for documentation on the Junior board
25 'SK-NET MC2+ Technical Manual", Version 1.1 by Schneider&Koch for
26 documentation on the MC2 bord
28 A big thank you to the S&K support for providing me so quickly with
31 Also see http://www.syskonnect.com/
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
44 added private structure, methods
45 begun building data structures in RAM
47 can receive frames, send frames
49 modularized initialization of LANCE
54 support for multiple devices
55 display media type for MC2+
57 fixed problem in GetLANCE leaving interrupts turned off
58 increase TX queue to 4 packets to improve send performance
60 a few corrections in statistics, caught rcvr overruns
61 reinitialization of LANCE/board in critical situations
63 implemented LANCE multicast filter
65 additions for Linux 2.2
67 unfortunately there seem to be newer MC2+ boards that react
68 on IRQ 3/5/9/10 instead of 3/5/10/11, so we have to autoprobe
69 in questionable cases...
71 integrated patches from David Weinehall & Bill Wendling for 2.3
72 kernels (isa_...functions). Things are defined in a way that
73 it still works with 2.0.x 8-)
75 added handling of the remaining interrupt conditions. That
76 should cure the spurious hangs.
78 newer kernels automatically probe more than one board, so the
79 'startslot' as a variable is also needed here
81 added changes for recent 2.3 kernels
83 *************************************************************************/
85 #include <linux/kernel.h>
86 #include <linux/string.h>
87 #include <linux/errno.h>
88 #include <linux/ioport.h>
89 #include <linux/slab.h>
90 #include <linux/interrupt.h>
91 #include <linux/delay.h>
92 #include <linux/time.h>
93 #include <linux/mca-legacy.h>
94 #include <linux/init.h>
95 #include <linux/module.h>
96 #include <linux/version.h>
97 #include <linux/netdevice.h>
98 #include <linux/etherdevice.h>
99 #include <linux/skbuff.h>
100 #include <linux/bitops.h>
102 #include <asm/processor.h>
105 #define _SK_MCA_DRIVER_
108 /* ------------------------------------------------------------------------
109 * global static data - not more since we can handle multiple boards and
110 * have to pack all state info into the device struct!
111 * ------------------------------------------------------------------------ */
113 static char *MediaNames[Media_Count] =
114 { "10Base2", "10BaseT", "10Base5", "Unknown" };
116 static unsigned char poly[] =
117 { 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0,
118 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0
121 /* ------------------------------------------------------------------------
122 * private subfunctions
123 * ------------------------------------------------------------------------ */
125 /* dump parts of shared memory - only needed during debugging */
128 static void dumpmem(struct net_device *dev, u32 start, u32 len)
130 skmca_priv *priv = netdev_priv(dev);
133 for (z = 0; z < len; z++) {
136 printk(" %02x", readb(priv->base + start + z));
142 /* print exact time - ditto */
144 static void PrTime(void)
148 do_gettimeofday(&tv);
149 printk("%9d:%06d: ", tv.tv_sec, tv.tv_usec);
153 /* deduce resources out of POS registers */
155 static void __init getaddrs(int slot, int junior, int *base, int *irq,
156 skmca_medium * medium)
158 u_char pos0, pos1, pos2;
161 pos0 = mca_read_stored_pos(slot, 2);
162 *base = ((pos0 & 0x0e) << 13) + 0xc0000;
163 *irq = ((pos0 & 0x10) >> 4) + 10;
164 *medium = Media_Unknown;
166 /* reset POS 104 Bits 0+1 so the shared memory region goes to the
167 configured area between 640K and 1M. Afterwards, enable the MC2.
168 I really don't know what rode SK to do this... */
170 mca_write_pos(slot, 4,
171 mca_read_stored_pos(slot, 4) & 0xfc);
172 mca_write_pos(slot, 2,
173 mca_read_stored_pos(slot, 2) | 0x01);
175 pos1 = mca_read_stored_pos(slot, 3);
176 pos2 = mca_read_stored_pos(slot, 4);
177 *base = ((pos1 & 0x07) << 14) + 0xc0000;
178 switch (pos2 & 0x0c) {
192 *medium = (pos2 >> 6) & 3;
196 /* check for both cards:
197 When the MC2 is turned off, it was configured for more than 15MB RAM,
198 is disabled and won't get detected using the standard probe. We
199 therefore have to scan the slots manually :-( */
201 static int __init dofind(int *junior, int firstslot)
206 for (slot = firstslot; slot < MCA_MAX_SLOT_NR; slot++) {
207 id = mca_read_stored_pos(slot, 0)
208 + (((unsigned int) mca_read_stored_pos(slot, 1)) << 8);
211 if (id == SKNET_MCA_ID)
214 if (id == SKNET_JUNIOR_MCA_ID)
220 /* reset the whole board */
222 static void ResetBoard(struct net_device *dev)
224 skmca_priv *priv = netdev_priv(dev);
226 writeb(CTRL_RESET_ON, priv->ctrladdr);
228 writeb(CTRL_RESET_OFF, priv->ctrladdr);
231 /* wait for LANCE interface to become not busy */
233 static int WaitLANCE(struct net_device *dev)
235 skmca_priv *priv = netdev_priv(dev);
238 while ((readb(priv->ctrladdr) & STAT_IO_BUSY) ==
242 printk("%s: LANCE access timeout", dev->name);
250 /* set LANCE register - must be atomic */
252 static void SetLANCE(struct net_device *dev, u16 addr, u16 value)
254 skmca_priv *priv = netdev_priv(dev);
257 /* disable interrupts */
259 spin_lock_irqsave(&priv->lock, flags);
261 /* wait until no transfer is pending */
265 /* transfer register address to RAP */
267 writeb(CTRL_RESET_OFF | CTRL_RW_WRITE | CTRL_ADR_RAP, priv->ctrladdr);
268 writew(addr, priv->ioregaddr);
269 writeb(IOCMD_GO, priv->cmdaddr);
273 /* transfer data to register */
275 writeb(CTRL_RESET_OFF | CTRL_RW_WRITE | CTRL_ADR_DATA, priv->ctrladdr);
276 writew(value, priv->ioregaddr);
277 writeb(IOCMD_GO, priv->cmdaddr);
281 /* reenable interrupts */
283 spin_unlock_irqrestore(&priv->lock, flags);
286 /* get LANCE register */
288 static u16 GetLANCE(struct net_device *dev, u16 addr)
290 skmca_priv *priv = netdev_priv(dev);
294 /* disable interrupts */
296 spin_lock_irqsave(&priv->lock, flags);
298 /* wait until no transfer is pending */
302 /* transfer register address to RAP */
304 writeb(CTRL_RESET_OFF | CTRL_RW_WRITE | CTRL_ADR_RAP, priv->ctrladdr);
305 writew(addr, priv->ioregaddr);
306 writeb(IOCMD_GO, priv->cmdaddr);
310 /* transfer data from register */
312 writeb(CTRL_RESET_OFF | CTRL_RW_READ | CTRL_ADR_DATA, priv->ctrladdr);
313 writeb(IOCMD_GO, priv->cmdaddr);
316 res = readw(priv->ioregaddr);
318 /* reenable interrupts */
320 spin_unlock_irqrestore(&priv->lock, flags);
325 /* build up descriptors in shared RAM */
327 static void InitDscrs(struct net_device *dev)
329 skmca_priv *priv = netdev_priv(dev);
332 /* Set up Tx descriptors. The board has only 16K RAM so bits 16..23
335 bufaddr = RAM_DATABASE;
340 for (z = 0; z < TXCOUNT; z++) {
341 descr.LowAddr = bufaddr;
345 memcpy_toio(priv->base + RAM_TXBASE +
346 (z * sizeof(LANCE_TxDescr)), &descr,
347 sizeof(LANCE_TxDescr));
348 memset_io(priv->base + bufaddr, 0, RAM_BUFSIZE);
349 bufaddr += RAM_BUFSIZE;
353 /* do the same for the Rx descriptors */
359 for (z = 0; z < RXCOUNT; z++) {
360 descr.LowAddr = bufaddr;
361 descr.Flags = RXDSCR_FLAGS_OWN;
362 descr.MaxLen = -RAM_BUFSIZE;
364 memcpy_toio(priv->base + RAM_RXBASE +
365 (z * sizeof(LANCE_RxDescr)), &descr,
366 sizeof(LANCE_RxDescr));
367 memset_io(priv->base + bufaddr, 0, RAM_BUFSIZE);
368 bufaddr += RAM_BUFSIZE;
373 /* calculate the hash bit position for a given multicast address
374 taken more or less directly from the AMD datasheet... */
376 static void UpdateCRC(unsigned char *CRC, int bit)
380 /* shift CRC one bit */
382 memmove(CRC + 1, CRC, 32 * sizeof(unsigned char));
385 /* if bit XOR controlbit = 1, set CRC = CRC XOR polynomial */
388 for (j = 0; j < 32; j++)
392 static unsigned int GetHash(char *address)
394 unsigned char CRC[33];
395 int i, byte, hashcode;
397 /* a multicast address has bit 0 in the first byte set */
399 if ((address[0] & 1) == 0)
404 memset(CRC, 1, sizeof(CRC));
406 /* loop through address bits */
408 for (byte = 0; byte < 6; byte++)
409 for (i = 0; i < 8; i++)
410 UpdateCRC(CRC, (address[byte] >> i) & 1);
412 /* hashcode is the 6 least significant bits of the CRC */
415 for (i = 0; i < 6; i++)
416 hashcode = (hashcode << 1) + CRC[i];
420 /* feed ready-built initialization block into LANCE */
422 static void InitLANCE(struct net_device *dev)
424 skmca_priv *priv = netdev_priv(dev);
426 /* build up descriptors. */
430 /* next RX descriptor to be read is the first one. Since the LANCE
431 will start from the beginning after initialization, we have to
432 reset out pointers too. */
436 /* no TX descriptors active */
438 priv->nexttxput = priv->nexttxdone = priv->txbusy = 0;
440 /* set up the LANCE bus control register - constant for SKnet boards */
442 SetLANCE(dev, LANCE_CSR3,
443 CSR3_BSWAP_OFF | CSR3_ALE_LOW | CSR3_BCON_HOLD);
445 /* write address of initialization block into LANCE */
447 SetLANCE(dev, LANCE_CSR1, RAM_INITBASE & 0xffff);
448 SetLANCE(dev, LANCE_CSR2, (RAM_INITBASE >> 16) & 0xff);
450 /* we don't get ready until the LANCE has read the init block */
452 netif_stop_queue(dev);
454 /* let LANCE read the initialization block. LANCE is ready
455 when we receive the corresponding interrupt. */
457 SetLANCE(dev, LANCE_CSR0, CSR0_INEA | CSR0_INIT);
460 /* stop the LANCE so we can reinitialize it */
462 static void StopLANCE(struct net_device *dev)
464 /* can't take frames any more */
466 netif_stop_queue(dev);
468 /* disable interrupts, stop it */
470 SetLANCE(dev, LANCE_CSR0, CSR0_STOP);
473 /* initialize card and LANCE for proper operation */
475 static void InitBoard(struct net_device *dev)
477 skmca_priv *priv = netdev_priv(dev);
478 LANCE_InitBlock block;
480 /* Lay out the shared RAM - first we create the init block for the LANCE.
481 We do not overwrite it later because we need it again when we switch
482 promiscous mode on/off. */
485 if (dev->flags & IFF_PROMISC)
486 block.Mode |= LANCE_INIT_PROM;
487 memcpy(block.PAdr, dev->dev_addr, 6);
488 memset(block.LAdrF, 0, sizeof(block.LAdrF));
489 block.RdrP = (RAM_RXBASE & 0xffffff) | (LRXCOUNT << 29);
490 block.TdrP = (RAM_TXBASE & 0xffffff) | (LTXCOUNT << 29);
492 memcpy_toio(priv->base + RAM_INITBASE, &block, sizeof(block));
494 /* initialize LANCE. Implicitly sets up other structures in RAM. */
499 /* deinitialize card and LANCE */
501 static void DeinitBoard(struct net_device *dev)
512 /* probe for device's irq */
514 static int __init ProbeIRQ(struct net_device *dev)
516 unsigned long imaskval, njiffies, irq;
519 /* enable all interrupts */
521 imaskval = probe_irq_on();
523 /* initialize the board. Wait for interrupt 'Initialization done'. */
528 njiffies = jiffies + HZ;
530 csr0val = GetLANCE(dev, LANCE_CSR0);
532 while (((csr0val & CSR0_IDON) == 0) && (jiffies != njiffies));
534 /* turn of interrupts again */
536 irq = probe_irq_off(imaskval);
538 /* if we found something, ack the interrupt */
541 SetLANCE(dev, LANCE_CSR0, csr0val | CSR0_IDON);
543 /* back to idle state */
550 /* ------------------------------------------------------------------------
551 * interrupt handler(s)
552 * ------------------------------------------------------------------------ */
554 /* LANCE has read initialization block -> start it */
556 static u16 irqstart_handler(struct net_device *dev, u16 oldcsr0)
558 /* now we're ready to transmit */
560 netif_wake_queue(dev);
562 /* reset IDON bit, start LANCE */
564 SetLANCE(dev, LANCE_CSR0, oldcsr0 | CSR0_IDON | CSR0_STRT);
565 return GetLANCE(dev, LANCE_CSR0);
568 /* did we lose blocks due to a FIFO overrun ? */
570 static u16 irqmiss_handler(struct net_device *dev, u16 oldcsr0)
572 skmca_priv *priv = netdev_priv(dev);
574 /* update statistics */
576 priv->stat.rx_fifo_errors++;
580 SetLANCE(dev, LANCE_CSR0, oldcsr0 | CSR0_MISS);
581 return GetLANCE(dev, LANCE_CSR0);
584 /* receive interrupt */
586 static u16 irqrx_handler(struct net_device *dev, u16 oldcsr0)
588 skmca_priv *priv = netdev_priv(dev);
590 unsigned int descraddr;
592 /* run through queue until we reach a descriptor we do not own */
594 descraddr = RAM_RXBASE + (priv->nextrx * sizeof(LANCE_RxDescr));
596 /* read descriptor */
597 memcpy_fromio(&descr, priv->base + descraddr,
598 sizeof(LANCE_RxDescr));
600 /* if we reach a descriptor we do not own, we're done */
601 if ((descr.Flags & RXDSCR_FLAGS_OWN) != 0)
606 printk("Receive packet on descr %d len %d\n", priv->nextrx,
610 /* erroneous packet ? */
611 if ((descr.Flags & RXDSCR_FLAGS_ERR) != 0) {
612 priv->stat.rx_errors++;
613 if ((descr.Flags & RXDSCR_FLAGS_CRC) != 0)
614 priv->stat.rx_crc_errors++;
615 else if ((descr.Flags & RXDSCR_FLAGS_CRC) != 0)
616 priv->stat.rx_frame_errors++;
617 else if ((descr.Flags & RXDSCR_FLAGS_OFLO) != 0)
618 priv->stat.rx_fifo_errors++;
625 skb = dev_alloc_skb(descr.Len + 2);
627 priv->stat.rx_dropped++;
629 memcpy_fromio(skb_put(skb, descr.Len),
631 descr.LowAddr, descr.Len);
633 skb->protocol = eth_type_trans(skb, dev);
634 skb->ip_summed = CHECKSUM_NONE;
635 priv->stat.rx_packets++;
636 priv->stat.rx_bytes += descr.Len;
638 dev->last_rx = jiffies;
642 /* give descriptor back to LANCE */
644 descr.Flags |= RXDSCR_FLAGS_OWN;
646 /* update descriptor in shared RAM */
647 memcpy_toio(priv->base + descraddr, &descr,
648 sizeof(LANCE_RxDescr));
650 /* go to next descriptor */
652 descraddr += sizeof(LANCE_RxDescr);
653 if (priv->nextrx >= RXCOUNT) {
655 descraddr = RAM_RXBASE;
661 SetLANCE(dev, LANCE_CSR0, oldcsr0 | CSR0_RINT);
662 return GetLANCE(dev, LANCE_CSR0);
665 /* transmit interrupt */
667 static u16 irqtx_handler(struct net_device *dev, u16 oldcsr0)
669 skmca_priv *priv = netdev_priv(dev);
671 unsigned int descraddr;
673 /* check descriptors at most until no busy one is left */
676 RAM_TXBASE + (priv->nexttxdone * sizeof(LANCE_TxDescr));
677 while (priv->txbusy > 0) {
678 /* read descriptor */
679 memcpy_fromio(&descr, priv->base + descraddr,
680 sizeof(LANCE_TxDescr));
682 /* if the LANCE still owns this one, we've worked out all sent packets */
683 if ((descr.Flags & TXDSCR_FLAGS_OWN) != 0)
688 printk("Send packet done on descr %d\n", priv->nexttxdone);
691 /* update statistics */
692 if ((descr.Flags & TXDSCR_FLAGS_ERR) == 0) {
693 priv->stat.tx_packets++;
694 priv->stat.tx_bytes++;
696 priv->stat.tx_errors++;
697 if ((descr.Status & TXDSCR_STATUS_UFLO) != 0) {
698 priv->stat.tx_fifo_errors++;
702 if ((descr.Status & TXDSCR_STATUS_LCOL) !=
703 0) priv->stat.tx_window_errors++;
704 else if ((descr.Status & TXDSCR_STATUS_LCAR) != 0)
705 priv->stat.tx_carrier_errors++;
706 else if ((descr.Status & TXDSCR_STATUS_RTRY) != 0)
707 priv->stat.tx_aborted_errors++;
710 /* go to next descriptor */
712 descraddr += sizeof(LANCE_TxDescr);
713 if (priv->nexttxdone >= TXCOUNT) {
714 priv->nexttxdone = 0;
715 descraddr = RAM_TXBASE;
720 /* reset TX interrupt bit */
722 SetLANCE(dev, LANCE_CSR0, oldcsr0 | CSR0_TINT);
723 oldcsr0 = GetLANCE(dev, LANCE_CSR0);
725 /* at least one descriptor is freed. Therefore we can accept
727 /* inform upper layers we're in business again */
729 netif_wake_queue(dev);
734 /* general interrupt entry */
736 static irqreturn_t irq_handler(int irq, void *device, struct pt_regs *regs)
738 struct net_device *dev = (struct net_device *) device;
741 /* read CSR0 to get interrupt cause */
743 csr0val = GetLANCE(dev, LANCE_CSR0);
745 /* in case we're not meant... */
747 if ((csr0val & CSR0_INTR) == 0)
751 set_bit(LINK_STATE_RXSEM, &dev->state);
754 /* loop through the interrupt bits until everything is clear */
757 if ((csr0val & CSR0_IDON) != 0)
758 csr0val = irqstart_handler(dev, csr0val);
759 if ((csr0val & CSR0_RINT) != 0)
760 csr0val = irqrx_handler(dev, csr0val);
761 if ((csr0val & CSR0_MISS) != 0)
762 csr0val = irqmiss_handler(dev, csr0val);
763 if ((csr0val & CSR0_TINT) != 0)
764 csr0val = irqtx_handler(dev, csr0val);
765 if ((csr0val & CSR0_MERR) != 0) {
766 SetLANCE(dev, LANCE_CSR0, csr0val | CSR0_MERR);
767 csr0val = GetLANCE(dev, LANCE_CSR0);
769 if ((csr0val & CSR0_BABL) != 0) {
770 SetLANCE(dev, LANCE_CSR0, csr0val | CSR0_BABL);
771 csr0val = GetLANCE(dev, LANCE_CSR0);
774 while ((csr0val & CSR0_INTR) != 0);
777 clear_bit(LINK_STATE_RXSEM, &dev->state);
782 /* ------------------------------------------------------------------------
784 * ------------------------------------------------------------------------ */
788 static int skmca_getinfo(char *buf, int slot, void *d)
791 struct net_device *dev = (struct net_device *) d;
794 /* can't say anything about an uninitialized device... */
798 priv = netdev_priv(dev);
802 len += sprintf(buf + len, "IRQ: %d\n", priv->realirq);
803 len += sprintf(buf + len, "Memory: %#lx-%#lx\n", dev->mem_start,
806 sprintf(buf + len, "Transceiver: %s\n",
807 MediaNames[priv->medium]);
808 len += sprintf(buf + len, "Device: %s\n", dev->name);
809 len += sprintf(buf + len, "MAC address:");
810 for (i = 0; i < 6; i++)
811 len += sprintf(buf + len, " %02x", dev->dev_addr[i]);
818 /* open driver. Means also initialization and start of LANCE */
820 static int skmca_open(struct net_device *dev)
823 skmca_priv *priv = netdev_priv(dev);
825 /* register resources - only necessary for IRQ */
827 request_irq(priv->realirq, irq_handler,
828 SA_SHIRQ | SA_SAMPLE_RANDOM, "sk_mca", dev);
830 printk("%s: failed to register irq %d\n", dev->name,
834 dev->irq = priv->realirq;
836 /* set up the card and LANCE */
842 netif_start_queue(dev);
847 /* close driver. Shut down board and free allocated resources */
849 static int skmca_close(struct net_device *dev)
854 /* release resources */
856 free_irq(dev->irq, dev);
862 /* transmit a block. */
864 static int skmca_tx(struct sk_buff *skb, struct net_device *dev)
866 skmca_priv *priv = netdev_priv(dev);
868 unsigned int address;
869 int tmplen, retval = 0;
872 /* if we get called with a NULL descriptor, the Ethernet layer thinks
873 our card is stuck an we should reset it. We'll do this completely: */
878 return 0; /* don't try to free the block here ;-) */
881 /* is there space in the Tx queue ? If no, the upper layer gave us a
882 packet in spite of us not being ready and is really in trouble.
883 We'll do the dropping for him: */
884 if (priv->txbusy >= TXCOUNT) {
885 priv->stat.tx_dropped++;
890 /* get TX descriptor */
891 address = RAM_TXBASE + (priv->nexttxput * sizeof(LANCE_TxDescr));
892 memcpy_fromio(&descr, priv->base + address, sizeof(LANCE_TxDescr));
894 /* enter packet length as 2s complement - assure minimum length */
898 descr.Len = 65536 - tmplen;
900 /* copy filler into RAM - in case we're filling up...
901 we're filling a bit more than necessary, but that doesn't harm
902 since the buffer is far larger... */
903 if (tmplen > skb->len) {
904 char *fill = "NetBSD is a nice OS too! ";
905 unsigned int destoffs = 0, l = strlen(fill);
907 while (destoffs < tmplen) {
908 memcpy_toio(priv->base + descr.LowAddr +
914 /* do the real data copying */
915 memcpy_toio(priv->base + descr.LowAddr, skb->data, skb->len);
917 /* hand descriptor over to LANCE - this is the first and last chunk */
919 TXDSCR_FLAGS_OWN | TXDSCR_FLAGS_STP | TXDSCR_FLAGS_ENP;
923 printk("Send packet on descr %d len %d\n", priv->nexttxput,
927 /* one more descriptor busy */
929 spin_lock_irqsave(&priv->lock, flags);
932 if (priv->nexttxput >= TXCOUNT)
936 /* are we saturated ? */
938 if (priv->txbusy >= TXCOUNT)
939 netif_stop_queue(dev);
941 /* write descriptor back to RAM */
942 memcpy_toio(priv->base + address, &descr, sizeof(LANCE_TxDescr));
944 /* if no descriptors were active, give the LANCE a hint to read it
947 if (priv->txbusy == 0)
948 SetLANCE(dev, LANCE_CSR0, CSR0_INEA | CSR0_TDMD);
950 spin_unlock_irqrestore(&priv->lock, flags);
959 /* return pointer to Ethernet statistics */
961 static struct net_device_stats *skmca_stats(struct net_device *dev)
963 skmca_priv *priv = netdev_priv(dev);
965 return &(priv->stat);
968 /* switch receiver mode. We use the LANCE's multicast filter to prefilter
969 multicast addresses. */
971 static void skmca_set_multicast_list(struct net_device *dev)
973 skmca_priv *priv = netdev_priv(dev);
974 LANCE_InitBlock block;
976 /* first stop the LANCE... */
979 /* ...then modify the initialization block... */
980 memcpy_fromio(&block, priv->base + RAM_INITBASE, sizeof(block));
981 if (dev->flags & IFF_PROMISC)
982 block.Mode |= LANCE_INIT_PROM;
984 block.Mode &= ~LANCE_INIT_PROM;
986 if (dev->flags & IFF_ALLMULTI) { /* get all multicasts */
987 memset(block.LAdrF, 0xff, sizeof(block.LAdrF));
988 } else { /* get selected/no multicasts */
990 struct dev_mc_list *mptr;
993 memset(block.LAdrF, 0, sizeof(block.LAdrF));
994 for (mptr = dev->mc_list; mptr != NULL; mptr = mptr->next) {
995 code = GetHash(mptr->dmi_addr);
996 block.LAdrF[(code >> 3) & 7] |= 1 << (code & 7);
1000 memcpy_toio(priv->base + RAM_INITBASE, &block, sizeof(block));
1002 /* ...then reinit LANCE with the correct flags */
1006 /* ------------------------------------------------------------------------
1008 * ------------------------------------------------------------------------ */
1010 static int startslot; /* counts through slots when probing multiple devices */
1012 static void cleanup_card(struct net_device *dev)
1014 skmca_priv *priv = netdev_priv(dev);
1017 free_irq(dev->irq, dev);
1018 iounmap(priv->base);
1019 mca_mark_as_unused(priv->slot);
1020 mca_set_adapter_procfn(priv->slot, NULL, NULL);
1023 struct net_device * __init skmca_probe(int unit)
1025 struct net_device *dev;
1026 int force_detect = 0;
1027 int junior, slot, i;
1028 int base = 0, irq = 0;
1030 skmca_medium medium;
1033 /* can't work without an MCA bus ;-) */
1036 return ERR_PTR(-ENODEV);
1038 dev = alloc_etherdev(sizeof(skmca_priv));
1040 return ERR_PTR(-ENOMEM);
1043 sprintf(dev->name, "eth%d", unit);
1044 netdev_boot_setup_check(dev);
1047 SET_MODULE_OWNER(dev);
1049 /* start address of 1 --> forced detection */
1051 if (dev->mem_start == 1)
1054 /* search through slots */
1056 base = dev->mem_start;
1057 irq = dev->base_addr;
1058 for (slot = startslot; (slot = dofind(&junior, slot)) != -1; slot++) {
1059 /* deduce card addresses */
1061 getaddrs(slot, junior, &base, &irq, &medium);
1063 /* slot already in use ? */
1065 if (mca_is_adapter_used(slot))
1068 /* were we looking for something different ? */
1070 if (dev->irq && dev->irq != irq)
1072 if (dev->mem_start && dev->mem_start != base)
1075 /* found something that matches */
1080 /* nothing found ? */
1084 return (base || irq) ? ERR_PTR(-ENXIO) : ERR_PTR(-ENODEV);
1087 /* make procfs entries */
1090 mca_set_adapter_name(slot,
1091 "SKNET junior MC2 Ethernet Adapter");
1093 mca_set_adapter_name(slot, "SKNET MC2+ Ethernet Adapter");
1094 mca_set_adapter_procfn(slot, (MCA_ProcFn) skmca_getinfo, dev);
1096 mca_mark_as_used(slot);
1098 /* announce success */
1099 printk("%s: SKNet %s adapter found in slot %d\n", dev->name,
1100 junior ? "Junior MC2" : "MC2+", slot + 1);
1102 priv = netdev_priv(dev);
1103 priv->base = ioremap(base, 0x4000);
1105 mca_set_adapter_procfn(slot, NULL, NULL);
1106 mca_mark_as_unused(slot);
1108 return ERR_PTR(-ENOMEM);
1112 priv->macbase = priv->base + 0x3fc0;
1113 priv->ioregaddr = priv->base + 0x3ff0;
1114 priv->ctrladdr = priv->base + 0x3ff2;
1115 priv->cmdaddr = priv->base + 0x3ff3;
1116 priv->medium = medium;
1117 memset(&priv->stat, 0, sizeof(struct net_device_stats));
1118 spin_lock_init(&priv->lock);
1120 /* set base + irq for this device (irq not allocated so far) */
1122 dev->mem_start = base;
1123 dev->mem_end = base + 0x4000;
1130 ("%s: ambigous POS bit combination, must probe for IRQ...\n",
1132 nirq = ProbeIRQ(dev);
1134 printk("%s: IRQ probe failed, assuming IRQ %d",
1135 dev->name, priv->realirq = -irq);
1137 priv->realirq = nirq;
1139 priv->realirq = irq;
1142 dev->open = skmca_open;
1143 dev->stop = skmca_close;
1144 dev->hard_start_xmit = skmca_tx;
1145 dev->do_ioctl = NULL;
1146 dev->get_stats = skmca_stats;
1147 dev->set_multicast_list = skmca_set_multicast_list;
1148 dev->flags |= IFF_MULTICAST;
1150 /* copy out MAC address */
1151 for (i = 0; i < 6; i++)
1152 dev->dev_addr[i] = readb(priv->macbase + (i << 1));
1155 printk("%s: IRQ %d, memory %#lx-%#lx, "
1156 "MAC address %02x:%02x:%02x:%02x:%02x:%02x.\n",
1157 dev->name, priv->realirq, dev->mem_start, dev->mem_end - 1,
1158 dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
1159 dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
1160 printk("%s: %s medium\n", dev->name, MediaNames[priv->medium]);
1166 startslot = slot + 1;
1168 err = register_netdev(dev);
1177 /* ------------------------------------------------------------------------
1178 * modularization support
1179 * ------------------------------------------------------------------------ */
1182 MODULE_LICENSE("GPL");
1186 static struct net_device *moddevs[DEVMAX];
1188 int init_module(void)
1193 for (z = 0; z < DEVMAX; z++) {
1194 struct net_device *dev = skmca_probe(-1);
1204 void cleanup_module(void)
1208 for (z = 0; z < DEVMAX; z++) {
1209 struct net_device *dev = moddevs[z];
1211 unregister_netdev(dev);