This adds a few configurable debugging options:

* driver debugging and tracing is now configurable per device
* driver debugging and tracing is now configurable at runtime
* the debugging / tracing is not run at all (besides a mask check)
  unless the specific debugging bitmap field is configured.

Signed-off-by: Adrian Chadd <adr...@freebsd.org>
---
 drivers/net/wireless/ath/ath10k/core.c  |   2 +
 drivers/net/wireless/ath/ath10k/core.h  |   2 +
 drivers/net/wireless/ath/ath10k/debug.c | 101 ++++++++++++++++++++++++++++----
 drivers/net/wireless/ath/ath10k/debug.h |  44 +++++++++-----
 4 files changed, 125 insertions(+), 24 deletions(-)

diff --git a/drivers/net/wireless/ath/ath10k/core.c 
b/drivers/net/wireless/ath/ath10k/core.c
index eea111d704c5..fcb068cb0248 100644
--- a/drivers/net/wireless/ath/ath10k/core.c
+++ b/drivers/net/wireless/ath/ath10k/core.c
@@ -2444,6 +2444,8 @@ struct ath10k *ath10k_core_create(size_t priv_size, 
struct device *dev,
        ar->hw_rev = hw_rev;
        ar->hif.ops = hif_ops;
        ar->hif.bus = bus;
+       ar->debug_mask = ath10k_debug_mask;
+       ar->trace_debug_mask = ath10k_debug_mask;
 
        switch (hw_rev) {
        case ATH10K_HW_QCA988X:
diff --git a/drivers/net/wireless/ath/ath10k/core.h 
b/drivers/net/wireless/ath/ath10k/core.h
index 8fc08a5043db..07e392a377d0 100644
--- a/drivers/net/wireless/ath/ath10k/core.h
+++ b/drivers/net/wireless/ath/ath10k/core.h
@@ -762,6 +762,8 @@ struct ath10k {
        struct device *dev;
        u8 mac_addr[ETH_ALEN];
 
+       u32 debug_mask;
+       u32 trace_debug_mask;
        enum ath10k_hw_rev hw_rev;
        u16 dev_id;
        u32 chip_id;
diff --git a/drivers/net/wireless/ath/ath10k/debug.c 
b/drivers/net/wireless/ath/ath10k/debug.c
index 389fcb7a9fd0..017360a26b40 100644
--- a/drivers/net/wireless/ath/ath10k/debug.c
+++ b/drivers/net/wireless/ath/ath10k/debug.c
@@ -2418,6 +2418,79 @@ int ath10k_debug_create(struct ath10k *ar)
        return 0;
 }
 
+#ifdef CONFIG_ATH10K_DEBUGFS
+static ssize_t ath10k_write_debug_mask(struct file *file,
+                                      const char __user *ubuf,
+                                      size_t count, loff_t *ppos)
+{
+       struct ath10k *ar = file->private_data;
+       int ret;
+       u32 val;
+
+        if (kstrtou32_from_user(ubuf, count, 0, &val))
+                return -EINVAL;
+
+       ar->debug_mask = val;
+       ret = count;
+
+       return ret;
+}
+
+static ssize_t ath10k_read_debug_mask(struct file *file, char __user *ubuf,
+                                     size_t count, loff_t *ppos)
+{
+       char buf[32];
+       struct ath10k *ar = file->private_data;
+       int len = 0;
+
+       len = scnprintf(buf, sizeof(buf) - len, "0x%x\n", ar->debug_mask);
+       return simple_read_from_buffer(ubuf, count, ppos, buf, len);
+}
+
+static const struct file_operations fops_debug_mask = {
+       .read = ath10k_read_debug_mask,
+       .write = ath10k_write_debug_mask,
+       .open = simple_open
+};
+
+static ssize_t ath10k_write_trace_debug_mask(struct file *file,
+                                            const char __user *ubuf,
+                                            size_t count, loff_t *ppos)
+{
+       struct ath10k *ar = file->private_data;
+       int ret;
+       u32 val;
+
+        if (kstrtou32_from_user(ubuf, count, 0, &val))
+                return -EINVAL;
+
+       ar->trace_debug_mask = val;
+       ret = count;
+
+       return ret;
+}
+
+static ssize_t ath10k_read_trace_debug_mask(struct file *file,
+                                           char __user *ubuf,
+                                           size_t count, loff_t *ppos)
+{
+       char buf[32];
+       struct ath10k *ar = file->private_data;
+       int len = 0;
+
+       len = scnprintf(buf, sizeof(buf) - len, "0x%x\n",
+                       ar->trace_debug_mask);
+       return simple_read_from_buffer(ubuf, count, ppos, buf, len);
+}
+
+static const struct file_operations fops_trace_debug_mask = {
+       .read = ath10k_read_trace_debug_mask,
+       .write = ath10k_write_trace_debug_mask,
+       .open = simple_open
+};
+#endif /* CONFIG_ATH10K_DEBUGFS */
+
+
 void ath10k_debug_destroy(struct ath10k *ar)
 {
        vfree(ar->debug.fw_crash_data);
@@ -2448,6 +2521,13 @@ int ath10k_debug_register(struct ath10k *ar)
        init_completion(&ar->debug.tpc_complete);
        init_completion(&ar->debug.fw_stats_complete);
 
+#ifdef CONFIG_ATH10K_DEBUG
+       debugfs_create_file("debug", S_IRUSR, ar->debug.debugfs_phy, ar,
+                           &fops_debug_mask);
+       debugfs_create_file("trace_debug", S_IRUSR, ar->debug.debugfs_phy, ar,
+                           &fops_trace_debug_mask);
+#endif
+
        debugfs_create_file("fw_stats", 0400, ar->debug.debugfs_phy, ar,
                            &fops_fw_stats);
 
@@ -2536,7 +2616,7 @@ void ath10k_debug_unregister(struct ath10k *ar)
 #endif /* CONFIG_ATH10K_DEBUGFS */
 
 #ifdef CONFIG_ATH10K_DEBUG
-void ath10k_dbg(struct ath10k *ar, enum ath10k_debug_mask mask,
+void _ath10k_dbg(struct ath10k *ar, enum ath10k_debug_mask mask,
                const char *fmt, ...)
 {
        struct va_format vaf;
@@ -2547,16 +2627,16 @@ void ath10k_dbg(struct ath10k *ar, enum 
ath10k_debug_mask mask,
        vaf.fmt = fmt;
        vaf.va = &args;
 
-       if (ath10k_debug_mask & mask)
+       if (ar->debug_mask & mask)
                dev_printk(KERN_DEBUG, ar->dev, "%pV", &vaf);
-
-       trace_ath10k_log_dbg(ar, mask, &vaf);
+       if (ar->trace_debug_mask & mask)
+               trace_ath10k_log_dbg(ar, mask, &vaf);
 
        va_end(args);
 }
-EXPORT_SYMBOL(ath10k_dbg);
+EXPORT_SYMBOL(_ath10k_dbg);
 
-void ath10k_dbg_dump(struct ath10k *ar,
+void _ath10k_dbg_dump(struct ath10k *ar,
                     enum ath10k_debug_mask mask,
                     const char *msg, const char *prefix,
                     const void *buf, size_t len)
@@ -2565,7 +2645,7 @@ void ath10k_dbg_dump(struct ath10k *ar,
        size_t linebuflen;
        const void *ptr;
 
-       if (ath10k_debug_mask & mask) {
+       if (ar->debug_mask & mask) {
                if (msg)
                        ath10k_dbg(ar, mask, "%s\n", msg);
 
@@ -2584,9 +2664,10 @@ void ath10k_dbg_dump(struct ath10k *ar,
        }
 
        /* tracing code doesn't like null strings :/ */
-       trace_ath10k_log_dbg_dump(ar, msg ? msg : "", prefix ? prefix : "",
-                                 buf, len);
+       if (ar->trace_debug_mask & mask)
+               trace_ath10k_log_dbg_dump(ar, msg ? msg : "", prefix ? prefix : 
"",
+                                         buf, len);
 }
-EXPORT_SYMBOL(ath10k_dbg_dump);
+EXPORT_SYMBOL(_ath10k_dbg_dump);
 
 #endif /* CONFIG_ATH10K_DEBUG */
diff --git a/drivers/net/wireless/ath/ath10k/debug.h 
b/drivers/net/wireless/ath/ath10k/debug.h
index 257d10985c6e..ad6fcd37412f 100644
--- a/drivers/net/wireless/ath/ath10k/debug.h
+++ b/drivers/net/wireless/ath/ath10k/debug.h
@@ -200,27 +200,43 @@ void ath10k_sta_update_rx_duration(struct ath10k *ar,
 #endif /* CONFIG_MAC80211_DEBUGFS */
 
 #ifdef CONFIG_ATH10K_DEBUG
-__printf(3, 4) void ath10k_dbg(struct ath10k *ar,
+static inline int
+_ath10k_do_dbg(struct ath10k *ar, enum ath10k_debug_mask mask)
+{
+       if (ar->trace_debug_mask & mask)
+               return (1);
+       if (ar->debug_mask & mask)
+               return (1);
+       return (0);
+}
+
+__printf(3, 4) void _ath10k_dbg(struct ath10k *ar,
                               enum ath10k_debug_mask mask,
                               const char *fmt, ...);
-void ath10k_dbg_dump(struct ath10k *ar,
+
+void _ath10k_dbg_dump(struct ath10k *ar,
                     enum ath10k_debug_mask mask,
                     const char *msg, const char *prefix,
                     const void *buf, size_t len);
+
+#define        ath10k_dbg(ar, mask, ...)                                       
\
+       do {                                                            \
+               if (_ath10k_do_dbg(ar, mask)) {                         \
+                       _ath10k_dbg((ar), (mask), __VA_ARGS__);         \
+               };                                                      \
+       } while (0)
+
+#define        ath10k_dbg_dump(ar, mask, msg, pfx, buf, len)                   
\
+       do {                                                            \
+               if (_ath10k_do_dbg(ar, mask)) {                         \
+                       _ath10k_dbg_dump((ar), (mask), (msg), (pfx), (buf), 
(len)); \
+               };                                                      \
+       } while (0)
+
 #else /* CONFIG_ATH10K_DEBUG */
 
-static inline int ath10k_dbg(struct ath10k *ar,
-                            enum ath10k_debug_mask dbg_mask,
-                            const char *fmt, ...)
-{
-       return 0;
-}
+#define        ath10k_dbg(ar, mask, fmt, ...)
+#define        ath10k_dbg_dump(ar, mask, msg, pfx, buf, len)
 
-static inline void ath10k_dbg_dump(struct ath10k *ar,
-                                  enum ath10k_debug_mask mask,
-                                  const char *msg, const char *prefix,
-                                  const void *buf, size_t len)
-{
-}
 #endif /* CONFIG_ATH10K_DEBUG */
 #endif /* _DEBUG_H_ */
-- 
2.12.1

Reply via email to