Merge branch 'linus' into cont_syslog
[safe/jmp/linux-2.6] / drivers / net / de620.c
index 22fc5b8..f3650fd 100644 (file)
@@ -40,7 +40,7 @@
  *****************************************************************************/
 static const char version[] =
        "de620.c: $Revision: 1.40 $,  Bjorn Ekwall <bj0rn@blox.se>\n";
-\f
+
 /***********************************************************************
  *
  * "Tuning" section.
@@ -48,7 +48,6 @@ static const char version[] =
  * Compile-time options: (see below for descriptions)
  * -DDE620_IO=0x378    (lpt1)
  * -DDE620_IRQ=7       (lpt1)
- * -DDE602_DEBUG=...
  * -DSHUTDOWN_WHEN_LOST
  * -DCOUNT_LOOPS
  * -DLOWSPEED
@@ -98,15 +97,6 @@ static const char version[] =
 #define SHUTDOWN_WHEN_LOST
  */
 
-/*
- * Enable debugging by "-DDE620_DEBUG=3" when compiling,
- * OR by enabling the following #define
- *
- * use 0 for production, 1 for verification, >2 for debug
- *
-#define DE620_DEBUG 3
- */
-
 #ifdef LOWSPEED
 /*
  * Enable this #define if you want to see debugging output that show how long
@@ -115,7 +105,7 @@ static const char version[] =
 #define COUNT_LOOPS
  */
 #endif
-\f
+
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/types.h>
@@ -160,14 +150,6 @@ typedef unsigned char byte;
 #define RUNT 60                /* Too small Ethernet packet */
 #define GIANT 1514     /* largest legal size packet, no fcs */
 
-#ifdef DE620_DEBUG /* Compile-time configurable */
-#define PRINTK(x) if (de620_debug >= 2) printk x
-#else
-#define DE620_DEBUG 0
-#define PRINTK(x) /**/
-#endif
-
-
 /*
  * Force media with insmod:
  *     insmod de620.o bnc=1
@@ -186,8 +168,6 @@ static int io  = DE620_IO;
 static int irq = DE620_IRQ;
 static int clone = DE620_CLONE;
 
-static unsigned int de620_debug = DE620_DEBUG;
-
 static spinlock_t de620_lock;
 
 module_param(bnc, int, 0);
@@ -195,13 +175,11 @@ module_param(utp, int, 0);
 module_param(io, int, 0);
 module_param(irq, int, 0);
 module_param(clone, int, 0);
-module_param(de620_debug, int, 0);
 MODULE_PARM_DESC(bnc, "DE-620 set BNC medium (0-1)");
 MODULE_PARM_DESC(utp, "DE-620 set UTP medium (0-1)");
 MODULE_PARM_DESC(io, "DE-620 I/O base address,required");
 MODULE_PARM_DESC(irq, "DE-620 IRQ number,required");
 MODULE_PARM_DESC(clone, "Check also for non-D-Link DE-620 clones (0-1)");
-MODULE_PARM_DESC(de620_debug, "DE-620 debug level (0-2)");
 
 /***********************************************
  *                                             *
@@ -216,12 +194,11 @@ MODULE_PARM_DESC(de620_debug, "DE-620 debug level (0-2)");
 /* Put in the device structure. */
 static int     de620_open(struct net_device *);
 static int     de620_close(struct net_device *);
-static struct  net_device_stats *get_stats(struct net_device *);
 static void    de620_set_multicast_list(struct net_device *);
 static int     de620_start_xmit(struct sk_buff *, struct net_device *);
 
 /* Dispatch from interrupts. */
-static irqreturn_t de620_interrupt(int, void *, struct pt_regs *);
+static irqreturn_t de620_interrupt(int, void *);
 static int     de620_rx_intr(struct net_device *);
 
 /* Initialization */
@@ -250,7 +227,7 @@ static struct nic {
        byte    Media;
        byte    SCR;
 } nic_data;
-\f
+
 /**********************************************************
  *                                                        *
  * Convenience macros/functions for D-Link DE-620 adapter *
@@ -432,7 +409,7 @@ de620_get_register(struct net_device *dev, byte reg)
 
        return value;
 }
-\f
+
 /*********************************************************************
  *
  * Open/initialize the board.
@@ -480,16 +457,6 @@ static int de620_close(struct net_device *dev)
 
 /*********************************************
  *
- * Return current statistics
- *
- */
-static struct net_device_stats *get_stats(struct net_device *dev)
-{
-       return (struct net_device_stats *)(dev->priv);
-}
-
-/*********************************************
- *
  * Set or clear the multicast filter for this adaptor.
  * (no real multicast implemented for the DE-620, but she can be promiscuous...)
  *
@@ -497,15 +464,8 @@ static struct net_device_stats *get_stats(struct net_device *dev)
 
 static void de620_set_multicast_list(struct net_device *dev)
 {
-       if (dev->mc_count || dev->flags&(IFF_ALLMULTI|IFF_PROMISC))
+       if (!netdev_mc_empty(dev) || dev->flags&(IFF_ALLMULTI|IFF_PROMISC))
        { /* Enable promiscuous mode */
