]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drivers/net: delete the really obsolete 8390 based 10Mbit ISA drivers
authorPaul Gortmaker <paul.gortmaker@windriver.com>
Tue, 15 Jan 2013 01:32:46 +0000 (20:32 -0500)
committerPaul Gortmaker <paul.gortmaker@windriver.com>
Tue, 22 Jan 2013 15:39:54 +0000 (10:39 -0500)
This is an area I know all too well, after being author of several 8390
drivers, and maintainer of all 8390 drivers during a large part of their
active lifecycle.

To that end, I can say this with a reasonable degree of confidence.
The drivers deleted here represent the earliest (as in early 1990)
hardware and/or rare hardware.  The remaining hardware not deleted
here is the more modern/sane of the lot, with ISA-PnP and jumperless
"soft configuration" like the wd and smc cards had.

The original ne2000 driver (ne.c) gets a pass at this time since
AT/LANTIC based cards that could be both ne2000 or wd-like (with
shared memory) and with jumperless configuration were made in the
mid to late 1990's, and performed reasonably well for their era.

Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
drivers/net/Space.c
drivers/net/ethernet/8390/3c503.c [deleted file]
drivers/net/ethernet/8390/3c503.h [deleted file]
drivers/net/ethernet/8390/Kconfig
drivers/net/ethernet/8390/Makefile
drivers/net/ethernet/8390/e2100.c [deleted file]
drivers/net/ethernet/8390/hp-plus.c [deleted file]
drivers/net/ethernet/8390/hp.c [deleted file]

index 15de20bed4fc3282012fde7e4191e14fd411ac9c..393b0176c13178e80cf226a176aaac45ba82daf4 100644 (file)
 extern struct net_device *hp100_probe(int unit);
 extern struct net_device *ultra_probe(int unit);
 extern struct net_device *wd_probe(int unit);
-extern struct net_device *el2_probe(int unit);
 extern struct net_device *ne_probe(int unit);
-extern struct net_device *hp_probe(int unit);
-extern struct net_device *hp_plus_probe(int unit);
 extern struct net_device *fmv18x_probe(int unit);
 extern struct net_device *i82596_probe(int unit);
 extern struct net_device *ewrk3_probe(int unit);
-extern struct net_device *e2100_probe(int unit);
 extern struct net_device *ni65_probe(int unit);
 extern struct net_device *sonic_probe(int unit);
 extern struct net_device *seeq8005_probe(int unit);
