ieee802154: introduce sysfs file
authorAlexander Aring <alex.aring@gmail.com>
Tue, 28 Oct 2014 17:21:32 +0000 (18:21 +0100)
committerMarcel Holtmann <marcel@holtmann.org>
Tue, 28 Oct 2014 22:19:09 +0000 (23:19 +0100)
This patch moves the sysfs handling in a own file. This is like wireless
sysfs file handling.

Signed-off-by: Alexander Aring <alex.aring@gmail.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
net/ieee802154/Makefile
net/ieee802154/core.c
net/ieee802154/sysfs.c [new file with mode: 0644]
net/ieee802154/sysfs.h [new file with mode: 0644]

index e58c4cb..38354d4 100644 (file)
@@ -3,7 +3,7 @@ obj-$(CONFIG_IEEE802154_6LOWPAN) += ieee802154_6lowpan.o
 
 ieee802154_6lowpan-y := 6lowpan_rtnl.o reassembly.o
 ieee802154-y := netlink.o nl-mac.o nl-phy.o nl_policy.o core.o \
-                header_ops.o
+                header_ops.o sysfs.o
 af_802154-y := af_ieee802154.o raw.o dgram.o
 
 ccflags-y += -D__CHECK_ENDIAN__
index 760b7d7..620abc2 100644 (file)
 #include <net/cfg802154.h>
 
 #include "ieee802154.h"
-
-#define MASTER_SHOW_COMPLEX(name, format_string, args...)              \
-static ssize_t name ## _show(struct device *dev,                       \
-                           struct device_attribute *attr, char *buf)   \
-{                                                                      \
-       struct wpan_phy *phy = container_of(dev, struct wpan_phy, dev); \
-       int ret;                                                        \
-                                                                       \
-       mutex_lock(&phy->pib_lock);                                     \
-       ret = snprintf(buf, PAGE_SIZE, format_string "\n", args);       \
-       mutex_unlock(&phy->pib_lock);                                   \
-       return ret;                                                     \
-}                                                                      \
-static DEVICE_ATTR_RO(name)
-
-#define MASTER_SHOW(field, format_string)                              \
-       MASTER_SHOW_COMPLEX(field, format_string, phy->field)
-
-MASTER_SHOW(current_channel, "%d");
-MASTER_SHOW(current_page, "%d");
-MASTER_SHOW(transmit_power, "%d +- 1 dB");
-MASTER_SHOW(cca_mode, "%d");
-
-static ssize_t channels_supported_show(struct device *dev,
-                                      struct device_attribute *attr,
-                                      char *buf)
-{
-       struct wpan_phy *phy = container_of(dev, struct wpan_phy, dev);
-       int ret;
-       int i, len = 0;
-
-       mutex_lock(&phy->pib_lock);
-       for (i = 0; i < 32; i++) {
-               ret = snprintf(buf + len, PAGE_SIZE - len,
-                              "%#09x\n", phy->channels_supported[i]);
-               if (ret < 0)
-                       break;
-               len += ret;
-       }
-       mutex_unlock(&phy->pib_lock);
-       return len;
-}
-static DEVICE_ATTR_RO(channels_supported);
-
-static struct attribute *pmib_attrs[] = {
-       &dev_attr_current_channel.attr,
-       &dev_attr_current_page.attr,
-       &dev_attr_channels_supported.attr,
-       &dev_attr_transmit_power.attr,
-       &dev_attr_cca_mode.attr,
-       NULL,
-};
-ATTRIBUTE_GROUPS(pmib);
-
-static void wpan_phy_release(struct device *d)
-{
-       struct wpan_phy *phy = container_of(d, struct wpan_phy, dev);
-
-       kfree(phy);
-}
-
-static struct class wpan_phy_class = {
-       .name = "ieee802154",
-       .dev_release = wpan_phy_release,
-       .dev_groups = pmib_groups,
-};
+#include "sysfs.h"
 
 static DEFINE_MUTEX(wpan_phy_mutex);
 static int wpan_phy_idx;
@@ -197,7 +132,7 @@ static int __init wpan_phy_class_init(void)
 {
        int rc;
 
-       rc = class_register(&wpan_phy_class);
+       rc = wpan_phy_sysfs_init();
        if (rc)
                goto err;
 
@@ -207,7 +142,7 @@ static int __init wpan_phy_class_init(void)
 
        return 0;
 err_nl:
-       class_unregister(&wpan_phy_class);
+       wpan_phy_sysfs_exit();
 err:
        return rc;
 }
@@ -216,7 +151,7 @@ subsys_initcall(wpan_phy_class_init);
 static void __exit wpan_phy_class_exit(void)
 {
        ieee802154_nl_exit();
-       class_unregister(&wpan_phy_class);
+       wpan_phy_sysfs_exit();
 }
 module_exit(wpan_phy_class_exit);
 
diff --git a/net/ieee802154/sysfs.c b/net/ieee802154/sysfs.c
new file mode 100644 (file)
index 0000000..eb9ca6f
--- /dev/null
@@ -0,0 +1,94 @@
+/* This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * Authors:
+ * Alexander Aring <aar@pengutronix.de>
+ *
+ * Based on: net/wireless/sysfs.c
+ */
+
+#include <linux/device.h>
+
+#include <net/cfg802154.h>
+
+#define MASTER_SHOW_COMPLEX(name, format_string, args...)              \
+static ssize_t name ## _show(struct device *dev,                       \
+                           struct device_attribute *attr, char *buf)   \
+{                                                                      \
+       struct wpan_phy *phy = container_of(dev, struct wpan_phy, dev); \
+       int ret;                                                        \
+                                                                       \
+       mutex_lock(&phy->pib_lock);                                     \
+       ret = snprintf(buf, PAGE_SIZE, format_string "\n", args);       \
+       mutex_unlock(&phy->pib_lock);                                   \
+       return ret;                                                     \
+}                                                                      \
+static DEVICE_ATTR_RO(name)
+
+#define MASTER_SHOW(field, format_string)                              \
+       MASTER_SHOW_COMPLEX(field, format_string, phy->field)
+
+MASTER_SHOW(current_channel, "%d");
+MASTER_SHOW(current_page, "%d");
+MASTER_SHOW(transmit_power, "%d +- 1 dB");
+MASTER_SHOW(cca_mode, "%d");
+
+static ssize_t channels_supported_show(struct device *dev,
+                                      struct device_attribute *attr,
+                                      char *buf)
+{
+       struct wpan_phy *phy = container_of(dev, struct wpan_phy, dev);
+       int ret;
+       int i, len = 0;
+
+       mutex_lock(&phy->pib_lock);
+       for (i = 0; i < 32; i++) {
+               ret = snprintf(buf + len, PAGE_SIZE - len,
+                              "%#09x\n", phy->channels_supported[i]);
+               if (ret < 0)
+                       break;
+               len += ret;
+       }
+       mutex_unlock(&phy->pib_lock);
+       return len;
+}
+static DEVICE_ATTR_RO(channels_supported);
+
+static void wpan_phy_release(struct device *d)
+{
+       struct wpan_phy *phy = container_of(d, struct wpan_phy, dev);
+
+       kfree(phy);
+}
+
+static struct attribute *pmib_attrs[] = {
+       &dev_attr_current_channel.attr,
+       &dev_attr_current_page.attr,
+       &dev_attr_channels_supported.attr,
+       &dev_attr_transmit_power.attr,
+       &dev_attr_cca_mode.attr,
+       NULL,
+};
+ATTRIBUTE_GROUPS(pmib);
+
+struct class wpan_phy_class = {
+       .name = "ieee802154",
+       .dev_release = wpan_phy_release,
+       .dev_groups = pmib_groups,
+};
+
+int wpan_phy_sysfs_init(void)
+{
+       return class_register(&wpan_phy_class);
+}
+
+void wpan_phy_sysfs_exit(void)
+{
+       class_unregister(&wpan_phy_class);
+}
diff --git a/net/ieee802154/sysfs.h b/net/ieee802154/sysfs.h
new file mode 100644 (file)
index 0000000..aa42e39
--- /dev/null
@@ -0,0 +1,9 @@
+#ifndef __IEEE802154_SYSFS_H
+#define __IEEE802154_SYSFS_H
+
+int wpan_phy_sysfs_init(void);
+void wpan_phy_sysfs_exit(void);
+
+extern struct class wpan_phy_class;
+
+#endif /* __IEEE802154_SYSFS_H */