[ARM] xsc3: add highmem support to L2 cache handling code
[linux-2.6] / net / ipv6 / sit.c
index 32e871a..d3467e5 100644 (file)
@@ -6,8 +6,6 @@
  *     Pedro Roque             <roque@di.fc.ul.pt>
  *     Alexey Kuznetsov        <kuznet@ms2.inr.ac.ru>
  *
- *     $Id: sit.c,v 1.53 2001/09/25 05:09:53 davem Exp $
- *
  *     This program is free software; you can redistribute it and/or
  *      modify it under the terms of the GNU General Public License
  *      as published by the Free Software Foundation; either version
@@ -64,8 +62,8 @@
 #define HASH_SIZE  16
 #define HASH(addr) (((__force u32)addr^((__force u32)addr>>4))&0xF)
 
-static int ipip6_fb_tunnel_init(struct net_device *dev);
-static int ipip6_tunnel_init(struct net_device *dev);
+static void ipip6_fb_tunnel_init(struct net_device *dev);
+static void ipip6_tunnel_init(struct net_device *dev);
 static void ipip6_tunnel_setup(struct net_device *dev);
 
 static int sit_net_id;
@@ -190,7 +188,8 @@ static struct ip_tunnel * ipip6_tunnel_locate(struct net *net,
        }
 
        nt = netdev_priv(dev);
-       dev->init = ipip6_tunnel_init;
+       ipip6_tunnel_init(dev);
+
        nt->parms = *parms;
 
        if (parms->i_flags & SIT_ISATAP)
@@ -493,13 +492,13 @@ static int ipip6_rcv(struct sk_buff *skb)
 
                if ((tunnel->dev->priv_flags & IFF_ISATAP) &&
                    !isatap_chksrc(skb, iph, tunnel)) {
-                       tunnel->stat.rx_errors++;
+                       tunnel->dev->stats.rx_errors++;
                        read_unlock(&ipip6_lock);
                        kfree_skb(skb);
                        return 0;
                }
-               tunnel->stat.rx_packets++;
-               tunnel->stat.rx_bytes += skb->len;
+               tunnel->dev->stats.rx_packets++;
+               tunnel->dev->stats.rx_bytes += skb->len;
                skb->dev = tunnel->dev;
                dst_release(skb->dst);
                skb->dst = NULL;
@@ -539,7 +538,7 @@ static inline __be32 try_6to4(struct in6_addr *v6dst)
 static int ipip6_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
 {
        struct ip_tunnel *tunnel = netdev_priv(dev);
-       struct net_device_stats *stats = &tunnel->stat;
+       struct net_device_stats *stats = &tunnel->dev->stats;
        struct iphdr  *tiph = &tunnel->parms.iph;
        struct ipv6hdr *iph6 = ipv6_hdr(skb);
        u8     tos = tunnel->parms.iph.tos;
@@ -553,7 +552,7 @@ static int ipip6_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
        int addr_type;
 
        if (tunnel->recursion++) {
-               tunnel->stat.collisions++;
+               stats->collisions++;
                goto tx_error;
        }
 
@@ -620,20 +619,20 @@ static int ipip6_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
                                    .oif = tunnel->parms.link,
                                    .proto = IPPROTO_IPV6 };
                if (ip_route_output_key(dev_net(dev), &rt, &fl)) {
-                       tunnel->stat.tx_carrier_errors++;
+                       stats->tx_carrier_errors++;
                        goto tx_error_icmp;
                }
        }
        if (rt->rt_type != RTN_UNICAST) {
                ip_rt_put(rt);
-               tunnel->stat.tx_carrier_errors++;
+               stats->tx_carrier_errors++;
                goto tx_error_icmp;
        }
        tdev = rt->u.dst.dev;
 
        if (tdev == dev) {
                ip_rt_put(rt);
-               tunnel->stat.collisions++;
+               stats->collisions++;
                goto tx_error;
        }
 
