ath10k: Implement sta_add_debugfs
authorRajkumar Manoharan <rmanohar@qti.qualcomm.com>
Mon, 12 Jan 2015 12:07:27 +0000 (14:07 +0200)
committerKalle Valo <kvalo@qca.qualcomm.com>
Tue, 13 Jan 2015 14:13:13 +0000 (16:13 +0200)
Add per station debugfs files when a station is added to mac80211's
station list. This helps to group peer specific debugfs entries
altogether. Right now this callback adds support to test aggregation
procedures (addba/addba_resp/delba) manually.

To enable automatic aggregation in target,
echo 0 >/sys/kernel/debug/ieee80211/phyX/netdev:wlanX/
stations/XX:XX:XX:XX:XX:XX/aggr_mode

For manual mode,
echo 1 >/sys/kernel/debug/ieee80211/phyX/netdev:wlanX/
stations/XX:XX:XX:XX:XX:XX/aggr_mode

Signed-off-by: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath10k/Makefile
drivers/net/wireless/ath/ath10k/core.h
drivers/net/wireless/ath/ath10k/debug.h
drivers/net/wireless/ath/ath10k/debugfs_sta.c [new file with mode: 0644]
drivers/net/wireless/ath/ath10k/mac.c

index ffa3b1a8745f003e6fd9a886c70ecf039a89d1bc..6c0c23e79bdaf62c945e4261de1aeca6537f09c7 100644 (file)
@@ -15,6 +15,7 @@ ath10k_core-$(CONFIG_ATH10K_DEBUGFS) += spectral.o
 ath10k_core-$(CONFIG_NL80211_TESTMODE) += testmode.o
 ath10k_core-$(CONFIG_ATH10K_TRACING) += trace.o
 ath10k_core-$(CONFIG_THERMAL) += thermal.o
+ath10k_core-$(CONFIG_MAC80211_DEBUGFS) += debugfs_sta.o
 
 obj-$(CONFIG_ATH10K_PCI) += ath10k_pci.o
 ath10k_pci-y += pci.o \
index 7b6d9e4567a3c923ff1db4e776d7b52fa14a9762..c5686122b140801d8be16f002a9fef9d0b2788aa 100644 (file)
@@ -239,6 +239,11 @@ struct ath10k_sta {
        u32 smps;
 
        struct work_struct update_wk;
+
+#ifdef CONFIG_MAC80211_DEBUGFS
+       /* protected by conf_mutex */
+       bool aggr_mode;
+#endif
 };
 
 #define ATH10K_VDEV_SETUP_TIMEOUT_HZ (5*HZ)
index 1b87a5dbec53c3bd8875774ca8806525d3476efd..a12b8323f9f1000ac9e139ee23d52e03f71ac13a 100644 (file)
@@ -48,6 +48,12 @@ enum ath10k_pktlog_filter {
        ATH10K_PKTLOG_ANY        = 0x00000001f,
 };
 
+enum ath10k_dbg_aggr_mode {
+       ATH10K_DBG_AGGR_MODE_AUTO,
+       ATH10K_DBG_AGGR_MODE_MANUAL,
+       ATH10K_DBG_AGGR_MODE_MAX,
+};
+
 extern unsigned int ath10k_debug_mask;
 
 __printf(2, 3) void ath10k_info(struct ath10k *ar, const char *fmt, ...);
