Merge branch 'master' into sh/clkfwk
[safe/jmp/linux-2.6] / drivers / net / wan / x25_asy.c
index 249e180..d67e208 100644 (file)
@@ -32,6 +32,7 @@
 #include <linux/x25.h>
 #include <linux/lapb.h>
 #include <linux/init.h>
+#include <linux/rtnetlink.h>
 #include "x25_asy.h"
 
 #include <net/x25device.h>
@@ -63,7 +64,7 @@ static struct x25_asy *x25_asy_alloc(void)
                if (dev == NULL)
                        break;
 
-               sl = dev->priv;
+               sl = netdev_priv(dev);
                /* Not in use ? */
                if (!test_and_set_bit(SLF_INUSE, &sl->flags))
                        return sl;
@@ -85,7 +86,7 @@ static struct x25_asy *x25_asy_alloc(void)
                        return NULL;
 
                /* Initialize channel control data */
-               sl = dev->priv;
+               sl = netdev_priv(dev);
                dev->base_addr    = i;
 
                /* register device so that it can be ifconfig'ed       */
@@ -119,7 +120,7 @@ static void x25_asy_free(struct x25_asy *sl)
 
 static int x25_asy_change_mtu(struct net_device *dev, int newmtu)
 {
-       struct x25_asy *sl = dev->priv;
+       struct x25_asy *sl = netdev_priv(dev);
        unsigned char *xbuff, *rbuff;
        int len = 2 * newmtu;
 
@@ -141,7 +142,7 @@ static int x25_asy_change_mtu(struct net_device *dev, int newmtu)
                        memcpy(sl->xbuff, sl->xhead, sl->xleft);
                } else  {
                        sl->xleft = 0;
-                       sl->stats.tx_dropped++;
+                       dev->stats.tx_dropped++;
                }
        }
        sl->xhead = sl->xbuff;
@@ -152,7 +153,7 @@ static int x25_asy_change_mtu(struct net_device *dev, int newmtu)
                        memcpy(sl->rbuff, rbuff, sl->rcount);
                } else  {
                        sl->rcount = 0;
-                       sl->stats.rx_over_errors++;
+                       dev->stats.rx_over_errors++;
                        set_bit(SLF_ERROR, &sl->flags);
                }
        }
@@ -187,18 +188,19 @@ static inline void x25_asy_unlock(struct x25_asy *sl)
 
 static void x25_asy_bump(struct x25_asy *sl)
 {
+       struct net_device *dev = sl->dev;
        struct sk_buff *skb;
        int count;
        int err;
 
        count = sl->rcount;
-       sl->stats.rx_bytes += count;
+       dev->stats.rx_bytes += count;
 
        skb = dev_alloc_skb(count+1);
        if (skb == NULL) {
                printk(KERN_WARNING "%s: memory squeeze, dropping packet.\n",
                        sl->dev->name);
-               sl->stats.rx_dropped++;
+               dev->stats.rx_dropped++;
                return;
        }
        skb_push(skb, 1);       /* LAPB internal control */
@@ -210,8 +212,7 @@ static void x25_asy_bump(struct x25_asy *sl)
                printk(KERN_DEBUG "x25_asy: data received err - %d\n", err);
        } else {
                netif_rx(skb);
-               sl->dev->last_rx = jiffies;
-               sl->stats.rx_packets++;
+               dev->stats.rx_packets++;
        }
 }
 
@@ -226,7 +227,7 @@ static void x25_asy_encaps(struct x25_asy *sl, unsigned char *icp, int len)
                len = mtu;
                printk(KERN_DEBUG "%s: truncating oversized transmit packet!\n",
                                        sl->dev->name);
-               sl->stats.tx_dropped++;
+               sl->dev->stats.tx_dropped++;
                x25_asy_unlock(sl);
                return;
        }
