netdevice wanrouter: Convert directly reference of netdev->priv
Wang Chen [Thu, 20 Nov 2008 12:26:21 +0000 (04:26 -0800)]
1. Make device driver to allocate memory for netdev.
2. Convert all directly reference of netdev->priv to netdev_priv().

Signed-off-by: Wang Chen <wangchen@cn.fujitsu.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

drivers/net/wan/cycx_x25.c
net/wanrouter/wanmain.c

index aeea321..5fa5292 100644 (file)
@@ -199,6 +199,8 @@ static struct net_device *cycx_x25_get_dev_by_lcn(struct wan_device *wandev,
 static struct net_device *
        cycx_x25_get_dev_by_dte_addr(struct wan_device *wandev, char *dte);
 
+static void cycx_x25_chan_setup(struct net_device *dev);
+
 #ifdef CYCLOMX_X25_DEBUG
 static void hex_dump(char *msg, unsigned char *p, int len);
 static void cycx_x25_dump_config(struct cycx_x25_config *conf);
@@ -353,6 +355,12 @@ static int cycx_wan_update(struct wan_device *wandev)
        return 0;
 }
 
+/* callback to initialize device */
+static void cycx_x25_chan_setup(struct net_device *dev)
+{
+       dev->init = cycx_netdevice_init;
+}
+
 /* Create new logical channel.
  * This routine is called by the router when ROUTER_IFNEW IOCTL is being
  * handled.
@@ -376,11 +384,12 @@ static int cycx_wan_new_if(struct wan_device *wandev, struct net_device *dev,
                return -EINVAL;
        }
 
-       /* allocate and initialize private data */
-       chan = kzalloc(sizeof(struct cycx_x25_channel), GFP_KERNEL);
-       if (!chan)
+       dev = alloc_netdev(sizeof(struct cycx_x25_channel), conf->name,
+                            cycx_x25_chan_setup);
+       if (!dev)
                return -ENOMEM;
 
+       chan = netdev_priv(dev);
        strcpy(chan->name, conf->name);
        chan->card = card;
        chan->link = conf->port;
@@ -396,14 +405,14 @@ static int cycx_wan_new_if(struct wan_device *wandev, struct net_device *dev,
                        if (len > WAN_ADDRESS_SZ) {
                                printk(KERN_ERR "%s: %s local addr too long!\n",
                                                wandev->name, chan->name);
-                               kfree(chan);
-                               return -EINVAL;
+                               err = -EINVAL;
+                               goto error;
                        } else {
                                chan->local_addr = kmalloc(len + 1, GFP_KERNEL);
 
                                if (!chan->local_addr) {
-                                       kfree(chan);
-                                       return -ENOMEM;
+                                       err = -ENOMEM;
+                                       goto error;
                                }
                        }
 
@@ -429,41 +438,31 @@ static int cycx_wan_new_if(struct wan_device *wandev, struct net_device *dev,
                                "%s: PVC %u is out of range on interface %s!\n",
                                wandev->name, lcn, chan->name);
                        err = -EINVAL;
+                       goto error;
                }
        } else {
                printk(KERN_ERR "%s: invalid media address on interface %s!\n",
                                wandev->name, chan->name);
                err = -EINVAL;
+               goto error;
        }
 
-       if (err) {
-               kfree(chan->local_addr);
-               kfree(chan);
-               return err;
-       }
-
-       /* prepare network device data space for registration */
-       strcpy(dev->name, chan->name);
-       dev->init = cycx_netdevice_init;
-       dev->priv = chan;
-
        return 0;
