ATH10K Archive on lore.kernel.org
 help / color / Atom feed
From: Adrian Chadd <adrian@freebsd.org>
To: Kalle Valo <kvalo@qca.qualcomm.com>,
	ath10k@lists.infradead.org, linux-wireless@vger.kernel.org
Cc: Adrian Chadd <adrian@FreeBSD.org>
Subject: [PATCH] ath10k: add configurable debugging.
Date: Wed, 10 May 2017 14:19:25 -0700
Message-ID: <20170510211925.17468-1-adrian@freebsd.org> (raw)

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 <adrian@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


_______________________________________________
ath10k mailing list
ath10k@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/ath10k

             reply index

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-05-10 21:19 Adrian Chadd [this message]
2017-05-19  9:51 ` Kalle Valo
2017-05-31 11:53 ` Kalle Valo
2017-05-31 12:16 ` Kalle Valo
2017-05-31 20:20   ` Arend van Spriel
2017-05-31 20:23     ` Adrian Chadd
2017-05-31 21:28       ` Arend van Spriel
2017-05-31 21:32         ` Adrian Chadd
2017-06-01 13:34       ` Kalle Valo
2017-06-01 13:24     ` Kalle Valo
2017-06-01 13:33       ` Adrian Chadd
  -- strict thread matches above, loose matches on Subject: below --
2017-05-10 16:25 Adrian Chadd
2017-05-10 16:44 ` Steve deRosier
2017-05-10 16:50   ` Adrian Chadd
2017-05-19  9:47 ` Kalle Valo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170510211925.17468-1-adrian@freebsd.org \
    --to=adrian@freebsd.org \
    --cc=ath10k@lists.infradead.org \
    --cc=kvalo@qca.qualcomm.com \
    --cc=linux-wireless@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

ATH10K Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/ath10k/0 ath10k/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ath10k ath10k/ https://lore.kernel.org/ath10k \
		ath10k@lists.infradead.org
	public-inbox-index ath10k

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.infradead.lists.ath10k


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git