mac80211: debugfs: improve airtime_flags handler readability
authorLorenzo Bianconi <lorenzo@kernel.org>
Wed, 27 Nov 2019 16:36:15 +0000 (17:36 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Thu, 2 Jan 2020 13:52:26 +0000 (14:52 +0100)
Improve airtime_flags debugfs handler readability reporting configured
airtime flags in both numeric and human readable manner

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Acked-by: Toke Høiland-Jørgensen <toke@redhat.com>
Link: https://lore.kernel.org/r/9df7e40b45e95bb0b320317831455beaed1ee3ee.1574872357.git.lorenzo@kernel.org
[remove AQL since it's no longer there]
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/debugfs.c

index ad41d74..5408029 100644 (file)
@@ -150,6 +150,59 @@ static const struct file_operations aqm_ops = {
        .llseek = default_llseek,
 };
 
+static ssize_t airtime_flags_read(struct file *file,
+                                 char __user *user_buf,
+                                 size_t count, loff_t *ppos)
+{
+       struct ieee80211_local *local = file->private_data;
+       char buf[128] = {}, *pos, *end;
+
+       pos = buf;
+       end = pos + sizeof(buf) - 1;
+
+       if (local->airtime_flags & AIRTIME_USE_TX)
+               pos += scnprintf(pos, end - pos, "AIRTIME_TX\t(%lx)\n",
+                                AIRTIME_USE_TX);
+       if (local->airtime_flags & AIRTIME_USE_RX)
+               pos += scnprintf(pos, end - pos, "AIRTIME_RX\t(%lx)\n",
+                                AIRTIME_USE_RX);
+
+       return simple_read_from_buffer(user_buf, count, ppos, buf,
+                                      strlen(buf));
+}
+
+static ssize_t airtime_flags_write(struct file *file,
+                                  const char __user *user_buf,
+                                  size_t count, loff_t *ppos)
+{
+       struct ieee80211_local *local = file->private_data;
+       char buf[16];
+       size_t len;
+
+       if (count > sizeof(buf))
+               return -EINVAL;
+
+       if (copy_from_user(buf, user_buf, count))
+               return -EFAULT;
+
+       buf[sizeof(buf) - 1] = 0;
+       len = strlen(buf);
+       if (len > 0 && buf[len - 1] == '\n')
+               buf[len - 1] = 0;
+
+       if (kstrtou16(buf, 0, &local->airtime_flags))
+               return -EINVAL;
+
+       return count;
+}
+
+static const struct file_operations airtime_flags_ops = {
+       .write = airtime_flags_write,
+       .read = airtime_flags_read,
+       .open = simple_open,
+       .llseek = default_llseek,
+};
+
 static ssize_t aql_txq_limit_read(struct file *file,
                                  char __user *user_buf,
                                  size_t count,
@@ -522,8 +575,7 @@ void debugfs_hw_add(struct ieee80211_local *local)
        if (local->ops->wake_tx_queue)
                DEBUGFS_ADD_MODE(aqm, 0600);
 
-       debugfs_create_u16("airtime_flags", 0600,
-                          phyd, &local->airtime_flags);
+       DEBUGFS_ADD_MODE(airtime_flags, 0600);
 
        DEBUGFS_ADD(aql_txq_limit);
        debugfs_create_u32("aql_threshold", 0600,