-               /*
-                *      We must make the kernel realise we had to move
-                *      into promisc mode or we start all out war on
-                *      the cable. - AC
-                */
-               dev->flags|=IFF_PROMISC;
-
                de620_set_register(dev, W_TCR, (TCR_DEF & ~RXPBM) | RXALL);
        }
        else
@@ -515,10 +475,10 @@ static void de620_set_multicast_list(struct net_device *dev)
 }
 
 /*******************************************************
- *     
+ *
  * Handle timeouts on transmit
  */
+
 static void de620_timeout(struct net_device *dev)
 {
        printk(KERN_WARNING "%s: transmit timed out, %s?\n", dev->name, "network cable problem");
@@ -540,9 +500,9 @@ static int de620_start_xmit(struct sk_buff *skb, struct net_device *dev)
        byte using_txbuf;
 
        using_txbuf = de620_tx_buffs(dev); /* Peek at the adapter */
-       
+
        netif_stop_queue(dev);
-       
+
 
        if ((len = skb->len) < RUNT)
                len = RUNT;
@@ -551,9 +511,9 @@ static int de620_start_xmit(struct sk_buff *skb, struct net_device *dev)
 
        /* Start real output */
 
-       spin_lock_irqsave(&de620_lock, flags)
-       PRINTK(("de620_start_xmit: len=%d, bufs 0x%02x\n",
-               (int)skb->len, using_txbuf));
+       spin_lock_irqsave(&de620_lock, flags);
+       pr_debug("de620_start_xmit: len=%d, bufs 0x%02x\n",
+               (int)skb->len, using_txbuf);
 
        /* select a free tx buffer. if there is one... */
        switch (using_txbuf) {
@@ -571,27 +531,26 @@ static int de620_start_xmit(struct sk_buff *skb, struct net_device *dev)
        case (TXBF0 | TXBF1): /* NONE!!! */
                printk(KERN_WARNING "%s: No tx-buffer available!\n", dev->name);
                spin_unlock_irqrestore(&de620_lock, flags);
-               return 1;
+               return NETDEV_TX_BUSY;
        }
        de620_write_block(dev, buffer, skb->len, len-skb->len);
 
-       dev->trans_start = jiffies;
        if(!(using_txbuf == (TXBF0 | TXBF1)))
                netif_wake_queue(dev);
 
-       ((struct net_device_stats *)(dev->priv))->tx_packets++;
+       dev->stats.tx_packets++;
        spin_unlock_irqrestore(&de620_lock, flags);
        dev_kfree_skb (skb);
-       return 0;
+       return NETDEV_TX_OK;
 }
-\f
+
 /*****************************************************
  *
  * Handle the network interface interrupts.
  *
  */
 static irqreturn_t
-de620_interrupt(int irq_in, void *dev_id, struct pt_regs *regs)
+de620_interrupt(int irq_in, void *dev_id)
 {
        struct net_device *dev = dev_id;
        byte irq_status;
@@ -599,23 +558,23 @@ de620_interrupt(int irq_in, void *dev_id, struct pt_regs *regs)
        int again = 0;
 
        spin_lock(&de620_lock);
-       
+
        /* Read the status register (_not_ the status port) */
        irq_status = de620_get_register(dev, R_STS);
 
-       PRINTK(("de620_interrupt (%2.2X)\n", irq_status));
+       pr_debug("de620_interrupt (%2.2X)\n", irq_status);
 
        if (irq_status & RXGOOD) {
                do {
                        again = de620_rx_intr(dev);
-                       PRINTK(("again=%d\n", again));
+                       pr_debug("again=%d\n", again);
                }
                while (again && (++bogus_count < 100));
        }
 
        if(de620_tx_buffs(dev) != (TXBF0 | TXBF1))
                netif_wake_queue(dev);
-               
+
        spin_unlock(&de620_lock);
        return IRQ_HANDLED;
 }
@@ -640,7 +599,7 @@ static int de620_rx_intr(struct net_device *dev)
        byte pagelink;
        byte curr_page;
 