@@ -242,7 +243,7 @@ static void x25_asy_encaps(struct x25_asy *sl, unsigned char *icp, int len)
         * if we did not request it before write operation.
         *       14 Oct 1994  Dmitry Gorodchanin.
         */
-       sl->tty->flags |= (1 << TTY_DO_WRITE_WAKEUP);
+       set_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags);
        actual = sl->tty->ops->write(sl->tty, sl->xbuff, count);
        sl->xleft = count - actual;
        sl->xhead = sl->xbuff + actual;
@@ -257,7 +258,7 @@ static void x25_asy_encaps(struct x25_asy *sl, unsigned char *icp, int len)
 static void x25_asy_write_wakeup(struct tty_struct *tty)
 {
        int actual;
-       struct x25_asy *sl = (struct x25_asy *) tty->disc_data;
+       struct x25_asy *sl = tty->disc_data;
 
        /* First make sure we're connected. */
        if (!sl || sl->magic != X25_ASY_MAGIC || !netif_running(sl->dev))
@@ -266,8 +267,8 @@ static void x25_asy_write_wakeup(struct tty_struct *tty)
        if (sl->xleft <= 0) {
                /* Now serial buffer is almost free & we can start
                 * transmission of another packet */
-               sl->stats.tx_packets++;
-               tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP);
+               sl->dev->stats.tx_packets++;
+               clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
                x25_asy_unlock(sl);
                return;
        }
@@ -279,7 +280,7 @@ static void x25_asy_write_wakeup(struct tty_struct *tty)
 
 static void x25_asy_timeout(struct net_device *dev)
 {
-       struct x25_asy *sl = dev->priv;
+       struct x25_asy *sl = netdev_priv(dev);
 
        spin_lock(&sl->lock);
        if (netif_queue_stopped(dev)) {
@@ -290,7 +291,7 @@ static void x25_asy_timeout(struct net_device *dev)
                       (tty_chars_in_buffer(sl->tty) || sl->xleft) ?
                       "bad line quality" : "driver error");
                sl->xleft = 0;
-               sl->tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP);
+               clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags);
                x25_asy_unlock(sl);
        }
        spin_unlock(&sl->lock);
