Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland...
[safe/jmp/linux-2.6] / drivers / net / 3c501.c
index 591e7fb..3ea42ff 100644 (file)
@@ -17,7 +17,7 @@
        Annapolis MD 21403
 
     Fixed (again!) the missing interrupt locking on TX/RX shifting.
-               Alan Cox <Alan.Cox@linux.org>
+       Alan Cox <alan@lxorguk.ukuu.org.uk>
 
     Removed calls to init_etherdev since they are no longer needed, and
     cleaned up modularization just a bit. The driver still allows only
     the board. Now getting 150K/second FTP with a 3c501 card. Still playing
     with a TX-TX optimisation to see if we can touch 180-200K/second as seems
     theoretically maximum.
-               19950402 Alan Cox <Alan.Cox@linux.org>
+               19950402 Alan Cox <alan@lxorguk.ukuu.org.uk>
 
     Cleaned up for 2.3.x because we broke SMP now.
-               20000208 Alan Cox <alan@redhat.com>
+               20000208 Alan Cox <alan@lxorguk.ukuu.org.uk>
 
     Check up pass for 2.5. Nothing significant changed
-               20021009 Alan Cox <alan@redhat.com>
+               20021009 Alan Cox <alan@lxorguk.ukuu.org.uk>
 
     Fixed zero fill corner case
-               20030104 Alan Cox <alan@redhat.com>
+               20030104 Alan Cox <alan@lxorguk.ukuu.org.uk>
 
 
    For the avoidance of doubt the "preferred form" of this code is one which
 
 
 static const char version[] =
-       DRV_NAME ".c: " DRV_VERSION " Alan Cox (alan@redhat.com).\n";
+       DRV_NAME ".c: " DRV_VERSION " Alan Cox (alan@lxorguk.ukuu.org.uk).\n";
 
 /*
  *     Braindamage remaining:
@@ -117,7 +117,6 @@ static const char version[] =
 #include <linux/fcntl.h>
 #include <linux/ioport.h>
 #include <linux/interrupt.h>
-#include <linux/slab.h>
 #include <linux/string.h>
 #include <linux/errno.h>
 #include <linux/spinlock.h>
@@ -139,8 +138,8 @@ static const char version[] =
  *     The boilerplate probe code.
  */
 
-static int io=0x280;
-static int irq=5;
+static int io = 0x280;
+static int irq = 5;
 static int mem_start;
 
 /**
@@ -174,8 +173,6 @@ struct net_device * __init el1_probe(int unit)
                mem_start = dev->mem_start & 7;
        }
 
-       SET_MODULE_OWNER(dev);
-
        if (io > 0x1ff) {       /* Check a single specified location. */
                err = el1_probe1(dev, io);
        } else if (io != 0) {
@@ -199,6 +196,17 @@ out:
        return ERR_PTR(err);
 }
 
+static const struct net_device_ops el_netdev_ops = {
+       .ndo_open               = el_open,
+       .ndo_stop               = el1_close,
+       .ndo_start_xmit         = el_start_xmit,
+       .ndo_tx_timeout         = el_timeout,
+       .ndo_set_multicast_list = set_multicast_list,
+       .ndo_change_mtu         = eth_change_mtu,
+       .ndo_set_mac_address    = eth_mac_addr,
+       .ndo_validate_addr      = eth_validate_addr,
+};
+
 /**
  *     el1_probe1:
  *     @dev: The device structure to use
@@ -231,8 +239,7 @@ static int __init el1_probe1(struct net_device *dev, int ioaddr)
         *      Read the station address PROM data from the special port.
         */
 
