ixgbe: Refactor common code between 82598 & 82599 to accommodate new hardware
[safe/jmp/linux-2.6] / drivers / net / 3c523.c
index b40885d..a7b0e5e 100644 (file)
@@ -83,7 +83,7 @@
        Stuart Adamson <stuart.adamson@compsoc.net>
    Nov 2001
    added support for ethtool (jgarzik)
-       
+
    $Header: /fsys2/home/chrisb/linux-1.3.59-MCA/drivers/net/RCS/3c523.c,v 1.1 1996/02/05 01:53:46 chrisb Exp chrisb $
  */
 
@@ -99,7 +99,6 @@
 #include <linux/errno.h>
 #include <linux/ioport.h>
 #include <linux/skbuff.h>
-#include <linux/slab.h>
 #include <linux/interrupt.h>
 #include <linux/delay.h>
 #include <linux/mca-legacy.h>
@@ -176,20 +175,20 @@ sizeof(nop_cmd) = 8;
     if(!p->scb->cmd) break; \
     DELAY_16(); \
     if(i == 1023) { \
-      printk(KERN_WARNING "%s:%d: scb_cmd timed out .. resetting i82586\n",\
+      pr_warning("%s:%d: scb_cmd timed out .. resetting i82586\n",\
        dev->name,__LINE__); \
       elmc_id_reset586(); } } }
 
-static irqreturn_t elmc_interrupt(int irq, void *dev_id, struct pt_regs *reg_ptr);
+static irqreturn_t elmc_interrupt(int irq, void *dev_id);
 static int elmc_open(struct net_device *dev);
 static int elmc_close(struct net_device *dev);
-static int elmc_send_packet(struct sk_buff *, struct net_device *);
+static netdev_tx_t elmc_send_packet(struct sk_buff *, struct net_device *);
 static struct net_device_stats *elmc_get_stats(struct net_device *dev);
 static void elmc_timeout(struct net_device *dev);
 #ifdef ELMC_MULTICAST
 static void set_multicast_list(struct net_device *dev);
 #endif
-static struct ethtool_ops netdev_ethtool_ops;
+static const struct ethtool_ops netdev_ethtool_ops;
 
 /* helper-functions */
 static int init586(struct net_device *dev);