-       PRINTK(("de620_rx_intr: next_rx_page = %d\n", next_rx_page));
+       pr_debug("de620_rx_intr: next_rx_page = %d\n", next_rx_page);
 
        /* Tell the adapter that we are going to read data, and from where */
        de620_send_command(dev, W_CR | RRN);
@@ -649,8 +608,9 @@ static int de620_rx_intr(struct net_device *dev)
 
        /* Deep breath, and away we goooooo */
        de620_read_block(dev, (byte *)&header_buf, sizeof(struct header_buf));
-       PRINTK(("page status=0x%02x, nextpage=%d, packetsize=%d\n",
-       header_buf.status, header_buf.Rx_NextPage, header_buf.Rx_ByteCount));
+       pr_debug("page status=0x%02x, nextpage=%d, packetsize=%d\n",
+               header_buf.status, header_buf.Rx_NextPage,
+               header_buf.Rx_ByteCount);
 
        /* Plausible page header? */
        pagelink = header_buf.Rx_NextPage;
@@ -660,7 +620,7 @@ static int de620_rx_intr(struct net_device *dev)
                /* You win some, you lose some. And sometimes plenty... */
                adapter_init(dev);
                netif_wake_queue(dev);
-               ((struct net_device_stats *)(dev->priv))->rx_over_errors++;
+               dev->stats.rx_over_errors++;
                return 0;
        }
 
@@ -680,7 +640,7 @@ static int de620_rx_intr(struct net_device *dev)
                next_rx_page = header_buf.Rx_NextPage; /* at least a try... */
                de620_send_command(dev, W_DUMMY);
                de620_set_register(dev, W_NPRF, next_rx_page);
-               ((struct net_device_stats *)(dev->priv))->rx_over_errors++;
+               dev->stats.rx_over_errors++;
                return 0;
        }
        next_rx_page = pagelink;
@@ -693,22 +653,20 @@ static int de620_rx_intr(struct net_device *dev)
                skb = dev_alloc_skb(size+2);
                if (skb == NULL) { /* Yeah, but no place to put it... */
                        printk(KERN_WARNING "%s: Couldn't allocate a sk_buff of size %d.\n", dev->name, size);
-                       ((struct net_device_stats *)(dev->priv))->rx_dropped++;
+                       dev->stats.rx_dropped++;
                }
                else { /* Yep! Go get it! */
                        skb_reserve(skb,2);     /* Align */
-                       skb->dev = dev;
                        /* skb->data points to the start of sk_buff data area */
                        buffer = skb_put(skb,size);
                        /* copy the packet into the buffer */
                        de620_read_block(dev, buffer, size);
-                       PRINTK(("Read %d bytes\n", size));
+                       pr_debug("Read %d bytes\n", size);
                        skb->protocol=eth_type_trans(skb,dev);
                        netif_rx(skb); /* deliver it "upstairs" */
-                       dev->last_rx = jiffies;
                        /* count all receives */
-                       ((struct net_device_stats *)(dev->priv))->rx_packets++;
-                       ((struct net_device_stats *)(dev->priv))->rx_bytes += size;
+                       dev->stats.rx_packets++;
+                       dev->stats.rx_bytes += size;
                }
        }
 
@@ -716,11 +674,11 @@ static int de620_rx_intr(struct net_device *dev)
        /* NOTE! We're _not_ checking the 'EMPTY'-flag! This seems better... */
        curr_page = de620_get_register(dev, R_CPR);
        de620_set_register(dev, W_NPRF, next_rx_page);
-       PRINTK(("next_rx_page=%d CPR=%d\n", next_rx_page, curr_page));
+       pr_debug("next_rx_page=%d CPR=%d\n", next_rx_page, curr_page);
 
        return (next_rx_page != curr_page); /* That was slightly tricky... */
 }
-\f
+
 /*********************************************
  *
  * Reset the adapter to a known state
@@ -803,7 +761,18 @@ static int adapter_init(struct net_device *dev)
 
        return 0; /* all ok */
 }
