78 #include <linux/kernel.h>
79 #include <linux/string.h>
80 #include <linux/errno.h>
84 #include <linux/time.h>
85 #include <linux/mca.h>
86 #include <linux/module.h>
87 #include <linux/netdevice.h>
89 #include <linux/if_ether.h>
91 #include <linux/bitops.h>
93 #include <asm/processor.h>
96 #define _IBM_LANA_DRIVER_
101 #define DRV_NAME "ibmlana"
108 static char *MediaNames[Media_Count] = {
109 "10BaseT",
"10Base5",
"Unknown",
"10Base2"
123 for (z = 0; z < 160; z += 2) {
136 ibmlana_priv *
priv = netdev_priv(dev);
139 printk(
"Address %04x:\n", start);
140 for (z = 0; z < len; z++) {
153 static void PrTime(
void)
158 printk(
"%9d:%06d: ", (
int) tv.tv_sec, (
int) tv.tv_usec);
164 static void getaddrs(
struct mca_device *mdev,
int *base,
int *memlen,
169 pos0 = mca_device_read_stored_pos(mdev, 2);
170 pos1 = mca_device_read_stored_pos(mdev, 3);
172 *base = 0xc0000 + ((pos1 & 0xf0) << 9);
173 *memlen = (pos1 & 0x01) ? 0x8000 : 0x4000;
174 *iobase = (pos0 & 0xe0) << 7;
175 switch (pos0 & 0x06) {
189 *medium = (pos0 & 0x18) >> 3;
197 unsigned long fin =
jiffies + timeout;
209 static void ResetBoard(
struct net_device *dev)
211 unsigned char bcmval;
219 bcmval |= BCMREG_RESET;
222 bcmval &= ~BCMREG_RESET;
227 bcmval |= BCMREG_RAMEN | BCMREG_RAMWIN;
235 ibmlana_priv *priv = netdev_priv(dev);
249 priv->tdastart = addr = 0;
250 priv->txbufstart = baddr =
sizeof(tda_t) * TXBUFCNT;
251 for (z = 0; z < TXBUFCNT; z++) {
259 if (z == TXBUFCNT - 1)
260 tda.link = priv->tdastart;
262 tda.link = addr +
sizeof(tda_t);
264 memcpy_toio(priv->base + addr, &tda,
sizeof(tda_t));
265 addr +=
sizeof(tda_t);
275 priv->rrastart = raddr = priv->txbufstart + (TXBUFCNT *
PKTSIZE);
276 priv->rdastart = addr = priv->rrastart + (priv->rxbufcnt *
sizeof(rra_t));
277 priv->rxbufstart = baddr = priv->rdastart + (priv->rxbufcnt *
sizeof(rda_t));
279 for (z = 0; z < priv->rxbufcnt; z++) {
284 memcpy_toio(priv->base + raddr, &rra,
sizeof(rra_t));
291 if (z < priv->rxbufcnt - 1)
292 rda.link = addr +
sizeof(rda_t);
296 memcpy_toio(priv->base + addr, &rda,
sizeof(rda_t));
299 raddr +=
sizeof(rra_t);
300 addr +=
sizeof(rda_t);
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));
317 ibmlana_priv *priv = netdev_priv(dev);
334 if (!
wait_timeout(dev, SONIC_CMDREG, CMDREG_RRRA, 0, 2)) {
369 static void putcam(camentry_t * cams,
int *camcnt,
char *addr)
371 camentry_t *pcam = cams + (*camcnt);
374 pcam->index = *camcnt;
375 pcam->addr0 = (((
u16) uaddr[1]) << 8) | uaddr[0];
376 pcam->addr1 = (((
u16) uaddr[3]) << 8) | uaddr[2];
377 pcam->addr2 = (((
u16) uaddr[5]) << 8) | uaddr[4];
383 ibmlana_priv *priv = netdev_priv(dev);
402 outw(DCREG_USR1 | DCREG_USR0 | DCREG_WC1 | DCREG_DW32, dev->
base_addr + SONIC_DCREG);
417 putcam(cams, &camcnt, dev->
dev_addr);
423 putcam(cams, &camcnt, ha->
addr);
430 cammask = (1 << camcnt) - 1;
434 memcpy_toio(priv->base, cams,
sizeof(camentry_t) * camcnt);
435 memcpy_toio(priv->base + (
sizeof(camentry_t) * camcnt), &cammask,
sizeof(cammask));
439 dumpmem(dev, 0,
sizeof(camentry_t) * camcnt +
sizeof(cammask));
445 if (!
wait_timeout(dev, SONIC_CMDREG, CMDREG_LCAM, 0, 2)) {
454 printk(
"Loading CAM done, address pointers %04x:%04x\n",
460 printk(
"\n-->CAM: PTR %04x CNT %04x\n",
464 for (z = 0; z < camcnt; z++) {
466 printk(
"Entry %d: %04x %04x %04x\n", z,
476 rcrval = RCREG_BRD | RCREG_LB_NONE;
493 printk(
"\nRCRVAL: %04x\n", rcrval);
509 outw(IMREG_PRXEN | IMREG_RBEEN | IMREG_PTXEN | IMREG_TXEREN, dev->
base_addr + SONIC_IMREG);
516 printk(
"Register dump after initialization:\n");
525 ibmlana_priv *priv = netdev_priv(dev);
528 addr = priv->tdastart + (descr *
sizeof(tda_t));
536 priv->currtxdescr =
descr;
546 static void irqrbe_handler(
struct net_device *dev)
548 ibmlana_priv *priv = netdev_priv(dev);
558 static void irqrx_handler(
struct net_device *dev)
560 ibmlana_priv *priv = netdev_priv(dev);
562 u32 rdaaddr, lrdaaddr;
569 rdaaddr = priv->rdastart + (priv->nextrxdescr *
sizeof(rda_t));
570 lrdaaddr = priv->rdastart + (priv->lastrxdescr *
sizeof(rda_t));
576 rda.status &= 0xffff;
577 rda.length &= 0xffff;
578 rda.startlo &= 0xffff;
587 else if (rda.status & RCREG_PRX) {
592 skb = netdev_alloc_skb(dev, rda.length + 2);
594 dev->
stats.rx_dropped++;
600 rda.startlo, rda.length);
605 skb_checksum_none_assert(skb);
608 dev->
stats.rx_packets++;
609 dev->
stats.rx_bytes += rda.length;
619 dev->
stats.rx_errors++;
620 if (rda.status & RCREG_FAER)
621 dev->
stats.rx_frame_errors++;
622 if (rda.status & RCREG_CRCR)
623 dev->
stats.rx_crc_errors++;
637 memcpy_toio(priv->base + lrdaaddr + 20, &rdaaddr, 4);
641 priv->lastrxdescr = priv->nextrxdescr;
642 if ((++priv->nextrxdescr) >= priv->rxbufcnt)
643 priv->nextrxdescr = 0;
649 static void irqtx_handler(
struct net_device *dev)
651 ibmlana_priv *priv = netdev_priv(dev);
655 memcpy_fromio(&tda, priv->base + priv->tdastart + (priv->currtxdescr *
sizeof(tda_t)),
sizeof(tda_t));
658 dev->
stats.tx_packets++;
659 dev->
stats.tx_bytes += tda.length;
662 priv->txused[priv->currtxdescr] = 0;
666 if (priv->txusedcnt > 0)
667 StartTx(dev, (priv->currtxdescr + 1) % TXBUFCNT);
670 netif_wake_queue(dev);
673 static void irqtxerr_handler(
struct net_device *dev)
675 ibmlana_priv *priv = netdev_priv(dev);
679 memcpy_fromio(&tda, priv->base + priv->tdastart + (priv->currtxdescr *
sizeof(tda_t)),
sizeof(tda_t));
682 dev->
stats.tx_errors++;
683 if (tda.status & (TCREG_NCRS | TCREG_CRSL))
684 dev->
stats.tx_carrier_errors++;
685 if (tda.status & TCREG_EXC)
686 dev->
stats.tx_aborted_errors++;
687 if (tda.status & TCREG_OWC)
688 dev->
stats.tx_window_errors++;
689 if (tda.status & TCREG_FU)
690 dev->
stats.tx_fifo_errors++;
693 priv->txused[priv->currtxdescr] = 0;
697 if (priv->txusedcnt > 0)
698 StartTx(dev, (priv->currtxdescr + 1) % TXBUFCNT);
701 netif_wake_queue(dev);
719 if (ival & ISREG_RBE) {
723 if (ival & ISREG_PKTRX) {
727 if (ival & ISREG_TXDN) {
731 if (ival & ISREG_TXER) {
732 irqtxerr_handler(dev);
747 static int ibmlana_getinfo(
char *
buf,
int slot,
void *
d)
757 priv = netdev_priv(dev);
761 len +=
sprintf(buf + len,
"IRQ: %d\n", priv->realirq);
764 len +=
sprintf(buf + len,
"Transceiver: %s\n", MediaNames[priv->medium]);
765 len +=
sprintf(buf + len,
"Device: %s\n", dev->
name);
766 len +=
sprintf(buf + len,
"MAC address:");
767 for (
i = 0;
i < 6;
i++)
778 static int ibmlana_open(
struct net_device *dev)
781 ibmlana_priv *priv = netdev_priv(dev);
791 dev->
irq = priv->realirq;
797 netif_start_queue(dev);
803 static int ibmlana_close(
struct net_device *dev)
818 ibmlana_priv *priv = netdev_priv(dev);
827 if (priv->txusedcnt >= TXBUFCNT) {
828 dev->
stats.tx_dropped++;
836 baddr = priv->txbufstart + (priv->nexttxdescr *
PKTSIZE);
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) {
855 addr = priv->tdastart + (priv->nexttxdescr *
sizeof(tda_t));
857 tda.length = tda.fraglength = tmplen;
858 memcpy_toio(priv->base + addr, &tda,
sizeof(tda_t));
864 priv->txused[priv->nexttxdescr] = 1;
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);
882 static void ibmlana_set_multicast_list(
struct net_device *dev)
894 static int ibmlana_irq;
895 static int ibmlana_io;
896 static int startslot;
898 static short ibmlana_adapter_ids[]
__initdata = {
910 .ndo_open = ibmlana_open,
911 .ndo_stop = ibmlana_close,
912 .ndo_start_xmit = ibmlana_tx,
913 .ndo_set_rx_mode = ibmlana_set_multicast_list,
919 static int __devinit ibmlana_init_one(
struct device *kdev)
921 struct mca_device *mdev = to_mca_device(kdev);
923 int slot = mdev->slot, z,
rc;
924 int base = 0, irq = 0, iobase = 0, memlen = 0;
928 dev = alloc_etherdev(
sizeof(ibmlana_priv));
932 dev->
irq = ibmlana_irq;
939 getaddrs(mdev, &base, &memlen, &iobase, &irq, &medium);
942 if (dev->
irq && dev->
irq != irq) {
957 startslot = slot + 1;
962 priv = netdev_priv(dev);
964 priv->realirq = mca_device_transform_irq(mdev, irq);
975 priv->base =
ioremap(base, memlen);
978 startslot = slot + 1;
983 mca_device_set_name(mdev, ibmlana_adapter_names[mdev->index]);
984 mca_device_set_claim(mdev, 1);
998 "MAC address %pM.\n",
1010 startslot = slot + 1;
1014 goto err_out_claimed;
1020 mca_device_set_claim(mdev, 0);
1029 static int ibmlana_remove_one(
struct device *kdev)
1031 struct mca_device *mdev = to_mca_device(kdev);
1033 ibmlana_priv *priv = netdev_priv(dev);
1038 mca_device_set_claim(mdev, 0);
1054 static struct mca_driver ibmlana_driver = {
1055 .id_table = ibmlana_adapter_ids,
1058 .bus = &mca_bus_type,
1059 .probe = ibmlana_init_one,
1060 .remove = ibmlana_remove_one,
1064 static int __init ibmlana_init_module(
void)
1066 return mca_register_driver(&ibmlana_driver);
1069 static void __exit ibmlana_cleanup_module(
void)
1071 mca_unregister_driver(&ibmlana_driver);