Commit 53f9ee61 authored by Alexander Aring's avatar Alexander Aring Committed by Marcel Holtmann

ieee802154: rework wpan_phy index assignment

This patch reworks the wpan_phy index incrementation. It's now similar
like wireless wiphy index incrementation. We move the wpan_phy index
attribute inside of cfg802154_registered_device and use atomic
operations instead locking mechanism via wpan_phy_mutex.
Signed-off-by: default avatarAlexander Aring <alex.aring@gmail.com>
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent 0d8a52f9
...@@ -61,7 +61,6 @@ struct wpan_phy { ...@@ -61,7 +61,6 @@ struct wpan_phy {
s32 cca_ed_level; s32 cca_ed_level;
struct device dev; struct device dev;
int idx;
char priv[0] __aligned(NETDEV_ALIGN); char priv[0] __aligned(NETDEV_ALIGN);
}; };
......
...@@ -23,9 +23,6 @@ ...@@ -23,9 +23,6 @@
#include "sysfs.h" #include "sysfs.h"
#include "core.h" #include "core.h"
static DEFINE_MUTEX(wpan_phy_mutex);
static int wpan_phy_idx;
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);
...@@ -72,14 +69,10 @@ int wpan_phy_for_each(int (*fn)(struct wpan_phy *phy, void *data), ...@@ -72,14 +69,10 @@ int wpan_phy_for_each(int (*fn)(struct wpan_phy *phy, void *data),
} }
EXPORT_SYMBOL(wpan_phy_for_each); EXPORT_SYMBOL(wpan_phy_for_each);
static int wpan_phy_idx_valid(int idx)
{
return idx >= 0;
}
struct wpan_phy * struct wpan_phy *
wpan_phy_alloc(const struct cfg802154_ops *ops, size_t priv_size) wpan_phy_alloc(const struct cfg802154_ops *ops, size_t priv_size)
{ {
static atomic_t wpan_phy_counter = ATOMIC_INIT(0);
struct cfg802154_registered_device *rdev; struct cfg802154_registered_device *rdev;
size_t alloc_size; size_t alloc_size;
...@@ -90,28 +83,27 @@ wpan_phy_alloc(const struct cfg802154_ops *ops, size_t priv_size) ...@@ -90,28 +83,27 @@ wpan_phy_alloc(const struct cfg802154_ops *ops, size_t priv_size)
rdev->ops = ops; rdev->ops = ops;
mutex_lock(&wpan_phy_mutex); rdev->wpan_phy_idx = atomic_inc_return(&wpan_phy_counter);
rdev->wpan_phy.idx = wpan_phy_idx++;
if (unlikely(!wpan_phy_idx_valid(rdev->wpan_phy.idx))) { if (unlikely(rdev->wpan_phy_idx < 0)) {
wpan_phy_idx--; /* ugh, wrapped! */
mutex_unlock(&wpan_phy_mutex); atomic_dec(&wpan_phy_counter);
kfree(rdev); kfree(rdev);
goto out; return NULL;
} }
mutex_unlock(&wpan_phy_mutex);
/* atomic_inc_return makes it start at 1, make it start at 0 */
rdev->wpan_phy_idx--;
mutex_init(&rdev->wpan_phy.pib_lock); mutex_init(&rdev->wpan_phy.pib_lock);
device_initialize(&rdev->wpan_phy.dev); device_initialize(&rdev->wpan_phy.dev);
dev_set_name(&rdev->wpan_phy.dev, "wpan-phy%d", rdev->wpan_phy.idx); dev_set_name(&rdev->wpan_phy.dev, "wpan-phy%d", rdev->wpan_phy_idx);
rdev->wpan_phy.dev.class = &wpan_phy_class; rdev->wpan_phy.dev.class = &wpan_phy_class;
rdev->wpan_phy.dev.platform_data = rdev; rdev->wpan_phy.dev.platform_data = rdev;
return &rdev->wpan_phy; return &rdev->wpan_phy;
out:
return NULL;
} }
EXPORT_SYMBOL(wpan_phy_alloc); EXPORT_SYMBOL(wpan_phy_alloc);
......
...@@ -6,6 +6,9 @@ ...@@ -6,6 +6,9 @@
struct cfg802154_registered_device { struct cfg802154_registered_device {
const struct cfg802154_ops *ops; const struct cfg802154_ops *ops;
/* wpan_phy index, internal only */
int wpan_phy_idx;
/* must be last because of the way we do wpan_phy_priv(), /* must be last because of the way we do wpan_phy_priv(),
* and it should at least be aligned to NETDEV_ALIGN * and it should at least be aligned to NETDEV_ALIGN
*/ */
......
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