@@ -300,7 +301,7 @@ static void x25_asy_timeout(struct net_device *dev)
 
 static int x25_asy_xmit(struct sk_buff *skb, struct net_device *dev)
 {
-       struct x25_asy *sl = dev->priv;
+       struct x25_asy *sl = netdev_priv(dev);
        int err;
 
        if (!netif_running(sl->dev)) {
@@ -360,7 +361,6 @@ static int x25_asy_xmit(struct sk_buff *skb, struct net_device *dev)
 
 static int x25_asy_data_indication(struct net_device *dev, struct sk_buff *skb)
 {
-       skb->dev->last_rx = jiffies;
        return netif_rx(skb);
 }
 
@@ -372,7 +372,7 @@ static int x25_asy_data_indication(struct net_device *dev, struct sk_buff *skb)
 
 static void x25_asy_data_transmit(struct net_device *dev, struct sk_buff *skb)
 {
-       struct x25_asy *sl = dev->priv;
+       struct x25_asy *sl = netdev_priv(dev);
 
        spin_lock(&sl->lock);
        if (netif_queue_stopped(sl->dev) || sl->tty == NULL) {
@@ -384,7 +384,7 @@ static void x25_asy_data_transmit(struct net_device *dev, struct sk_buff *skb)
        /* We were not busy, so we are now... :-) */
        if (skb != NULL) {
                x25_asy_lock(sl);
-               sl->stats.tx_bytes += skb->len;
+               dev->stats.tx_bytes += skb->len;
                x25_asy_encaps(sl, skb->data, skb->len);
                dev_kfree_skb(skb);
        }
@@ -397,7 +397,7 @@ static void x25_asy_data_transmit(struct net_device *dev, struct sk_buff *skb)
 
 static void x25_asy_connected(struct net_device *dev, int reason)
 {
-       struct x25_asy *sl = dev->priv;
+       struct x25_asy *sl = netdev_priv(dev);
        struct sk_buff *skb;
        unsigned char *ptr;
 
@@ -412,12 +412,11 @@ static void x25_asy_connected(struct net_device *dev, int reason)
 
        skb->protocol = x25_type_trans(skb, sl->dev);
        netif_rx(skb);
-       sl->dev->last_rx = jiffies;
 }
 
 static void x25_asy_disconnected(struct net_device *dev, int reason)
 {
-       struct x25_asy *sl = dev->priv;
+       struct x25_asy *sl = netdev_priv(dev);
        struct sk_buff *skb;
        unsigned char *ptr;
 
@@ -432,7 +431,6 @@ static void x25_asy_disconnected(struct net_device *dev, int reason)
 
        skb->protocol = x25_type_trans(skb, sl->dev);
        netif_rx(skb);
-       sl->dev->last_rx = jiffies;
 }
 
 static struct lapb_register_struct x25_asy_callbacks = {
@@ -449,7 +447,7 @@ static struct lapb_register_struct x25_asy_callbacks = {
 /* Open the low-level part of the X.25 channel. Easy! */
 static int x25_asy_open(struct net_device *dev)
 {
-       struct x25_asy *sl = dev->priv;
+       struct x25_asy *sl = netdev_priv(dev);
        unsigned long len;
        int err;
 
@@ -498,12 +496,12 @@ norbuff:
 /* Close the low-level part of the X.25 channel. Easy! */
 static int x25_asy_close(struct net_device *dev)
 {
-       struct x25_asy *sl = dev->priv;
+       struct x25_asy *sl = netdev_priv(dev);
        int err;
 
        spin_lock(&sl->lock);
        if (sl->tty)
-               sl->tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP);
+               clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags);
 
        netif_stop_queue(dev);
        sl->rcount = 0;
@@ -526,7 +524,7 @@ static int x25_asy_close(struct net_device *dev)
 static void x25_asy_receive_buf(struct tty_struct *tty,
                                const unsigned char *cp, char *fp, int count)
 {
-       struct x25_asy *sl = (struct x25_asy *) tty->disc_data;
+       struct x25_asy *sl = tty->disc_data;
 
        if (!sl || sl->magic != X25_ASY_MAGIC || !netif_running(sl->dev))
                return;
@@ -536,7 +534,7 @@ static void x25_asy_receive_buf(struct tty_struct *tty,
        while (count--) {
                if (fp && *fp++) {
                        if (!test_and_set_bit(SLF_ERROR, &sl->flags))
-                               sl->stats.rx_errors++;
+                               sl->dev->stats.rx_errors++;
                        cp++;
                        continue;
                }
@@ -554,7 +552,7 @@ static void x25_asy_receive_buf(struct tty_struct *tty,
 
 static int x25_asy_open_tty(struct tty_struct *tty)
 {
-       struct x25_asy *sl = (struct x25_asy *) tty->disc_data;
+       struct x25_asy *sl = tty->disc_data;
        int err;
 
        if (tty->ops->write == NULL)
@@ -595,33 +593,27 @@ static int x25_asy_open_tty(struct tty_struct *tty)
  */
 static void x25_asy_close_tty(struct tty_struct *tty)
 {
-       struct x25_asy *sl = (struct x25_asy *) tty->disc_data;
+       struct x25_asy *sl = tty->disc_data;
 
        /* First make sure we're connected. */
        if (!sl || sl->magic != X25_ASY_MAGIC)
                return;
 
+       rtnl_lock();
        if (sl->dev->flags & IFF_UP)
                dev_close(sl->dev);
+       rtnl_unlock();
 
        tty->disc_data = NULL;
        sl->tty = NULL;
        x25_asy_free(sl);
 }
 
-
-static struct net_device_stats *x25_asy_get_stats(struct net_device *dev)
-{
-       struct x25_asy *sl = dev->priv;
-       return &sl->stats;
-}
-
-
  /************************************************************************
   *                    STANDARD X.25 ENCAPSULATION                      *
   ************************************************************************/
 
-int x25_asy_esc(unsigned char *s, unsigned char *d, int len)
+static int x25_asy_esc(unsigned char *s, unsigned char *d, int len)
 {
        unsigned char *ptr = d;
        unsigned char c;
@@ -683,7 +675,7 @@ static void x25_asy_unesc(struct x25_asy *sl, unsigned char s)
                        sl->rbuff[sl->rcount++] = s;
                        return;
                }
-               sl->stats.rx_over_errors++;
+               sl->dev->stats.rx_over_errors++;
                set_bit(SLF_ERROR, &sl->flags);
        }
 }
@@ -693,7 +685,7 @@ static void x25_asy_unesc(struct x25_asy *sl, unsigned char s)
 static int x25_asy_ioctl(struct tty_struct *tty, struct file *file,
                         unsigned int cmd,  unsigned long arg)
 {
-       struct x25_asy *sl = (struct x25_asy *) tty->disc_data;
+       struct x25_asy *sl = tty->disc_data;
 
        /* First make sure we're connected. */
        if (!sl || sl->magic != X25_ASY_MAGIC)
@@ -714,16 +706,24 @@ static int x25_asy_ioctl(struct tty_struct *tty, struct file *file,
 
 static int x25_asy_open_dev(struct net_device *dev)
 {
-       struct x25_asy *sl = dev->priv;
+       struct x25_asy *sl = netdev_priv(dev);
        if (sl->tty == NULL)
                return -ENODEV;
        return 0;
 }
 
+static const struct net_device_ops x25_asy_netdev_ops = {
+       .ndo_open       = x25_asy_open_dev,
+       .ndo_stop       = x25_asy_close,
+       .ndo_start_xmit = x25_asy_xmit,
+       .ndo_tx_timeout = x25_asy_timeout,
+       .ndo_change_mtu = x25_asy_change_mtu,
+};
+
 /* Initialise the X.25 driver.  Called by the device init code */
 static void x25_asy_setup(struct net_device *dev)
 {
-       struct x25_asy *sl = dev->priv;
+       struct x25_asy *sl = netdev_priv(dev);
 
        sl->magic  = X25_ASY_MAGIC;
        sl->dev    = dev;
@@ -735,13 +735,8 @@ static void x25_asy_setup(struct net_device *dev)
         */
 
        dev->mtu                = SL_MTU;
-       dev->hard_start_xmit    = x25_asy_xmit;
-       dev->tx_timeout         = x25_asy_timeout;
+       dev->netdev_ops         = &x25_asy_netdev_ops;
        dev->watchdog_timeo     = HZ*20;
-       dev->open               = x25_asy_open_dev;
-       dev->stop               = x25_asy_close;
-       dev->get_stats          = x25_asy_get_stats;
-       dev->change_mtu         = x25_asy_change_mtu;
        dev->hard_header_len    = 0;
        dev->addr_len           = 0;
        dev->type               = ARPHRD_X25;
@@ -751,7 +746,7 @@ static void x25_asy_setup(struct net_device *dev)
        dev->flags              = IFF_NOARP;
 }
 
-static struct tty_ldisc x25_ldisc = {
+static struct tty_ldisc_ops x25_ldisc = {
        .owner          = THIS_MODULE,
        .magic          = TTY_LDISC_MAGIC,
        .name           = "X.25",
@@ -790,7 +785,7 @@ static void __exit exit_x25_asy(void)
        for (i = 0; i < x25_asy_maxdev; i++) {
                dev = x25_asy_devs[i];
                if (dev) {
-                       struct x25_asy *sl = dev->priv;
+                       struct x25_asy *sl = netdev_priv(dev);
 
                        spin_lock_bh(&sl->lock);
                        if (sl->tty)