-\f
+
+static const struct net_device_ops de620_netdev_ops = {
+       .ndo_open               = de620_open,
+       .ndo_stop               = de620_close,
+       .ndo_start_xmit         = de620_start_xmit,
+       .ndo_tx_timeout         = de620_timeout,
+       .ndo_set_multicast_list = de620_set_multicast_list,
+       .ndo_change_mtu         = eth_change_mtu,
+       .ndo_set_mac_address    = eth_mac_addr,
+       .ndo_validate_addr      = eth_validate_addr,
+};
+
 /******************************************************************************
  *
  * Only start-up code below
@@ -820,14 +789,12 @@ struct net_device * __init de620_probe(int unit)
        int err = -ENOMEM;
        int i;
 
-       dev = alloc_etherdev(sizeof(struct net_device_stats));
+       dev = alloc_etherdev(0);
        if (!dev)
                goto out;
 
-       SET_MODULE_OWNER(dev);
-
        spin_lock_init(&de620_lock);
-       
+
        /*
         * This is where the base_addr and irq gets set.
         * Tunable at compile-time and insmod-time
@@ -840,9 +807,8 @@ struct net_device * __init de620_probe(int unit)
                sprintf(dev->name, "eth%d", unit);
                netdev_boot_setup_check(dev);
        }
-       
-       if (de620_debug)
-               printk(version);
+
+       pr_debug("%s", version);
 
        printk(KERN_INFO "D-Link DE-620 pocket adapter");
 
@@ -867,13 +833,14 @@ struct net_device * __init de620_probe(int unit)
        }
 
        /* else, got it! */
-       printk(", Ethernet Address: %2.2X",
-               dev->dev_addr[0] = nic_data.NodeID[0]);
+       dev->dev_addr[0] = nic_data.NodeID[0];
        for (i = 1; i < ETH_ALEN; i++) {
-               printk(":%2.2X", dev->dev_addr[i] = nic_data.NodeID[i]);
+               dev->dev_addr[i] = nic_data.NodeID[i];
                dev->broadcast[i] = 0xff;
        }
 
+       printk(", Ethernet Address: %pM", dev->dev_addr);
+
        printk(" (%dk RAM,",
                (nic_data.RAM_Size) ? (nic_data.RAM_Size >> 2) : 64);
 
@@ -882,28 +849,19 @@ struct net_device * __init de620_probe(int unit)
        else
                printk(" UTP)\n");
 
-       dev->get_stats          = get_stats;
-       dev->open               = de620_open;
-       dev->stop               = de620_close;
-       dev->hard_start_xmit    = de620_start_xmit;
-       dev->tx_timeout         = de620_timeout;
+       dev->netdev_ops = &de620_netdev_ops;
        dev->watchdog_timeo     = HZ*2;
-       dev->set_multicast_list = de620_set_multicast_list;
-       
+
        /* base_addr and irq are already set, see above! */
 
        /* dump eeprom */
-       if (de620_debug) {
-               printk("\nEEPROM contents:\n");
-               printk("RAM_Size = 0x%02X\n", nic_data.RAM_Size);
-               printk("NodeID = %02X:%02X:%02X:%02X:%02X:%02X\n",
-                       nic_data.NodeID[0], nic_data.NodeID[1],
-                       nic_data.NodeID[2], nic_data.NodeID[3],
-                       nic_data.NodeID[4], nic_data.NodeID[5]);
-               printk("Model = %d\n", nic_data.Model);
-               printk("Media = %d\n", nic_data.Media);
-               printk("SCR = 0x%02x\n", nic_data.SCR);
-       }
+       pr_debug("\nEEPROM contents:\n"
+               "RAM_Size = 0x%02X\n"
+               "NodeID = %pM\n"
+               "Model = %d\n"
+               "Media = %d\n"
+               "SCR = 0x%02x\n", nic_data.RAM_Size, nic_data.NodeID,
+               nic_data.Model, nic_data.Media, nic_data.SCR);
 
        err = register_netdev(dev);
        if (err)
@@ -917,7 +875,7 @@ out1:
 out:
        return ERR_PTR(err);
 }
-\f
+
 /**********************************
  *
  * Read info from on-board EEPROM
@@ -1003,7 +961,7 @@ static int __init read_eeprom(struct net_device *dev)
 
        return 0; /* no errors */
 }
-\f
+
 /******************************************************************************
  *
  * Loadable module skeleton
@@ -1028,20 +986,3 @@ void cleanup_module(void)
 }
 #endif /* MODULE */
 MODULE_LICENSE("GPL");
-
-\f
-/*
- * (add '-DMODULE' when compiling as loadable module)
- *
- * compile-command:
- *     gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 \
- *      -fomit-frame-pointer -m486 \
- *     -I/usr/src/linux/include -I../../net/inet -c de620.c
-*/
-/*
- * Local variables:
- *  kernel-compile-command: "gcc -D__KERNEL__ -Ilinux/include -I../../net/inet -Wall -Wstrict-prototypes -O2 -m486 -c de620.c"
- *  module-compile-command: "gcc -D__KERNEL__ -DMODULE -Ilinux/include -I../../net/inet -Wall -Wstrict-prototypes -O2 -m486 -c de620.c"
- *  compile-command: "gcc -D__KERNEL__ -DMODULE -Ilinux/include -I../../net/inet -Wall -Wstrict-prototypes -O2 -m486 -c de620.c"
- * End:
- */