ixgbe: Refactor common code between 82598 & 82599 to accommodate new hardware
[safe/jmp/linux-2.6] / drivers / net / eql.c
index 815436c..b34a2dd 100644 (file)
@@ -8,7 +8,7 @@
  *
  *     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 simon@ncm.com, or C/O
  *    NCM
  *    Attn: Simon Janes
@@ -23,7 +23,7 @@
  * Inspirations:
  *   The Harried and Overworked Alan Cox
  * Conspiracies:
- *   The Alan Cox and Mike McLagan plot to get someone else to do the code, 
+ *   The Alan Cox and Mike McLagan plot to get someone else to do the code,
  *   which turned out to be me.
  */
 
  * Sorry, I had to rewrite most of this for 2.5.x -DaveM
  */
 
+#include <linux/capability.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
+#include <linux/slab.h>
 #include <linux/timer.h>
 #include <linux/netdevice.h>
+#include <net/net_namespace.h>
 
 #include <linux/if.h>
 #include <linux/if_arp.h>
 static int eql_open(struct net_device *dev);
 static int eql_close(struct net_device *dev);
 static int eql_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
-static int eql_slave_xmit(struct sk_buff *skb, struct net_device *dev);
-static struct net_device_stats *eql_get_stats(struct net_device *dev);
+static netdev_tx_t eql_slave_xmit(struct sk_buff *skb, struct net_device *dev);
 
 #define eql_is_slave(dev)      ((dev->flags & IFF_SLAVE) == IFF_SLAVE)
 #define eql_is_master(dev)     ((dev->flags & IFF_MASTER) == IFF_MASTER)
@@ -138,7 +140,7 @@ static void eql_timer(unsigned long param)
 {
        equalizer_t *eql = (equalizer_t *) param;
        struct list_head *this, *tmp, *head;
-       
+
        spin_lock_bh(&eql->queue.lock);
        head = &eql->queue.all_slaves;
        list_for_each_safe(this, tmp, head) {
@@ -159,15 +161,20 @@ static void eql_timer(unsigned long param)
        add_timer(&eql->timer);
 }
 
-static char version[] __initdata = 
+static const char version[] __initconst =
        "Equalizer2002: Simon Janes (simon@ncm.com) and David S. Miller (davem@redhat.com)\n";
 
+static const struct net_device_ops eql_netdev_ops = {
+       .ndo_open       = eql_open,
+       .ndo_stop       = eql_close,
+       .ndo_do_ioctl   = eql_ioctl,
+       .ndo_start_xmit = eql_slave_xmit,
+};
+
 static void __init eql_setup(struct net_device *dev)
 {
        equalizer_t *eql = netdev_priv(dev);
 
-       SET_MODULE_OWNER(dev);
-
        init_timer(&eql->timer);
        eql->timer.data         = (unsigned long) eql;
        eql->timer.expires      = jiffies + EQL_DEFAULT_RESCHED_IVAL;
@@ -177,22 +184,19 @@ static void __init eql_setup(struct net_device *dev)
        INIT_LIST_HEAD(&eql->queue.all_slaves);
        eql->queue.master_dev   = dev;
 
-       dev->open               = eql_open;
-       dev->stop               = eql_close;
-       dev->do_ioctl           = eql_ioctl;
-       dev->hard_start_xmit    = eql_slave_xmit;
-       dev->get_stats          = eql_get_stats;
-  
+       dev->netdev_ops         = &eql_netdev_ops;
+
        /*
         *      Now we undo some of the things that eth_setup does
-        *      that we don't like 
+        *      that we don't like
         */
-        
+
        dev->mtu                = EQL_DEFAULT_MTU;      /* set to 576 in if_eql.h */
        dev->flags              = IFF_MASTER;
 
        dev->type               = ARPHRD_SLIP;
        dev->tx_queue_len       = 5;            /* Hands them off fast */
+       dev->priv_flags        &= ~IFF_XMIT_DST_RELEASE;
 }
 
 static int eql_open(struct net_device *dev)
@@ -223,7 +227,7 @@ static void eql_kill_one_slave(slave_queue_t *queue, slave_t *slave)
 }
 
 static void eql_kill_slave_queue(slave_queue_t *queue)