@@ -108,18 +104,6 @@ static struct devprobe2 isa_probes[] __initdata = {
 #ifdef CONFIG_WD80x3
        {wd_probe, 0},
 #endif
-#ifdef CONFIG_EL2              /* 3c503 */
-       {el2_probe, 0},
-#endif
-#ifdef CONFIG_HPLAN
-       {hp_probe, 0},
-#endif
-#ifdef CONFIG_HPLAN_PLUS
-       {hp_plus_probe, 0},
-#endif
-#ifdef CONFIG_E2100            /* Cabletron E21xx series. */
-       {e2100_probe, 0},
-#endif
 #if defined(CONFIG_NE2000) || \
     defined(CONFIG_NE_H8300)  /* ISA (use ne2k-pci for PCI cards) */
        {ne_probe, 0},
diff --git a/drivers/net/ethernet/8390/3c503.c b/drivers/net/ethernet/8390/3c503.c
deleted file mode 100644 (file)
index 0e9afe7..0000000
+++ /dev/null
@@ -1,778 +0,0 @@
-/* 3c503.c: A shared-memory NS8390 ethernet driver for linux. */
-/*
-    Written 1992-94 by Donald Becker.
-
-    Copyright 1993 United States Government as represented by the
-    Director, National Security Agency.  This software may be used and
-    distributed according to the terms of the GNU General Public License,
-    incorporated herein by reference.
-
-    The author may be reached as becker@scyld.com, or C/O
-       Scyld Computing Corporation
-       410 Severn Ave., Suite 210
-       Annapolis MD 21403
-
-
-    This driver should work with the 3c503 and 3c503/16.  It should be used
-    in shared memory mode for best performance, although it may also work
-    in programmed-I/O mode.
-
-    Sources:
-    EtherLink II Technical Reference Manual,
-    EtherLink II/16 Technical Reference Manual Supplement,
-    3Com Corporation, 5400 Bayfront Plaza, Santa Clara CA 95052-8145
-
-    The Crynwr 3c503 packet driver.
-
-    Changelog:
-
-    Paul Gortmaker     : add support for the 2nd 8kB of RAM on 16 bit cards.
-    Paul Gortmaker     : multiple card support for module users.
-    rjohnson@analogic.com : Fix up PIO interface for efficient operation.
-    Jeff Garzik                : ethtool support
-
-*/
-
-#define DRV_NAME       "3c503"
-#define DRV_VERSION    "1.10a"
-#define DRV_RELDATE    "11/17/2001"
-
-
-static const char version[] =
-    DRV_NAME ".c:v" DRV_VERSION " " DRV_RELDATE "  Donald Becker (becker@scyld.com)\n";
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/delay.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/ethtool.h>
-
-#include <asm/uaccess.h>
-#include <asm/io.h>
-#include <asm/byteorder.h>
-
-#include "8390.h"
-#include "3c503.h"
-#define WRD_COUNT 4
-
-static int el2_pio_probe(struct net_device *dev);
-static int el2_probe1(struct net_device *dev, int ioaddr);
-
-/* A zero-terminated list of I/O addresses to be probed in PIO mode. */
-static unsigned int netcard_portlist[] __initdata =
-       { 0x300,0x310,0x330,0x350,0x250,0x280,0x2a0,0x2e0,0};
-
-#define EL2_IO_EXTENT  16
-
-static int el2_open(struct net_device *dev);
-static int el2_close(struct net_device *dev);
-static void el2_reset_8390(struct net_device *dev);
-static void el2_init_card(struct net_device *dev);
-static void el2_block_output(struct net_device *dev, int count,
-                            const unsigned char *buf, int start_page);
-static void el2_block_input(struct net_device *dev, int count, struct sk_buff *skb,
-                          int ring_offset);
-static void el2_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr,
-                        int ring_page);
-static const struct ethtool_ops netdev_ethtool_ops;
-
-
-/* This routine probes for a memory-mapped 3c503 board by looking for
-   the "location register" at the end of the jumpered boot PROM space.
-   This works even if a PROM isn't there.
-
-   If the ethercard isn't found there is an optional probe for
-   ethercard jumpered to programmed-I/O mode.
-   */
-static int __init do_el2_probe(struct net_device *dev)
-{
-    int *addr, addrs[] = { 0xddffe, 0xd9ffe, 0xcdffe, 0xc9ffe, 0};
-    int base_addr = dev->base_addr;
-    int irq = dev->irq;
-
-    if (base_addr > 0x1ff)     /* Check a single specified location. */
-       return el2_probe1(dev, base_addr);
-    else if (base_addr != 0)           /* Don't probe at all. */
-       return -ENXIO;
-
-    for (addr = addrs; *addr; addr++) {
-       void __iomem *p = ioremap(*addr, 1);
-       unsigned base_bits;
-       int i;
-
-       if (!p)
-               continue;
-       base_bits = readb(p);
-       iounmap(p);
-       i = ffs(base_bits) - 1;
-       if (i == -1 || base_bits != (1 << i))
-           continue;
-       if (el2_probe1(dev, netcard_portlist[i]) == 0)
-           return 0;
-       dev->irq = irq;
-    }
-#if ! defined(no_probe_nonshared_memory)
-    return el2_pio_probe(dev);
-#else
-    return -ENODEV;
-#endif
-}
-
-/*  Try all of the locations that aren't obviously empty.  This touches
-    a lot of locations, and is much riskier than the code above. */
-static int __init
-el2_pio_probe(struct net_device *dev)
-{
-    int i;
-    int base_addr = dev->base_addr;
-    int irq = dev->irq;
-
-    if (base_addr > 0x1ff)     /* Check a single specified location. */
-       return el2_probe1(dev, base_addr);
-    else if (base_addr != 0)   /* Don't probe at all. */
-       return -ENXIO;
-
-    for (i = 0; netcard_portlist[i]; i++) {
-       if (el2_probe1(dev, netcard_portlist[i]) == 0)
-           return 0;
-       dev->irq = irq;
-    }
-
-    return -ENODEV;
-}
-
-#ifndef MODULE
-struct net_device * __init el2_probe(int unit)
-{
-       struct net_device *dev = alloc_eip_netdev();
-       int err;
-
-       if (!dev)
-               return ERR_PTR(-ENOMEM);
-
-       sprintf(dev->name, "eth%d", unit);
-       netdev_boot_setup_check(dev);
-
-       err = do_el2_probe(dev);
-       if (err)
-               goto out;
-       return dev;
-out:
-       free_netdev(dev);
-       return ERR_PTR(err);
-}
-#endif
-
-static const struct net_device_ops el2_netdev_ops = {
-       .ndo_open               = el2_open,
-       .ndo_stop               = el2_close,
-
-       .ndo_start_xmit         = eip_start_xmit,
-       .ndo_tx_timeout         = eip_tx_timeout,
-       .ndo_get_stats          = eip_get_stats,
-       .ndo_set_rx_mode        = eip_set_multicast_list,
-       .ndo_validate_addr      = eth_validate_addr,
-       .ndo_set_mac_address    = eth_mac_addr,
-       .ndo_change_mtu         = eth_change_mtu,
-#ifdef CONFIG_NET_POLL_CONTROLLER
-       .ndo_poll_controller    = eip_poll,
-#endif
-};
-
-/* Probe for the Etherlink II card at I/O port base IOADDR,
-   returning non-zero on success.  If found, set the station
-   address and memory parameters in DEVICE. */
-static int __init
-el2_probe1(struct net_device *dev, int ioaddr)
-{
-    int i, iobase_reg, membase_reg, saved_406, wordlength, retval;
-    static unsigned version_printed;
-    unsigned long vendor_id;
-
-    if (!request_region(ioaddr, EL2_IO_EXTENT, DRV_NAME))
-       return -EBUSY;
-
-    if (!request_region(ioaddr + 0x400, 8, DRV_NAME)) {
-       retval = -EBUSY;
-       goto out;
-    }
-
-    /* Reset and/or avoid any lurking NE2000 */
-    if (inb(ioaddr + 0x408) == 0xff) {
-       mdelay(1);
-       retval = -ENODEV;
-       goto out1;
-    }
-
-    /* We verify that it's a 3C503 board by checking the first three octets
-       of its ethernet address. */
-    iobase_reg = inb(ioaddr+0x403);
-    membase_reg = inb(ioaddr+0x404);
-    /* ASIC location registers should be 0 or have only a single bit set. */
-    if ((iobase_reg  & (iobase_reg - 1)) ||
-       (membase_reg & (membase_reg - 1))) {
-       retval = -ENODEV;
-       goto out1;
-    }
-    saved_406 = inb_p(ioaddr + 0x406);
-    outb_p(ECNTRL_RESET|ECNTRL_THIN, ioaddr + 0x406); /* Reset it... */
-    outb_p(ECNTRL_THIN, ioaddr + 0x406);
-    /* Map the station addr PROM into the lower I/O ports. We now check
-       for both the old and new 3Com prefix */
-    outb(ECNTRL_SAPROM|ECNTRL_THIN, ioaddr + 0x406);
-    vendor_id = inb(ioaddr)*0x10000 + inb(ioaddr + 1)*0x100 + inb(ioaddr + 2);
-    if ((vendor_id != OLD_3COM_ID) && (vendor_id != NEW_3COM_ID)) {
-       /* Restore the register we frobbed. */
-       outb(saved_406, ioaddr + 0x406);
-       retval = -ENODEV;
-       goto out1;
-    }
-
-    if (ei_debug  &&  version_printed++ == 0)
-       pr_debug("%s", version);
-
-    dev->base_addr = ioaddr;
-
-    pr_info("%s: 3c503 at i/o base %#3x, node ", dev->name, ioaddr);
-
-    /* Retrieve and print the ethernet address. */
-    for (i = 0; i < 6; i++)
-       dev->dev_addr[i] = inb(ioaddr + i);
-    pr_cont("%pM", dev->dev_addr);
-
-    /* Map the 8390 back into the window. */
-    outb(ECNTRL_THIN, ioaddr + 0x406);
-
-    /* Check for EL2/16 as described in tech. man. */
-    outb_p(E8390_PAGE0, ioaddr + E8390_CMD);
-    outb_p(0, ioaddr + EN0_DCFG);
-    outb_p(E8390_PAGE2, ioaddr + E8390_CMD);
-    wordlength = inb_p(ioaddr + EN0_DCFG) & ENDCFG_WTS;
-    outb_p(E8390_PAGE0, ioaddr + E8390_CMD);
-
-    /* Probe for, turn on and clear the board's shared memory. */
-    if (ei_debug > 2)
-       pr_cont(" memory jumpers %2.2x ", membase_reg);
-    outb(EGACFR_NORM, ioaddr + 0x405); /* Enable RAM */
-
-    /* This should be probed for (or set via an ioctl()) at run-time.
-       Right now we use a sleazy hack to pass in the interface number
-       at boot-time via the low bits of the mem_end field.  That value is
-       unused, and the low bits would be discarded even if it was used. */
-#if defined(EI8390_THICK) || defined(EL2_AUI)
-    ei_status.interface_num = 1;
-#else
-    ei_status.interface_num = dev->mem_end & 0xf;
-#endif
-    pr_cont(", using %sternal xcvr.\n", ei_status.interface_num == 0 ? "in" : "ex");
-
-    if ((membase_reg & 0xf0) == 0) {
-       dev->mem_start = 0;
-       ei_status.name = "3c503-PIO";
-       ei_status.mem = NULL;
-    } else {
-       dev->mem_start = ((membase_reg & 0xc0) ? 0xD8000 : 0xC8000) +
-           ((membase_reg & 0xA0) ? 0x4000 : 0);
-#define EL2_MEMSIZE (EL2_MB1_STOP_PG - EL2_MB1_START_PG)*256
-       ei_status.mem = ioremap(dev->mem_start, EL2_MEMSIZE);
-
-#ifdef EL2MEMTEST
-       /* This has never found an error, but someone might care.
-          Note that it only tests the 2nd 8kB on 16kB 3c503/16
-          cards between card addr. 0x2000 and 0x3fff. */
-       {                       /* Check the card's memory. */
-           void __iomem *mem_base = ei_status.mem;
-           unsigned int test_val = 0xbbadf00d;
-           writel(0xba5eba5e, mem_base);
-           for (i = sizeof(test_val); i < EL2_MEMSIZE; i+=sizeof(test_val)) {
-               writel(test_val, mem_base + i);
-               if (readl(mem_base) != 0xba5eba5e ||
-                   readl(mem_base + i) != test_val) {
-                   pr_warning("3c503: memory failure or memory address conflict.\n");
-                   dev->mem_start = 0;
-                   ei_status.name = "3c503-PIO";
-                   iounmap(mem_base);
-                   ei_status.mem = NULL;
-                   break;
-               }
-               test_val += 0x55555555;
-               writel(0, mem_base + i);
-           }
-       }
-#endif  /* EL2MEMTEST */
-
-       if (dev->mem_start)
-               dev->mem_end = dev->mem_start + EL2_MEMSIZE;
-
-       if (wordlength) {       /* No Tx pages to skip over to get to Rx */
-               ei_status.priv = 0;
-               ei_status.name = "3c503/16";
-       } else {
-               ei_status.priv = TX_PAGES * 256;
-               ei_status.name = "3c503";
-       }
-    }
-
-    /*
-       Divide up the memory on the card. This is the same regardless of
-       whether shared-mem or PIO is used. For 16 bit cards (16kB RAM),
-       we use the entire 8k of bank1 for an Rx ring. We only use 3k
-       of the bank0 for 2 full size Tx packet slots. For 8 bit cards,
-       (8kB RAM) we use 3kB of bank1 for two Tx slots, and the remaining
-       5kB for an Rx ring.  */
-
-    if (wordlength) {
-       ei_status.tx_start_page = EL2_MB0_START_PG;
-       ei_status.rx_start_page = EL2_MB1_START_PG;
-    } else {
-       ei_status.tx_start_page = EL2_MB1_START_PG;
-       ei_status.rx_start_page = EL2_MB1_START_PG + TX_PAGES;
-    }
-
-    /* Finish setting the board's parameters. */
-    ei_status.stop_page = EL2_MB1_STOP_PG;
-    ei_status.word16 = wordlength;
-    ei_status.reset_8390 = el2_reset_8390;
-    ei_status.get_8390_hdr = el2_get_8390_hdr;
-    ei_status.block_input = el2_block_input;
-    ei_status.block_output = el2_block_output;
-
-    if (dev->irq == 2)
-       dev->irq = 9;
-    else if (dev->irq > 5 && dev->irq != 9) {
-       pr_warning("3c503: configured interrupt %d invalid, will use autoIRQ.\n",
-              dev->irq);
-       dev->irq = 0;
-    }
-
-    ei_status.saved_irq = dev->irq;
-
-    dev->netdev_ops = &el2_netdev_ops;
-    dev->ethtool_ops = &netdev_ethtool_ops;
-
-    retval = register_netdev(dev);
-    if (retval)
-       goto out1;
-
-    if (dev->mem_start)
-       pr_info("%s: %s - %dkB RAM, 8kB shared mem window at %#6lx-%#6lx.\n",
-               dev->name, ei_status.name, (wordlength+1)<<3,
-               dev->mem_start, dev->mem_end-1);
-
-    else
-    {
-       ei_status.tx_start_page = EL2_MB1_START_PG;
-       ei_status.rx_start_page = EL2_MB1_START_PG + TX_PAGES;
-       pr_info("%s: %s, %dkB RAM, using programmed I/O (REJUMPER for SHARED MEMORY).\n",
-              dev->name, ei_status.name, (wordlength+1)<<3);
-    }
-    release_region(ioaddr + 0x400, 8);
-    return 0;
-out1:
-    release_region(ioaddr + 0x400, 8);
-out:
-    release_region(ioaddr, EL2_IO_EXTENT);
-    return retval;
-}
-
-static irqreturn_t el2_probe_interrupt(int irq, void *seen)
-{
-       *(bool *)seen = true;
-       return IRQ_HANDLED;
-}
-
-static int
-el2_open(struct net_device *dev)
-{
-    int retval;
-
-    if (dev->irq < 2) {
-       static const int irqlist[] = {5, 9, 3, 4, 0};
-       const int *irqp = irqlist;
-
-       outb(EGACFR_NORM, E33G_GACFR);  /* Enable RAM and interrupts. */
-       do {
-               bool seen;
-
-               retval = request_irq(*irqp, el2_probe_interrupt, 0,
-                                    dev->name, &seen);
-               if (retval == -EBUSY)
-                       continue;
-               if (retval < 0)
-                       goto err_disable;
-
-               /* Twinkle the interrupt, and check if it's seen. */
-               seen = false;
-               smp_wmb();
-               outb_p(0x04 << ((*irqp == 9) ? 2 : *irqp), E33G_IDCFR);
-               outb_p(0x00, E33G_IDCFR);
-               msleep(1);
-               free_irq(*irqp, &seen);
-               if (!seen)
-                       continue;
-
-               retval = request_irq(dev->irq = *irqp, eip_interrupt, 0,
-                                    dev->name, dev);
-               if (retval == -EBUSY)
-                       continue;
-               if (retval < 0)
-                       goto err_disable;
-               break;
-       } while (*++irqp);
-
-       if (*irqp == 0) {
-       err_disable:
-           outb(EGACFR_IRQOFF, E33G_GACFR);    /* disable interrupts. */
-           return -EAGAIN;
-       }
-    } else {
-       if ((retval = request_irq(dev->irq, eip_interrupt, 0, dev->name, dev))) {
-           return retval;
-       }
-    }
-
-    el2_init_card(dev);
-    eip_open(dev);
-    return 0;
-}
-
-static int
-el2_close(struct net_device *dev)
-{
-    free_irq(dev->irq, dev);
-    dev->irq = ei_status.saved_irq;
-    outb(EGACFR_IRQOFF, E33G_GACFR);   /* disable interrupts. */
-
-    eip_close(dev);
-    return 0;
-}
-
-/* This is called whenever we have a unrecoverable failure:
-       transmit timeout
-       Bad ring buffer packet header
- */
-static void
-el2_reset_8390(struct net_device *dev)
-{
-    if (ei_debug > 1) {
-       pr_debug("%s: Resetting the 3c503 board...", dev->name);
-       pr_cont(" %#lx=%#02x %#lx=%#02x %#lx=%#02x...", E33G_IDCFR, inb(E33G_IDCFR),
-              E33G_CNTRL, inb(E33G_CNTRL), E33G_GACFR, inb(E33G_GACFR));
-    }
-    outb_p(ECNTRL_RESET|ECNTRL_THIN, E33G_CNTRL);
-    ei_status.txing = 0;
-    outb_p(ei_status.interface_num==0 ? ECNTRL_THIN : ECNTRL_AUI, E33G_CNTRL);
-    el2_init_card(dev);
-    if (ei_debug > 1)
-       pr_cont("done\n");
-}
-
-/* Initialize the 3c503 GA registers after a reset. */
-static void
-el2_init_card(struct net_device *dev)
-{
-    /* Unmap the station PROM and select the DIX or BNC connector. */
-    outb_p(ei_status.interface_num==0 ? ECNTRL_THIN : ECNTRL_AUI, E33G_CNTRL);
-
-    /* Set ASIC copy of rx's first and last+1 buffer pages */
-    /* These must be the same as in the 8390. */
-    outb(ei_status.rx_start_page, E33G_STARTPG);
-    outb(ei_status.stop_page,  E33G_STOPPG);
-
-    /* Point the vector pointer registers somewhere ?harmless?. */
-    outb(0xff, E33G_VP2);      /* Point at the ROM restart location 0xffff0 */
-    outb(0xff, E33G_VP1);
-    outb(0x00, E33G_VP0);
-    /* Turn off all interrupts until we're opened. */
-    outb_p(0x00,  dev->base_addr + EN0_IMR);
-    /* Enable IRQs iff started. */
-    outb(EGACFR_NORM, E33G_GACFR);
-
-    /* Set the interrupt line. */
-    outb_p((0x04 << (dev->irq == 9 ? 2 : dev->irq)), E33G_IDCFR);
-    outb_p((WRD_COUNT << 1), E33G_DRQCNT);     /* Set burst size to 8 */
-    outb_p(0x20, E33G_DMAAH);  /* Put a valid addr in the GA DMA */
-    outb_p(0x00, E33G_DMAAL);
-    return;                    /* We always succeed */
-}
-
-/*
- * Either use the shared memory (if enabled on the board) or put the packet
- * out through the ASIC FIFO.
- */
-static void
-el2_block_output(struct net_device *dev, int count,
-                const unsigned char *buf, int start_page)
-{
-    unsigned short int *wrd;
-    int boguscount;            /* timeout counter */
-    unsigned short word;       /* temporary for better machine code */
-    void __iomem *base = ei_status.mem;
-
-    if (ei_status.word16)      /* Tx packets go into bank 0 on EL2/16 card */
-       outb(EGACFR_RSEL|EGACFR_TCM, E33G_GACFR);
-    else
-       outb(EGACFR_NORM, E33G_GACFR);
-
-    if (base) {        /* Shared memory transfer */
-       memcpy_toio(base + ((start_page - ei_status.tx_start_page) << 8),
-                       buf, count);
-       outb(EGACFR_NORM, E33G_GACFR);  /* Back to bank1 in case on bank0 */
-       return;
-    }
-
-/*
- *  No shared memory, put the packet out the other way.
- *  Set up then start the internal memory transfer to Tx Start Page
- */
-
-    word = (unsigned short)start_page;
-    outb(word&0xFF, E33G_DMAAH);
-    outb(word>>8, E33G_DMAAL);
-
-    outb_p((ei_status.interface_num ? ECNTRL_AUI : ECNTRL_THIN ) | ECNTRL_OUTPUT
-          | ECNTRL_START, E33G_CNTRL);
-
-/*
- *  Here I am going to write data to the FIFO as quickly as possible.
- *  Note that E33G_FIFOH is defined incorrectly. It is really
- *  E33G_FIFOL, the lowest port address for both the byte and
- *  word write. Variable 'count' is NOT checked. Caller must supply a
- *  valid count. Note that I may write a harmless extra byte to the
- *  8390 if the byte-count was not even.
- */
-    wrd = (unsigned short int *) buf;
-    count  = (count + 1) >> 1;
-    for(;;)
-    {
-        boguscount = 0x1000;
-        while ((inb(E33G_STATUS) & ESTAT_DPRDY) == 0)
-        {
-            if(!boguscount--)
-            {
-                pr_notice("%s: FIFO blocked in el2_block_output.\n", dev->name);
-                el2_reset_8390(dev);
-                goto blocked;
-            }
-        }
-        if(count > WRD_COUNT)
-        {
-            outsw(E33G_FIFOH, wrd, WRD_COUNT);
-            wrd   += WRD_COUNT;
-            count -= WRD_COUNT;
-        }
-        else
-        {
-            outsw(E33G_FIFOH, wrd, count);
-            break;
-        }
-    }
-    blocked:;
-    outb_p(ei_status.interface_num==0 ? ECNTRL_THIN : ECNTRL_AUI, E33G_CNTRL);
-}
-
-/* Read the 4 byte, page aligned 8390 specific header. */
-static void
-el2_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page)
-{
-    int boguscount;
-    void __iomem *base = ei_status.mem;
-    unsigned short word;
-
-    if (base) {       /* Use the shared memory. */
-       void __iomem *hdr_start = base + ((ring_page - EL2_MB1_START_PG)<<8);
-       memcpy_fromio(hdr, hdr_start, sizeof(struct e8390_pkt_hdr));
-       hdr->count = le16_to_cpu(hdr->count);
-       return;
-    }
-
-/*
- *  No shared memory, use programmed I/O.
- */
-
-    word = (unsigned short)ring_page;
-    outb(word&0xFF, E33G_DMAAH);
-    outb(word>>8, E33G_DMAAL);
-
-    outb_p((ei_status.interface_num == 0 ? ECNTRL_THIN : ECNTRL_AUI) | ECNTRL_INPUT
-          | ECNTRL_START, E33G_CNTRL);
-    boguscount = 0x1000;
-    while ((inb(E33G_STATUS) & ESTAT_DPRDY) == 0)
-    {
-        if(!boguscount--)
-        {
-            pr_notice("%s: FIFO blocked in el2_get_8390_hdr.\n", dev->name);
-            memset(hdr, 0x00, sizeof(struct e8390_pkt_hdr));
-            el2_reset_8390(dev);
-            goto blocked;
-        }
-    }
-    insw(E33G_FIFOH, hdr, (sizeof(struct e8390_pkt_hdr))>> 1);
-    blocked:;
-    outb_p(ei_status.interface_num == 0 ? ECNTRL_THIN : ECNTRL_AUI, E33G_CNTRL);
-}
-
-
-static void
-el2_block_input(struct net_device *dev, int count, struct sk_buff *skb, int ring_offset)
-{
-    int boguscount = 0;
-    void __iomem *base = ei_status.mem;
-    unsigned short int *buf;
-    unsigned short word;
-
-    /* Maybe enable shared memory just be to be safe... nahh.*/
-    if (base) {        /* Use the shared memory. */
-       ring_offset -= (EL2_MB1_START_PG<<8);
-       if (ring_offset + count > EL2_MEMSIZE) {
-           /* We must wrap the input move. */
-           int semi_count = EL2_MEMSIZE - ring_offset;
-           memcpy_fromio(skb->data, base + ring_offset, semi_count);
-           count -= semi_count;
-           memcpy_fromio(skb->data + semi_count, base + ei_status.priv, count);
-       } else {
-               memcpy_fromio(skb->data, base + ring_offset, count);
-       }
-       return;
-    }
-
-/*
- *  No shared memory, use programmed I/O.
- */
-    word = (unsigned short) ring_offset;
-    outb(word>>8, E33G_DMAAH);
-    outb(word&0xFF, E33G_DMAAL);
-
-    outb_p((ei_status.interface_num == 0 ? ECNTRL_THIN : ECNTRL_AUI) | ECNTRL_INPUT
-          | ECNTRL_START, E33G_CNTRL);
-
-/*
- *  Here I also try to get data as fast as possible. I am betting that I
- *  can read one extra byte without clobbering anything in the kernel because
- *  this would only occur on an odd byte-count and allocation of skb->data
- *  is word-aligned. Variable 'count' is NOT checked. Caller must check
- *  for a valid count.
- *  [This is currently quite safe.... but if one day the 3c503 explodes
- *   you know where to come looking ;)]
- */
-
-    buf =  (unsigned short int *) skb->data;
-    count =  (count + 1) >> 1;
-    for(;;)
-    {
-        boguscount = 0x1000;
-        while ((inb(E33G_STATUS) & ESTAT_DPRDY) == 0)
-        {
-            if(!boguscount--)
-            {
-                pr_notice("%s: FIFO blocked in el2_block_input.\n", dev->name);
-                el2_reset_8390(dev);
-                goto blocked;
-            }
-        }
-        if(count > WRD_COUNT)
-        {
-            insw(E33G_FIFOH, buf, WRD_COUNT);
-            buf   += WRD_COUNT;
-            count -= WRD_COUNT;
-        }
-        else
-        {
-            insw(E33G_FIFOH, buf, count);
-            break;
-        }
-    }
-    blocked:;
-    outb_p(ei_status.interface_num == 0 ? ECNTRL_THIN : ECNTRL_AUI, E33G_CNTRL);
-}
-
-
-static void netdev_get_drvinfo(struct net_device *dev,
-                              struct ethtool_drvinfo *info)
-{
-       strlcpy(info->driver, DRV_NAME, sizeof(info->driver));
-       strlcpy(info->version, DRV_VERSION, sizeof(info->version));
-       snprintf(info->bus_info, sizeof(info->bus_info), "ISA 0x%lx",
-                dev->base_addr);
-}
-
-static const struct ethtool_ops netdev_ethtool_ops = {
-       .get_drvinfo            = netdev_get_drvinfo,
-};
-
-#ifdef MODULE
-#define MAX_EL2_CARDS  4       /* Max number of EL2 cards per module */
-
-static struct net_device *dev_el2[MAX_EL2_CARDS];
-static int io[MAX_EL2_CARDS];
-static int irq[MAX_EL2_CARDS];
-static int xcvr[MAX_EL2_CARDS];        /* choose int. or ext. xcvr */
-module_param_array(io, int, NULL, 0);
-module_param_array(irq, int, NULL, 0);
-module_param_array(xcvr, int, NULL, 0);
-MODULE_PARM_DESC(io, "I/O base address(es)");
-MODULE_PARM_DESC(irq, "IRQ number(s) (assigned)");
-MODULE_PARM_DESC(xcvr, "transceiver(s) (0=internal, 1=external)");
-MODULE_DESCRIPTION("3Com ISA EtherLink II, II/16 (3c503, 3c503/16) driver");
-MODULE_LICENSE("GPL");
-
-/* This is set up so that only a single autoprobe takes place per call.
-ISA device autoprobes on a running machine are not recommended. */
-int __init
-init_module(void)
-{
-       struct net_device *dev;
-       int this_dev, found = 0;
-
-       for (this_dev = 0; this_dev < MAX_EL2_CARDS; this_dev++) {
-               if (io[this_dev] == 0)  {
-                       if (this_dev != 0) break; /* only autoprobe 1st one */
-                       pr_notice("3c503.c: Presently autoprobing (not recommended) for a single card.\n");
-               }
-               dev = alloc_eip_netdev();
-               if (!dev)
-                       break;
-               dev->irq = irq[this_dev];
-               dev->base_addr = io[this_dev];
-               dev->mem_end = xcvr[this_dev];  /* low 4bits = xcvr sel. */
-               if (do_el2_probe(dev) == 0) {
-                       dev_el2[found++] = dev;
-                       continue;
-               }
-               free_netdev(dev);
-               pr_warning("3c503.c: No 3c503 card found (i/o = 0x%x).\n", io[this_dev]);
-               break;
-       }
-       if (found)
-               return 0;
-       return -ENXIO;
-}
-
-static void cleanup_card(struct net_device *dev)
-{
-       /* NB: el2_close() handles free_irq */
-       release_region(dev->base_addr, EL2_IO_EXTENT);
-       if (ei_status.mem)
-               iounmap(ei_status.mem);
-}
-
-void __exit
-cleanup_module(void)
-{
-       int this_dev;
-
-       for (this_dev = 0; this_dev < MAX_EL2_CARDS; this_dev++) {
-               struct net_device *dev = dev_el2[this_dev];
-               if (dev) {
-                       unregister_netdev(dev);
-                       cleanup_card(dev);
-                       free_netdev(dev);
-               }
-       }
-}
-#endif /* MODULE */
diff --git a/drivers/net/ethernet/8390/3c503.h b/drivers/net/ethernet/8390/3c503.h
deleted file mode 100644 (file)
index e2367b8..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-/* Definitions for the 3Com 3c503 Etherlink 2. */
-/* This file is distributed under the GPL.
-   Many of these names and comments are directly from the Crynwr packet
-   drivers, which are released under the GPL. */
-
-#define EL2H (dev->base_addr + 0x400)
-#define EL2L (dev->base_addr)
-
-/* Vendor unique hardware addr. prefix. 3Com has 2 because they ran
-   out of available addresses on the first one... */
-
-#define OLD_3COM_ID    0x02608c
-#define NEW_3COM_ID    0x0020af
-
-/* Shared memory management parameters. NB: The 8 bit cards have only
-   one bank (MB1) which serves both Tx and Rx packet space. The 16bit
-   cards have 2 banks, MB0 for Tx packets, and MB1 for Rx packets.
-   You choose which bank appears in the sh. mem window with EGACFR_MBSn */
-
-#define EL2_MB0_START_PG       (0x00)  /* EL2/16 Tx packets go in bank 0 */
-#define EL2_MB1_START_PG       (0x20)  /* First page of bank 1 */
-#define EL2_MB1_STOP_PG                (0x40)  /* Last page +1 of bank 1 */
-
-/* 3Com 3c503 ASIC registers */
-#define E33G_STARTPG   (EL2H+0)        /* Start page, matching EN0_STARTPG */
-#define E33G_STOPPG    (EL2H+1)        /* Stop page, must match EN0_STOPPG */
-#define E33G_DRQCNT    (EL2H+2)        /* DMA burst count */
-#define E33G_IOBASE    (EL2H+3)        /* Read of I/O base jumpers. */
-       /* (non-useful, but it also appears at the end of EPROM space) */
-#define E33G_ROMBASE   (EL2H+4)        /* Read of memory base jumpers. */
-#define E33G_GACFR     (EL2H+5)        /* Config/setup bits for the ASIC GA */
-#define E33G_CNTRL     (EL2H+6)        /* Board's main control register */
-#define E33G_STATUS    (EL2H+7)        /* Status on completions. */
-#define E33G_IDCFR     (EL2H+8)        /* Interrupt/DMA config register */
-                               /* (Which IRQ to assert, DMA chan to use) */
-#define E33G_DMAAH     (EL2H+9)        /* High byte of DMA address reg */
-#define E33G_DMAAL     (EL2H+10)       /* Low byte of DMA address reg */
-/* "Vector pointer" - if this address matches a read, the EPROM (rather than
-   shared RAM) is mapped into memory space. */
-#define E33G_VP2       (EL2H+11)
-#define E33G_VP1       (EL2H+12)
-#define E33G_VP0       (EL2H+13)
-#define E33G_FIFOH     (EL2H+14)       /* FIFO for programmed I/O moves */
-#define E33G_FIFOL     (EL2H+15)       /* ... low byte of above. */
-
-/* Bits in E33G_CNTRL register: */
-
-#define ECNTRL_RESET   (0x01)  /* Software reset of the ASIC and 8390 */
-#define ECNTRL_THIN    (0x02)  /* Onboard xcvr enable, AUI disable */
-#define ECNTRL_AUI     (0x00)  /* Onboard xcvr disable, AUI enable */
-#define ECNTRL_SAPROM  (0x04)  /* Map the station address prom */
-#define ECNTRL_DBLBFR  (0x20)  /* FIFO configuration bit */
-#define ECNTRL_OUTPUT  (0x40)  /* PC-to-3C503 direction if 1 */
-#define ECNTRL_INPUT   (0x00)  /* 3C503-to-PC direction if 0 */
-#define ECNTRL_START   (0x80)  /* Start the DMA logic */
-
-/* Bits in E33G_STATUS register: */
-
-#define ESTAT_DPRDY    (0x80)  /* Data port (of FIFO) ready */
-#define ESTAT_UFLW     (0x40)  /* Tried to read FIFO when it was empty */
-#define ESTAT_OFLW     (0x20)  /* Tried to write FIFO when it was full */
-#define ESTAT_DTC      (0x10)  /* Terminal Count from PC bus DMA logic */
-#define ESTAT_DIP      (0x08)  /* DMA In Progress */
-
-/* Bits in E33G_GACFR register: */
-
-#define EGACFR_NIM     (0x80)  /* NIC interrupt mask */
-#define EGACFR_TCM     (0x40)  /* DMA term. count interrupt mask */
-#define EGACFR_RSEL    (0x08)  /* Map a bank of card mem into system mem */
-#define EGACFR_MBS2    (0x04)  /* Memory bank select, bit 2. */
-#define EGACFR_MBS1    (0x02)  /* Memory bank select, bit 1. */
-#define EGACFR_MBS0    (0x01)  /* Memory bank select, bit 0. */
-
-#define EGACFR_NORM    (0x49)  /* TCM | RSEL | MBS0 */
-#define EGACFR_IRQOFF  (0xc9)  /* TCM | RSEL | MBS0 | NIM */
-
-/*
-       MBS2    MBS1    MBS0    Sh. mem windows card mem at:
-       ----    ----    ----    -----------------------------
-       0       0       0       0x0000 -- bank 0
-       0       0       1       0x2000 -- bank 1 (only choice for 8bit card)
-       0       1       0       0x4000 -- bank 2, not used
-       0       1       1       0x6000 -- bank 3, not used
-
-There was going to be a 32k card that used bank 2 and 3, but it
-never got produced.
-
-*/
-
-
-/* End of 3C503 parameter definitions */
index e49a442218003332e290f50f1a54eb8e88866c5e..1b78ca7a97868d78728bee1d25fc72203d1bfb28 100644 (file)
@@ -21,18 +21,6 @@ config NET_VENDOR_8390
 
 if NET_VENDOR_8390
 