-       for (i = 0; i < 6; i++)
-       {
+       for (i = 0; i < 6; i++) {
                outw(i, ioaddr + EL1_DATAPTR);
                station_addr[i] = inb(ioaddr + EL1_SAPROM);
        }
@@ -241,29 +248,25 @@ static int __init el1_probe1(struct net_device *dev, int ioaddr)
         *      for the Sager NP943 prefix.
         */
 
-       if (station_addr[0] == 0x02  &&  station_addr[1] == 0x60
-               && station_addr[2] == 0x8c)
-       {
+       if (station_addr[0] == 0x02 && station_addr[1] == 0x60 &&
+           station_addr[2] == 0x8c)
                mname = "3c501";
-       } else if (station_addr[0] == 0x00  &&  station_addr[1] == 0x80
-       && station_addr[2] == 0xC8)
-       {
+       else if (station_addr[0] == 0x00 && station_addr[1] == 0x80 &&
+                station_addr[2] == 0xC8)
                mname = "NP943";
-       }
-       else {
+       else {
                release_region(ioaddr, EL1_IO_EXTENT);
                return -ENODEV;
        }
 
        /*
-        *      We auto-IRQ by shutting off the interrupt line and letting it float
-        *      high.
+        *      We auto-IRQ by shutting off the interrupt line and letting it
+        *      float high.
         */
 
        dev->irq = irq;
 
-       if (dev->irq < 2)
-       {
+       if (dev->irq < 2) {
                unsigned long irq_mask;
 
                irq_mask = probe_irq_on();
@@ -276,9 +279,8 @@ static int __init el1_probe1(struct net_device *dev, int ioaddr)
                mdelay(20);
                autoirq = probe_irq_off(irq_mask);
 
-               if (autoirq == 0)
-               {
-                       printk(KERN_WARNING "%s probe at %#x failed to detect IRQ line.\n",
+               if (autoirq == 0) {
+                       pr_warning("%s probe at %#x failed to detect IRQ line.\n",
                                mname, ioaddr);
                        release_region(ioaddr, EL1_IO_EXTENT);
                        return -EAGAIN;
@@ -294,31 +296,27 @@ static int __init el1_probe1(struct net_device *dev, int ioaddr)
        if (autoirq)
                dev->irq = autoirq;
 
-       printk(KERN_INFO "%s: %s EtherLink at %#lx, using %sIRQ %d.\n", dev->name, mname, dev->base_addr,
+       pr_info("%s: %s EtherLink at %#lx, using %sIRQ %d.\n",
+                       dev->name, mname, dev->base_addr,
                        autoirq ? "auto":"assigned ", dev->irq);
 
 #ifdef CONFIG_IP_MULTICAST
-       printk(KERN_WARNING "WARNING: Use of the 3c501 in a multicast kernel is NOT recommended.\n");
+       pr_warning("WARNING: Use of the 3c501 in a multicast kernel is NOT recommended.\n");
 #endif
 
        if (el_debug)
-               printk(KERN_DEBUG "%s", version);
+               pr_debug("%s", version);
 
-       memset(dev->priv, 0, sizeof(struct net_local));
        lp = netdev_priv(dev);
+       memset(lp, 0, sizeof(struct net_local));
        spin_lock_init(&lp->lock);
 
        /*
         *      The EL1-specific entries in the device structure.
         */
 
-       dev->open = &el_open;
-       dev->hard_start_xmit = &el_start_xmit;
-       dev->tx_timeout = &el_timeout;
+       dev->netdev_ops = &el_netdev_ops;
        dev->watchdog_timeo = HZ;
-       dev->stop = &el1_close;
-       dev->get_stats = &el1_get_stats;
-       dev->set_multicast_list = &set_multicast_list;
        dev->ethtool_ops = &netdev_ethtool_ops;
        return 0;
 }
@@ -344,9 +342,10 @@ static int el_open(struct net_device *dev)
        unsigned long flags;
 
        if (el_debug > 2)
-               printk(KERN_DEBUG "%s: Doing el_open()...", dev->name);
+               pr_debug("%s: Doing el_open()...\n", dev->name);
 
-       if ((retval = request_irq(dev->irq, &el_interrupt, 0, dev->name, dev)))
+       retval = request_irq(dev->irq, el_interrupt, 0, dev->name, dev);
+       if (retval)
                return retval;
 
        spin_lock_irqsave(&lp->lock, flags);
@@ -374,9 +373,10 @@ static void el_timeout(struct net_device *dev)
        int ioaddr = dev->base_addr;
 
        if (el_debug)
-               printk (KERN_DEBUG "%s: transmit timed out, txsr %#2x axsr=%02x rxsr=%02x.\n",
-                       dev->name, inb(TX_STATUS), inb(AX_STATUS), inb(RX_STATUS));
-       lp->stats.tx_errors++;
+               pr_debug("%s: transmit timed out, txsr %#2x axsr=%02x rxsr=%02x.\n",
+                       dev->name, inb(TX_STATUS),
+                       inb(AX_STATUS), inb(RX_STATUS));
+       dev->stats.tx_errors++;
        outb(TX_NORM, TX_CMD);
        outb(RX_NORM, RX_CMD);
        outb(AX_OFF, AX_CMD);   /* Just trigger a false interrupt. */
@@ -408,7 +408,7 @@ static void el_timeout(struct net_device *dev)
  * no real choice.
  */
 
-static int el_start_xmit(struct sk_buff *skb, struct net_device *dev)
+static netdev_tx_t el_start_xmit(struct sk_buff *skb, struct net_device *dev)
 {
        struct net_local *lp = netdev_priv(dev);
        int ioaddr = dev->base_addr;
@@ -428,8 +428,7 @@ static int el_start_xmit(struct sk_buff *skb, struct net_device *dev)
 
        netif_stop_queue(dev);
 
-       do
-       {
+       do {
                int len = skb->len;
                int pad = 0;
                int gp_start;
@@ -438,12 +437,12 @@ static int el_start_xmit(struct sk_buff *skb, struct net_device *dev)
                if (len < ETH_ZLEN)
                        pad = ETH_ZLEN - len;
 
-               gp_start = 0x800 - ( len + pad );
+               gp_start = 0x800 - (len + pad);
 
                lp->tx_pkt_start = gp_start;
-               lp->collisions = 0;
+               lp->collisions = 0;
 
-               lp->stats.tx_bytes += skb->len;
+               dev->stats.tx_bytes += skb->len;
 
                /*
                 *      Command mode with status cleared should [in theory]
@@ -458,45 +457,46 @@ static int el_start_xmit(struct sk_buff *skb, struct net_device *dev)
                lp->txing = 1;
 
                /*
-                *      Turn interrupts back on while we spend a pleasant afternoon
-                *      loading bytes into the board
+                *      Turn interrupts back on while we spend a pleasant
+                *      afternoon loading bytes into the board
                 */
 
                spin_unlock_irqrestore(&lp->lock, flags);
 
-               outw(0x00, RX_BUF_CLR);         /* Set rx packet area to 0. */
-               outw(gp_start, GP_LOW);         /* aim - packet will be loaded into buffer start */
-               outsb(DATAPORT,buf,len);        /* load buffer (usual thing each byte increments the pointer) */
+               /* Set rx packet area to 0. */
+               outw(0x00, RX_BUF_CLR);
+               /* aim - packet will be loaded into buffer start */
+               outw(gp_start, GP_LOW);
+               /* load buffer (usual thing each byte increments the pointer) */
+               outsb(DATAPORT, buf, len);
                if (pad) {
-                       while(pad--)            /* Zero fill buffer tail */
+                       while (pad--)           /* Zero fill buffer tail */
                                outb(0, DATAPORT);
                }
-               outw(gp_start, GP_LOW);         /* the board reuses the same register */
+               /* the board reuses the same register */
+               outw(gp_start, GP_LOW);
 
-               if(lp->loading != 2)
-               {
-                       outb(AX_XMIT, AX_CMD);          /* fire ... Trigger xmit.  */
-                       lp->loading=0;
+               if (lp->loading != 2) {
+                       /* fire ... Trigger xmit.  */
+                       outb(AX_XMIT, AX_CMD);
+                       lp->loading = 0;
                        dev->trans_start = jiffies;
                        if (el_debug > 2)
-                               printk(KERN_DEBUG " queued xmit.\n");
-                       dev_kfree_skb (skb);
-                       return 0;
+                               pr_debug(" queued xmit.\n");
+                       dev_kfree_skb(skb);
+                       return NETDEV_TX_OK;
                }
                /* A receive upset our load, despite our best efforts */
-               if(el_debug>2)
-                       printk(KERN_DEBUG "%s: burped during tx load.\n", dev->name);
+               if (el_debug > 2)
+                       pr_debug("%s: burped during tx load.\n", dev->name);
                spin_lock_irqsave(&lp->lock, flags);
-       }
-       while(1);
-
+       } while (1);
 }
 
 /**
  * el_interrupt:
  * @irq: Interrupt number
  * @dev_id: The 3c501 that burped
- * @regs: Register data (surplus to our requirements)
  *
  * Handle the ether interface interrupts. The 3c501 needs a lot more
  * hand holding than most cards. In particular we get a transmit interrupt
@@ -515,7 +515,7 @@ static int el_start_xmit(struct sk_buff *skb, struct net_device *dev)
  * TCP window.
  */
 
-static irqreturn_t el_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+static irqreturn_t el_interrupt(int irq, void *dev_id)
 {
        struct net_device *dev = dev_id;
        struct net_local *lp;
@@ -538,137 +538,121 @@ static irqreturn_t el_interrupt(int irq, void *dev_id, struct pt_regs *regs)
         */
 
        if (el_debug > 3)
-               printk(KERN_DEBUG "%s: el_interrupt() aux=%#02x", dev->name, axsr);
-
-        if(lp->loading==1 && !lp->txing)
-               printk(KERN_WARNING "%s: Inconsistent state loading while not in tx\n",
-                       dev->name);
-
-       if (lp->txing)
-       {
+               pr_debug("%s: el_interrupt() aux=%#02x\n", dev->name, axsr);
 
-               /*
-                *      Board in transmit mode. May be loading. If we are
-                *      loading we shouldn't have got this.
-                */
+       if (lp->loading == 1 && !lp->txing)
+               pr_warning("%s: Inconsistent state loading while not in tx\n",
+                       dev->name);
 
+       if (lp->txing) {
+               /*
+                *      Board in transmit mode. May be loading. If we are
+                *      loading we shouldn't have got this.
+                */
                int txsr = inb(TX_STATUS);
 
-               if(lp->loading==1)
-               {
-                       if(el_debug > 2)
-                       {
-                               printk(KERN_DEBUG "%s: Interrupt while loading [", dev->name);
-                               printk(KERN_DEBUG " txsr=%02x gp=%04x rp=%04x]\n", txsr, inw(GP_LOW),inw(RX_LOW));
-                       }
-                       lp->loading=2;          /* Force a reload */
+               if (lp->loading == 1) {
+                       if (el_debug > 2)
+                               pr_debug("%s: Interrupt while loading [txsr=%02x gp=%04x rp=%04x]\n",
+                                       dev->name, txsr, inw(GP_LOW), inw(RX_LOW));
+
+                       /* Force a reload */
+                       lp->loading = 2;
                        spin_unlock(&lp->lock);
                        goto out;
                }
-
                if (el_debug > 6)
-                       printk(KERN_DEBUG " txsr=%02x gp=%04x rp=%04x", txsr, inw(GP_LOW),inw(RX_LOW));
+                       pr_debug("%s: txsr=%02x gp=%04x rp=%04x\n", dev->name,
+                                       txsr, inw(GP_LOW), inw(RX_LOW));
 
-               if ((axsr & 0x80) && (txsr & TX_READY) == 0)
-               {
+               if ((axsr & 0x80) && (txsr & TX_READY) == 0) {
                        /*
-                        *      FIXME: is there a logic to whether to keep on trying or
-                        *      reset immediately ?
+                        *      FIXME: is there a logic to whether to keep
+                        *      on trying or reset immediately ?
                         */
-                       if(el_debug>1)
-                               printk(KERN_DEBUG "%s: Unusual interrupt during Tx, txsr=%02x axsr=%02x"
-                                       " gp=%03x rp=%03x.\n", dev->name, txsr, axsr,
-                       inw(ioaddr + EL1_DATAPTR), inw(ioaddr + EL1_RXPTR));
+                       if (el_debug > 1)
+                               pr_debug("%s: Unusual interrupt during Tx, txsr=%02x axsr=%02x gp=%03x rp=%03x.\n",
+                                       dev->name, txsr, axsr,
+                                       inw(ioaddr + EL1_DATAPTR),
+                                       inw(ioaddr + EL1_RXPTR));
                        lp->txing = 0;
                        netif_wake_queue(dev);
-               }
-               else if (txsr & TX_16COLLISIONS)
-               {
+               } else if (txsr & TX_16COLLISIONS) {
                        /*
                         *      Timed out
                         */
                        if (el_debug)
-                               printk (KERN_DEBUG "%s: Transmit failed 16 times, Ethernet jammed?\n",dev->name);
+                               pr_debug("%s: Transmit failed 16 times, Ethernet jammed?\n", dev->name);
                        outb(AX_SYS, AX_CMD);
                        lp->txing = 0;
-                       lp->stats.tx_aborted_errors++;
+                       dev->stats.tx_aborted_errors++;
                        netif_wake_queue(dev);
-               }
-               else if (txsr & TX_COLLISION)
-               {
+               } else if (txsr & TX_COLLISION) {
                        /*
                         *      Retrigger xmit.
                         */
 
                        if (el_debug > 6)
-                               printk(KERN_DEBUG " retransmitting after a collision.\n");
+                               pr_debug("%s: retransmitting after a collision.\n", dev->name);
                        /*
-                        *      Poor little chip can't reset its own start pointer
+                        *      Poor little chip can't reset its own start
+                        *      pointer
                         */
 
                        outb(AX_SYS, AX_CMD);
                        outw(lp->tx_pkt_start, GP_LOW);
                        outb(AX_XMIT, AX_CMD);
-                       lp->stats.collisions++;
+                       dev->stats.collisions++;
                        spin_unlock(&lp->lock);
                        goto out;
-               }
-               else
-               {
+               } else {
                        /*
                         *      It worked.. we will now fall through and receive
                         */
-                       lp->stats.tx_packets++;
+                       dev->stats.tx_packets++;
                        if (el_debug > 6)
-                               printk(KERN_DEBUG " Tx succeeded %s\n",
-                                       (txsr & TX_RDY) ? "." : "but tx is busy!");
+                               pr_debug("%s: Tx succeeded %s\n", dev->name,
+                                       (txsr & TX_RDY) ? "." : "but tx is busy!");
                        /*
                         *      This is safe the interrupt is atomic WRT itself.
                         */
-
                        lp->txing = 0;
-                       netif_wake_queue(dev);  /* In case more to transmit */
+                       /* In case more to transmit */
+                       netif_wake_queue(dev);
                }
-       }
-       else
-       {
-               /*
-                *      In receive mode.
-                */
+       } else {
+               /*
+                *      In receive mode.
+                */
 
                int rxsr = inb(RX_STATUS);
                if (el_debug > 5)
-                       printk(KERN_DEBUG " rxsr=%02x txsr=%02x rp=%04x", rxsr, inb(TX_STATUS),inw(RX_LOW));
+                       pr_debug("%s: rxsr=%02x txsr=%02x rp=%04x\n",
+                               dev->name, rxsr, inb(TX_STATUS), inw(RX_LOW));
                /*
                 *      Just reading rx_status fixes most errors.
                 */
                if (rxsr & RX_MISSED)
-                       lp->stats.rx_missed_errors++;
-               else if (rxsr & RX_RUNT)
-               {       /* Handled to avoid board lock-up. */
-                       lp->stats.rx_length_errors++;
+                       dev->stats.rx_missed_errors++;
+               else if (rxsr & RX_RUNT) {
+                       /* Handled to avoid board lock-up. */
+                       dev->stats.rx_length_errors++;
                        if (el_debug > 5)
-                               printk(KERN_DEBUG " runt.\n");
-               }
-               else if (rxsr & RX_GOOD)
-               {
+                               pr_debug("%s: runt.\n", dev->name);
+               } else if (rxsr & RX_GOOD) {
                        /*
                         *      Receive worked.
                         */
                        el_receive(dev);
-               }
-               else
-               {
+               } else {
                        /*
                         *      Nothing?  Something is broken!
                         */
                        if (el_debug > 2)
-                               printk(KERN_DEBUG "%s: No packet seen, rxsr=%02x **resetting 3c501***\n",
+                               pr_debug("%s: No packet seen, rxsr=%02x **resetting 3c501***\n",
                                        dev->name, rxsr);
                        el_reset(dev);
                }
-               if (el_debug > 3)
-                       printk(KERN_DEBUG ".\n");
        }
 
        /*
@@ -697,7 +681,6 @@ out:
 
 static void el_receive(struct net_device *dev)
 {
-       struct net_local *lp = netdev_priv(dev);
        int ioaddr = dev->base_addr;
        int pkt_len;
        struct sk_buff *skb;
@@ -705,13 +688,13 @@ static void el_receive(struct net_device *dev)
        pkt_len = inw(RX_LOW);
 
        if (el_debug > 4)
-               printk(KERN_DEBUG " el_receive %d.\n", pkt_len);
+               pr_debug(" el_receive %d.\n", pkt_len);
 
-       if ((pkt_len < 60)  ||  (pkt_len > 1536))
-       {
+       if (pkt_len < 60 || pkt_len > 1536) {
                if (el_debug)
-                       printk(KERN_DEBUG "%s: bogus packet, length=%d\n", dev->name, pkt_len);
-               lp->stats.rx_over_errors++;
+                       pr_debug("%s: bogus packet, length=%d\n",
+                                               dev->name, pkt_len);
+               dev->stats.rx_over_errors++;
                return;
        }
 
@@ -727,27 +710,22 @@ static void el_receive(struct net_device *dev)
         */
 
        outw(0x00, GP_LOW);
-       if (skb == NULL)
-       {
-               printk(KERN_INFO "%s: Memory squeeze, dropping packet.\n", dev->name);
-               lp->stats.rx_dropped++;
+       if (skb == NULL) {
+               pr_info("%s: Memory squeeze, dropping packet.\n", dev->name);
+               dev->stats.rx_dropped++;
                return;
-       }
-       else
-       {
-               skb_reserve(skb,2);     /* Force 16 byte alignment */
-               skb->dev = dev;
+       } else {
+               skb_reserve(skb, 2);    /* Force 16 byte alignment */
                /*
                 *      The read increments through the bytes. The interrupt
                 *      handler will fix the pointer when it returns to
                 *      receive mode.
                 */
-               insb(DATAPORT, skb_put(skb,pkt_len), pkt_len);
-               skb->protocol=eth_type_trans(skb,dev);
+               insb(DATAPORT, skb_put(skb, pkt_len), pkt_len);
+               skb->protocol = eth_type_trans(skb, dev);
                netif_rx(skb);
-               dev->last_rx = jiffies;
-               lp->stats.rx_packets++;
-               lp->stats.rx_bytes+=pkt_len;
+               dev->stats.rx_packets++;
+               dev->stats.rx_bytes += pkt_len;
        }
        return;
 }
@@ -766,10 +744,11 @@ static void  el_reset(struct net_device *dev)
        struct net_local *lp = netdev_priv(dev);
        int ioaddr = dev->base_addr;
 
-       if (el_debug> 2)
-               printk(KERN_INFO "3c501 reset...");
+       if (el_debug > 2)
+               pr_info("3c501 reset...\n");
        outb(AX_RESET, AX_CMD);         /* Reset the chip */
-       outb(AX_LOOP, AX_CMD);          /* Aux control, irq and loopback enabled */
+       /* Aux control, irq and loopback enabled */
+       outb(AX_LOOP, AX_CMD);
        {
                int i;
                for (i = 0; i < 6; i++) /* Set the station address. */
@@ -800,7 +779,8 @@ static int el1_close(struct net_device *dev)
        int ioaddr = dev->base_addr;
 
        if (el_debug > 2)
-               printk(KERN_INFO "%s: Shutting down Ethernet card at %#x.\n", dev->name, ioaddr);
+               pr_info("%s: Shutting down Ethernet card at %#x.\n",
+                                               dev->name, ioaddr);
 
        netif_stop_queue(dev);
 
@@ -815,23 +795,6 @@ static int el1_close(struct net_device *dev)
 }
 
 /**
- * el1_get_stats:
- * @dev: The card to get the statistics for
- *
- * In smarter devices this function is needed to pull statistics off the
- * board itself. The 3c501 has no hardware statistics. We maintain them all
- * so they are by definition always up to date.
- *
- * Returns the statistics for the card from the card private data
- */
-
-static struct net_device_stats *el1_get_stats(struct net_device *dev)
-{
-       struct net_local *lp = netdev_priv(dev);
-       return &lp->stats;
-}
-
-/**
  * set_multicast_list:
  * @dev: The device to adjust
  *
@@ -845,18 +808,14 @@ static void set_multicast_list(struct net_device *dev)
 {
        int ioaddr = dev->base_addr;
 
-       if(dev->flags&IFF_PROMISC)
-       {
+       if (dev->flags & IFF_PROMISC) {
                outb(RX_PROM, RX_CMD);
                inb(RX_STATUS);
-       }
-       else if (dev->mc_list || dev->flags&IFF_ALLMULTI)
-       {
-               outb(RX_MULT, RX_CMD);  /* Multicast or all multicast is the same */
+       } else if (!netdev_mc_empty(dev) || dev->flags & IFF_ALLMULTI) {
+               /* Multicast or all multicast is the same */
+               outb(RX_MULT, RX_CMD);
                inb(RX_STATUS);         /* Clear status. */
-       }
-       else
-       {
+       } else {
                outb(RX_NORM, RX_CMD);
                inb(RX_STATUS);
        }
@@ -881,7 +840,7 @@ static void netdev_set_msglevel(struct net_device *dev, u32 level)
        debug = level;
 }
 
-static struct ethtool_ops netdev_ethtool_ops = {
+static const struct ethtool_ops netdev_ethtool_ops = {
        .get_drvinfo            = netdev_get_drvinfo,
        .get_msglevel           = netdev_get_msglevel,
        .set_msglevel           = netdev_set_msglevel,
@@ -923,7 +882,7 @@ int __init init_module(void)
  * and then free up the resources we took when the card was found.
  */
 
-void cleanup_module(void)
+void __exit cleanup_module(void)
 {
        struct net_device *dev = dev_3c501;
        unregister_netdev(dev);