@@ -202,7 +201,6 @@ static void elmc_xmt_int(struct net_device *dev);
 static void elmc_rnr_int(struct net_device *dev);
 
 struct priv {
-       struct net_device_stats stats;
        unsigned long base;
        char *memtop;
        unsigned long mapped_start;             /* Start of ioremap */
@@ -289,10 +287,10 @@ static int elmc_open(struct net_device *dev)
 
        elmc_id_attn586();      /* disable interrupts */
 
-       ret = request_irq(dev->irq, &elmc_interrupt, SA_SHIRQ | SA_SAMPLE_RANDOM,
+       ret = request_irq(dev->irq, elmc_interrupt, IRQF_SHARED | IRQF_SAMPLE_RANDOM,
                          dev->name, dev);
        if (ret) {
-               printk(KERN_ERR "%s: couldn't get irq %d\n", dev->name, dev->irq);
+               pr_err("%s: couldn't get irq %d\n", dev->name, dev->irq);
                elmc_id_reset586();
                return ret;
        }
@@ -309,7 +307,7 @@ static int elmc_open(struct net_device *dev)
 
 static int __init check586(struct net_device *dev, unsigned long where, unsigned size)
 {
-       struct priv *p = (struct priv *) dev->priv;
+       struct priv *p = netdev_priv(dev);
        char *iscp_addrs[2];
        int i = 0;
 
@@ -348,9 +346,9 @@ static int __init check586(struct net_device *dev, unsigned long where, unsigned
  * set iscp at the right place, called by elmc_probe and open586.
  */
 
-void alloc586(struct net_device *dev)
+static void alloc586(struct net_device *dev)
 {
-       struct priv *p = (struct priv *) dev->priv;
+       struct priv *p = netdev_priv(dev);
 
        elmc_id_reset586();
        DELAY(2);
@@ -372,9 +370,9 @@ void alloc586(struct net_device *dev)
 
        DELAY(2);
 
-       if (p->iscp->busy) {
-               printk(KERN_ERR "%s: Init-Problems (alloc).\n", dev->name);
-       }
+       if (p->iscp->busy)
+               pr_err("%s: Init-Problems (alloc).\n", dev->name);
+
        memset((char *) p->scb, 0, sizeof(struct scb_struct));
 }
 
@@ -383,8 +381,7 @@ void alloc586(struct net_device *dev)
 static int elmc_getinfo(char *buf, int slot, void *d)
 {
        int len = 0;
-       struct net_device *dev = (struct net_device *) d;
-       int i;
+       struct net_device *dev = d;
 
        if (dev == NULL)
                return len;
@@ -399,16 +396,26 @@ static int elmc_getinfo(char *buf, int slot, void *d)
        len += sprintf(buf + len, "Transceiver: %s\n", dev->if_port ?
                       "External" : "Internal");
        len += sprintf(buf + len, "Device: %s\n", dev->name);
-       len += sprintf(buf + len, "Hardware Address:");
-       for (i = 0; i < 6; i++) {
-               len += sprintf(buf + len, " %02x", dev->dev_addr[i]);
-       }
-       buf[len++] = '\n';
-       buf[len] = 0;
+       len += sprintf(buf + len, "Hardware Address: %pM\n",
+                      dev->dev_addr);
 
        return len;
 }                              /* elmc_getinfo() */
 
+static const struct net_device_ops netdev_ops = {
+       .ndo_open               = elmc_open,
+       .ndo_stop               = elmc_close,
+       .ndo_get_stats          = elmc_get_stats,
+       .ndo_start_xmit         = elmc_send_packet,
+       .ndo_tx_timeout         = elmc_timeout,
+#ifdef ELMC_MULTICAST
+       .ndo_set_multicast_list = set_multicast_list,
+#endif
+       .ndo_change_mtu         = eth_change_mtu,
+       .ndo_set_mac_address    = eth_mac_addr,
+       .ndo_validate_addr      = eth_validate_addr,
+};
+
 /*****************************************************************/
 
 static int __init do_elmc_probe(struct net_device *dev)
@@ -421,9 +428,8 @@ static int __init do_elmc_probe(struct net_device *dev)
        int i = 0;
        unsigned int size = 0;
        int retval;
-       struct priv *pr = dev->priv;
+       struct priv *pr = netdev_priv(dev);
 
-       SET_MODULE_OWNER(dev);
        if (MCA_bus == 0) {
                return -ENODEV;
        }
@@ -434,14 +440,14 @@ static int __init do_elmc_probe(struct net_device *dev)
 
                dev->irq=irq_table[(status & ELMC_STATUS_IRQ_SELECT) >> 6];
                dev->base_addr=csr_table[(status & ELMC_STATUS_CSR_SELECT) >> 1];
-               
+
                /*
                   If we're trying to match a specified irq or IO address,
                   we'll reject a match unless it's what we're looking for.
                   Also reject it if the card is already in use.
                 */
 
-               if ((irq && irq != dev->irq) || 
+               if ((irq && irq != dev->irq) ||
                    (base_addr && base_addr != dev->base_addr)) {
                        slot = mca_find_adapter(ELMC_MCA_ID, slot + 1);
                        continue;
@@ -463,7 +469,7 @@ static int __init do_elmc_probe(struct net_device *dev)
        mca_set_adapter_procfn(slot, (MCA_ProcFn) elmc_getinfo, dev);
 
        /* if we get this far, adapter has been found - carry on */
-       printk(KERN_INFO "%s: 3c523 adapter found in slot %d\n", dev->name, slot + 1);
+       pr_info("%s: 3c523 adapter found in slot %d\n", dev->name, slot + 1);
 
        /* Now we extract configuration info from the card.
           The 3c523 provides information in two of the POS registers, but
@@ -497,10 +503,9 @@ static int __init do_elmc_probe(struct net_device *dev)
                break;
        }
 
-       memset(pr, 0, sizeof(struct priv));
        pr->slot = slot;
 
-       printk(KERN_INFO "%s: 3Com 3c523 Rev 0x%x at %#lx\n", dev->name, (int) revision,
+       pr_info("%s: 3Com 3c523 Rev 0x%x at %#lx\n", dev->name, (int) revision,
               dev->base_addr);
 
        /* Determine if we're using the on-board transceiver (i.e. coax) or
@@ -522,7 +527,7 @@ static int __init do_elmc_probe(struct net_device *dev)
 
        size = 0x4000;          /* check for 16K mem */
        if (!check586(dev, dev->mem_start, size)) {
-               printk(KERN_ERR "%s: memprobe, Can't find memory at 0x%lx!\n", dev->name,
+               pr_err("%s: memprobe, Can't find memory at 0x%lx!\n", dev->name,
                       dev->mem_start);
                retval = -ENODEV;
                goto err_out;
@@ -539,32 +544,22 @@ static int __init do_elmc_probe(struct net_device *dev)
        pr->num_recv_buffs = NUM_RECV_BUFFS_16;
 
        /* dump all the assorted information */
-       printk(KERN_INFO "%s: IRQ %d, %sternal xcvr, memory %#lx-%#lx.\n", dev->name,
-              dev->irq, dev->if_port ? "ex" : "in", 
+       pr_info("%s: IRQ %d, %sternal xcvr, memory %#lx-%#lx.\n", dev->name,
+              dev->irq, dev->if_port ? "ex" : "in",
               dev->mem_start, dev->mem_end - 1);
 
        /* The hardware address for the 3c523 is stored in the first six
           bytes of the IO address. */
-       printk(KERN_INFO "%s: hardware address ", dev->name);
-       for (i = 0; i < 6; i++) {
+       for (i = 0; i < 6; i++)
                dev->dev_addr[i] = inb(dev->base_addr + i);
-               printk(" %02x", dev->dev_addr[i]);
-       }
-       printk("\n");
 
-       dev->open = &elmc_open;
-       dev->stop = &elmc_close;
-       dev->get_stats = &elmc_get_stats;
-       dev->hard_start_xmit = &elmc_send_packet;
-       dev->tx_timeout = &elmc_timeout;
+       pr_info("%s: hardware address %pM\n",
+              dev->name, dev->dev_addr);
+
+       dev->netdev_ops = &netdev_ops;
        dev->watchdog_timeo = HZ;
-#ifdef ELMC_MULTICAST
-       dev->set_multicast_list = &set_multicast_list;
-#else
-       dev->set_multicast_list = NULL;
-#endif
        dev->ethtool_ops = &netdev_ethtool_ops;
-       
+
        /* note that we haven't actually requested the IRQ from the kernel.
           That gets done in elmc_open().  I'm not sure that's such a good idea,
           but it works, so I'll go with it. */
@@ -583,14 +578,15 @@ err_out:
        release_region(dev->base_addr, ELMC_IO_EXTENT);
        return retval;
 }
+
+#ifdef MODULE
 static void cleanup_card(struct net_device *dev)
 {
-       mca_set_adapter_procfn(((struct priv *) (dev->priv))->slot, NULL, NULL);
+       mca_set_adapter_procfn(((struct priv *)netdev_priv(dev))->slot,
+                               NULL, NULL);
        release_region(dev->base_addr, ELMC_IO_EXTENT);
 }
-
-#ifndef MODULE
+#else
 struct net_device * __init elmc_probe(int unit)
 {
        struct net_device *dev = alloc_etherdev(sizeof(struct priv));
@@ -622,13 +618,13 @@ static int init586(struct net_device *dev)
        void *ptr;
        unsigned long s;
        int i, result = 0;
-       struct priv *p = (struct priv *) dev->priv;
+       struct priv *p = netdev_priv(dev);
        volatile struct configure_cmd_struct *cfg_cmd;
        volatile struct iasetup_cmd_struct *ias_cmd;
        volatile struct tdr_cmd_struct *tdr_cmd;
        volatile struct mcsetup_cmd_struct *mc_cmd;
-       struct dev_mc_list *dmi = dev->mc_list;
-       int num_addrs = dev->mc_count;
+       struct netdev_hw_addr *ha;
+       int num_addrs = netdev_mc_count(dev);
 
        ptr = (void *) ((char *) p->scb + sizeof(struct scb_struct));
 
@@ -646,10 +642,8 @@ static int init586(struct net_device *dev)
        cfg_cmd->time_low = 0x00;
        cfg_cmd->time_high = 0xf2;
        cfg_cmd->promisc = 0;
-       if (dev->flags & (IFF_ALLMULTI | IFF_PROMISC)) {
+       if (dev->flags & (IFF_ALLMULTI | IFF_PROMISC))
                cfg_cmd->promisc = 1;
-               dev->flags |= IFF_PROMISC;
-       }
        cfg_cmd->carr_coll = 0x00;
 
        p->scb->cbl_offset = make16(cfg_cmd);
@@ -664,7 +658,7 @@ static int init586(struct net_device *dev)
        }
 
        if ((cfg_cmd->cmd_status & (STAT_OK | STAT_COMPL)) != (STAT_COMPL | STAT_OK)) {
-               printk(KERN_WARNING "%s (elmc): configure command failed: %x\n", dev->name, cfg_cmd->cmd_status);
+               pr_warning("%s (elmc): configure command failed: %x\n", dev->name, cfg_cmd->cmd_status);
                return 1;
        }
        /*
@@ -690,7 +684,8 @@ static int init586(struct net_device *dev)
        }
 
        if ((ias_cmd->cmd_status & (STAT_OK | STAT_COMPL)) != (STAT_OK | STAT_COMPL)) {
-               printk(KERN_WARNING "%s (elmc): individual address setup command failed: %04x\n", dev->name, ias_cmd->cmd_status);
+               pr_warning("%s (elmc): individual address setup command failed: %04x\n",
+                       dev->name, ias_cmd->cmd_status);
                return 1;
        }
        /*
@@ -711,7 +706,7 @@ static int init586(struct net_device *dev)
        s = jiffies;
        while (!(tdr_cmd->cmd_status & STAT_COMPL)) {
                if (time_after(jiffies, s + 30*HZ/100)) {
-                       printk(KERN_WARNING "%s: %d Problems while running the TDR.\n", dev->name, __LINE__);
+                       pr_warning("%s: %d Problems while running the TDR.\n", dev->name, __LINE__);
                        result = 1;
                        break;
                }
@@ -727,14 +722,14 @@ static int init586(struct net_device *dev)
                if (result & TDR_LNK_OK) {
                        /* empty */
                } else if (result & TDR_XCVR_PRB) {
-                       printk(KERN_WARNING "%s: TDR: Transceiver problem!\n", dev->name);
+                       pr_warning("%s: TDR: Transceiver problem!\n", dev->name);
                } else if (result & TDR_ET_OPN) {
-                       printk(KERN_WARNING "%s: TDR: No correct termination %d clocks away.\n", dev->name, result & TDR_TIMEMASK);
+                       pr_warning("%s: TDR: No correct termination %d clocks away.\n", dev->name, result & TDR_TIMEMASK);
                } else if (result & TDR_ET_SRT) {
                        if (result & TDR_TIMEMASK)      /* time == 0 -> strange :-) */
-                               printk(KERN_WARNING "%s: TDR: Detected a short circuit %d clocks away.\n", dev->name, result & TDR_TIMEMASK);
+                               pr_warning("%s: TDR: Detected a short circuit %d clocks away.\n", dev->name, result & TDR_TIMEMASK);
                } else {
-                       printk(KERN_WARNING "%s: TDR: Unknown status %04x\n", dev->name, result);
+                       pr_warning("%s: TDR: Unknown status %04x\n", dev->name, result);
                }
        }
        /*
@@ -774,15 +769,15 @@ static int init586(struct net_device *dev)
         * Multicast setup
         */
 
-       if (dev->mc_count) {
+       if (num_addrs) {
                /* I don't understand this: do we really need memory after the init? */
                int len = ((char *) p->iscp - (char *) ptr - 8) / 6;
                if (len <= 0) {
-                       printk(KERN_ERR "%s: Ooooops, no memory for MC-Setup!\n", dev->name);
+                       pr_err("%s: Ooooops, no memory for MC-Setup!\n", dev->name);
                } else {
                        if (len < num_addrs) {
                                num_addrs = len;
-                               printk(KERN_WARNING "%s: Sorry, can only apply %d MC-Address(es).\n",
+                               pr_warning("%s: Sorry, can only apply %d MC-Address(es).\n",
                                       dev->name, num_addrs);
                        }
                        mc_cmd = (struct mcsetup_cmd_struct *) ptr;
@@ -790,10 +785,10 @@ static int init586(struct net_device *dev)
                        mc_cmd->cmd_cmd = CMD_MCSETUP | CMD_LAST;
                        mc_cmd->cmd_link = 0xffff;
                        mc_cmd->mc_cnt = num_addrs * 6;
-                       for (i = 0; i < num_addrs; i++) {
-                               memcpy((char *) mc_cmd->mc_list[i], dmi->dmi_addr, 6);
-                               dmi = dmi->next;
-                       }
+                       i = 0;
+                       netdev_for_each_mc_addr(ha, dev)
+                               memcpy((char *) mc_cmd->mc_list[i++],
+                                      ha->addr, 6);
                        p->scb->cbl_offset = make16(mc_cmd);
                        p->scb->cmd = CUC_START;
                        elmc_id_attn586();
@@ -803,7 +798,7 @@ static int init586(struct net_device *dev)
                                        break;
                        }
                        if (!(mc_cmd->cmd_status & STAT_COMPL)) {
-                               printk(KERN_WARNING "%s: Can't apply multicast-address-list.\n", dev->name);
+                               pr_warning("%s: Can't apply multicast-address-list.\n", dev->name);
                        }
                }
        }
@@ -816,7 +811,7 @@ static int init586(struct net_device *dev)
                p->xmit_buffs[i] = (struct tbd_struct *) ptr;   /* TBD */
                ptr = (char *) ptr + sizeof(struct tbd_struct);
                if ((void *) ptr > (void *) p->iscp) {
-                       printk(KERN_ERR "%s: not enough shared-mem for your configuration!\n", dev->name);
+                       pr_err("%s: not enough shared-mem for your configuration!\n", dev->name);
                        return 1;
                }
                memset((char *) (p->xmit_cmds[i]), 0, sizeof(struct transmit_cmd_struct));
@@ -860,7 +855,7 @@ static void *alloc_rfa(struct net_device *dev, void *ptr)
        volatile struct rfd_struct *rfd = (struct rfd_struct *) ptr;
        volatile struct rbd_struct *rbd;
        int i;
-       struct priv *p = (struct priv *) dev->priv;
+       struct priv *p = netdev_priv(dev);
 
        memset((char *) rfd, 0, sizeof(struct rfd_struct) * p->num_recv_buffs);
        p->rfd_first = rfd;
@@ -900,16 +895,13 @@ static void *alloc_rfa(struct net_device *dev, void *ptr)
  */
 
 static irqreturn_t
-elmc_interrupt(int irq, void *dev_id, struct pt_regs *reg_ptr)
+elmc_interrupt(int irq, void *dev_id)
 {
-       struct net_device *dev = (struct net_device *) dev_id;
+       struct net_device *dev = dev_id;
        unsigned short stat;
        struct priv *p;
 
-       if (dev == NULL) {
-               printk(KERN_ERR "elmc-interrupt: irq %d for unknown device.\n", (int) -(((struct pt_regs *) reg_ptr)->orig_eax + 2));
-               return IRQ_NONE;
-       } else if (!netif_running(dev)) {
+       if (!netif_running(dev)) {
                /* The 3c523 has this habit of generating interrupts during the
                   reset.  I'm not sure if the ni52 has this same problem, but it's
                   really annoying if we haven't finished initializing it.  I was
@@ -924,9 +916,9 @@ elmc_interrupt(int irq, void *dev_id, struct pt_regs *reg_ptr)
        }
        /* reading ELMC_CTRL also clears the INT bit. */
 
-       p = (struct priv *) dev->priv;
+       p = netdev_priv(dev);
 
-       while ((stat = p->scb->status & STAT_MASK)) 
+       while ((stat = p->scb->status & STAT_MASK))
        {
                p->scb->cmd = stat;
                elmc_attn586(); /* ack inter. */
@@ -943,7 +935,8 @@ elmc_interrupt(int irq, void *dev_id, struct pt_regs *reg_ptr)
                if (stat & STAT_CNA) {
                        /* CU went 'not ready' */
                        if (netif_running(dev)) {
-                               printk(KERN_WARNING "%s: oops! CU has left active state. stat: %04x/%04x.\n", dev->name, (int) stat, (int) p->scb->status);
+                               pr_warning("%s: oops! CU has left active state. stat: %04x/%04x.\n",
+                                       dev->name, (int) stat, (int) p->scb->status);
                        }
                }
 #endif
@@ -958,7 +951,8 @@ elmc_interrupt(int irq, void *dev_id, struct pt_regs *reg_ptr)
                                p->scb->cmd = RUC_RESUME;
                                elmc_attn586();
                        } else {
-                               printk(KERN_WARNING "%s: Receiver-Unit went 'NOT READY': %04x/%04x.\n", dev->name, (int) stat, (int) p->scb->status);
+                               pr_warning("%s: Receiver-Unit went 'NOT READY': %04x/%04x.\n",
+                                       dev->name, (int) stat, (int) p->scb->status);
                                elmc_rnr_int(dev);
                        }
                }
@@ -980,7 +974,7 @@ static void elmc_rcv_int(struct net_device *dev)
        unsigned short totlen;
        struct sk_buff *skb;
        struct rbd_struct *rbd;
-       struct priv *p = (struct priv *) dev->priv;
+       struct priv *p = netdev_priv(dev);
 
        for (; (status = p->rfd_top->status) & STAT_COMPL;) {
                rbd = (struct rbd_struct *) make32(p->rfd_top->rbd_offset);
@@ -991,25 +985,23 @@ static void elmc_rcv_int(struct net_device *dev)
                                rbd->status = 0;
                                skb = (struct sk_buff *) dev_alloc_skb(totlen + 2);
                                if (skb != NULL) {
-                                       skb->dev = dev;
                                        skb_reserve(skb, 2);    /* 16 byte alignment */
                                        skb_put(skb,totlen);
-                                       eth_copy_and_sum(skb, (char *) p->base+(unsigned long) rbd->buffer,totlen,0);
+                                       skb_copy_to_linear_data(skb, (char *) p->base+(unsigned long) rbd->buffer,totlen);
                                        skb->protocol = eth_type_trans(skb, dev);
                                        netif_rx(skb);
-                                       dev->last_rx = jiffies;
-                                       p->stats.rx_packets++;
-                                       p->stats.rx_bytes += totlen;
+                                       dev->stats.rx_packets++;
+                                       dev->stats.rx_bytes += totlen;
                                } else {
-                                       p->stats.rx_dropped++;
+                                       dev->stats.rx_dropped++;
                                }
                        } else {
-                               printk(KERN_WARNING "%s: received oversized frame.\n", dev->name);
-                               p->stats.rx_dropped++;
+                               pr_warning("%s: received oversized frame.\n", dev->name);
+                               dev->stats.rx_dropped++;
                        }
                } else {        /* frame !(ok), only with 'save-bad-frames' */
-                       printk(KERN_WARNING "%s: oops! rfd-error-status: %04x\n", dev->name, status);
-                       p->stats.rx_errors++;
+                       pr_warning("%s: oops! rfd-error-status: %04x\n", dev->name, status);
+                       dev->stats.rx_errors++;
                }
                p->rfd_top->status = 0;
                p->rfd_top->last = RFD_SUSP;
@@ -1025,9 +1017,9 @@ static void elmc_rcv_int(struct net_device *dev)
 
 static void elmc_rnr_int(struct net_device *dev)
 {
-       struct priv *p = (struct priv *) dev->priv;
+       struct priv *p = netdev_priv(dev);
 
-       p->stats.rx_errors++;
+       dev->stats.rx_errors++;
 
        WAIT_4_SCB_CMD();       /* wait for the last cmd */
        p->scb->cmd = RUC_ABORT;        /* usually the RU is in the 'no resource'-state .. abort it now. */
@@ -1037,7 +1029,7 @@ static void elmc_rnr_int(struct net_device *dev)
        alloc_rfa(dev, (char *) p->rfd_first);
        startrecv586(dev);      /* restart RU */
 
-       printk(KERN_WARNING "%s: Receive-Unit restarted. Status: %04x\n", dev->name, p->scb->status);
+       pr_warning("%s: Receive-Unit restarted. Status: %04x\n", dev->name, p->scb->status);
 
 }
 
@@ -1048,31 +1040,31 @@ static void elmc_rnr_int(struct net_device *dev)
 static void elmc_xmt_int(struct net_device *dev)
 {
        int status;
-       struct priv *p = (struct priv *) dev->priv;
+       struct priv *p = netdev_priv(dev);
 
        status = p->xmit_cmds[p->xmit_last]->cmd_status;
        if (!(status & STAT_COMPL)) {
-               printk(KERN_WARNING "%s: strange .. xmit-int without a 'COMPLETE'\n", dev->name);
+               pr_warning("%s: strange .. xmit-int without a 'COMPLETE'\n", dev->name);
        }
        if (status & STAT_OK) {
-               p->stats.tx_packets++;
-               p->stats.collisions += (status & TCMD_MAXCOLLMASK);
+               dev->stats.tx_packets++;
+               dev->stats.collisions += (status & TCMD_MAXCOLLMASK);
        } else {
-               p->stats.tx_errors++;
+               dev->stats.tx_errors++;
                if (status & TCMD_LATECOLL) {
-                       printk(KERN_WARNING "%s: late collision detected.\n", dev->name);
-                       p->stats.collisions++;
+                       pr_warning("%s: late collision detected.\n", dev->name);
+                       dev->stats.collisions++;
                } else if (status & TCMD_NOCARRIER) {
-                       p->stats.tx_carrier_errors++;
-                       printk(KERN_WARNING "%s: no carrier detected.\n", dev->name);
+                       dev->stats.tx_carrier_errors++;
+                       pr_warning("%s: no carrier detected.\n", dev->name);
                } else if (status & TCMD_LOSTCTS) {
-                       printk(KERN_WARNING "%s: loss of CTS detected.\n", dev->name);
+                       pr_warning("%s: loss of CTS detected.\n", dev->name);
                } else if (status & TCMD_UNDERRUN) {
-                       p->stats.tx_fifo_errors++;
-                       printk(KERN_WARNING "%s: DMA underrun detected.\n", dev->name);
+                       dev->stats.tx_fifo_errors++;
+                       pr_warning("%s: DMA underrun detected.\n", dev->name);
                } else if (status & TCMD_MAXCOLL) {
-                       printk(KERN_WARNING "%s: Max. collisions exceeded.\n", dev->name);
-                       p->stats.collisions += 16;
+                       pr_warning("%s: Max. collisions exceeded.\n", dev->name);
+                       dev->stats.collisions += 16;
                }
        }
 
@@ -1091,7 +1083,7 @@ static void elmc_xmt_int(struct net_device *dev)
 
 static void startrecv586(struct net_device *dev)
 {
-       struct priv *p = (struct priv *) dev->priv;
+       struct priv *p = netdev_priv(dev);
 
        p->scb->rfa_offset = make16(p->rfd_first);
        p->scb->cmd = RUC_START;
@@ -1102,16 +1094,17 @@ static void startrecv586(struct net_device *dev)
 /******************************************************
  * timeout
  */
+
 static void elmc_timeout(struct net_device *dev)
 {
-       struct priv *p = (struct priv *) dev->priv;
+       struct priv *p = netdev_priv(dev);
        /* COMMAND-UNIT active? */
        if (p->scb->status & CU_ACTIVE) {
-#ifdef DEBUG
-               printk("%s: strange ... timeout with CU active?!?\n", dev->name);
-               printk("%s: X0: %04x N0: %04x N1: %04x %d\n", dev->name, (int) p->xmit_cmds[0]->cmd_status, (int) p->nop_cmds[0]->cmd_status, (int) p->nop_cmds[1]->cmd_status, (int) p->nop_point);
-#endif
+               pr_debug("%s: strange ... timeout with CU active?!?\n", dev->name);
+               pr_debug("%s: X0: %04x N0: %04x N1: %04x %d\n", dev->name,
+                       (int)p->xmit_cmds[0]->cmd_status,
+                       (int)p->nop_cmds[0]->cmd_status,
+                       (int)p->nop_cmds[1]->cmd_status, (int)p->nop_point);
                p->scb->cmd = CUC_ABORT;
                elmc_attn586();
                WAIT_4_SCB_CMD();
@@ -1121,35 +1114,35 @@ static void elmc_timeout(struct net_device *dev)
                WAIT_4_SCB_CMD();
                netif_wake_queue(dev);
        } else {
-#ifdef DEBUG
-               printk("%s: xmitter timed out, try to restart! stat: %04x\n", dev->name, p->scb->status);
-               printk("%s: command-stats: %04x %04x\n", dev->name, p->xmit_cmds[0]->cmd_status, p->xmit_cmds[1]->cmd_status);
-#endif
+               pr_debug("%s: xmitter timed out, try to restart! stat: %04x\n",
+                       dev->name, p->scb->status);
+               pr_debug("%s: command-stats: %04x %04x\n", dev->name,
+                       p->xmit_cmds[0]->cmd_status, p->xmit_cmds[1]->cmd_status);
                elmc_close(dev);
                elmc_open(dev);
        }
 }
+
 /******************************************************
  * send frame
  */
 
-static int elmc_send_packet(struct sk_buff *skb, struct net_device *dev)
+static netdev_tx_t elmc_send_packet(struct sk_buff *skb, struct net_device *dev)
 {
        int len;
        int i;
 #ifndef NO_NOPCOMMANDS
        int next_nop;
 #endif
-       struct priv *p = (struct priv *) dev->priv;
+       struct priv *p = netdev_priv(dev);
 
        netif_stop_queue(dev);
 
        len = (ETH_ZLEN < skb->len) ? skb->len : ETH_ZLEN;
-       
+
        if (len != skb->len)
                memset((char *) p->xmit_cbuffs[p->xmit_count], 0, ETH_ZLEN);
-       memcpy((char *) p->xmit_cbuffs[p->xmit_count], (char *) (skb->data), skb->len);
+       skb_copy_from_linear_data(skb, (char *) p->xmit_cbuffs[p->xmit_count], skb->len);
 
 #if (NUM_XMIT_BUFFS == 1)
 #ifdef NO_NOPCOMMANDS
@@ -1159,7 +1152,6 @@ static int elmc_send_packet(struct sk_buff *skb, struct net_device *dev)
                p->scb->cmd = CUC_START;
                p->xmit_cmds[0]->cmd_status = 0;
                        elmc_attn586();
-               dev->trans_start = jiffies;
                if (!i) {
                        dev_kfree_skb(skb);
                }
@@ -1171,19 +1163,18 @@ static int elmc_send_packet(struct sk_buff *skb, struct net_device *dev)
                        break;
                }
                if (i == 15) {
-                       printk(KERN_WARNING "%s: Can't start transmit-command.\n", dev->name);
+                       pr_warning("%s: Can't start transmit-command.\n", dev->name);
                }
        }
 #else
        next_nop = (p->nop_point + 1) & 0x1;
        p->xmit_buffs[0]->size = TBD_LAST | len;
-       
+
        p->xmit_cmds[0]->cmd_link = p->nop_cmds[next_nop]->cmd_link
            = make16((p->nop_cmds[next_nop]));
        p->xmit_cmds[0]->cmd_status = p->nop_cmds[next_nop]->cmd_status = 0;
 
        p->nop_cmds[p->nop_point]->cmd_link = make16((p->xmit_cmds[0]));
-       dev->trans_start = jiffies;
        p->nop_point = next_nop;
        dev_kfree_skb(skb);
 #endif
@@ -1197,13 +1188,12 @@ static int elmc_send_packet(struct sk_buff *skb, struct net_device *dev)
            = make16((p->nop_cmds[next_nop]));
        p->nop_cmds[next_nop]->cmd_status = 0;
                p->nop_cmds[p->xmit_count]->cmd_link = make16((p->xmit_cmds[p->xmit_count]));
-       dev->trans_start = jiffies;
        p->xmit_count = next_nop;
        if (p->xmit_count != p->xmit_last)
                netif_wake_queue(dev);
        dev_kfree_skb(skb);
 #endif
-       return 0;
+       return NETDEV_TX_OK;
 }
 
 /*******************************************
@@ -1212,7 +1202,7 @@ static int elmc_send_packet(struct sk_buff *skb, struct net_device *dev)
 
 static struct net_device_stats *elmc_get_stats(struct net_device *dev)
 {
-       struct priv *p = (struct priv *) dev->priv;
+       struct priv *p = netdev_priv(dev);
        unsigned short crc, aln, rsc, ovrn;
 
        crc = p->scb->crc_errs; /* get error-statistic from the ni82586 */
@@ -1224,12 +1214,12 @@ static struct net_device_stats *elmc_get_stats(struct net_device *dev)
        ovrn = p->scb->ovrn_errs;
        p->scb->ovrn_errs -= ovrn;
 
-       p->stats.rx_crc_errors += crc;
-       p->stats.rx_fifo_errors += ovrn;
-       p->stats.rx_frame_errors += aln;
-       p->stats.rx_dropped += rsc;
+       dev->stats.rx_crc_errors += crc;
+       dev->stats.rx_fifo_errors += ovrn;
+       dev->stats.rx_frame_errors += aln;
+       dev->stats.rx_dropped += rsc;
 
-       return &p->stats;
+       return &dev->stats;
 }
 
 /********************************************************
@@ -1259,7 +1249,7 @@ static void netdev_get_drvinfo(struct net_device *dev,
        sprintf(info->bus_info, "MCA 0x%lx", dev->base_addr);
 }
 
-static struct ethtool_ops netdev_ethtool_ops = {
+static const struct ethtool_ops netdev_ethtool_ops = {
        .get_drvinfo            = netdev_get_drvinfo,
 };
 
@@ -1277,11 +1267,11 @@ MODULE_PARM_DESC(io, "EtherLink/MC I/O base address(es)");
 MODULE_PARM_DESC(irq, "EtherLink/MC IRQ number(s)");
 MODULE_LICENSE("GPL");
 
-int init_module(void)
+int __init init_module(void)
 {
        int this_dev,found = 0;
 
-       /* Loop until we either can't find any more cards, or we have MAX_3C523_CARDS */        
+       /* Loop until we either can't find any more cards, or we have MAX_3C523_CARDS */
        for(this_dev=0; this_dev<MAX_3C523_CARDS; this_dev++) {
                struct net_device *dev = alloc_etherdev(sizeof(struct priv));
                if (!dev)
@@ -1296,16 +1286,17 @@ int init_module(void)
                free_netdev(dev);
                if (io[this_dev]==0)
                        break;
-               printk(KERN_WARNING "3c523.c: No 3c523 card found at io=%#x\n",io[this_dev]);
+               pr_warning("3c523.c: No 3c523 card found at io=%#x\n",io[this_dev]);
        }
 
        if(found==0) {
-               if(io[0]==0) printk(KERN_NOTICE "3c523.c: No 3c523 cards found\n");
+               if (io[0]==0)
+                       pr_notice("3c523.c: No 3c523 cards found\n");
                return -ENXIO;
        } else return 0;
 }
 
-void cleanup_module(void)
+void __exit cleanup_module(void)
 {
        int this_dev;
        for (this_dev=0; this_dev<MAX_3C523_CARDS; this_dev++) {