ACPI: thermal: syntax, spelling, kernel-doc
[safe/jmp/linux-2.6] / drivers / net / loopback.c
index f11120b..f2a6e71 100644 (file)
@@ -64,8 +64,6 @@ struct pcpu_lstats {
        unsigned long bytes;
 };
 
-#define LOOPBACK_OVERHEAD (128 + MAX_HEADER + 16 + 16)
-
 /* KISS: just allocate small chunks and copy bits.
  *
  * So, in fact, this is documentation, explaining what we expect
@@ -154,6 +152,7 @@ static int loopback_xmit(struct sk_buff *skb, struct net_device *dev)
 #endif
        dev->last_rx = jiffies;
 
+       /* it's OK to use per_cpu_ptr() because BHs are off */
        pcpu_lstats = netdev_priv(dev);
        lb_stats = per_cpu_ptr(pcpu_lstats, smp_processor_id());
        lb_stats->bytes += skb->len;
@@ -221,22 +220,18 @@ static void loopback_dev_free(struct net_device *dev)
 }
 
 /*
- * The loopback device is special. There is only one instance and
- * it is statically allocated. Don't do this for other devices.
+ * The loopback device is special. There is only one instance
+ * per network namespace.
  */
 static void loopback_setup(struct net_device *dev)
 {
        dev->get_stats          = &get_stats;
        dev->mtu                = (16 * 1024) + 20 + 20 + 12;
        dev->hard_start_xmit    = loopback_xmit;
-       dev->hard_header        = eth_header;
-       dev->hard_header_cache  = eth_header_cache;
-       dev->header_cache_update = eth_header_cache_update;
        dev->hard_header_len    = ETH_HLEN;     /* 14   */
        dev->addr_len           = ETH_ALEN;     /* 6    */
        dev->tx_queue_len       = 0;
        dev->type               = ARPHRD_LOOPBACK;      /* 0x0001*/
-       dev->rebuild_header     = eth_rebuild_header;
        dev->flags              = IFF_LOOPBACK;
        dev->features           = NETIF_F_SG | NETIF_F_FRAGLIST
 #ifdef LOOPBACK_TSO
@@ -245,14 +240,15 @@ static void loopback_setup(struct net_device *dev)
                | NETIF_F_NO_CSUM
                | NETIF_F_HIGHDMA
                | NETIF_F_LLTX
-               | NETIF_F_NETNS_LOCAL,
+               | NETIF_F_NETNS_LOCAL;
        dev->ethtool_ops        = &loopback_ethtool_ops;
+       dev->header_ops         = &eth_header_ops;
        dev->init = loopback_dev_init;
        dev->destructor = loopback_dev_free;
 }
 
 /* Setup and register the loopback device. */
-static int loopback_net_init(struct net *net)
+static __net_init int loopback_net_init(struct net *net)
 {
        struct net_device *dev;
        int err;
@@ -267,27 +263,26 @@ static int loopback_net_init(struct net *net)
        if (err)
                goto out_free_netdev;
 
-       err = 0;
        net->loopback_dev = dev;
+       return 0;
 
-out:
-       if (err)
-               panic("loopback: Failed to register netdevice: %d\n", err);
-       return err;
 
 out_free_netdev:
        free_netdev(dev);
-       goto out;
+out:
+       if (net == &init_net)
+               panic("loopback: Failed to register netdevice: %d\n", err);
+       return err;
 }
 
-static void loopback_net_exit(struct net *net)
+static __net_exit void loopback_net_exit(struct net *net)
 {
        struct net_device *dev = net->loopback_dev;
 
        unregister_netdev(dev);
 }
 
-static struct pernet_operations loopback_net_ops = {
+static struct pernet_operations __net_initdata loopback_net_ops = {
        .init = loopback_net_init,
        .exit = loopback_net_exit,
 };
@@ -297,4 +292,7 @@ static int __init loopback_init(void)
        return register_pernet_device(&loopback_net_ops);
 }
 
+/* Loopback is special. It should be initialized before any other network
+ * device and network subsystem.
+ */
 fs_initcall(loopback_init);