emac: Fix clock control for 405EX and 405EXr chips
[safe/jmp/linux-2.6] / drivers / net / dummy.c
index 91126b9..8ebd7d7 100644 (file)
 #include <linux/rtnetlink.h>
 #include <net/rtnetlink.h>
 
-struct dummy_priv {
-       struct net_device *dev;
-       struct list_head list;
-};
-
 static int numdummies = 1;
 
 static int dummy_xmit(struct sk_buff *skb, struct net_device *dev);
@@ -62,21 +57,25 @@ static void set_multicast_list(struct net_device *dev)
 {
 }
 
+static const struct net_device_ops dummy_netdev_ops = {
+       .ndo_start_xmit         = dummy_xmit,
+       .ndo_validate_addr      = eth_validate_addr,
+       .ndo_set_multicast_list = set_multicast_list,
+       .ndo_set_mac_address    = dummy_set_address,
+};
+
 static void dummy_setup(struct net_device *dev)
 {
+       ether_setup(dev);
+
        /* Initialize the device structure. */
-       dev->hard_start_xmit = dummy_xmit;
-       dev->set_multicast_list = set_multicast_list;
-       dev->set_mac_address = dummy_set_address;
+       dev->netdev_ops = &dummy_netdev_ops;
        dev->destructor = free_netdev;
 
        /* Fill in device structure with ethernet-generic values. */
-       ether_setup(dev);
        dev->tx_queue_len = 0;
-       dev->change_mtu = NULL;
        dev->flags |= IFF_NOARP;
        dev->flags &= ~IFF_MULTICAST;
-       SET_MODULE_OWNER(dev);
        random_ether_addr(dev->dev_addr);
 }
 
@@ -89,37 +88,21 @@ static int dummy_xmit(struct sk_buff *skb, struct net_device *dev)
        return 0;
 }
 
-static LIST_HEAD(dummies);
-
-static int dummy_newlink(struct net_device *dev,
-                        struct nlattr *tb[], struct nlattr *data[])
+static int dummy_validate(struct nlattr *tb[], struct nlattr *data[])
 {
-       struct dummy_priv *priv = netdev_priv(dev);
-       int err;
-
-       err = register_netdevice(dev);
-       if (err < 0)
-               return err;
-
-       priv->dev = dev;
-       list_add_tail(&priv->list, &dummies);
+       if (tb[IFLA_ADDRESS]) {
+               if (nla_len(tb[IFLA_ADDRESS]) != ETH_ALEN)
+                       return -EINVAL;
+               if (!is_valid_ether_addr(nla_data(tb[IFLA_ADDRESS])))
+                       return -EADDRNOTAVAIL;
+       }
        return 0;
 }
 
-static void dummy_dellink(struct net_device *dev)
-{
-       struct dummy_priv *priv = netdev_priv(dev);
-
-       list_del(&priv->list);
-       unregister_netdevice(dev);
-}
-
 static struct rtnl_link_ops dummy_link_ops __read_mostly = {
        .kind           = "dummy",
-       .priv_size      = sizeof(struct dummy_priv),
        .setup          = dummy_setup,
-       .newlink        = dummy_newlink,
-       .dellink        = dummy_dellink,
+       .validate       = dummy_validate,
 };
 
 /* Number of dummy devices to be set up by this module. */
@@ -129,12 +112,9 @@ MODULE_PARM_DESC(numdummies, "Number of dummy pseudo devices");
 static int __init dummy_init_one(void)
 {
        struct net_device *dev_dummy;
-       struct dummy_priv *priv;
        int err;
 
-       dev_dummy = alloc_netdev(sizeof(struct dummy_priv), "dummy%d",
-                                dummy_setup);
-
+       dev_dummy = alloc_netdev(0, "dummy%d", dummy_setup);
        if (!dev_dummy)
                return -ENOMEM;
 
@@ -146,10 +126,6 @@ static int __init dummy_init_one(void)
        err = register_netdevice(dev_dummy);
        if (err < 0)
                goto err;
-
-       priv = netdev_priv(dev_dummy);
-       priv->dev = dev_dummy;
-       list_add_tail(&priv->list, &dummies);
        return 0;
 
 err:
@@ -159,7 +135,6 @@ err:
 
 static int __init dummy_init_module(void)
 {
-       struct dummy_priv *priv, *next;
        int i, err = 0;
 
        rtnl_lock();
@@ -167,11 +142,8 @@ static int __init dummy_init_module(void)
 
        for (i = 0; i < numdummies && !err; i++)
                err = dummy_init_one();
-       if (err < 0) {
-               list_for_each_entry_safe(priv, next, &dummies, list)
-                       dummy_dellink(priv->dev);
+       if (err < 0)
                __rtnl_link_unregister(&dummy_link_ops);
-       }
        rtnl_unlock();
 
        return err;
@@ -179,14 +151,7 @@ static int __init dummy_init_module(void)
 
 static void __exit dummy_cleanup_module(void)
 {
-       struct dummy_priv *priv, *next;
-
-       rtnl_lock();
-       list_for_each_entry_safe(priv, next, &dummies, list)
-               dummy_dellink(priv->dev);
-
-       __rtnl_link_unregister(&dummy_link_ops);
-       rtnl_unlock();
+       rtnl_link_unregister(&dummy_link_ops);
 }
 
 module_init(dummy_init_module);