-{ 
+{
        struct list_head *head, *tmp, *this;
 
        spin_lock_bh(&queue->lock);
@@ -244,7 +248,7 @@ static int eql_close(struct net_device *dev)
 
        /*
         *      The timer has to be stopped first before we start hacking away
-        *      at the data structure it scans every so often... 
+        *      at the data structure it scans every so often...
         */
 
        del_timer_sync(&eql->timer);
@@ -264,7 +268,7 @@ static int eql_g_master_cfg(struct net_device *dev, master_config_t __user *mc);
 static int eql_s_master_cfg(struct net_device *dev, master_config_t __user *mc);
 
 static int eql_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
-{  
+{
        if (cmd != EQL_GETMASTRCFG && cmd != EQL_GETSLAVECFG &&
            !capable(CAP_NET_ADMIN))
                return -EPERM;
@@ -300,15 +304,15 @@ static slave_t *__eql_schedule_slaves(slave_queue_t *queue)
        head = &queue->all_slaves;
        list_for_each_safe(this, tmp, head) {
                slave_t *slave = list_entry(this, slave_t, list);
-               unsigned long slave_load, bytes_queued, priority_Bps; 
+               unsigned long slave_load, bytes_queued, priority_Bps;
 
                /* Go through the slave list once, updating best_slave
                 * whenever a new best_load is found.
                 */
                bytes_queued = slave->bytes_queued;
-               priority_Bps = slave->priority_Bps;    
+               priority_Bps = slave->priority_Bps;
                if ((slave->dev->flags & IFF_UP) == IFF_UP) {
-                       slave_load = (~0UL - (~0UL / 2)) - 
+                       slave_load = (~0UL - (~0UL / 2)) -
                                (priority_Bps) + bytes_queued * 8;
 
                        if (slave_load < best_load) {
@@ -323,7 +327,7 @@ static slave_t *__eql_schedule_slaves(slave_queue_t *queue)
        return best_slave;
 }
 
-static int eql_slave_xmit(struct sk_buff *skb, struct net_device *dev)
+static netdev_tx_t eql_slave_xmit(struct sk_buff *skb, struct net_device *dev)
 {
        equalizer_t *eql = netdev_priv(dev);
        slave_t *slave;
@@ -336,23 +340,17 @@ static int eql_slave_xmit(struct sk_buff *skb, struct net_device *dev)
 
                skb->dev = slave_dev;
                skb->priority = 1;
-               slave->bytes_queued += skb->len; 
+               slave->bytes_queued += skb->len;
                dev_queue_xmit(skb);
-               eql->stats.tx_packets++;
+               dev->stats.tx_packets++;
        } else {
-               eql->stats.tx_dropped++;
+               dev->stats.tx_dropped++;
                dev_kfree_skb(skb);
-       }         
+       }
 
        spin_unlock(&eql->queue.lock);
 
-       return 0;
-}
-
-static struct net_device_stats * eql_get_stats(struct net_device *dev)
-{
-       equalizer_t *eql = netdev_priv(dev);
-       return &eql->stats;
+       return NETDEV_TX_OK;
 }
 
 /*
@@ -391,7 +389,7 @@ static int __eql_insert_slave(slave_queue_t *queue, slave_t *slave)
                slave_t *duplicate_slave = NULL;
 
                duplicate_slave = __eql_find_slave_dev(queue, slave->dev);
-               if (duplicate_slave != 0)
+               if (duplicate_slave)
                        eql_kill_one_slave(queue, duplicate_slave);
 
                list_add(&slave->list, &queue->all_slaves);
@@ -412,7 +410,7 @@ static int eql_enslave(struct net_device *master_dev, slaving_request_t __user *
        if (copy_from_user(&srq, srqp, sizeof (slaving_request_t)))
                return -EFAULT;
 
-       slave_dev  = dev_get_by_name(srq.slave_name);
+       slave_dev  = dev_get_by_name(&init_net, srq.slave_name);
        if (slave_dev) {
                if ((master_dev->flags & IFF_UP) == IFF_UP) {
                        /* slave is not a master & not already a slave: */
@@ -460,7 +458,7 @@ static int eql_emancipate(struct net_device *master_dev, slaving_request_t __use
        if (copy_from_user(&srq, srqp, sizeof (slaving_request_t)))
                return -EFAULT;
 
-       slave_dev = dev_get_by_name(srq.slave_name);
+       slave_dev = dev_get_by_name(&init_net, srq.slave_name);
        ret = -EINVAL;
        if (slave_dev) {
                spin_lock_bh(&eql->queue.lock);
@@ -493,7 +491,7 @@ static int eql_g_slave_cfg(struct net_device *dev, slave_config_t __user *scp)
        if (copy_from_user(&sc, scp, sizeof (slave_config_t)))
                return -EFAULT;
 
-       slave_dev = dev_get_by_name(sc.slave_name);
+       slave_dev = dev_get_by_name(&init_net, sc.slave_name);
        if (!slave_dev)
                return -ENODEV;
 
@@ -528,7 +526,7 @@ static int eql_s_slave_cfg(struct net_device *dev, slave_config_t __user *scp)
        if (copy_from_user(&sc, scp, sizeof (slave_config_t)))
                return -EFAULT;
 
-       slave_dev = dev_get_by_name(sc.slave_name);
+       slave_dev = dev_get_by_name(&init_net, sc.slave_name);
        if (!slave_dev)
                return -ENODEV;
 
@@ -547,6 +545,8 @@ static int eql_s_slave_cfg(struct net_device *dev, slave_config_t __user *scp)
        }
        spin_unlock_bh(&eql->queue.lock);
 
+       dev_put(slave_dev);
+
        return ret;
 }
 
@@ -596,7 +596,7 @@ static int __init eql_init_module(void)
                return -ENOMEM;
 
        err = register_netdev(dev_eql);
-       if (err) 
+       if (err)
                free_netdev(dev_eql);
        return err;
 }