-config EL2
-       tristate "3c503 \"EtherLink II\" support"
-       depends on ISA
-       select CRC32
-       ---help---
-         If you have a network (Ethernet) card of this type, say Y and read
-         the Ethernet-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
-
-         To compile this driver as a module, choose M here. The module
-         will be called 3c503.
-
 config PCMCIA_AXNET
        tristate "Asix AX88190 PCMCIA support"
        depends on PCMCIA
@@ -62,42 +50,6 @@ config AX88796_93CX6
        ---help---
          Select this if your platform comes with an external 93CX6 eeprom.
 
-config E2100
-       tristate "Cabletron E21xx support"
-       depends on ISA
-       select CRC32
-       ---help---
-         If you have a network (Ethernet) card of this type, say Y and read
-         the Ethernet-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
-
-         To compile this driver as a module, choose M here. The module
-         will be called e2100.
-
-config HPLAN_PLUS
-       tristate "HP PCLAN+ (27247B and 27252A) support"
-       depends on ISA
-       select CRC32
-       ---help---
-         If you have a network (Ethernet) card of this type, say Y and read
-         the Ethernet-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
-
-         To compile this driver as a module, choose M here. The module
-         will be called hp-plus.
-
-config HPLAN
-       tristate "HP PCLAN (27245 and other 27xxx series) support"
-       depends on ISA
-       select CRC32
-       ---help---
-         If you have a network (Ethernet) card of this type, say Y and read
-         the Ethernet-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
-
-         To compile this driver as a module, choose M here. The module
-         will be called hp.
-
 config HYDRA
        tristate "Hydra support"
        depends on ZORRO
