Commit f3ada640 authored by Alexander Aring's avatar Alexander Aring Committed by Marcel Holtmann

ieee802154: add cfg802154_registered_device list

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: default avatarAlexander Aring <alex.aring@gmail.com>
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent f601379f
...@@ -18,11 +18,16 @@ ...@@ -18,11 +18,16 @@
#include <linux/device.h> #include <linux/device.h>
#include <net/cfg802154.h> #include <net/cfg802154.h>
#include <net/rtnetlink.h>
#include "ieee802154.h" #include "ieee802154.h"
#include "sysfs.h" #include "sysfs.h"
#include "core.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) static int wpan_phy_match(struct device *dev, const void *data)
{ {
return !strcmp(dev_name(dev), (const char *)data); return !strcmp(dev_name(dev), (const char *)data);
...@@ -109,13 +114,51 @@ EXPORT_SYMBOL(wpan_phy_new); ...@@ -109,13 +114,51 @@ EXPORT_SYMBOL(wpan_phy_new);
int wpan_phy_register(struct wpan_phy *phy) 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); EXPORT_SYMBOL(wpan_phy_register);
void wpan_phy_unregister(struct wpan_phy *phy) 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); device_del(&phy->dev);
rtnl_unlock();
} }
EXPORT_SYMBOL(wpan_phy_unregister); EXPORT_SYMBOL(wpan_phy_unregister);
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
struct cfg802154_registered_device { struct cfg802154_registered_device {
const struct cfg802154_ops *ops; const struct cfg802154_ops *ops;
struct list_head list;
/* wpan_phy index, internal only */ /* wpan_phy index, internal only */
int wpan_phy_idx; int wpan_phy_idx;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment