#define WPAN_NUM_CHANNELS 27
#define WPAN_NUM_PAGES 32
+struct wpan_phy;
+
+struct cfg802154_ops {
+};
+
struct wpan_phy {
struct mutex pib_lock;
#define to_phy(_dev) container_of(_dev, struct wpan_phy, dev)
-struct wpan_phy *wpan_phy_alloc(size_t priv_size);
+struct wpan_phy *
+wpan_phy_alloc(const struct cfg802154_ops *ops, size_t priv_size);
static inline void wpan_phy_set_dev(struct wpan_phy *phy, struct device *dev)
{
phy->dev.parent = dev;
#include "ieee802154.h"
#include "sysfs.h"
+#include "core.h"
static DEFINE_MUTEX(wpan_phy_mutex);
static int wpan_phy_idx;
return idx >= 0;
}
-struct wpan_phy *wpan_phy_alloc(size_t priv_size)
+struct wpan_phy *
+wpan_phy_alloc(const struct cfg802154_ops *ops, size_t priv_size)
{
- struct wpan_phy *phy = kzalloc(sizeof(*phy) + priv_size,
- GFP_KERNEL);
+ struct cfg802154_registered_device *rdev;
+ size_t alloc_size;
+
+ alloc_size = sizeof(*rdev) + priv_size;
+ rdev = kzalloc(alloc_size, GFP_KERNEL);
+ if (!rdev)
+ return NULL;
+
+ rdev->ops = ops;
- if (!phy)
- goto out;
mutex_lock(&wpan_phy_mutex);
- phy->idx = wpan_phy_idx++;
- if (unlikely(!wpan_phy_idx_valid(phy->idx))) {
+ rdev->wpan_phy.idx = wpan_phy_idx++;
+ if (unlikely(!wpan_phy_idx_valid(rdev->wpan_phy.idx))) {
wpan_phy_idx--;
mutex_unlock(&wpan_phy_mutex);
- kfree(phy);
+ kfree(rdev);
goto out;
}
mutex_unlock(&wpan_phy_mutex);
- mutex_init(&phy->pib_lock);
+ mutex_init(&rdev->wpan_phy.pib_lock);
- device_initialize(&phy->dev);
- dev_set_name(&phy->dev, "wpan-phy%d", phy->idx);
+ device_initialize(&rdev->wpan_phy.dev);
+ dev_set_name(&rdev->wpan_phy.dev, "wpan-phy%d", rdev->wpan_phy.idx);
- phy->dev.class = &wpan_phy_class;
+ rdev->wpan_phy.dev.class = &wpan_phy_class;
+ rdev->wpan_phy.dev.platform_data = rdev;
- return phy;
+ return &rdev->wpan_phy;
out:
return NULL;
}
EXPORT_SYMBOL(wpan_phy_free);
+void cfg802154_dev_free(struct cfg802154_registered_device *rdev)
+{
+ kfree(rdev);
+}
+
static int __init wpan_phy_class_init(void)
{
int rc;
--- /dev/null
+#ifndef __IEEE802154_CORE_H
+#define __IEEE802154_CORE_H
+
+#include <net/cfg802154.h>
+
+struct cfg802154_registered_device {
+ const struct cfg802154_ops *ops;
+
+ /* must be last because of the way we do wpan_phy_priv(),
+ * and it should at least be aligned to NETDEV_ALIGN
+ */
+ struct wpan_phy wpan_phy __aligned(NETDEV_ALIGN);
+};
+
+/* free object */
+void cfg802154_dev_free(struct cfg802154_registered_device *rdev);
+
+#endif /* __IEEE802154_CORE_H */
#include <net/cfg802154.h>
+#include "core.h"
+
+static inline struct cfg802154_registered_device *
+dev_to_rdev(struct device *dev)
+{
+ return container_of(dev, struct cfg802154_registered_device,
+ wpan_phy.dev);
+}
+
#define MASTER_SHOW_COMPLEX(name, format_string, args...) \
static ssize_t name ## _show(struct device *dev, \
struct device_attribute *attr, char *buf) \
}
static DEVICE_ATTR_RO(channels_supported);
-static void wpan_phy_release(struct device *d)
+static void wpan_phy_release(struct device *dev)
{
- struct wpan_phy *phy = container_of(d, struct wpan_phy, dev);
+ struct cfg802154_registered_device *rdev = dev_to_rdev(dev);
- kfree(phy);
+ cfg802154_dev_free(rdev);
}
static struct attribute *pmib_attrs[] = {
priv_size = ALIGN(sizeof(*local), NETDEV_ALIGN) + priv_data_len;
- phy = wpan_phy_alloc(priv_size);
+ phy = wpan_phy_alloc(NULL, priv_size);
if (!phy) {
pr_err("failure to allocate master IEEE802.15.4 device\n");
return NULL;