+
+error:
+       free_netdev(dev);
+       return err;
 }
 
 /* Delete logical channel. */
 static int cycx_wan_del_if(struct wan_device *wandev, struct net_device *dev)
 {
-       if (dev->priv) {
-               struct cycx_x25_channel *chan = dev->priv;
+       struct cycx_x25_channel *chan = netdev_priv(dev);
 
-               if (chan->svc) {
-                       kfree(chan->local_addr);
-                       if (chan->state == WAN_CONNECTED)
-                               del_timer(&chan->timer);
-               }
-
-               kfree(chan);
-               dev->priv = NULL;
+       if (chan->svc) {
+               kfree(chan->local_addr);
+               if (chan->state == WAN_CONNECTED)
+                       del_timer(&chan->timer);
        }
 
        return 0;
@@ -484,7 +483,7 @@ static const struct header_ops cycx_header_ops = {
  * registration. */
 static int cycx_netdevice_init(struct net_device *dev)
 {
-       struct cycx_x25_channel *chan = dev->priv;
+       struct cycx_x25_channel *chan = netdev_priv(dev);
        struct cycx_device *card = chan->card;
        struct wan_device *wandev = &card->wandev;
 
@@ -542,7 +541,7 @@ static int cycx_netdevice_open(struct net_device *dev)
  * o if there's no more open channels then disconnect physical link. */
 static int cycx_netdevice_stop(struct net_device *dev)
 {
-       struct cycx_x25_channel *chan = dev->priv;
+       struct cycx_x25_channel *chan = netdev_priv(dev);
 
        netif_stop_queue(dev);
 
@@ -596,7 +595,7 @@ static int cycx_netdevice_rebuild_header(struct sk_buff *skb)
 static int cycx_netdevice_hard_start_xmit(struct sk_buff *skb,
                                          struct net_device *dev)
 {
-       struct cycx_x25_channel *chan = dev->priv;
+       struct cycx_x25_channel *chan = netdev_priv(dev);
        struct cycx_device *card = chan->card;
 
        if (!chan->svc)
@@ -670,7 +669,7 @@ free_packet:
  * Return a pointer to struct net_device_stats */
 static struct net_device_stats *cycx_netdevice_get_stats(struct net_device *dev)
 {
-       struct cycx_x25_channel *chan = dev->priv;
+       struct cycx_x25_channel *chan = netdev_priv(dev);
 
        return chan ? &chan->ifstats : NULL;
 }
@@ -783,7 +782,7 @@ static void cycx_x25_irq_rx(struct cycx_device *card, struct cycx_x25_cmd *cmd)
                return;
        }
 
-       chan = dev->priv;
+       chan = netdev_priv(dev);
        reset_timer(dev);
 
        if (chan->drop_sequence) {
@@ -883,7 +882,7 @@ static void cycx_x25_irq_connect(struct cycx_device *card,
                return;
        }
 
-       chan = dev->priv;
+       chan = netdev_priv(dev);
        chan->lcn = lcn;
        cycx_x25_connect_response(card, chan);
        cycx_x25_set_chan_state(dev, WAN_CONNECTED);
@@ -913,7 +912,7 @@ static void cycx_x25_irq_connect_confirm(struct cycx_device *card,
        }
 
        clear_bit(--key, (void*)&card->u.x.connection_keys);
-       chan = dev->priv;
+       chan = netdev_priv(dev);
        chan->lcn = lcn;
        cycx_x25_set_chan_state(dev, WAN_CONNECTED);
 }
@@ -953,7 +952,7 @@ static void cycx_x25_irq_disconnect(struct cycx_device *card,
 
        dev = cycx_x25_get_dev_by_lcn(wandev, lcn);
        if (dev) {
-               struct cycx_x25_channel *chan = dev->priv;
+               struct cycx_x25_channel *chan = netdev_priv(dev);
 
                cycx_x25_disconnect_response(card, chan->link, lcn);
                cycx_x25_set_chan_state(dev, WAN_DISCONNECTED);
@@ -1301,7 +1300,7 @@ static struct net_device *cycx_x25_get_dev_by_lcn(struct wan_device *wandev,
        struct cycx_x25_channel *chan;
 
        while (dev) {
-               chan = (struct cycx_x25_channel*)dev->priv;
+               chan = netdev_priv(dev);
 
                if (chan->lcn == lcn)
                        break;
@@ -1318,7 +1317,7 @@ static struct net_device *
        struct cycx_x25_channel *chan;
 
        while (dev) {
-               chan = (struct cycx_x25_channel*)dev->priv;
+               chan = netdev_priv(dev);
 
                if (!strcmp(chan->addr, dte))
                        break;
@@ -1336,7 +1335,7 @@ static struct net_device *
  *             <0      failure */
 static int cycx_x25_chan_connect(struct net_device *dev)
 {
-       struct cycx_x25_channel *chan = dev->priv;
+       struct cycx_x25_channel *chan = netdev_priv(dev);
        struct cycx_device *card = chan->card;
 
        if (chan->svc) {
@@ -1361,7 +1360,7 @@ static int cycx_x25_chan_connect(struct net_device *dev)
  * o if SVC then clear X.25 call */
 static void cycx_x25_chan_disconnect(struct net_device *dev)
 {
-       struct cycx_x25_channel *chan = dev->priv;
+       struct cycx_x25_channel *chan = netdev_priv(dev);
 
        if (chan->svc) {
                x25_clear_call(chan->card, chan->link, chan->lcn, 0, 0);
@@ -1374,7 +1373,7 @@ static void cycx_x25_chan_disconnect(struct net_device *dev)
 static void cycx_x25_chan_timer(unsigned long d)
 {
        struct net_device *dev = (struct net_device *)d;
-       struct cycx_x25_channel *chan = dev->priv;
+       struct cycx_x25_channel *chan = netdev_priv(dev);
 
        if (chan->state == WAN_CONNECTED)
                cycx_x25_chan_disconnect(dev);
@@ -1386,7 +1385,7 @@ static void cycx_x25_chan_timer(unsigned long d)
 /* Set logical channel state. */
 static void cycx_x25_set_chan_state(struct net_device *dev, u8 state)
 {
-       struct cycx_x25_channel *chan = dev->priv;
+       struct cycx_x25_channel *chan = netdev_priv(dev);
        struct cycx_device *card = chan->card;
        unsigned long flags;
        char *string_state = NULL;
@@ -1452,7 +1451,7 @@ static void cycx_x25_set_chan_state(struct net_device *dev, u8 state)
  *    to the router.  */
 static int cycx_x25_chan_send(struct net_device *dev, struct sk_buff *skb)
 {
-       struct cycx_x25_channel *chan = dev->priv;
+       struct cycx_x25_channel *chan = netdev_priv(dev);
        struct cycx_device *card = chan->card;
        int bitm = 0;           /* final packet */
        unsigned len = skb->len;
@@ -1545,7 +1544,7 @@ static unsigned dec_to_uint(u8 *str, int len)
 
 static void reset_timer(struct net_device *dev)
 {
-       struct cycx_x25_channel *chan = dev->priv;
+       struct cycx_x25_channel *chan = netdev_priv(dev);
 
        if (chan->svc)
                mod_timer(&chan->timer, jiffies+chan->idle_tmout*HZ);
@@ -1598,7 +1597,7 @@ static void cycx_x25_dump_devs(struct wan_device *wandev)
        printk(KERN_INFO "---------------------------------------\n");
 
        while(dev) {
-               struct cycx_x25_channel *chan = dev->priv;
+               struct cycx_x25_channel *chan = netdev_priv(dev);
 
                printk(KERN_INFO "%-5.5s %-15.15s   %d     ETH_P_%s\n",
                                 chan->name, chan->addr, netif_queue_stopped(dev),
index 7f07152..39701de 100644 (file)
@@ -60,6 +60,8 @@
 
 #define KMEM_SAFETYZONE 8
 
+#define DEV_TO_SLAVE(dev)      (*((struct net_device **)netdev_priv(dev)))
+
 /*
  *     Function Prototypes
  */
@@ -511,7 +513,7 @@ static int wanrouter_device_shutdown(struct wan_device *wandev)
                if (err)
                        return err;
                /* The above function deallocates the current dev
-                * structure. Therefore, we cannot use dev->priv
+                * structure. Therefore, we cannot use netdev_priv(dev)
                 * as the next element: wandev->dev points to the
                 * next element */
                dev = wandev->dev;
@@ -589,10 +591,6 @@ static int wanrouter_device_new_if(struct wan_device *wandev,
                err = -EPROTONOSUPPORT;
                goto out;
        } else {
-               dev = kzalloc(sizeof(struct net_device), GFP_KERNEL);
-               err = -ENOBUFS;
-               if (dev == NULL)
-                       goto out;
                err = wandev->new_if(wandev, dev, cnf);
        }
 
@@ -622,10 +620,9 @@ static int wanrouter_device_new_if(struct wan_device *wandev,
                                        wandev->dev = dev;
                                } else {
                                        for (slave=wandev->dev;
-                                        *((struct net_device **)slave->priv);
-                                slave = *((struct net_device **)slave->priv));
-
-                                    *((struct net_device **)slave->priv) = dev;
+                                            DEV_TO_SLAVE(slave);
+                                            slave = DEV_TO_SLAVE(slave))
+                                               DEV_TO_SLAVE(slave) = dev;
                                }
                                ++wandev->ndev;
 
@@ -636,15 +633,9 @@ static int wanrouter_device_new_if(struct wan_device *wandev,
                }
                if (wandev->del_if)
                        wandev->del_if(wandev, dev);
+               free_netdev(dev);
        }
 
-       /* This code has moved from del_if() function */
-       kfree(dev->priv);
-       dev->priv = NULL;
-
-       /* Sync PPP is disabled */
-       if (cnf->config_id != WANCONFIG_MPPP)
-               kfree(dev);
 out:
        kfree(cnf);
        return err;
@@ -734,7 +725,7 @@ static int wanrouter_delete_interface(struct wan_device *wandev, char *name)
        dev = wandev->dev;
        prev = NULL;
        while (dev && strcmp(name, dev->name)) {
-               struct net_device **slave = dev->priv;
+               struct net_device **slave = netdev_priv(dev);
                prev = dev;
                dev = *slave;
        }
@@ -751,12 +742,12 @@ static int wanrouter_delete_interface(struct wan_device *wandev, char *name)
 
        lock_adapter_irq(&wandev->lock, &smp_flags);
        if (prev) {
-               struct net_device **prev_slave = prev->priv;
-               struct net_device **slave = dev->priv;
+               struct net_device **prev_slave = netdev_priv(prev);
+               struct net_device **slave = netdev_priv(dev);
 
                *prev_slave = *slave;
        } else {
-               struct net_device **slave = dev->priv;
+               struct net_device **slave = netdev_priv(dev);
                wandev->dev = *slave;
        }
        --wandev->ndev;
@@ -764,11 +755,6 @@ static int wanrouter_delete_interface(struct wan_device *wandev, char *name)
 
        printk(KERN_INFO "%s: unregistering '%s'\n", wandev->name, dev->name);
 
-       /* Due to new interface linking method using dev->priv,
-        * this code has moved from del_if() function.*/
-       kfree(dev->priv);
-       dev->priv=NULL;
-
        unregister_netdev(dev);
 
        free_netdev(dev);