@@ -77,7 +83,6 @@ int ath10k_debug_get_et_sset_count(struct ieee80211_hw *hw,
 void ath10k_debug_get_et_stats(struct ieee80211_hw *hw,
                               struct ieee80211_vif *vif,
                               struct ethtool_stats *stats, u64 *data);
-
 #else
 static inline int ath10k_debug_start(struct ath10k *ar)
 {
@@ -129,6 +134,10 @@ ath10k_debug_get_new_fw_crash_data(struct ath10k *ar)
 #define ath10k_debug_get_et_stats NULL
 
 #endif /* CONFIG_ATH10K_DEBUGFS */
+#ifdef CONFIG_MAC80211_DEBUGFS
+void ath10k_sta_add_debugfs(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+                           struct ieee80211_sta *sta, struct dentry *dir);
+#endif /* CONFIG_MAC80211_DEBUGFS */
 
 #ifdef CONFIG_ATH10K_DEBUG
 __printf(3, 4) void ath10k_dbg(struct ath10k *ar,
diff --git a/drivers/net/wireless/ath/ath10k/debugfs_sta.c b/drivers/net/wireless/ath/ath10k/debugfs_sta.c
new file mode 100644 (file)
index 0000000..5df9673
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2014 Qualcomm Atheros, Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include "core.h"
+#include "wmi-ops.h"
+#include "debug.h"
+
+static ssize_t ath10k_dbg_sta_read_aggr_mode(struct file *file,
+                                            char __user *user_buf,
+                                            size_t count, loff_t *ppos)
+{
+       struct ieee80211_sta *sta = file->private_data;
+       struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
+       struct ath10k *ar = arsta->arvif->ar;
+       char buf[32];
+       int len = 0;
+
+       mutex_lock(&ar->conf_mutex);
+       len = scnprintf(buf, sizeof(buf) - len, "aggregation mode: %s\n",
+                       (arsta->aggr_mode == ATH10K_DBG_AGGR_MODE_AUTO) ?
+                       "auto" : "manual");
+       mutex_unlock(&ar->conf_mutex);
+
+       return simple_read_from_buffer(user_buf, count, ppos, buf, len);
+}
+
+static ssize_t ath10k_dbg_sta_write_aggr_mode(struct file *file,
+                                             const char __user *user_buf,
+                                             size_t count, loff_t *ppos)
+{
+       struct ieee80211_sta *sta = file->private_data;
+       struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
+       struct ath10k *ar = arsta->arvif->ar;
+       u32 aggr_mode;
+       int ret;
+
+       if (kstrtouint_from_user(user_buf, count, 0, &aggr_mode))
+               return -EINVAL;
+
+       if (aggr_mode >= ATH10K_DBG_AGGR_MODE_MAX)
+               return -EINVAL;
+
+       mutex_lock(&ar->conf_mutex);
+       if ((ar->state != ATH10K_STATE_ON) ||
+           (aggr_mode == arsta->aggr_mode)) {
+               ret = count;
+               goto out;
+       }
+
+       ret = ath10k_wmi_addba_clear_resp(ar, arsta->arvif->vdev_id, sta->addr);
+       if (ret) {
+               ath10k_warn(ar, "failed to clear addba session ret: %d\n", ret);
+               goto out;
+       }
+
+       arsta->aggr_mode = aggr_mode;
+out:
+       mutex_unlock(&ar->conf_mutex);
+       return ret;
+}
+
+static const struct file_operations fops_aggr_mode = {
+       .read = ath10k_dbg_sta_read_aggr_mode,
+       .write = ath10k_dbg_sta_write_aggr_mode,
+       .open = simple_open,
+       .owner = THIS_MODULE,
+       .llseek = default_llseek,
+};
+
+void ath10k_sta_add_debugfs(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+                           struct ieee80211_sta *sta, struct dentry *dir)
+{
+       debugfs_create_file("aggr_mode", S_IRUGO | S_IWUSR, dir, sta,
+                           &fops_aggr_mode);
+}
index 5085f558d0101312aef787a23440744ebea82610..c7febfc9c68fc3f1098e4d52b5d44d6086e1c079 100644 (file)
@@ -4746,6 +4746,9 @@ static const struct ieee80211_ops ath10k_ops = {
        .suspend                        = ath10k_suspend,
        .resume                         = ath10k_resume,
 #endif
+#ifdef CONFIG_MAC80211_DEBUGFS
+       .sta_add_debugfs                = ath10k_sta_add_debugfs,
+#endif
 };
 
 #define RATETAB_ENT(_rate, _rateid, _flags) { \