+++ /dev/null
-/*
-net-3-driver for the IBM LAN Adapter/A
-
-This is an extension to the Linux operating system, and is covered by the
-same GNU General Public License that covers that work.
-
-Copyright 1999 by Alfred Arnold (alfred@ccac.rwth-aachen.de,
-                                 alfred.arnold@lancom.de)
-
-This driver is based both on the SK_MCA driver, which is itself based on the
-SK_G16 and 3C523 driver.
-
-paper sources:
-  'PC Hardware: Aufbau, Funktionsweise, Programmierung' by
-  Hans-Peter Messmer for the basic Microchannel stuff
-
-  'Linux Geraetetreiber' by Allesandro Rubini, Kalle Dalheimer
-  for help on Ethernet driver programming
-
-  'DP83934CVUL-20/25 MHz SONIC-T Ethernet Controller Datasheet' by National
-  Semiconductor for info on the MAC chip
-
-  'LAN Technical Reference Ethernet Adapter Interface Version 1 Release 1.0
-   Document Number SC30-3661-00' by IBM for info on the adapter itself
-
-  Also see http://www.national.com/analog 
-
-special acknowledgements to:
-  - Bob Eager for helping me out with documentation from IBM
-  - Jim Shorney for his endless patience with me while I was using
-    him as a beta tester to trace down the address filter bug ;-)
-
-  Missing things:
-
-  -> set debug level via ioctl instead of compile-time switches
-  -> I didn't follow the development of the 2.1.x kernels, so my
-     assumptions about which things changed with which kernel version
-     are probably nonsense
-
-History:
-  Nov 6th, 1999
-       startup from SK_MCA driver
-  Dec 6th, 1999
-       finally got docs about the card.  A big thank you to Bob Eager!
-  Dec 12th, 1999
-       first packet received
-  Dec 13th, 1999
-       recv queue done, tcpdump works
-  Dec 15th, 1999
-       transmission part works
-  Dec 28th, 1999
-       added usage of the isa_functions for Linux 2.3 .  Things should
-       still work with 2.0.x....
-  Jan 28th, 2000
-       in Linux 2.2.13, the version.h file mysteriously didn't get
-       included.  Added a workaround for this.  Furthermore, it now
-       not only compiles as a modules ;-)
-  Jan 30th, 2000
-       newer kernels automatically probe more than one board, so the
-       'startslot' as a variable is also needed here
-  Apr 12th, 2000
-       the interrupt mask register is not set 'hard' instead of individually
-       setting registers, since this seems to set bits that shouldn't be
-       set
-  May 21st, 2000
-       reset interrupt status immediately after CAM load
-       add a recovery delay after releasing the chip's reset line
-  May 24th, 2000
-       finally found the bug in the address filter setup - damned signed
-        chars!
-  June 1st, 2000
-       corrected version codes, added support for the latest 2.3 changes
-  Oct 28th, 2002
-       cleaned up for the 2.5 tree <alan@lxorguk.ukuu.org.uk>
-
- *************************************************************************/
-
-#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/errno.h>
-#include <linux/ioport.h>
-#include <linux/interrupt.h>
-#include <linux/delay.h>
-#include <linux/time.h>
-#include <linux/mca.h>
-#include <linux/module.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/if_ether.h>
-#include <linux/skbuff.h>
-#include <linux/bitops.h>
-
-#include <asm/processor.h>
-#include <asm/io.h>
-
-#define _IBM_LANA_DRIVER_
-#include "ibmlana.h"
-
-#undef DEBUG
-
-#define DRV_NAME "ibmlana"
-
-/* ------------------------------------------------------------------------
- * global static data - not more since we can handle multiple boards and
- * have to pack all state info into the device struct!
- * ------------------------------------------------------------------------ */
-
-static char *MediaNames[Media_Count] = {
-       "10BaseT", "10Base5", "Unknown", "10Base2"
-};
-
-/* ------------------------------------------------------------------------
- * private subfunctions
- * ------------------------------------------------------------------------ */
-
-#ifdef DEBUG
-  /* dump all registers */
-
-static void dumpregs(struct net_device *dev)
-{
-       int z;
-
-       for (z = 0; z < 160; z += 2) {
-               if (!(z & 15))
-                       printk("REGS: %04x:", z);
-               printk(" %04x", inw(dev->base_addr + z));
-               if ((z & 15) == 14)
-                       printk("\n");
-       }
-}
-
-/* dump parts of shared memory - only needed during debugging */
-
-static void dumpmem(struct net_device *dev, u32 start, u32 len)
-{
-       ibmlana_priv *priv = netdev_priv(dev);
-       int z;
-
-       printk("Address %04x:\n", start);
-       for (z = 0; z < len; z++) {
-               if ((z & 15) == 0)
-                       printk("%04x:", z);
-               printk(" %02x", readb(priv->base + start + z));
-               if ((z & 15) == 15)
-                       printk("\n");
-       }
-       if ((z & 15) != 0)
-               printk("\n");
-}
-
-/* print exact time - ditto */
-
-static void PrTime(void)
-{
-       struct timeval tv;
-
-       do_gettimeofday(&tv);
-       printk("%9d:%06d: ", (int) tv.tv_sec, (int) tv.tv_usec);
-}
-#endif                         /* DEBUG */
-
-/* deduce resources out of POS registers */
-
-static void getaddrs(struct mca_device *mdev, int *base, int *memlen,
-                    int *iobase, int *irq, ibmlana_medium *medium)
-{
-       u_char pos0, pos1;
-
-       pos0 = mca_device_read_stored_pos(mdev, 2);
-       pos1 = mca_device_read_stored_pos(mdev, 3);
-
-       *base = 0xc0000 + ((pos1 & 0xf0) << 9);
-       *memlen = (pos1 & 0x01) ? 0x8000 : 0x4000;
-       *iobase = (pos0 & 0xe0) << 7;
-       switch (pos0 & 0x06) {
-       case 0:
-               *irq = 5;
-               break;
-       case 2:
-               *irq = 15;
-               break;
-       case 4:
-               *irq = 10;
-               break;
-       case 6:
-               *irq = 11;
-               break;
-       }
-       *medium = (pos0 & 0x18) >> 3;
-}
-
-/* wait on register value with mask and timeout */
-
-static int wait_timeout(struct net_device *dev, int regoffs, u16 mask,
-                       u16 value, int timeout)
-{
-       unsigned long fin = jiffies + timeout;
-
-       while (time_before(jiffies,fin))
-               if ((inw(dev->base_addr + regoffs) & mask) == value)
-                       return 1;
-
-       return 0;
-}
-
-
-/* reset the whole board */
-
-static void ResetBoard(struct net_device *dev)
-{
-       unsigned char bcmval;
-
-       /* read original board control value */
-
-       bcmval = inb(dev->base_addr + BCMREG);
-
-       /* set reset bit for a while */
-
-       bcmval |= BCMREG_RESET;
-       outb(bcmval, dev->base_addr + BCMREG);
-       udelay(10);
-       bcmval &= ~BCMREG_RESET;
-       outb(bcmval, dev->base_addr + BCMREG);
-
-       /* switch over to RAM again */
-
-       bcmval |= BCMREG_RAMEN | BCMREG_RAMWIN;
-       outb(bcmval, dev->base_addr + BCMREG);
-}
-
-/* calculate RAM layout & set up descriptors in RAM */
-
-static void InitDscrs(struct net_device *dev)
-{
-       ibmlana_priv *priv = netdev_priv(dev);
-       u32 addr, baddr, raddr;
-       int z;
-       tda_t tda;
-       rda_t rda;
-       rra_t rra;
-
-       /* initialize RAM */
-
-       memset_io(priv->base, 0xaa,
-                     dev->mem_start - dev->mem_start); /* XXX: typo? */
-
-       /* setup n TX descriptors - independent of RAM size */
-
-       priv->tdastart = addr = 0;
-       priv->txbufstart = baddr = sizeof(tda_t) * TXBUFCNT;
-       for (z = 0; z < TXBUFCNT; z++) {
-               tda.status = 0;
-               tda.config = 0;
-               tda.length = 0;
-               tda.fragcount = 1;
-               tda.startlo = baddr;
-               tda.starthi = 0;
-               tda.fraglength = 0;
-               if (z == TXBUFCNT - 1)
-                       tda.link = priv->tdastart;
-               else
-                       tda.link = addr + sizeof(tda_t);
-               tda.link |= 1;
-               memcpy_toio(priv->base + addr, &tda, sizeof(tda_t));
-               addr += sizeof(tda_t);
-               baddr += PKTSIZE;
-       }
-
-       /* calculate how many receive buffers fit into remaining memory */
-
-       priv->rxbufcnt = (dev->mem_end - dev->mem_start - baddr) / (sizeof(rra_t) + sizeof(rda_t) + PKTSIZE);
-
-       /* calculate receive addresses */
-
-       priv->rrastart = raddr = priv->txbufstart + (TXBUFCNT * PKTSIZE);
-       priv->rdastart = addr = priv->rrastart + (priv->rxbufcnt * sizeof(rra_t));
-       priv->rxbufstart = baddr = priv->rdastart + (priv->rxbufcnt * sizeof(rda_t));
-
-       for (z = 0; z < priv->rxbufcnt; z++) {
-               rra.startlo = baddr;
-               rra.starthi = 0;
-               rra.cntlo = PKTSIZE >> 1;
-               rra.cnthi = 0;
-               memcpy_toio(priv->base + raddr, &rra, sizeof(rra_t));
-
-               rda.status = 0;
-               rda.length = 0;
-               rda.startlo = 0;
-               rda.starthi = 0;
-               rda.seqno = 0;
-               if (z < priv->rxbufcnt - 1)
-                       rda.link = addr + sizeof(rda_t);
-               else
-                       rda.link = 1;
-               rda.inuse = 1;
-               memcpy_toio(priv->base + addr, &rda, sizeof(rda_t));
-
-               baddr += PKTSIZE;
-               raddr += sizeof(rra_t);
-               addr += sizeof(rda_t);
-       }
-
-       /* initialize current pointers */
-
-       priv->nextrxdescr = 0;
-       priv->lastrxdescr = priv->rxbufcnt - 1;
-       priv->nexttxdescr = 0;
-       priv->currtxdescr = 0;
-       priv->txusedcnt = 0;
-       memset(priv->txused, 0, sizeof(priv->txused));
-}
-
-/* set up Rx + Tx descriptors in SONIC */
-
-static int InitSONIC(struct net_device *dev)
-{
-       ibmlana_priv *priv = netdev_priv(dev);
-
-       /* set up start & end of resource area */
-
-       outw(0, SONIC_URRA);
-       outw(priv->rrastart, dev->base_addr + SONIC_RSA);
-       outw(priv->rrastart + (priv->rxbufcnt * sizeof(rra_t)), dev->base_addr + SONIC_REA);
-       outw(priv->rrastart, dev->base_addr + SONIC_RRP);
-       outw(priv->rrastart, dev->base_addr + SONIC_RWP);
-
-       /* set EOBC so that only one packet goes into one buffer */
-
-       outw((PKTSIZE - 4) >> 1, dev->base_addr + SONIC_EOBC);
-
-       /* let SONIC read the first RRA descriptor */
-
-       outw(CMDREG_RRRA, dev->base_addr + SONIC_CMDREG);
-       if (!wait_timeout(dev, SONIC_CMDREG, CMDREG_RRRA, 0, 2)) {
-               printk(KERN_ERR "%s: SONIC did not respond on RRRA command - giving up.", dev->name);
-               return 0;
-       }
-
-       /* point SONIC to the first RDA */
-
-       outw(0, dev->base_addr + SONIC_URDA);
-       outw(priv->rdastart, dev->base_addr + SONIC_CRDA);
-
-       /* set upper half of TDA address */
-
-       outw(0, dev->base_addr + SONIC_UTDA);
-
-       return 1;
-}
-
-/* stop SONIC so we can reinitialize it */
-
-static void StopSONIC(struct net_device *dev)
-{
-       /* disable interrupts */
-
-       outb(inb(dev->base_addr + BCMREG) & (~BCMREG_IEN), dev->base_addr + BCMREG);
-       outb(0, dev->base_addr + SONIC_IMREG);
-
-       /* reset the SONIC */
-
-       outw(CMDREG_RST, dev->base_addr + SONIC_CMDREG);
-       udelay(10);
-       outw(CMDREG_RST, dev->base_addr + SONIC_CMDREG);
-}
-
-/* initialize card and SONIC for proper operation */
-
-static void putcam(camentry_t * cams, int *camcnt, char *addr)
-{
-       camentry_t *pcam = cams + (*camcnt);
-       u8 *uaddr = (u8 *) addr;
-
-       pcam->index = *camcnt;
-       pcam->addr0 = (((u16) uaddr[1]) << 8) | uaddr[0];
-       pcam->addr1 = (((u16) uaddr[3]) << 8) | uaddr[2];
-       pcam->addr2 = (((u16) uaddr[5]) << 8) | uaddr[4];
-       (*camcnt)++;
-}
-
-static void InitBoard(struct net_device *dev)
-{
-       ibmlana_priv *priv = netdev_priv(dev);
-       int camcnt;
-       camentry_t cams[16];
-       u32 cammask;
-       struct netdev_hw_addr *ha;
-       u16 rcrval;
-
-       /* reset the SONIC */
-
-       outw(CMDREG_RST, dev->base_addr + SONIC_CMDREG);
-       udelay(10);
-
-       /* clear all spurious interrupts */
-
-       outw(inw(dev->base_addr + SONIC_ISREG), dev->base_addr + SONIC_ISREG);
-
-       /* set up the SONIC's bus interface - constant for this adapter -
-          must be done while the SONIC is in reset */
-
-       outw(DCREG_USR1 | DCREG_USR0 | DCREG_WC1 | DCREG_DW32, dev->base_addr + SONIC_DCREG);
-       outw(0, dev->base_addr + SONIC_DCREG2);
-
-       /* remove reset form the SONIC */
-
-       outw(0, dev->base_addr + SONIC_CMDREG);
-       udelay(10);
-
-       /* data sheet requires URRA to be programmed before setting up the CAM contents */
-
-       outw(0, dev->base_addr + SONIC_URRA);
-
-       /* program the CAM entry 0 to the device address */
-
-       camcnt = 0;
-       putcam(cams, &camcnt, dev->dev_addr);
-
-       /* start putting the multicast addresses into the CAM list.  Stop if
-          it is full. */
-
-       netdev_for_each_mc_addr(ha, dev) {
-               putcam(cams, &camcnt, ha->addr);
-               if (camcnt == 16)
-                       break;
-       }
-
-       /* calculate CAM mask */
-
-       cammask = (1 << camcnt) - 1;
-
-       /* feed CDA into SONIC, initialize RCR value (always get broadcasts) */
-
-       memcpy_toio(priv->base, cams, sizeof(camentry_t) * camcnt);
-       memcpy_toio(priv->base + (sizeof(camentry_t) * camcnt), &cammask, sizeof(cammask));
-
-#ifdef DEBUG
-       printk("CAM setup:\n");
-       dumpmem(dev, 0, sizeof(camentry_t) * camcnt + sizeof(cammask));
-#endif
-
-       outw(0, dev->base_addr + SONIC_CAMPTR);
-       outw(camcnt, dev->base_addr + SONIC_CAMCNT);
-       outw(CMDREG_LCAM, dev->base_addr + SONIC_CMDREG);
-       if (!wait_timeout(dev, SONIC_CMDREG, CMDREG_LCAM, 0, 2)) {
-               printk(KERN_ERR "%s:SONIC did not respond on LCAM command - giving up.", dev->name);
-               return;
-       } else {
-               /* clear interrupt condition */
-
-               outw(ISREG_LCD, dev->base_addr + SONIC_ISREG);
-
-#ifdef DEBUG
-               printk("Loading CAM done, address pointers %04x:%04x\n",
-                      inw(dev->base_addr + SONIC_URRA),
-                      inw(dev->base_addr + SONIC_CAMPTR));
-               {
-                       int z;
-
-                       printk("\n-->CAM: PTR %04x CNT %04x\n",
-                              inw(dev->base_addr + SONIC_CAMPTR),
-                              inw(dev->base_addr + SONIC_CAMCNT));
-                       outw(CMDREG_RST, dev->base_addr + SONIC_CMDREG);
-                       for (z = 0; z < camcnt; z++) {
-                               outw(z, dev->base_addr + SONIC_CAMEPTR);
-                               printk("Entry %d: %04x %04x %04x\n", z,
-                                      inw(dev->base_addr + SONIC_CAMADDR0),
-                                      inw(dev->base_addr + SONIC_CAMADDR1),
-                                      inw(dev->base_addr + SONIC_CAMADDR2));
-                       }
-                       outw(0, dev->base_addr + SONIC_CMDREG);
-               }
-#endif
-       }
-
-       rcrval = RCREG_BRD | RCREG_LB_NONE;
-
-       /* if still multicast addresses left or ALLMULTI is set, set the multicast
-          enable bit */
-
-       if ((dev->flags & IFF_ALLMULTI) || netdev_mc_count(dev) > camcnt)
-               rcrval |= RCREG_AMC;
-
-       /* promiscuous mode ? */
-
-       if (dev->flags & IFF_PROMISC)
-               rcrval |= RCREG_PRO;
-
-       /* program receive mode */
-
-       outw(rcrval, dev->base_addr + SONIC_RCREG);
-#ifdef DEBUG
-       printk("\nRCRVAL: %04x\n", rcrval);
-#endif
-
-       /* set up descriptors in shared memory + feed them into SONIC registers */
-
-       InitDscrs(dev);
-       if (!InitSONIC(dev))
-               return;
-
-       /* reset all pending interrupts */
-
-       outw(0xffff, dev->base_addr + SONIC_ISREG);
-
-       /* enable transmitter + receiver interrupts */
-
-       outw(CMDREG_RXEN, dev->base_addr + SONIC_CMDREG);
-       outw(IMREG_PRXEN | IMREG_RBEEN | IMREG_PTXEN | IMREG_TXEREN, dev->base_addr + SONIC_IMREG);
-
-       /* turn on card interrupts */
-
-       outb(inb(dev->base_addr + BCMREG) | BCMREG_IEN, dev->base_addr + BCMREG);
-
-#ifdef DEBUG
-       printk("Register dump after initialization:\n");
-       dumpregs(dev);
-#endif
-}
-
-/* start transmission of a descriptor */
-
-static void StartTx(struct net_device *dev, int descr)
-{
-       ibmlana_priv *priv = netdev_priv(dev);
-       int addr;
-
-       addr = priv->tdastart + (descr * sizeof(tda_t));
-
-       /* put descriptor address into SONIC */
-
-       outw(addr, dev->base_addr + SONIC_CTDA);
-
-       /* trigger transmitter */
-
-       priv->currtxdescr = descr;
-       outw(CMDREG_TXP, dev->base_addr + SONIC_CMDREG);
-}
-
-/* ------------------------------------------------------------------------
- * interrupt handler(s)
- * ------------------------------------------------------------------------ */
-
-/* receive buffer area exhausted */
-
-static void irqrbe_handler(struct net_device *dev)
-{
-       ibmlana_priv *priv = netdev_priv(dev);
-
-       /* point the SONIC back to the RRA start */
-
-       outw(priv->rrastart, dev->base_addr + SONIC_RRP);
-       outw(priv->rrastart, dev->base_addr + SONIC_RWP);
-}
-
-/* receive interrupt */
-
-static void irqrx_handler(struct net_device *dev)
-{
-       ibmlana_priv *priv = netdev_priv(dev);
-       rda_t rda;
-       u32 rdaaddr, lrdaaddr;
-
-       /* loop until ... */
-
-       while (1) {
-               /* read descriptor that was next to be filled by SONIC */
-
-               rdaaddr = priv->rdastart + (priv->nextrxdescr * sizeof(rda_t));
-               lrdaaddr = priv->rdastart + (priv->lastrxdescr * sizeof(rda_t));
-               memcpy_fromio(&rda, priv->base + rdaaddr, sizeof(rda_t));
-
-               /* iron out upper word halves of fields we use - SONIC will duplicate
-                  bits 0..15 to 16..31 */
-
-               rda.status &= 0xffff;
-               rda.length &= 0xffff;
-               rda.startlo &= 0xffff;
-
-               /* stop if the SONIC still owns it, i.e. there is no data for us */
-
-               if (rda.inuse)
-                       break;
-
-               /* good packet? */
-
-               else if (rda.status & RCREG_PRX) {
-                       struct sk_buff *skb;
-
-                       /* fetch buffer */
-
-                       skb = netdev_alloc_skb(dev, rda.length + 2);
-                       if (skb == NULL)
-                               dev->stats.rx_dropped++;
-                       else {
-                               /* copy out data */
-
-                               memcpy_fromio(skb_put(skb, rda.length),
-                                              priv->base +
-                                              rda.startlo, rda.length);
-
-                               /* set up skb fields */
-
-                               skb->protocol = eth_type_trans(skb, dev);
-                               skb_checksum_none_assert(skb);
-
-                               /* bookkeeping */
-                               dev->stats.rx_packets++;
-                               dev->stats.rx_bytes += rda.length;
-
-                               /* pass to the upper layers */
-                               netif_rx(skb);
-                       }
-               }
-
-               /* otherwise check error status bits and increase statistics */
-
-               else {
-                       dev->stats.rx_errors++;
-                       if (rda.status & RCREG_FAER)
-                               dev->stats.rx_frame_errors++;
-                       if (rda.status & RCREG_CRCR)
-                               dev->stats.rx_crc_errors++;
-               }
-
-               /* descriptor processed, will become new last descriptor in queue */
-
-               rda.link = 1;
-               rda.inuse = 1;
-               memcpy_toio(priv->base + rdaaddr, &rda,
-                            sizeof(rda_t));
-
-               /* set up link and EOL = 0 in currently last descriptor. Only write
-                  the link field since the SONIC may currently already access the
-                  other fields. */
-
-               memcpy_toio(priv->base + lrdaaddr + 20, &rdaaddr, 4);
-
-               /* advance indices */
-
-               priv->lastrxdescr = priv->nextrxdescr;
-               if ((++priv->nextrxdescr) >= priv->rxbufcnt)
-                       priv->nextrxdescr = 0;
-       }
-}
-
-/* transmit interrupt */
-
-static void irqtx_handler(struct net_device *dev)
-{
-       ibmlana_priv *priv = netdev_priv(dev);
-       tda_t tda;
-
-       /* fetch descriptor (we forgot the size ;-) */
-       memcpy_fromio(&tda, priv->base + priv->tdastart + (priv->currtxdescr * sizeof(tda_t)), sizeof(tda_t));
-
-       /* update statistics */
-       dev->stats.tx_packets++;
-       dev->stats.tx_bytes += tda.length;
-
-       /* update our pointers */
-       priv->txused[priv->currtxdescr] = 0;
-       priv->txusedcnt--;
-
-       /* if there are more descriptors present in RAM, start them */
-       if (priv->txusedcnt > 0)
-               StartTx(dev, (priv->currtxdescr + 1) % TXBUFCNT);
-
-       /* tell the upper layer we can go on transmitting */
-       netif_wake_queue(dev);
-}
-
-static void irqtxerr_handler(struct net_device *dev)
-{
-       ibmlana_priv *priv = netdev_priv(dev);
-       tda_t tda;
-
-       /* fetch descriptor to check status */
-       memcpy_fromio(&tda, priv->base + priv->tdastart + (priv->currtxdescr * sizeof(tda_t)), sizeof(tda_t));
-
-       /* update statistics */
-       dev->stats.tx_errors++;
-       if (tda.status & (TCREG_NCRS | TCREG_CRSL))
-               dev->stats.tx_carrier_errors++;
-       if (tda.status & TCREG_EXC)
-               dev->stats.tx_aborted_errors++;
-       if (tda.status & TCREG_OWC)
-               dev->stats.tx_window_errors++;
-       if (tda.status & TCREG_FU)
-               dev->stats.tx_fifo_errors++;
-
-       /* update our pointers */
-       priv->txused[priv->currtxdescr] = 0;
-       priv->txusedcnt--;
-
-       /* if there are more descriptors present in RAM, start them */
-       if (priv->txusedcnt > 0)
-               StartTx(dev, (priv->currtxdescr + 1) % TXBUFCNT);
-
-       /* tell the upper layer we can go on transmitting */
-       netif_wake_queue(dev);
-}
-
-/* general interrupt entry */
-
-static irqreturn_t irq_handler(int dummy, void *device)
-{
-       struct net_device *dev = device;
-       u16 ival;
-
-       /* in case we're not meant... */
-       if (!(inb(dev->base_addr + BCMREG) & BCMREG_IPEND))
-               return IRQ_NONE;
-
-       /* loop through the interrupt bits until everything is clear */
-       while (1) {
-               ival = inw(dev->base_addr + SONIC_ISREG);
-
-               if (ival & ISREG_RBE) {
-                       irqrbe_handler(dev);
-                       outw(ISREG_RBE, dev->base_addr + SONIC_ISREG);
-               }
-               if (ival & ISREG_PKTRX) {
-                       irqrx_handler(dev);
-                       outw(ISREG_PKTRX, dev->base_addr + SONIC_ISREG);
-               }
-               if (ival & ISREG_TXDN) {
-                       irqtx_handler(dev);
-                       outw(ISREG_TXDN, dev->base_addr + SONIC_ISREG);
-               }
-               if (ival & ISREG_TXER) {
-                       irqtxerr_handler(dev);
-                       outw(ISREG_TXER, dev->base_addr + SONIC_ISREG);
-               }
-               break;
-       }
-       return IRQ_HANDLED;
-}
-
-/* ------------------------------------------------------------------------
- * driver methods
- * ------------------------------------------------------------------------ */
-
-/* MCA info */
-
-#if 0 /* info available elsewhere, but this is kept for reference */
-static int ibmlana_getinfo(char *buf, int slot, void *d)
-{
-       int len = 0, i;
-       struct net_device *dev = (struct net_device *) d;
-       ibmlana_priv *priv;
-
-       /* can't say anything about an uninitialized device... */
-
-       if (dev == NULL)
-               return len;
-       priv = netdev_priv(dev);
-
-       /* print info */
-
-       len += sprintf(buf + len, "IRQ: %d\n", priv->realirq);
-       len += sprintf(buf + len, "I/O: %#lx\n", dev->base_addr);
-       len += sprintf(buf + len, "Memory: %#lx-%#lx\n", dev->mem_start, dev->mem_end - 1);
-       len += sprintf(buf + len, "Transceiver: %s\n", MediaNames[priv->medium]);
-       len += sprintf(buf + len, "Device: %s\n", dev->name);
-       len += sprintf(buf + len, "MAC address:");
-       for (i = 0; i < 6; i++)
-               len += sprintf(buf + len, " %02x", dev->dev_addr[i]);
-       buf[len++] = '\n';
-       buf[len] = 0;
-
-       return len;
-}
-#endif
-
-/* open driver.  Means also initialization and start of LANCE */
-
-static int ibmlana_open(struct net_device *dev)
-{
-       int result;
-       ibmlana_priv *priv = netdev_priv(dev);
-
-       /* register resources - only necessary for IRQ */
-
-       result = request_irq(priv->realirq, irq_handler, IRQF_SHARED,
-                            dev->name, dev);
-       if (result != 0) {
-               printk(KERN_ERR "%s: failed to register irq %d\n", dev->name, dev->irq);
-               return result;
-       }
-       dev->irq = priv->realirq;
-
-       /* set up the card and SONIC */
-       InitBoard(dev);
-
-       /* initialize operational flags */
-       netif_start_queue(dev);
-       return 0;
-}
-
-/* close driver.  Shut down board and free allocated resources */
-
-static int ibmlana_close(struct net_device *dev)
-{
-       /* turn off board */
-
-       /* release resources */
-       if (dev->irq != 0)
-               free_irq(dev->irq, dev);
-       dev->irq = 0;
-       return 0;
-}
-
-/* transmit a block. */
-
-static netdev_tx_t ibmlana_tx(struct sk_buff *skb, struct net_device *dev)
-{
-       ibmlana_priv *priv = netdev_priv(dev);
-       int tmplen, addr;
-       unsigned long flags;
-       tda_t tda;
-       int baddr;
-
-       /* find out if there are free slots for a frame to transmit. If not,
-          the upper layer is in deep desperation and we simply ignore the frame. */
-
-       if (priv->txusedcnt >= TXBUFCNT) {
-               dev->stats.tx_dropped++;
-               goto tx_done;
-       }
-
-       /* copy the frame data into the next free transmit buffer - fillup missing */
-       tmplen = skb->len;
-       if (tmplen < 60)
-               tmplen = 60;
-       baddr = priv->txbufstart + (priv->nexttxdescr * PKTSIZE);
-       memcpy_toio(priv->base + baddr, skb->data, skb->len);
-
-       /* copy filler into RAM - in case we're filling up...
-          we're filling a bit more than necessary, but that doesn't harm
-          since the buffer is far larger...
-          Sorry Linus for the filler string but I couldn't resist ;-) */
-
-       if (tmplen > skb->len) {
-               char *fill = "NetBSD is a nice OS too! ";
-               unsigned int destoffs = skb->len, l = strlen(fill);
-
-               while (destoffs < tmplen) {
-                       memcpy_toio(priv->base + baddr + destoffs, fill, l);
-                       destoffs += l;
-               }
-       }
-
-       /* set up the new frame descriptor */
-       addr = priv->tdastart + (priv->nexttxdescr * sizeof(tda_t));
-       memcpy_fromio(&tda, priv->base + addr, sizeof(tda_t));
-       tda.length = tda.fraglength = tmplen;
-       memcpy_toio(priv->base + addr, &tda, sizeof(tda_t));
-
-       /* if there were no active descriptors, trigger the SONIC */
-       spin_lock_irqsave(&priv->lock, flags);
-
-       priv->txusedcnt++;
-       priv->txused[priv->nexttxdescr] = 1;
-
-       /* are all transmission slots used up ? */
-       if (priv->txusedcnt >= TXBUFCNT)
-               netif_stop_queue(dev);
-
-       if (priv->txusedcnt == 1)
-               StartTx(dev, priv->nexttxdescr);
-       priv->nexttxdescr = (priv->nexttxdescr + 1) % TXBUFCNT;
-
-       spin_unlock_irqrestore(&priv->lock, flags);
-tx_done:
-       dev_kfree_skb(skb);
-       return NETDEV_TX_OK;
-}
-
-/* switch receiver mode. */
-
-static void ibmlana_set_multicast_list(struct net_device *dev)
-{
-       /* first stop the SONIC... */
-       StopSONIC(dev);
-       /* ...then reinit it with the new flags */
-       InitBoard(dev);
-}
-
-/* ------------------------------------------------------------------------
- * hardware check
- * ------------------------------------------------------------------------ */
-
-static int ibmlana_irq;
-static int ibmlana_io;
-static int startslot;          /* counts through slots when probing multiple devices */
-
-static short ibmlana_adapter_ids[] __initdata = {
-       IBM_LANA_ID,
-       0x0000
-};
-
-static char *ibmlana_adapter_names[] = {
-       "IBM LAN Adapter/A",
-       NULL
-};
-
-
-static const struct net_device_ops ibmlana_netdev_ops = {
-       .ndo_open               = ibmlana_open,
-       .ndo_stop               = ibmlana_close,
-       .ndo_start_xmit         = ibmlana_tx,
-       .ndo_set_rx_mode        = ibmlana_set_multicast_list,
-       .ndo_change_mtu         = eth_change_mtu,
-       .ndo_set_mac_address    = eth_mac_addr,
-       .ndo_validate_addr      = eth_validate_addr,
-};
-
-static int ibmlana_init_one(struct device *kdev)
-{
-       struct mca_device *mdev = to_mca_device(kdev);
-       struct net_device *dev;
-       int slot = mdev->slot, z, rc;
-       int base = 0, irq = 0, iobase = 0, memlen = 0;
-       ibmlana_priv *priv;
-       ibmlana_medium medium;
-
-       dev = alloc_etherdev(sizeof(ibmlana_priv));
-       if (!dev)
-               return -ENOMEM;
-
-       dev->irq = ibmlana_irq;
-       dev->base_addr = ibmlana_io;
-
-       base = dev->mem_start;
-       irq = dev->irq;
-
-       /* deduce card addresses */
-       getaddrs(mdev, &base, &memlen, &iobase, &irq, &medium);
-
-       /* were we looking for something different ? */
-       if (dev->irq && dev->irq != irq) {
-               rc = -ENODEV;
-               goto err_out;
-       }
-       if (dev->mem_start && dev->mem_start != base) {
-               rc = -ENODEV;
-               goto err_out;
-       }
-
-       /* announce success */
-       printk(KERN_INFO "%s: IBM LAN Adapter/A found in slot %d\n", dev->name, slot + 1);
-
-       /* try to obtain I/O range */
-       if (!request_region(iobase, IBM_LANA_IORANGE, DRV_NAME)) {
-               printk(KERN_ERR "%s: cannot allocate I/O range at %#x!\n", DRV_NAME, iobase);
-               startslot = slot + 1;
-               rc = -EBUSY;
-               goto err_out;
-       }
-
-       priv = netdev_priv(dev);
-       priv->slot = slot;
-       priv->realirq = mca_device_transform_irq(mdev, irq);
-       priv->medium = medium;
-       spin_lock_init(&priv->lock);
-
-       /* set base + irq for this device (irq not allocated so far) */
-
-       dev->irq = 0;
-       dev->mem_start = base;
-       dev->mem_end = base + memlen;
-       dev->base_addr = iobase;
-
-       priv->base = ioremap(base, memlen);
-       if (!priv->base) {
-               printk(KERN_ERR "%s: cannot remap memory!\n", DRV_NAME);
-               startslot = slot + 1;
-               rc = -EBUSY;
-               goto err_out_reg;
-       }
-
-       mca_device_set_name(mdev, ibmlana_adapter_names[mdev->index]);
-       mca_device_set_claim(mdev, 1);
-
-       /* set methods */
-       dev->netdev_ops = &ibmlana_netdev_ops;
-       dev->flags |= IFF_MULTICAST;
-
-       /* copy out MAC address */
-
-       for (z = 0; z < ETH_ALEN; z++)
-               dev->dev_addr[z] = inb(dev->base_addr + MACADDRPROM + z);
-
-       /* print config */
-
-       printk(KERN_INFO "%s: IRQ %d, I/O %#lx, memory %#lx-%#lx, "
-              "MAC address %pM.\n",
-              dev->name, priv->realirq, dev->base_addr,
-              dev->mem_start, dev->mem_end - 1,
-              dev->dev_addr);
-       printk(KERN_INFO "%s: %s medium\n", dev->name, MediaNames[priv->medium]);
-
-       /* reset board */
-
-       ResetBoard(dev);
-
-       /* next probe will start at next slot */
-
-       startslot = slot + 1;
-
-       rc = register_netdev(dev);
-       if (rc)
-               goto err_out_claimed;
-
-       dev_set_drvdata(kdev, dev);
-       return 0;
-
-err_out_claimed:
-       mca_device_set_claim(mdev, 0);
-       iounmap(priv->base);
-err_out_reg:
-       release_region(iobase, IBM_LANA_IORANGE);
-err_out:
-       free_netdev(dev);
-       return rc;
-}
-
-static int ibmlana_remove_one(struct device *kdev)
-{
-       struct mca_device *mdev = to_mca_device(kdev);
-       struct net_device *dev = dev_get_drvdata(kdev);
-       ibmlana_priv *priv = netdev_priv(dev);
-
-       unregister_netdev(dev);
-       /*DeinitBoard(dev); */
-       release_region(dev->base_addr, IBM_LANA_IORANGE);
-       mca_device_set_claim(mdev, 0);
-       iounmap(priv->base);
-       free_netdev(dev);
-       return 0;
-}
-
-/* ------------------------------------------------------------------------
- * modularization support
- * ------------------------------------------------------------------------ */
-
-module_param_named(irq, ibmlana_irq, int, 0);
-module_param_named(io, ibmlana_io, int, 0);
-MODULE_PARM_DESC(irq, "IBM LAN/A IRQ number");
-MODULE_PARM_DESC(io, "IBM LAN/A I/O base address");
-MODULE_LICENSE("GPL");
-
-static struct mca_driver ibmlana_driver = {
-       .id_table = ibmlana_adapter_ids,
-       .driver = {
-               .name   = "ibmlana",
-               .bus    = &mca_bus_type,
-               .probe  = ibmlana_init_one,
-               .remove = ibmlana_remove_one,
-       },
-};
-
-static int __init ibmlana_init_module(void)
-{
-       return mca_register_driver(&ibmlana_driver);
-}
-
-static void __exit ibmlana_cleanup_module(void)
-{
-       mca_unregister_driver(&ibmlana_driver);
-}
-
-module_init(ibmlana_init_module);
-module_exit(ibmlana_cleanup_module);
 