index e8bb97cd355f4d4e85573ee56f2ca3e9ec5fcbc4..588954a79b2ae657bf905b0246a0b2753f72a5ed 100644 (file)
@@ -6,10 +6,6 @@ obj-$(CONFIG_MAC8390) += mac8390.o
 obj-$(CONFIG_APNE) += apne.o 8390.o
 obj-$(CONFIG_ARM_ETHERH) += etherh.o
 obj-$(CONFIG_AX88796) += ax88796.o
-obj-$(CONFIG_E2100) += e2100.o 8390.o
-obj-$(CONFIG_EL2) += 3c503.o 8390p.o
-obj-$(CONFIG_HPLAN_PLUS) += hp-plus.o 8390p.o
-obj-$(CONFIG_HPLAN) += hp.o 8390p.o
 obj-$(CONFIG_HYDRA) += hydra.o 8390.o
 obj-$(CONFIG_MCF8390) += mcf8390.o 8390.o
 obj-$(CONFIG_NE2000) += ne.o 8390p.o
diff --git a/drivers/net/ethernet/8390/e2100.c b/drivers/net/ethernet/8390/e2100.c
deleted file mode 100644 (file)
index ed55ce8..0000000
+++ /dev/null
@@ -1,489 +0,0 @@
-/* e2100.c: A Cabletron E2100 series ethernet driver for linux. */
-/*
-       Written 1993-1994 by Donald Becker.
-
-       Copyright 1994 by Donald Becker.
-       Copyright 1993 United States Government as represented by the
-       Director, National Security Agency.  This software may be used and
-       distributed according to the terms of the GNU General Public License,
-       incorporated herein by reference.
-
-       This is a driver for the Cabletron E2100 series ethercards.
-
-       The Author may be reached as becker@scyld.com, or C/O
-       Scyld Computing Corporation
-       410 Severn Ave., Suite 210
-       Annapolis MD 21403
-
-       The E2100 series ethercard is a fairly generic shared memory 8390
-       implementation.  The only unusual aspect is the way the shared memory
-       registers are set: first you do an inb() in what is normally the
-       station address region, and the low three bits of next outb() *address*
-       is used as the write value for that register.  Either someone wasn't
-       too used to dem bit en bites, or they were trying to obfuscate the
-       programming interface.
-
-       There is an additional complication when setting the window on the packet
-       buffer.  You must first do a read into the packet buffer region with the
-       low 8 address bits the address setting the page for the start of the packet
-       buffer window, and then do the above operation.  See mem_on() for details.
-
-       One bug on the chip is that even a hard reset won't disable the memory
-       window, usually resulting in a hung machine if mem_off() isn't called.
-       If this happens, you must power down the machine for about 30 seconds.
-*/
-
-static const char version[] =
-       "e2100.c:v1.01 7/21/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/ioport.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/delay.h>
-
-#include <asm/io.h>
-
-#include "8390.h"
-
-#define DRV_NAME "e2100"
-
-static int e21_probe_list[] = {0x300, 0x280, 0x380, 0x220, 0};
-
-/* Offsets from the base_addr.
-   Read from the ASIC register, and the low three bits of the next outb()
-   address is used to set the corresponding register. */
-#define E21_NIC_OFFSET  0              /* Offset to the 8390 NIC. */
-#define E21_ASIC               0x10
-#define E21_MEM_ENABLE 0x10
-#define  E21_MEM_ON            0x05    /* Enable memory in 16 bit mode. */
-#define  E21_MEM_ON_8  0x07    /* Enable memory in  8 bit mode. */
-#define E21_MEM_BASE   0x11
-#define E21_IRQ_LOW            0x12    /* The low three bits of the IRQ number. */
-#define E21_IRQ_HIGH   0x14    /* The high IRQ bit and media select ...  */
-#define E21_MEDIA              0x14    /* (alias). */
-#define  E21_ALT_IFPORT 0x02   /* Set to use the other (BNC,AUI) port. */
-#define  E21_BIG_MEM   0x04    /* Use a bigger (64K) buffer (we don't) */
-#define E21_SAPROM             0x10    /* Offset to station address data. */
-#define E21_IO_EXTENT   0x20
-
-static inline void mem_on(short port, volatile char __iomem *mem_base,
-                                                 unsigned char start_page )
-{
-       /* This is a little weird: set the shared memory window by doing a
-          read.  The low address bits specify the starting page. */
-       readb(mem_base+start_page);
-       inb(port + E21_MEM_ENABLE);
-       outb(E21_MEM_ON, port + E21_MEM_ENABLE + E21_MEM_ON);
-}
-
-static inline void mem_off(short port)
-{
-       inb(port + E21_MEM_ENABLE);
-       outb(0x00, port + E21_MEM_ENABLE);
-}
-
-/* In other drivers I put the TX pages first, but the E2100 window circuitry
-   is designed to have a 4K Tx region last. The windowing circuitry wraps the
-   window at 0x2fff->0x0000 so that the packets at e.g. 0x2f00 in the RX ring
-   appear contiguously in the window. */
-#define E21_RX_START_PG                0x00    /* First page of RX buffer */
-#define E21_RX_STOP_PG         0x30    /* Last page +1 of RX ring */
-#define E21_BIG_RX_STOP_PG     0xF0    /* Last page +1 of RX ring */
-#define E21_TX_START_PG                E21_RX_STOP_PG  /* First page of TX buffer */
-
-static int e21_probe1(struct net_device *dev, int ioaddr);
-
-static int e21_open(struct net_device *dev);
-static void e21_reset_8390(struct net_device *dev);
-static void e21_block_input(struct net_device *dev, int count,
-                                                  struct sk_buff *skb, int ring_offset);
-static void e21_block_output(struct net_device *dev, int count,
-                                                        const unsigned char *buf, int start_page);
-static void e21_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr,
-                                                       int ring_page);
-static int e21_open(struct net_device *dev);
-static int e21_close(struct net_device *dev);
-
-
-/*  Probe for the E2100 series ethercards.  These cards have an 8390 at the
-       base address and the station address at both offset 0x10 and 0x18.  I read
-       the station address from offset 0x18 to avoid the dataport of NE2000
-       ethercards, and look for Ctron's unique ID (first three octets of the
-       station address).
- */
-
-static int  __init do_e2100_probe(struct net_device *dev)
-{
-       int *port;
-       int base_addr = dev->base_addr;
-       int irq = dev->irq;
-
-       if (base_addr > 0x1ff)          /* Check a single specified location. */
-               return e21_probe1(dev, base_addr);
-       else if (base_addr != 0)        /* Don't probe at all. */
-               return -ENXIO;
-
-       for (port = e21_probe_list; *port; port++) {
-               dev->irq = irq;
-               if (e21_probe1(dev, *port) == 0)
-                       return 0;
-       }
-
-       return -ENODEV;
-}
-
-#ifndef MODULE
-struct net_device * __init e2100_probe(int unit)
-{
-       struct net_device *dev = alloc_ei_netdev();
-       int err;
-
-       if (!dev)
-               return ERR_PTR(-ENOMEM);
-
-       sprintf(dev->name, "eth%d", unit);
-       netdev_boot_setup_check(dev);
-
-       err = do_e2100_probe(dev);
-       if (err)
-               goto out;
-       return dev;
-out:
-       free_netdev(dev);
-       return ERR_PTR(err);
-}
-#endif
-
-static const struct net_device_ops e21_netdev_ops = {
-       .ndo_open               = e21_open,
-       .ndo_stop               = e21_close,
-
-       .ndo_start_xmit         = ei_start_xmit,
-       .ndo_tx_timeout         = ei_tx_timeout,
-       .ndo_get_stats          = ei_get_stats,
-       .ndo_set_rx_mode        = ei_set_multicast_list,
-       .ndo_validate_addr      = eth_validate_addr,
-       .ndo_set_mac_address    = eth_mac_addr,
-       .ndo_change_mtu         = eth_change_mtu,
-#ifdef CONFIG_NET_POLL_CONTROLLER
-       .ndo_poll_controller    = ei_poll,
-#endif
-};
-
-static int __init e21_probe1(struct net_device *dev, int ioaddr)
-{
-       int i, status, retval;
-       unsigned char *station_addr = dev->dev_addr;
-       static unsigned version_printed;
-
-       if (!request_region(ioaddr, E21_IO_EXTENT, DRV_NAME))
-               return -EBUSY;
-
-       /* First check the station address for the Ctron prefix. */
-       if (inb(ioaddr + E21_SAPROM + 0) != 0x00 ||
-           inb(ioaddr + E21_SAPROM + 1) != 0x00 ||
-           inb(ioaddr + E21_SAPROM + 2) != 0x1d) {
-               retval = -ENODEV;
-               goto out;
-       }
-
-       /* Verify by making certain that there is a 8390 at there. */
-       outb(E8390_NODMA + E8390_STOP, ioaddr);
-       udelay(1);      /* we want to delay one I/O cycle - which is 2MHz */
-       status = inb(ioaddr);
-       if (status != 0x21 && status != 0x23) {
-               retval = -ENODEV;
-               goto out;
-       }
-
-       /* Read the station address PROM.  */
-       for (i = 0; i < 6; i++)
-               station_addr[i] = inb(ioaddr + E21_SAPROM + i);
-
-       inb(ioaddr + E21_MEDIA);                /* Point to media selection. */
-       outb(0, ioaddr + E21_ASIC);     /* and disable the secondary interface. */
-
-       if (ei_debug  &&  version_printed++ == 0)
-               printk(version);
-
-       for (i = 0; i < 6; i++)
-               printk(" %02X", station_addr[i]);
-
-       if (dev->irq < 2) {
-               static const int irqlist[] = {15, 11, 10, 12, 5, 9, 3, 4};
-               for (i = 0; i < ARRAY_SIZE(irqlist); i++)
-                       if (request_irq (irqlist[i], NULL, 0, "bogus", NULL) != -EBUSY) {
-                               dev->irq = irqlist[i];
-                               break;
-                       }
-               if (i >= ARRAY_SIZE(irqlist)) {
-                       printk(" unable to get IRQ %d.\n", dev->irq);
-                       retval = -EAGAIN;
-                       goto out;
-               }
-       } else if (dev->irq == 2)       /* Fixup luser bogosity: IRQ2 is really IRQ9 */
-               dev->irq = 9;
-
-       /* The 8390 is at the base address. */
-       dev->base_addr = ioaddr;
-
-       ei_status.name = "E2100";
-       ei_status.word16 = 1;
-       ei_status.tx_start_page = E21_TX_START_PG;
-       ei_status.rx_start_page = E21_RX_START_PG;
-       ei_status.stop_page = E21_RX_STOP_PG;
-       ei_status.saved_irq = dev->irq;
-
-       /* Check the media port used.  The port can be passed in on the
-          low mem_end bits. */
-       if (dev->mem_end & 15)
-               dev->if_port = dev->mem_end & 7;
-       else {
-               dev->if_port = 0;
-               inb(ioaddr + E21_MEDIA);        /* Turn automatic media detection on. */
-               for(i = 0; i < 6; i++)
-                       if (station_addr[i] != inb(ioaddr + E21_SAPROM + 8 + i)) {
-                               dev->if_port = 1;
-                               break;
-                       }
-       }
-
-       /* Never map in the E21 shared memory unless you are actively using it.
-          Also, the shared memory has effective only one setting -- spread all
-          over the 128K region! */
-       if (dev->mem_start == 0)
-               dev->mem_start = 0xd0000;
-
-       ei_status.mem = ioremap(dev->mem_start, 2*1024);
-       if (!ei_status.mem) {
-               printk("unable to remap memory\n");
-               retval = -EAGAIN;
-               goto out;
-       }
-
-#ifdef notdef
-       /* These values are unused.  The E2100 has a 2K window into the packet
-          buffer.  The window can be set to start on any page boundary. */
-       ei_status.rmem_start = dev->mem_start + TX_PAGES*256;
-       dev->mem_end = ei_status.rmem_end = dev->mem_start + 2*1024;
-#endif
-
-       printk(", IRQ %d, %s media, memory @ %#lx.\n", dev->irq,
-                  dev->if_port ? "secondary" : "primary", dev->mem_start);
-
-       ei_status.reset_8390 = &e21_reset_8390;
-       ei_status.block_input = &e21_block_input;
-       ei_status.block_output = &e21_block_output;
-       ei_status.get_8390_hdr = &e21_get_8390_hdr;
-
-       dev->netdev_ops = &e21_netdev_ops;
-       NS8390_init(dev, 0);
-
-       retval = register_netdev(dev);
-       if (retval)
-               goto out;
-       return 0;
-out:
-       release_region(ioaddr, E21_IO_EXTENT);
-       return retval;
-}
-
-static int
-e21_open(struct net_device *dev)
-{
-       short ioaddr = dev->base_addr;
-       int retval;
-
-       if ((retval = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev)))
-               return retval;
-
-       /* Set the interrupt line and memory base on the hardware. */
-       inb(ioaddr + E21_IRQ_LOW);
-       outb(0, ioaddr + E21_ASIC + (dev->irq & 7));
-       inb(ioaddr + E21_IRQ_HIGH);                     /* High IRQ bit, and if_port. */
-       outb(0, ioaddr + E21_ASIC + (dev->irq > 7 ? 1:0)
-                  + (dev->if_port ? E21_ALT_IFPORT : 0));
-       inb(ioaddr + E21_MEM_BASE);
-       outb(0, ioaddr + E21_ASIC + ((dev->mem_start >> 17) & 7));
-
-       ei_open(dev);
-       return 0;
-}
-
-static void
-e21_reset_8390(struct net_device *dev)
-{
-       short ioaddr = dev->base_addr;
-
-       outb(0x01, ioaddr);
-       if (ei_debug > 1) printk("resetting the E2180x3 t=%ld...", jiffies);
-       ei_status.txing = 0;
-
-       /* Set up the ASIC registers, just in case something changed them. */
-
-       if (ei_debug > 1) printk("reset done\n");
-}
-
-/* Grab the 8390 specific header. We put the 2k window so the header page
-   appears at the start of the shared memory. */
-
-static void
-e21_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page)
-{
-
-       short ioaddr = dev->base_addr;
-       char __iomem *shared_mem = ei_status.mem;
-
-       mem_on(ioaddr, shared_mem, ring_page);
-
-#ifdef notdef
-       /* Officially this is what we are doing, but the readl() is faster */
-       memcpy_fromio(hdr, shared_mem, sizeof(struct e8390_pkt_hdr));
-#else
-       ((unsigned int*)hdr)[0] = readl(shared_mem);
-#endif
-
-       /* Turn off memory access: we would need to reprogram the window anyway. */
-       mem_off(ioaddr);
-
-}
-
-/*  Block input and output are easy on shared memory ethercards.
-       The E21xx makes block_input() especially easy by wrapping the top
-       ring buffer to the bottom automatically. */
-static void
-e21_block_input(struct net_device *dev, int count, struct sk_buff *skb, int ring_offset)
-{
-       short ioaddr = dev->base_addr;
-       char __iomem *shared_mem = ei_status.mem;
-
-       mem_on(ioaddr, shared_mem, (ring_offset>>8));
-
-       memcpy_fromio(skb->data, ei_status.mem + (ring_offset & 0xff), count);
-
-       mem_off(ioaddr);
-}
-
-static void
-e21_block_output(struct net_device *dev, int count, const unsigned char *buf,
-                                int start_page)
-{
-       short ioaddr = dev->base_addr;
-       volatile char __iomem *shared_mem = ei_status.mem;
-
-       /* Set the shared memory window start by doing a read, with the low address
-          bits specifying the starting page. */
-       readb(shared_mem + start_page);
-       mem_on(ioaddr, shared_mem, start_page);
-
-       memcpy_toio(shared_mem, buf, count);
-       mem_off(ioaddr);
-}
-
-static int
-e21_close(struct net_device *dev)
-{
-       short ioaddr = dev->base_addr;
-
-       if (ei_debug > 1)
-               printk("%s: Shutting down ethercard.\n", dev->name);
-
-       free_irq(dev->irq, dev);
-       dev->irq = ei_status.saved_irq;
-
-       /* Shut off the interrupt line and secondary interface. */
-       inb(ioaddr + E21_IRQ_LOW);
-       outb(0, ioaddr + E21_ASIC);
-       inb(ioaddr + E21_IRQ_HIGH);                     /* High IRQ bit, and if_port. */
-       outb(0, ioaddr + E21_ASIC);
-
-       ei_close(dev);
-
-       /* Double-check that the memory has been turned off, because really
-          really bad things happen if it isn't. */
-       mem_off(ioaddr);
-
-       return 0;
-}
-
-
-#ifdef MODULE
-#define MAX_E21_CARDS  4       /* Max number of E21 cards per module */
-static struct net_device *dev_e21[MAX_E21_CARDS];
-static int io[MAX_E21_CARDS];
-static int irq[MAX_E21_CARDS];
-static int mem[MAX_E21_CARDS];
-static int xcvr[MAX_E21_CARDS];                /* choose int. or ext. xcvr */
-
-module_param_array(io, int, NULL, 0);
-module_param_array(irq, int, NULL, 0);
-module_param_array(mem, int, NULL, 0);
-module_param_array(xcvr, int, NULL, 0);
-MODULE_PARM_DESC(io, "I/O base address(es)");
-MODULE_PARM_DESC(irq, "IRQ number(s)");
-MODULE_PARM_DESC(mem, " memory base address(es)");
-MODULE_PARM_DESC(xcvr, "transceiver(s) (0=internal, 1=external)");
-MODULE_DESCRIPTION("Cabletron E2100 ISA ethernet driver");
-MODULE_LICENSE("GPL");
-
-/* This is set up so that only a single autoprobe takes place per call.
-ISA device autoprobes on a running machine are not recommended. */
-
-int __init init_module(void)
-{
-       struct net_device *dev;
-       int this_dev, found = 0;
-
-       for (this_dev = 0; this_dev < MAX_E21_CARDS; this_dev++) {
-               if (io[this_dev] == 0)  {
-                       if (this_dev != 0) break; /* only autoprobe 1st one */
-                       printk(KERN_NOTICE "e2100.c: Presently autoprobing (not recommended) for a single card.\n");
-               }
-               dev = alloc_ei_netdev();
-               if (!dev)
-                       break;
-               dev->irq = irq[this_dev];
-               dev->base_addr = io[this_dev];
-               dev->mem_start = mem[this_dev];
-               dev->mem_end = xcvr[this_dev];  /* low 4bits = xcvr sel. */
-               if (do_e2100_probe(dev) == 0) {
-                       dev_e21[found++] = dev;
-                       continue;
-               }
-               free_netdev(dev);
-               printk(KERN_WARNING "e2100.c: No E2100 card found (i/o = 0x%x).\n", io[this_dev]);
-               break;
-       }
-       if (found)
-               return 0;
-       return -ENXIO;
-}
-
-static void cleanup_card(struct net_device *dev)
-{
-       /* NB: e21_close() handles free_irq */
-       iounmap(ei_status.mem);
-       release_region(dev->base_addr, E21_IO_EXTENT);
-}
-
-void __exit
-cleanup_module(void)
-{
-       int this_dev;
-
-       for (this_dev = 0; this_dev < MAX_E21_CARDS; this_dev++) {
-               struct net_device *dev = dev_e21[this_dev];
-               if (dev) {
-                       unregister_netdev(dev);
-                       cleanup_card(dev);
-                       free_netdev(dev);
-               }
-       }
-}
-#endif /* MODULE */
diff --git a/drivers/net/ethernet/8390/hp-plus.c b/drivers/net/ethernet/8390/hp-plus.c
deleted file mode 100644 (file)
index 52f70f9..0000000
+++ /dev/null
@@ -1,505 +0,0 @@
-/* hp-plus.c: A HP PCLAN/plus ethernet driver for linux. */
-/*
-       Written 1994 by Donald Becker.
-
-       This driver is for the Hewlett Packard PC LAN (27***) plus ethercards.
-       These cards are sold under several model numbers, usually 2724*.
-
-       This software may be used and distributed according to the terms
-       of the GNU General Public License, incorporated herein by reference.
-
-       The author may be reached as becker@scyld.com, or C/O
-       Scyld Computing Corporation
-       410 Severn Ave., Suite 210
-       Annapolis MD 21403
-
-       As is often the case, a great deal of credit is owed to Russ Nelson.
-       The Crynwr packet driver was my primary source of HP-specific
-       programming information.
-*/
-
-static const char version[] =
-"hp-plus.c:v1.10 9/24/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
-
-#include <linux/module.h>
-
-#include <linux/string.h>              /* Important -- this inlines word moves. */
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/ioport.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/delay.h>
-
-#include <asm/io.h>
-
-#include "8390.h"
-
-#define DRV_NAME "hp-plus"
-
-/* A zero-terminated list of I/O addresses to be probed. */
-static unsigned int hpplus_portlist[] __initdata =
-{0x200, 0x240, 0x280, 0x2C0, 0x300, 0x320, 0x340, 0};
-
-/*
-   The HP EtherTwist chip implementation is a fairly routine DP8390
-   implementation.  It allows both shared memory and programmed-I/O buffer
-   access, using a custom interface for both.  The programmed-I/O mode is
-   entirely implemented in the HP EtherTwist chip, bypassing the problem
-   ridden built-in 8390 facilities used on NE2000 designs.  The shared
-   memory mode is likewise special, with an offset register used to make
-   packets appear at the shared memory base.  Both modes use a base and bounds
-   page register to hide the Rx ring buffer wrap -- a packet that spans the
-   end of physical buffer memory appears continuous to the driver. (c.f. the
-   3c503 and Cabletron E2100)
-
-   A special note: the internal buffer of the board is only 8 bits wide.
-   This lays several nasty traps for the unaware:
-   - the 8390 must be programmed for byte-wide operations
-   - all I/O and memory operations must work on whole words (the access
-     latches are serially preloaded and have no byte-swapping ability).
-
-   This board is laid out in I/O space much like the earlier HP boards:
-   the first 16 locations are for the board registers, and the second 16 are
-   for the 8390.  The board is easy to identify, with both a dedicated 16 bit
-   ID register and a constant 0x530* value in the upper bits of the paging
-   register.
-*/
-
-#define HP_ID                  0x00    /* ID register, always 0x4850. */
-#define HP_PAGING              0x02    /* Registers visible @ 8-f, see PageName. */
-#define HPP_OPTION             0x04    /* Bitmapped options, see HP_Option.    */
-#define HPP_OUT_ADDR   0x08    /* I/O output location in Perf_Page.    */
-#define HPP_IN_ADDR            0x0A    /* I/O input location in Perf_Page.             */
-#define HP_DATAPORT            0x0c    /* I/O data transfer in Perf_Page.              */
-#define NIC_OFFSET             0x10    /* Offset to the 8390 registers.                */
-#define HP_IO_EXTENT   32
-
-#define HP_START_PG            0x00    /* First page of TX buffer */
-#define HP_STOP_PG             0x80    /* Last page +1 of RX ring */
-
-/* The register set selected in HP_PAGING. */
-enum PageName {
-       Perf_Page = 0,                          /* Normal operation. */
-       MAC_Page = 1,                           /* The ethernet address (+checksum). */
-       HW_Page = 2,                            /* EEPROM-loaded hardware parameters. */
-       LAN_Page = 4,                           /* Transceiver selection, testing, etc. */
-       ID_Page = 6 };
-
-/* The bit definitions for the HPP_OPTION register. */
-enum HP_Option {
-       NICReset = 1, ChipReset = 2,    /* Active low, really UNreset. */
-       EnableIRQ = 4, FakeIntr = 8, BootROMEnb = 0x10, IOEnb = 0x20,
-       MemEnable = 0x40, ZeroWait = 0x80, MemDisable = 0x1000, };
-
-static int hpp_probe1(struct net_device *dev, int ioaddr);
-
-static void hpp_reset_8390(struct net_device *dev);
-static int hpp_open(struct net_device *dev);
-static int hpp_close(struct net_device *dev);
-static void hpp_mem_block_input(struct net_device *dev, int count,
-                                                 struct sk_buff *skb, int ring_offset);
-static void hpp_mem_block_output(struct net_device *dev, int count,
-                                                       const unsigned char *buf, int start_page);
-static void hpp_mem_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr,
-                                                 int ring_page);
-static void hpp_io_block_input(struct net_device *dev, int count,
-                                                 struct sk_buff *skb, int ring_offset);
-static void hpp_io_block_output(struct net_device *dev, int count,
-                                                       const unsigned char *buf, int start_page);
-static void hpp_io_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr,
-                                                 int ring_page);
-
-
-/*     Probe a list of addresses for an HP LAN+ adaptor.
-       This routine is almost boilerplate. */
-
-static int __init do_hpp_probe(struct net_device *dev)
-{
-       int i;
-       int base_addr = dev->base_addr;
-       int irq = dev->irq;
-
-       if (base_addr > 0x1ff)          /* Check a single specified location. */
-               return hpp_probe1(dev, base_addr);
-       else if (base_addr != 0)        /* Don't probe at all. */
-               return -ENXIO;
-
-       for (i = 0; hpplus_portlist[i]; i++) {
-               if (hpp_probe1(dev, hpplus_portlist[i]) == 0)
-                       return 0;
-               dev->irq = irq;
-       }
-
-       return -ENODEV;
-}
-
-#ifndef MODULE
-struct net_device * __init hp_plus_probe(int unit)
-{
-       struct net_device *dev = alloc_eip_netdev();
-       int err;
-
-       if (!dev)
-               return ERR_PTR(-ENOMEM);
-
-       sprintf(dev->name, "eth%d", unit);
-       netdev_boot_setup_check(dev);
-
-       err = do_hpp_probe(dev);
-       if (err)
-               goto out;
-       return dev;
-out:
-       free_netdev(dev);
-       return ERR_PTR(err);
-}
-#endif
-
-static const struct net_device_ops hpp_netdev_ops = {
-       .ndo_open               = hpp_open,
-       .ndo_stop               = hpp_close,
-       .ndo_start_xmit         = eip_start_xmit,
-       .ndo_tx_timeout         = eip_tx_timeout,
-       .ndo_get_stats          = eip_get_stats,
-       .ndo_set_rx_mode        = eip_set_multicast_list,
-       .ndo_validate_addr      = eth_validate_addr,
-       .ndo_set_mac_address    = eth_mac_addr,
-       .ndo_change_mtu         = eth_change_mtu,
-#ifdef CONFIG_NET_POLL_CONTROLLER
-       .ndo_poll_controller    = eip_poll,
-#endif
-};
-
-
-/* Do the interesting part of the probe at a single address. */
-static int __init hpp_probe1(struct net_device *dev, int ioaddr)
-{
-       int i, retval;
-       unsigned char checksum = 0;
-       const char name[] = "HP-PC-LAN+";
-       int mem_start;
-       static unsigned version_printed;
-
-       if (!request_region(ioaddr, HP_IO_EXTENT, DRV_NAME))
-               return -EBUSY;
-
-       /* Check for the HP+ signature, 50 48 0x 53. */
-       if (inw(ioaddr + HP_ID) != 0x4850 ||
-           (inw(ioaddr + HP_PAGING) & 0xfff0) != 0x5300) {
-               retval = -ENODEV;
-               goto out;
-       }
-
-       if (ei_debug  &&  version_printed++ == 0)
-               printk(version);
-
-       printk("%s: %s at %#3x, ", dev->name, name, ioaddr);
-
-       /* Retrieve and checksum the station address. */
-       outw(MAC_Page, ioaddr + HP_PAGING);
-
-       for(i = 0; i < ETH_ALEN; i++) {
-               unsigned char inval = inb(ioaddr + 8 + i);
-               dev->dev_addr[i] = inval;
-               checksum += inval;
-       }
-       checksum += inb(ioaddr + 14);
-
-       printk("%pM", dev->dev_addr);
-
-       if (checksum != 0xff) {
-               printk(" bad checksum %2.2x.\n", checksum);
-               retval = -ENODEV;
-               goto out;
-       } else {
-               /* Point at the Software Configuration Flags. */
-               outw(ID_Page, ioaddr + HP_PAGING);
-               printk(" ID %4.4x", inw(ioaddr + 12));
-       }
-
-       /* Read the IRQ line. */
-       outw(HW_Page, ioaddr + HP_PAGING);
-       {
-               int irq = inb(ioaddr + 13) & 0x0f;
-               int option = inw(ioaddr + HPP_OPTION);
-
-               dev->irq = irq;
-               if (option & MemEnable) {
-                       mem_start = inw(ioaddr + 9) << 8;
-                       printk(", IRQ %d, memory address %#x.\n", irq, mem_start);
-               } else {
-                       mem_start = 0;
-                       printk(", IRQ %d, programmed-I/O mode.\n", irq);
-               }
-       }
-
-       /* Set the wrap registers for string I/O reads.   */
-       outw((HP_START_PG + TX_PAGES/2) | ((HP_STOP_PG - 1) << 8), ioaddr + 14);
-
-       /* Set the base address to point to the NIC, not the "real" base! */
-       dev->base_addr = ioaddr + NIC_OFFSET;
-
-       dev->netdev_ops = &hpp_netdev_ops;
-
-       ei_status.name = name;
-       ei_status.word16 = 0;           /* Agggghhhhh! Debug time: 2 days! */
-       ei_status.tx_start_page = HP_START_PG;
-       ei_status.rx_start_page = HP_START_PG + TX_PAGES/2;
-       ei_status.stop_page = HP_STOP_PG;
-
-       ei_status.reset_8390 = &hpp_reset_8390;
-       ei_status.block_input = &hpp_io_block_input;
-       ei_status.block_output = &hpp_io_block_output;
-       ei_status.get_8390_hdr = &hpp_io_get_8390_hdr;
-
-       /* Check if the memory_enable flag is set in the option register. */
-       if (mem_start) {
-               ei_status.block_input = &hpp_mem_block_input;
-               ei_status.block_output = &hpp_mem_block_output;
-               ei_status.get_8390_hdr = &hpp_mem_get_8390_hdr;
-               dev->mem_start = mem_start;
-               ei_status.mem = ioremap(mem_start,
-                                       (HP_STOP_PG - HP_START_PG)*256);
-               if (!ei_status.mem) {
-                       retval = -ENOMEM;
-                       goto out;
-               }
-               ei_status.rmem_start = dev->mem_start + TX_PAGES/2*256;
-               dev->mem_end = ei_status.rmem_end
-                       = dev->mem_start + (HP_STOP_PG - HP_START_PG)*256;
-       }
-
-       outw(Perf_Page, ioaddr + HP_PAGING);
-       NS8390p_init(dev, 0);
-       /* Leave the 8390 and HP chip reset. */
-       outw(inw(ioaddr + HPP_OPTION) & ~EnableIRQ, ioaddr + HPP_OPTION);
-
-       retval = register_netdev(dev);
-       if (retval)
-               goto out1;
-       return 0;
-out1:
-       iounmap(ei_status.mem);
-out:
-       release_region(ioaddr, HP_IO_EXTENT);
-       return retval;
-}
-
-static int
-hpp_open(struct net_device *dev)
-{
-       int ioaddr = dev->base_addr - NIC_OFFSET;
-       int option_reg;
-       int retval;
-
-       if ((retval = request_irq(dev->irq, eip_interrupt, 0, dev->name, dev))) {
-           return retval;
-       }
-
-       /* Reset the 8390 and HP chip. */
-       option_reg = inw(ioaddr + HPP_OPTION);
-       outw(option_reg & ~(NICReset + ChipReset), ioaddr + HPP_OPTION);
-       udelay(5);
-       /* Unreset the board and enable interrupts. */
-       outw(option_reg | (EnableIRQ + NICReset + ChipReset), ioaddr + HPP_OPTION);
-
-       /* Set the wrap registers for programmed-I/O operation.   */
-       outw(HW_Page, ioaddr + HP_PAGING);
-       outw((HP_START_PG + TX_PAGES/2) | ((HP_STOP_PG - 1) << 8), ioaddr + 14);
-
-       /* Select the operational page. */
-       outw(Perf_Page, ioaddr + HP_PAGING);
-
-       return eip_open(dev);
-}
-
-static int
-hpp_close(struct net_device *dev)
-{
-       int ioaddr = dev->base_addr - NIC_OFFSET;
-       int option_reg = inw(ioaddr + HPP_OPTION);
-
-       free_irq(dev->irq, dev);
-       eip_close(dev);
-       outw((option_reg & ~EnableIRQ) | MemDisable | NICReset | ChipReset,
-                ioaddr + HPP_OPTION);
-
-       return 0;
-}
-
-static void
-hpp_reset_8390(struct net_device *dev)
-{
-       int ioaddr = dev->base_addr - NIC_OFFSET;
-       int option_reg = inw(ioaddr + HPP_OPTION);
-
-       if (ei_debug > 1) printk("resetting the 8390 time=%ld...", jiffies);
-
-       outw(option_reg & ~(NICReset + ChipReset), ioaddr + HPP_OPTION);
-       /* Pause a few cycles for the hardware reset to take place. */
-       udelay(5);
-       ei_status.txing = 0;
-       outw(option_reg | (EnableIRQ + NICReset + ChipReset), ioaddr + HPP_OPTION);
-
-       udelay(5);
-
-
-       if ((inb_p(ioaddr+NIC_OFFSET+EN0_ISR) & ENISR_RESET) == 0)
-               printk("%s: hp_reset_8390() did not complete.\n", dev->name);
-
-       if (ei_debug > 1) printk("8390 reset done (%ld).", jiffies);
-}
-
-/* The programmed-I/O version of reading the 4 byte 8390 specific header.
-   Note that transfer with the EtherTwist+ must be on word boundaries. */
-
-static void
-hpp_io_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page)
-{
-       int ioaddr = dev->base_addr - NIC_OFFSET;
-
-       outw((ring_page<<8), ioaddr + HPP_IN_ADDR);
-       insw(ioaddr + HP_DATAPORT, hdr, sizeof(struct e8390_pkt_hdr)>>1);
-}
-
-/* Block input and output, similar to the Crynwr packet driver. */
-
-static void
-hpp_io_block_input(struct net_device *dev, int count, struct sk_buff *skb, int ring_offset)
-{
-       int ioaddr = dev->base_addr - NIC_OFFSET;
-       char *buf = skb->data;
-
-       outw(ring_offset, ioaddr + HPP_IN_ADDR);
-       insw(ioaddr + HP_DATAPORT, buf, count>>1);
-       if (count & 0x01)
-        buf[count-1] = inw(ioaddr + HP_DATAPORT);
-}
-
-/* The corresponding shared memory versions of the above 2 functions. */
-
-static void
-hpp_mem_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page)
-{
-       int ioaddr = dev->base_addr - NIC_OFFSET;
-       int option_reg = inw(ioaddr + HPP_OPTION);
-
-       outw((ring_page<<8), ioaddr + HPP_IN_ADDR);
-       outw(option_reg & ~(MemDisable + BootROMEnb), ioaddr + HPP_OPTION);
-       memcpy_fromio(hdr, ei_status.mem, sizeof(struct e8390_pkt_hdr));
-       outw(option_reg, ioaddr + HPP_OPTION);
-       hdr->count = (le16_to_cpu(hdr->count) + 3) & ~3;        /* Round up allocation. */
-}
-
-static void
-hpp_mem_block_input(struct net_device *dev, int count, struct sk_buff *skb, int ring_offset)
-{
-       int ioaddr = dev->base_addr - NIC_OFFSET;
-       int option_reg = inw(ioaddr + HPP_OPTION);
-
-       outw(ring_offset, ioaddr + HPP_IN_ADDR);
-
-       outw(option_reg & ~(MemDisable + BootROMEnb), ioaddr + HPP_OPTION);
-
-       /* Caution: this relies on get_8390_hdr() rounding up count!
-          Also note that we *can't* use eth_io_copy_and_sum() because
-          it will not always copy "count" bytes (e.g. padded IP).  */
-
-       memcpy_fromio(skb->data, ei_status.mem, count);
-       outw(option_reg, ioaddr + HPP_OPTION);
-}
-
-/* A special note: we *must* always transfer >=16 bit words.
-   It's always safe to round up, so we do. */
-static void
-hpp_io_block_output(struct net_device *dev, int count,
-                                       const unsigned char *buf, int start_page)
-{
-       int ioaddr = dev->base_addr - NIC_OFFSET;
-       outw(start_page << 8, ioaddr + HPP_OUT_ADDR);
-       outsl(ioaddr + HP_DATAPORT, buf, (count+3)>>2);
-}
-
-static void
-hpp_mem_block_output(struct net_device *dev, int count,
-                               const unsigned char *buf, int start_page)
-{
-       int ioaddr = dev->base_addr - NIC_OFFSET;
-       int option_reg = inw(ioaddr + HPP_OPTION);
-
-       outw(start_page << 8, ioaddr + HPP_OUT_ADDR);
-       outw(option_reg & ~(MemDisable + BootROMEnb), ioaddr + HPP_OPTION);
-       memcpy_toio(ei_status.mem, buf, (count + 3) & ~3);
-       outw(option_reg, ioaddr + HPP_OPTION);
-}
-
-
-#ifdef MODULE
-#define MAX_HPP_CARDS  4       /* Max number of HPP cards per module */
-static struct net_device *dev_hpp[MAX_HPP_CARDS];
-static int io[MAX_HPP_CARDS];
-static int irq[MAX_HPP_CARDS];
-
-module_param_array(io, int, NULL, 0);
-module_param_array(irq, int, NULL, 0);
-MODULE_PARM_DESC(io, "I/O port address(es)");
-MODULE_PARM_DESC(irq, "IRQ number(s); ignored if properly detected");
-MODULE_DESCRIPTION("HP PC-LAN+ ISA ethernet driver");
-MODULE_LICENSE("GPL");
-
-/* This is set up so that only a single autoprobe takes place per call.
-ISA device autoprobes on a running machine are not recommended. */
-int __init
-init_module(void)
-{
-       struct net_device *dev;
-       int this_dev, found = 0;
-
-       for (this_dev = 0; this_dev < MAX_HPP_CARDS; this_dev++) {
-               if (io[this_dev] == 0)  {
-                       if (this_dev != 0) break; /* only autoprobe 1st one */
-                       printk(KERN_NOTICE "hp-plus.c: Presently autoprobing (not recommended) for a single card.\n");
-               }
-               dev = alloc_eip_netdev();
-               if (!dev)
-                       break;
-               dev->irq = irq[this_dev];
-               dev->base_addr = io[this_dev];
-               if (do_hpp_probe(dev) == 0) {
-                       dev_hpp[found++] = dev;
-                       continue;
-               }
-               free_netdev(dev);
-               printk(KERN_WARNING "hp-plus.c: No HP-Plus card found (i/o = 0x%x).\n", io[this_dev]);
-               break;
-       }
-       if (found)
-               return 0;
-       return -ENXIO;
-}
-
-static void cleanup_card(struct net_device *dev)
-{
-       /* NB: hpp_close() handles free_irq */
-       iounmap(ei_status.mem);
-       release_region(dev->base_addr - NIC_OFFSET, HP_IO_EXTENT);
-}
-
-void __exit
-cleanup_module(void)
-{
-       int this_dev;
-
-       for (this_dev = 0; this_dev < MAX_HPP_CARDS; this_dev++) {
-               struct net_device *dev = dev_hpp[this_dev];
-               if (dev) {
-                       unregister_netdev(dev);
-                       cleanup_card(dev);
-                       free_netdev(dev);
-               }
-       }
-}
-#endif /* MODULE */
diff --git a/drivers/net/ethernet/8390/hp.c b/drivers/net/ethernet/8390/hp.c
deleted file mode 100644 (file)
index 37fa89a..0000000
+++ /dev/null
@@ -1,438 +0,0 @@
-/* hp.c: A HP LAN ethernet driver for linux. */
-/*
-       Written 1993-94 by Donald Becker.
-
-       Copyright 1993 United States Government as represented by the
-       Director, National Security Agency.
-
-       This software may be used and distributed according to the terms
-       of the GNU General Public License, incorporated herein by reference.
-
-       The author may be reached as becker@scyld.com, or C/O
-       Scyld Computing Corporation
-       410 Severn Ave., Suite 210
-       Annapolis MD 21403
-
-       This is a driver for the HP PC-LAN adaptors.
-
-       Sources:
-         The Crynwr packet driver.
-*/
-
-static const char version[] =
-       "hp.c:v1.10 9/23/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
-
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/ioport.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/delay.h>
-
-#include <asm/io.h>
-
-#include "8390.h"
-
-#define DRV_NAME "hp"
-
-/* A zero-terminated list of I/O addresses to be probed. */
-static unsigned int hppclan_portlist[] __initdata =
-{ 0x300, 0x320, 0x340, 0x280, 0x2C0, 0x200, 0x240, 0};
-
-#define HP_IO_EXTENT   32
-
-#define HP_DATAPORT            0x0c    /* "Remote DMA" data port. */
-#define HP_ID                  0x07
-#define HP_CONFIGURE   0x08    /* Configuration register. */
-#define         HP_RUN                 0x01    /* 1 == Run, 0 == reset. */
-#define         HP_IRQ                 0x0E    /* Mask for software-configured IRQ line. */
-#define         HP_DATAON              0x10    /* Turn on dataport */
-#define NIC_OFFSET             0x10    /* Offset the 8390 registers. */
-
-#define HP_START_PG            0x00    /* First page of TX buffer */
-#define HP_8BSTOP_PG   0x80    /* Last page +1 of RX ring */
-#define HP_16BSTOP_PG  0xFF    /* Same, for 16 bit cards. */
-
-static int hp_probe1(struct net_device *dev, int ioaddr);
-
-static void hp_reset_8390(struct net_device *dev);
-static void hp_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr,
-                                       int ring_page);
-static void hp_block_input(struct net_device *dev, int count,
-                                       struct sk_buff *skb , int ring_offset);
-static void hp_block_output(struct net_device *dev, int count,
-                                                       const unsigned char *buf, int start_page);
-
-static void hp_init_card(struct net_device *dev);
-
-/* The map from IRQ number to HP_CONFIGURE register setting. */
-/* My default is IRQ5               0  1  2  3  4  5  6  7  8  9 10 11 */
-static char irqmap[16] __initdata= { 0, 0, 4, 6, 8,10, 0,14, 0, 4, 2,12,0,0,0,0};
-
-
-/*     Probe for an HP LAN adaptor.
-       Also initialize the card and fill in STATION_ADDR with the station
-       address. */
-
-static int __init do_hp_probe(struct net_device *dev)
-{
-       int i;
-       int base_addr = dev->base_addr;
-       int irq = dev->irq;
-
-       if (base_addr > 0x1ff)          /* Check a single specified location. */
-               return hp_probe1(dev, base_addr);
-       else if (base_addr != 0)        /* Don't probe at all. */
-               return -ENXIO;
-
-       for (i = 0; hppclan_portlist[i]; i++) {
-               if (hp_probe1(dev, hppclan_portlist[i]) == 0)
-                       return 0;
-               dev->irq = irq;
-       }
-
-       return -ENODEV;
-}
-
-#ifndef MODULE
-struct net_device * __init hp_probe(int unit)
-{
-       struct net_device *dev = alloc_eip_netdev();
-       int err;
-
-       if (!dev)
-               return ERR_PTR(-ENOMEM);
-
-       sprintf(dev->name, "eth%d", unit);
-       netdev_boot_setup_check(dev);
-
-       err = do_hp_probe(dev);
-       if (err)
-               goto out;
-       return dev;
-out:
-       free_netdev(dev);
-       return ERR_PTR(err);
-}
-#endif
-
-static int __init hp_probe1(struct net_device *dev, int ioaddr)
-{
-       int i, retval, board_id, wordmode;
-       const char *name;
-       static unsigned version_printed;
-
-       if (!request_region(ioaddr, HP_IO_EXTENT, DRV_NAME))
-               return -EBUSY;
-
-       /* Check for the HP physical address, 08 00 09 xx xx xx. */
-       /* This really isn't good enough: we may pick up HP LANCE boards
-          also!  Avoid the lance 0x5757 signature. */
-       if (inb(ioaddr) != 0x08
-               || inb(ioaddr+1) != 0x00
-               || inb(ioaddr+2) != 0x09
-               || inb(ioaddr+14) == 0x57) {
-               retval = -ENODEV;
-               goto out;
-       }
-
-       /* Set up the parameters based on the board ID.
-          If you have additional mappings, please mail them to me -djb. */
-       if ((board_id = inb(ioaddr + HP_ID)) & 0x80) {
-               name = "HP27247";
-               wordmode = 1;
-       } else {
-               name = "HP27250";
-               wordmode = 0;
-       }
-
-       if (ei_debug  &&  version_printed++ == 0)
-               printk(version);
-
-       printk("%s: %s (ID %02x) at %#3x,", dev->name, name, board_id, ioaddr);
-
-       for(i = 0; i < ETH_ALEN; i++)
-               dev->dev_addr[i] = inb(ioaddr + i);
-
-       printk(" %pM", dev->dev_addr);
-
-       /* Snarf the interrupt now.  Someday this could be moved to open(). */
-       if (dev->irq < 2) {
-               static const int irq_16list[] = { 11, 10, 5, 3, 4, 7, 9, 0};
-               static const int irq_8list[] = { 7, 5, 3, 4, 9, 0};
-               const int *irqp = wordmode ? irq_16list : irq_8list;
-               do {
-                       int irq = *irqp;
-                       if (request_irq (irq, NULL, 0, "bogus", NULL) != -EBUSY) {
-                               unsigned long cookie = probe_irq_on();
-                               /* Twinkle the interrupt, and check if it's seen. */
-                               outb_p(irqmap[irq] | HP_RUN, ioaddr + HP_CONFIGURE);
-                               outb_p( 0x00 | HP_RUN, ioaddr + HP_CONFIGURE);
-                               if (irq == probe_irq_off(cookie)                 /* It's a good IRQ line! */
-                                       && request_irq (irq, eip_interrupt, 0, DRV_NAME, dev) == 0) {
-                                       printk(" selecting IRQ %d.\n", irq);
-                                       dev->irq = *irqp;
-                                       break;
-                               }
-                       }
-               } while (*++irqp);
-               if (*irqp == 0) {
-                       printk(" no free IRQ lines.\n");
-                       retval = -EBUSY;
-                       goto out;
-               }
-       } else {
-               if (dev->irq == 2)
-                       dev->irq = 9;
-               if ((retval = request_irq(dev->irq, eip_interrupt, 0, DRV_NAME, dev))) {
-                       printk (" unable to get IRQ %d.\n", dev->irq);
-                       goto out;
-               }
-       }
-
-       /* Set the base address to point to the NIC, not the "real" base! */
-       dev->base_addr = ioaddr + NIC_OFFSET;
-       dev->netdev_ops = &eip_netdev_ops;
-
-       ei_status.name = name;
-       ei_status.word16 = wordmode;
-       ei_status.tx_start_page = HP_START_PG;
-       ei_status.rx_start_page = HP_START_PG + TX_PAGES;
-       ei_status.stop_page = wordmode ? HP_16BSTOP_PG : HP_8BSTOP_PG;
-
-       ei_status.reset_8390 = hp_reset_8390;
-       ei_status.get_8390_hdr = hp_get_8390_hdr;
-       ei_status.block_input = hp_block_input;
-       ei_status.block_output = hp_block_output;
-       hp_init_card(dev);
-
-       retval = register_netdev(dev);
-       if (retval)
-               goto out1;
-       return 0;
-out1:
-       free_irq(dev->irq, dev);
-out:
-       release_region(ioaddr, HP_IO_EXTENT);
-       return retval;
-}
-
-static void
-hp_reset_8390(struct net_device *dev)
-{
-       int hp_base = dev->base_addr - NIC_OFFSET;
-       int saved_config = inb_p(hp_base + HP_CONFIGURE);
-
-       if (ei_debug > 1) printk("resetting the 8390 time=%ld...", jiffies);
-       outb_p(0x00, hp_base + HP_CONFIGURE);
-       ei_status.txing = 0;
-       /* Pause just a few cycles for the hardware reset to take place. */
-       udelay(5);
-
-       outb_p(saved_config, hp_base + HP_CONFIGURE);
-       udelay(5);
-
-       if ((inb_p(hp_base+NIC_OFFSET+EN0_ISR) & ENISR_RESET) == 0)
-               printk("%s: hp_reset_8390() did not complete.\n", dev->name);
-
-       if (ei_debug > 1) printk("8390 reset done (%ld).", jiffies);
-}
-
-static void
-hp_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page)
-{
-       int nic_base = dev->base_addr;
-       int saved_config = inb_p(nic_base - NIC_OFFSET + HP_CONFIGURE);
-
-       outb_p(saved_config | HP_DATAON, nic_base - NIC_OFFSET + HP_CONFIGURE);
-       outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base);
-       outb_p(sizeof(struct e8390_pkt_hdr), nic_base + EN0_RCNTLO);
-       outb_p(0, nic_base + EN0_RCNTHI);
-       outb_p(0, nic_base + EN0_RSARLO);       /* On page boundary */
-       outb_p(ring_page, nic_base + EN0_RSARHI);
-       outb_p(E8390_RREAD+E8390_START, nic_base);
-
-       if (ei_status.word16)
-         insw(nic_base - NIC_OFFSET + HP_DATAPORT, hdr, sizeof(struct e8390_pkt_hdr)>>1);
-       else
-         insb(nic_base - NIC_OFFSET + HP_DATAPORT, hdr, sizeof(struct e8390_pkt_hdr));
-
-       outb_p(saved_config & (~HP_DATAON), nic_base - NIC_OFFSET + HP_CONFIGURE);
-}
-
-/* Block input and output, similar to the Crynwr packet driver. If you are
-   porting to a new ethercard look at the packet driver source for hints.
-   The HP LAN doesn't use shared memory -- we put the packet
-   out through the "remote DMA" dataport. */
-
-static void
-hp_block_input(struct net_device *dev, int count, struct sk_buff *skb, int ring_offset)
-{
-       int nic_base = dev->base_addr;
-       int saved_config = inb_p(nic_base - NIC_OFFSET + HP_CONFIGURE);
-       int xfer_count = count;
-       char *buf = skb->data;
-
-       outb_p(saved_config | HP_DATAON, nic_base - NIC_OFFSET + HP_CONFIGURE);
-       outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base);
-       outb_p(count & 0xff, nic_base + EN0_RCNTLO);
-       outb_p(count >> 8, nic_base + EN0_RCNTHI);
-       outb_p(ring_offset & 0xff, nic_base + EN0_RSARLO);
-       outb_p(ring_offset >> 8, nic_base + EN0_RSARHI);
-       outb_p(E8390_RREAD+E8390_START, nic_base);
-       if (ei_status.word16) {
-         insw(nic_base - NIC_OFFSET + HP_DATAPORT,buf,count>>1);
-         if (count & 0x01)
-               buf[count-1] = inb(nic_base - NIC_OFFSET + HP_DATAPORT), xfer_count++;
-       } else {
-               insb(nic_base - NIC_OFFSET + HP_DATAPORT, buf, count);
-       }
-       /* This is for the ALPHA version only, remove for later releases. */
-       if (ei_debug > 0) {                     /* DMA termination address check... */
-         int high = inb_p(nic_base + EN0_RSARHI);
-         int low = inb_p(nic_base + EN0_RSARLO);
-         int addr = (high << 8) + low;
-         /* Check only the lower 8 bits so we can ignore ring wrap. */
-         if (((ring_offset + xfer_count) & 0xff) != (addr & 0xff))
-               printk("%s: RX transfer address mismatch, %#4.4x vs. %#4.4x (actual).\n",
-                          dev->name, ring_offset + xfer_count, addr);
-       }
-       outb_p(saved_config & (~HP_DATAON), nic_base - NIC_OFFSET + HP_CONFIGURE);
-}
-
-static void
-hp_block_output(struct net_device *dev, int count,
-                               const unsigned char *buf, int start_page)
-{
-       int nic_base = dev->base_addr;
-       int saved_config = inb_p(nic_base - NIC_OFFSET + HP_CONFIGURE);
-
-       outb_p(saved_config | HP_DATAON, nic_base - NIC_OFFSET + HP_CONFIGURE);
-       /* Round the count up for word writes.  Do we need to do this?
-          What effect will an odd byte count have on the 8390?
-          I should check someday. */
-       if (ei_status.word16 && (count & 0x01))
-         count++;
-       /* We should already be in page 0, but to be safe... */
-       outb_p(E8390_PAGE0+E8390_START+E8390_NODMA, nic_base);
-
-#ifdef NE8390_RW_BUGFIX
-       /* Handle the read-before-write bug the same way as the
-          Crynwr packet driver -- the NatSemi method doesn't work. */
-       outb_p(0x42, nic_base + EN0_RCNTLO);
-       outb_p(0,       nic_base + EN0_RCNTHI);
-       outb_p(0xff, nic_base + EN0_RSARLO);
-       outb_p(0x00, nic_base + EN0_RSARHI);
-#define NE_CMD         0x00
-       outb_p(E8390_RREAD+E8390_START, nic_base + NE_CMD);
-       /* Make certain that the dummy read has occurred. */
-       inb_p(0x61);
-       inb_p(0x61);
-#endif
-
-       outb_p(count & 0xff, nic_base + EN0_RCNTLO);
-       outb_p(count >> 8,       nic_base + EN0_RCNTHI);
-       outb_p(0x00, nic_base + EN0_RSARLO);
-       outb_p(start_page, nic_base + EN0_RSARHI);
-
-       outb_p(E8390_RWRITE+E8390_START, nic_base);
-       if (ei_status.word16) {
-               /* Use the 'rep' sequence for 16 bit boards. */
-               outsw(nic_base - NIC_OFFSET + HP_DATAPORT, buf, count>>1);
-       } else {
-               outsb(nic_base - NIC_OFFSET + HP_DATAPORT, buf, count);
-       }
-
-       /* DON'T check for 'inb_p(EN0_ISR) & ENISR_RDC' here -- it's broken! */
-
-       /* This is for the ALPHA version only, remove for later releases. */
-       if (ei_debug > 0) {                     /* DMA termination address check... */
-         int high = inb_p(nic_base + EN0_RSARHI);
-         int low  = inb_p(nic_base + EN0_RSARLO);
-         int addr = (high << 8) + low;
-         if ((start_page << 8) + count != addr)
-               printk("%s: TX Transfer address mismatch, %#4.4x vs. %#4.4x.\n",
-                          dev->name, (start_page << 8) + count, addr);
-       }
-       outb_p(saved_config & (~HP_DATAON), nic_base - NIC_OFFSET + HP_CONFIGURE);
-}
-
-/* This function resets the ethercard if something screws up. */
-static void __init
-hp_init_card(struct net_device *dev)
-{
-       int irq = dev->irq;
-       NS8390p_init(dev, 0);
-       outb_p(irqmap[irq&0x0f] | HP_RUN,
-                  dev->base_addr - NIC_OFFSET + HP_CONFIGURE);
-}
-
-#ifdef MODULE
-#define MAX_HP_CARDS   4       /* Max number of HP cards per module */
-static struct net_device *dev_hp[MAX_HP_CARDS];
-static int io[MAX_HP_CARDS];
-static int irq[MAX_HP_CARDS];
-
-module_param_array(io, int, NULL, 0);
-module_param_array(irq, int, NULL, 0);
-MODULE_PARM_DESC(io, "I/O base address(es)");
-MODULE_PARM_DESC(irq, "IRQ number(s) (assigned)");
-MODULE_DESCRIPTION("HP PC-LAN ISA ethernet driver");
-MODULE_LICENSE("GPL");
-
-/* This is set up so that only a single autoprobe takes place per call.
-ISA device autoprobes on a running machine are not recommended. */
-int __init
-init_module(void)
-{
-       struct net_device *dev;
-       int this_dev, found = 0;
-
-       for (this_dev = 0; this_dev < MAX_HP_CARDS; this_dev++) {
-               if (io[this_dev] == 0)  {
-                       if (this_dev != 0) break; /* only autoprobe 1st one */
-                       printk(KERN_NOTICE "hp.c: Presently autoprobing (not recommended) for a single card.\n");
-               }
-               dev = alloc_eip_netdev();
-               if (!dev)
-                       break;
-               dev->irq = irq[this_dev];
-               dev->base_addr = io[this_dev];
-               if (do_hp_probe(dev) == 0) {
-                       dev_hp[found++] = dev;
-                       continue;
-               }
-               free_netdev(dev);
-               printk(KERN_WARNING "hp.c: No HP card found (i/o = 0x%x).\n", io[this_dev]);
-               break;
-       }
-       if (found)
-               return 0;
-       return -ENXIO;
-}
-
-static void cleanup_card(struct net_device *dev)
-{
-       free_irq(dev->irq, dev);
-       release_region(dev->base_addr - NIC_OFFSET, HP_IO_EXTENT);
-}
-
-void __exit
-cleanup_module(void)
-{
-       int this_dev;
-
-       for (this_dev = 0; this_dev < MAX_HP_CARDS; this_dev++) {
-               struct net_device *dev = dev_hp[this_dev];
-               if (dev) {
-                       unregister_netdev(dev);
-                       cleanup_card(dev);
-                       free_netdev(dev);
-               }
-       }
-}
-#endif /* MODULE */