@@ -643,7 +642,7 @@ static int ipip6_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
                mtu = skb->dst ? dst_mtu(skb->dst) : dev->mtu;
 
        if (mtu < 68) {
-               tunnel->stat.collisions++;
+               stats->collisions++;
                ip_rt_put(rt);
                goto tx_error;
        }
@@ -920,11 +919,6 @@ done:
        return err;
 }
 
-static struct net_device_stats *ipip6_tunnel_get_stats(struct net_device *dev)
-{
-       return &(((struct ip_tunnel*)netdev_priv(dev))->stat);
-}
-
 static int ipip6_tunnel_change_mtu(struct net_device *dev, int new_mtu)
 {
        if (new_mtu < IPV6_MIN_MTU || new_mtu > 0xFFF8 - sizeof(struct iphdr))
@@ -933,14 +927,17 @@ static int ipip6_tunnel_change_mtu(struct net_device *dev, int new_mtu)
        return 0;
 }
 
+static const struct net_device_ops ipip6_netdev_ops = {
+       .ndo_uninit     = ipip6_tunnel_uninit,
+       .ndo_start_xmit = ipip6_tunnel_xmit,
+       .ndo_do_ioctl   = ipip6_tunnel_ioctl,
+       .ndo_change_mtu = ipip6_tunnel_change_mtu,
+};
+
 static void ipip6_tunnel_setup(struct net_device *dev)
 {
-       dev->uninit             = ipip6_tunnel_uninit;
+       dev->netdev_ops         = &ipip6_netdev_ops;
        dev->destructor         = free_netdev;
-       dev->hard_start_xmit    = ipip6_tunnel_xmit;
-       dev->get_stats          = ipip6_tunnel_get_stats;
-       dev->do_ioctl           = ipip6_tunnel_ioctl;
-       dev->change_mtu         = ipip6_tunnel_change_mtu;
 
        dev->type               = ARPHRD_SIT;
        dev->hard_header_len    = LL_MAX_HEADER + sizeof(struct iphdr);
@@ -951,11 +948,9 @@ static void ipip6_tunnel_setup(struct net_device *dev)
        dev->features           |= NETIF_F_NETNS_LOCAL;
 }
 
-static int ipip6_tunnel_init(struct net_device *dev)
+static void ipip6_tunnel_init(struct net_device *dev)
 {
-       struct ip_tunnel *tunnel;
-
-       tunnel = netdev_priv(dev);
+       struct ip_tunnel *tunnel = netdev_priv(dev);
 
        tunnel->dev = dev;
        strcpy(tunnel->parms.name, dev->name);
@@ -964,11 +959,9 @@ static int ipip6_tunnel_init(struct net_device *dev)
        memcpy(dev->broadcast, &tunnel->parms.iph.daddr, 4);
 
        ipip6_tunnel_bind_dev(dev);
-
-       return 0;
 }
 
-static int ipip6_fb_tunnel_init(struct net_device *dev)
+static void ipip6_fb_tunnel_init(struct net_device *dev)
 {
        struct ip_tunnel *tunnel = netdev_priv(dev);
        struct iphdr *iph = &tunnel->parms.iph;
@@ -985,7 +978,6 @@ static int ipip6_fb_tunnel_init(struct net_device *dev)
 
        dev_hold(dev);
        sitn->tunnels_wc[0]     = tunnel;
-       return 0;
 }
 
 static struct xfrm_tunnel sit_handler = {
@@ -1033,16 +1025,17 @@ static int sit_init_net(struct net *net)
                err = -ENOMEM;
                goto err_alloc_dev;
        }
-
-       sitn->fb_tunnel_dev->init = ipip6_fb_tunnel_init;
        dev_net_set(sitn->fb_tunnel_dev, net);
 
+       ipip6_fb_tunnel_init(sitn->fb_tunnel_dev);
+
        if ((err = register_netdev(sitn->fb_tunnel_dev)))
                goto err_reg_dev;
 
        return 0;
 
 err_reg_dev:
+       dev_put(sitn->fb_tunnel_dev);
        free_netdev(sitn->fb_tunnel_dev);
 err_alloc_dev:
        /* nothing */