+++ /dev/null
-#ifndef _IBM_LANA_INCLUDE_
-#define _IBM_LANA_INCLUDE_
-
-#ifdef _IBM_LANA_DRIVER_
-
-/* maximum packet size */
-
-#define PKTSIZE 1524
-
-/* number of transmit buffers */
-
-#define TXBUFCNT 4
-
-/* Adapter ID's */
-#define IBM_LANA_ID 0xffe0
-
-/* media enumeration - defined in a way that it fits onto the LAN/A's
-   POS registers... */
-
-typedef enum {
-       Media_10BaseT, Media_10Base5,
-       Media_Unknown, Media_10Base2, Media_Count
-} ibmlana_medium;
-
-/* private structure */
-
-typedef struct {
-       unsigned int slot;              /* MCA-Slot-#                       */
-       int realirq;                    /* memorizes actual IRQ, even when
-                                          currently not allocated          */
-       ibmlana_medium medium;          /* physical cannector               */
-       u32     tdastart, txbufstart,   /* addresses                        */
-               rrastart, rxbufstart, rdastart, rxbufcnt, txusedcnt;
-       int     nextrxdescr,            /* next rx descriptor to be used    */
-               lastrxdescr,            /* last free rx descriptor          */
-               nexttxdescr,            /* last tx descriptor to be used    */
-               currtxdescr,            /* tx descriptor currently tx'ed    */
-               txused[TXBUFCNT];       /* busy flags                       */
-       void __iomem *base;
-       spinlock_t lock;
-} ibmlana_priv;
-
-/* this card uses quite a lot of I/O ports...luckily the MCA bus decodes
-   a full 64K I/O range... */
-
-#define IBM_LANA_IORANGE 0xa0
-
-/* Command Register: */
-
-#define SONIC_CMDREG     0x00
-#define CMDREG_HTX       0x0001        /* halt transmission                */
-#define CMDREG_TXP       0x0002        /* start transmission               */
-#define CMDREG_RXDIS     0x0004        /* disable receiver                 */
-#define CMDREG_RXEN      0x0008        /* enable receiver                  */
-#define CMDREG_STP       0x0010        /* stop timer                       */
-#define CMDREG_ST        0x0020        /* start timer                      */
-#define CMDREG_RST       0x0080        /* software reset                   */
-#define CMDREG_RRRA      0x0100        /* force SONIC to read first RRA    */
-#define CMDREG_LCAM      0x0200        /* force SONIC to read CAM descrs   */
-
-/* Data Configuration Register */
-
-#define SONIC_DCREG      0x02
-#define DCREG_EXBUS      0x8000        /* Extended Bus Mode                */
-#define DCREG_LBR        0x2000        /* Latched Bus Retry                */
-#define DCREG_PO1        0x1000        /* Programmable Outputs             */
-#define DCREG_PO0        0x0800
-#define DCREG_SBUS       0x0400        /* Synchronous Bus Mode             */
-#define DCREG_USR1       0x0200        /* User Definable Pins              */
-#define DCREG_USR0       0x0100
-#define DCREG_WC0        0x0000        /* 0..3 Wait States                 */
-#define DCREG_WC1        0x0040
-#define DCREG_WC2        0x0080
-#define DCREG_WC3        0x00c0
-#define DCREG_DW16       0x0000        /* 16 bit Bus Mode                  */
-#define DCREG_DW32       0x0020        /* 32 bit Bus Mode                  */
-#define DCREG_BMS        0x0010        /* Block Mode Select                */
-#define DCREG_RFT4       0x0000        /* 4/8/16/24 bytes RX  Threshold    */
-#define DCREG_RFT8       0x0004
-#define DCREG_RFT16      0x0008
-#define DCREG_RFT24      0x000c
-#define DCREG_TFT8       0x0000        /* 8/16/24/28 bytes TX Threshold    */
-#define DCREG_TFT16      0x0001
-#define DCREG_TFT24      0x0002
-#define DCREG_TFT28      0x0003
-
-/* Receive Control Register */
-
-#define SONIC_RCREG      0x04
-#define RCREG_ERR        0x8000        /* accept damaged and collided pkts */
-#define RCREG_RNT        0x4000        /* accept packets that are < 64     */
-#define RCREG_BRD        0x2000        /* accept broadcasts                */
-#define RCREG_PRO        0x1000        /* promiscuous mode                  */
-#define RCREG_AMC        0x0800        /* accept all multicasts            */
-#define RCREG_LB_NONE    0x0000        /* no loopback                      */
-#define RCREG_LB_MAC     0x0200        /* MAC loopback                     */
-#define RCREG_LB_ENDEC   0x0400        /* ENDEC loopback                   */
-#define RCREG_LB_XVR     0x0600        /* Transceiver loopback             */
-#define RCREG_MC         0x0100        /* Multicast received               */
-#define RCREG_BC         0x0080        /* Broadcast received               */
-#define RCREG_LPKT       0x0040        /* last packet in RBA               */
-#define RCREG_CRS        0x0020        /* carrier sense present            */
-#define RCREG_COL        0x0010        /* recv'd packet with collision     */
-#define RCREG_CRCR       0x0008        /* recv'd packet with CRC error     */
-#define RCREG_FAER       0x0004        /* recv'd packet with inv. framing  */
-#define RCREG_LBK        0x0002        /* recv'd loopback packet           */
-#define RCREG_PRX        0x0001        /* recv'd packet is OK              */
-
-/* Transmit Control Register */
-
-#define SONIC_TCREG      0x06
-#define TCREG_PINT       0x8000        /* generate interrupt after TDA read */
-#define TCREG_POWC       0x4000        /* timer start out of window detect */
-#define TCREG_CRCI       0x2000        /* inhibit CRC generation           */
-#define TCREG_EXDIS      0x1000        /* disable excessive deferral timer */
-#define TCREG_EXD        0x0400        /* excessive deferral occurred       */
-#define TCREG_DEF        0x0200        /* single deferral occurred          */
-#define TCREG_NCRS       0x0100        /* no carrier detected              */
-#define TCREG_CRSL       0x0080        /* carrier lost                     */
-#define TCREG_EXC        0x0040        /* excessive collisions occurred     */
-#define TCREG_OWC        0x0020        /* out of window collision occurred  */
-#define TCREG_PMB        0x0008        /* packet monitored bad             */
-#define TCREG_FU         0x0004        /* FIFO underrun                    */
-#define TCREG_BCM        0x0002        /* byte count mismatch of fragments */
-#define TCREG_PTX        0x0001        /* packet transmitted OK            */
-
-/* Interrupt Mask Register */
-
-#define SONIC_IMREG      0x08
-#define IMREG_BREN       0x4000        /* interrupt when bus retry occurred */
-#define IMREG_HBLEN      0x2000        /* interrupt when heartbeat lost    */
-#define IMREG_LCDEN      0x1000        /* interrupt when CAM loaded        */
-#define IMREG_PINTEN     0x0800        /* interrupt when PINT in TDA set   */
-#define IMREG_PRXEN      0x0400        /* interrupt when packet received   */
-#define IMREG_PTXEN      0x0200        /* interrupt when packet was sent   */
-#define IMREG_TXEREN     0x0100        /* interrupt when send failed       */
-#define IMREG_TCEN       0x0080        /* interrupt when timer completed   */
-#define IMREG_RDEEN      0x0040        /* interrupt when RDA exhausted     */
-#define IMREG_RBEEN      0x0020        /* interrupt when RBA exhausted     */
-#define IMREG_RBAEEN     0x0010        /* interrupt when RBA too short     */
-#define IMREG_CRCEN      0x0008        /* interrupt when CRC counter rolls */
-#define IMREG_FAEEN      0x0004        /* interrupt when FAE counter rolls */
-#define IMREG_MPEN       0x0002        /* interrupt when MP counter rolls  */
-#define IMREG_RFOEN      0x0001        /* interrupt when Rx FIFO overflows */
-
-/* Interrupt Status Register */
-
-#define SONIC_ISREG      0x0a
-#define ISREG_BR         0x4000        /* bus retry occurred                */
-#define ISREG_HBL        0x2000        /* heartbeat lost                   */
-#define ISREG_LCD        0x1000        /* CAM loaded                       */
-#define ISREG_PINT       0x0800        /* PINT in TDA set                  */
-#define ISREG_PKTRX      0x0400        /* packet received                  */
-#define ISREG_TXDN       0x0200        /* packet was sent                  */
-#define ISREG_TXER       0x0100        /* send failed                      */
-#define ISREG_TC         0x0080        /* timer completed                  */
-#define ISREG_RDE        0x0040        /* RDA exhausted                    */
-#define ISREG_RBE        0x0020        /* RBA exhausted                    */
-#define ISREG_RBAE       0x0010        /* RBA too short for received frame */
-#define ISREG_CRC        0x0008        /* CRC counter rolls over           */
-#define ISREG_FAE        0x0004        /* FAE counter rolls over           */
-#define ISREG_MP         0x0002        /* MP counter rolls  over           */
-#define ISREG_RFO        0x0001        /* Rx FIFO overflows                */
-
-#define SONIC_UTDA       0x0c  /* current transmit descr address   */
-#define SONIC_CTDA       0x0e
-
-#define SONIC_URDA       0x1a  /* current receive descr address    */
-#define SONIC_CRDA       0x1c
-
-#define SONIC_CRBA0      0x1e  /* current receive buffer address   */
-#define SONIC_CRBA1      0x20
-
-#define SONIC_RBWC0      0x22  /* word count in receive buffer     */
-#define SONIC_RBWC1      0x24
-
-#define SONIC_EOBC       0x26  /* minimum space to be free in RBA  */
-
-#define SONIC_URRA       0x28  /* upper address of CDA & Recv Area */
-
-#define SONIC_RSA        0x2a  /* start of receive resource area   */
-
-#define SONIC_REA        0x2c  /* end of receive resource area     */
-
-#define SONIC_RRP        0x2e  /* resource read pointer            */
-
-#define SONIC_RWP        0x30  /* resource write pointer           */
-
-#define SONIC_CAMEPTR    0x42  /* CAM entry pointer                */
-
-#define SONIC_CAMADDR2   0x44  /* CAM address ports                */
-#define SONIC_CAMADDR1   0x46
-#define SONIC_CAMADDR0   0x48
-
-#define SONIC_CAMPTR     0x4c  /* lower address of CDA             */
-
-#define SONIC_CAMCNT     0x4e  /* # of CAM descriptors to load     */
-
-/* Data Configuration Register 2    */
-
-#define SONIC_DCREG2     0x7e
-#define DCREG2_EXPO3     0x8000        /* extended programmable outputs    */
-#define DCREG2_EXPO2     0x4000
-#define DCREG2_EXPO1     0x2000
-#define DCREG2_EXPO0     0x1000
-#define DCREG2_HD        0x0800        /* heartbeat disable                */
-#define DCREG2_JD        0x0200        /* jabber timer disable             */
-#define DCREG2_AUTO      0x0100        /* enable AUI/TP auto selection     */
-#define DCREG2_XWRAP     0x0040        /* TP transceiver loopback          */
-#define DCREG2_PH        0x0010        /* HOLD request timing              */
-#define DCREG2_PCM       0x0004        /* packet compress when matched     */
-#define DCREG2_PCNM      0x0002        /* packet compress when not matched */
-#define DCREG2_RJCM      0x0001        /* inverse packet match via CAM     */
-
-/* Board Control Register: Enable RAM, Interrupts... */
-
-#define BCMREG           0x80
-#define BCMREG_RAMEN     0x80  /* switch over to RAM               */
-#define BCMREG_IPEND     0x40  /* interrupt pending ?              */
-#define BCMREG_RESET     0x08  /* reset board                      */
-#define BCMREG_16BIT     0x04  /* adapter in 16-bit slot           */
-#define BCMREG_RAMWIN    0x02  /* enable RAM window                */
-#define BCMREG_IEN       0x01  /* interrupt enable                 */
-
-/* MAC Address PROM */
-
-#define MACADDRPROM      0x92
-
-/* structure of a CAM entry */
-
-typedef struct {
-       u32 index;              /* pointer into CAM area            */
-       u32 addr0;              /* address part (bits 0..15 used)   */
-       u32 addr1;
-       u32 addr2;
-} camentry_t;
-
-/* structure of a receive resource */
-
-typedef struct {
-       u32 startlo;            /* start address (bits 0..15 used)  */
-       u32 starthi;
-       u32 cntlo;              /* size in 16-bit quantities        */
-       u32 cnthi;
-} rra_t;
-
-/* structure of a receive descriptor */
-
-typedef struct {
-       u32 status;             /* packet status                    */
-       u32 length;             /* length in bytes                  */
-       u32 startlo;            /* start address                    */
-       u32 starthi;
-       u32 seqno;              /* frame sequence                   */
-       u32 link;               /* pointer to next descriptor       */
-       /* bit 0 = EOL                      */
-       u32 inuse;              /* !=0 --> free for SONIC to write  */
-} rda_t;
-
-/* structure of a transmit descriptor */
-
-typedef struct {
-       u32 status;             /* transmit status                  */
-       u32 config;             /* value for TCR                    */
-       u32 length;             /* total length                     */
-       u32 fragcount;          /* number of fragments              */
-       u32 startlo;            /* start address of fragment        */
-       u32 starthi;
-       u32 fraglength;         /* length of this fragment          */
-       /* more address/length triplets may */
-       /* follow here                      */
-       u32 link;               /* pointer to next descriptor       */
-       /* bit 0 = EOL                      */
-} tda_t;
-
-#endif                         /* _IBM_LANA_DRIVER_ */
-
-#endif /* _IBM_LANA_INCLUDE_ */