]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ieee802154: add cfg802154_registered_device list
authorAlexander Aring <alex.aring@gmail.com>
Sun, 9 Nov 2014 07:36:48 +0000 (08:36 +0100)
committerMarcel Holtmann <marcel@holtmann.org>
Sun, 9 Nov 2014 18:50:28 +0000 (19:50 +0100)
This patch adds a new cfg802154_rdev_list to remember all registered
cfg802154_registered_device structs. This is needed to prepare the
upcomming nl802154 framework.

Signed-off-by: Alexander Aring <alex.aring@gmail.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
net/ieee802154/core.c
net/ieee802154/core.h

index a3aa23f8c36c3ecb00ae0c24e1c4987cdf14950d..11a1d2ed5b26442cd4bbde96e1f4d4dea0578246 100644 (file)
 #include <linux/device.h>
 
 #include <net/cfg802154.h>
+#include <net/rtnetlink.h>
 
 #include "ieee802154.h"
 #include "sysfs.h"
 #include "core.h"
 
+/* RCU-protected (and RTNL for writers) */
+static LIST_HEAD(cfg802154_rdev_list);
+static int cfg802154_rdev_list_generation;
+
 static int wpan_phy_match(struct device *dev, const void *data)
 {
        return !strcmp(dev_name(dev), (const char *)data);
@@ -109,13 +114,51 @@ EXPORT_SYMBOL(wpan_phy_new);
 
 int wpan_phy_register(struct wpan_phy *phy)
 {
-       return device_add(&phy->dev);
+       struct cfg802154_registered_device *rdev = wpan_phy_to_rdev(phy);
+       int ret;
+
+       rtnl_lock();
+       ret = device_add(&phy->dev);
+       if (ret) {
+               rtnl_unlock();
+               return ret;
+       }
+
+       list_add_rcu(&rdev->list, &cfg802154_rdev_list);
+       cfg802154_rdev_list_generation++;
+
+       /* TODO phy registered lock */
+       rtnl_unlock();
+
+       /* TODO nl802154 phy notify */
+
+       return 0;
 }
 EXPORT_SYMBOL(wpan_phy_register);
 
 void wpan_phy_unregister(struct wpan_phy *phy)
 {
+       struct cfg802154_registered_device *rdev = wpan_phy_to_rdev(phy);
+
+       /* TODO open count */
+
+       rtnl_lock();
+       /* TODO nl802154 phy notify */
+       /* TODO phy registered lock */
+
+       /* TODO WARN_ON wpan_dev_list */
+
+       /* First remove the hardware from everywhere, this makes
+        * it impossible to find from userspace.
+        */
+       list_del_rcu(&rdev->list);
+       synchronize_rcu();
+
+       cfg802154_rdev_list_generation++;
+
        device_del(&phy->dev);
+
+       rtnl_unlock();
 }
 EXPORT_SYMBOL(wpan_phy_unregister);
 
index fea60b3a884609eca84c012610f83f93562e708b..38887cb2eaf4df1267e2f63aa5bea8c9b7a7426b 100644 (file)
@@ -5,6 +5,7 @@
 
 struct cfg802154_registered_device {
        const struct cfg802154_ops *ops;
+       struct list_head list;
 
        /* wpan_phy index, internal only */
        int wpan_phy_idx;