All of lore.kernel.org
 help / color / mirror / 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>, Adrian Chadd <adrian@FreeBSD.org>
Subject: [PATCH] ath10k: add configurable debugging.
Date: Wed, 10 May 2017 14:19:25 -0700	[thread overview]
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

WARNING: multiple messages have this Message-ID (diff)
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	[thread overview]
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	other threads:[~2017-05-10 21:19 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-05-10 21:19 Adrian Chadd [this message]
2017-05-10 21:19 ` [PATCH] ath10k: add configurable debugging Adrian Chadd
2017-05-19  9:51 ` Kalle Valo
2017-05-19  9:51   ` Kalle Valo
2017-05-31 11:53 ` Kalle Valo
2017-05-31 11:53   ` Kalle Valo
2017-05-31 12:16 ` Kalle Valo
2017-05-31 12:16   ` Kalle Valo
2017-05-31 20:20   ` Arend van Spriel
2017-05-31 20:20     ` Arend van Spriel
2017-05-31 20:23     ` Adrian Chadd
2017-05-31 20:23       ` Adrian Chadd
2017-05-31 21:28       ` Arend van Spriel
2017-05-31 21:28         ` Arend van Spriel
2017-05-31 21:32         ` Adrian Chadd
2017-05-31 21:32           ` Adrian Chadd
2017-06-01 13:34       ` Kalle Valo
2017-06-01 13:34         ` Kalle Valo
2017-06-01 13:24     ` Kalle Valo
2017-06-01 13:24       ` Kalle Valo
2017-06-01 13:33       ` Adrian Chadd
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:25 ` Adrian Chadd
2017-05-10 16:44 ` Steve deRosier
2017-05-10 16:44   ` Steve deRosier
2017-05-10 16:50   ` Adrian Chadd
2017-05-10 16:50     ` Adrian Chadd
2017-05-19  9:47 ` Kalle Valo
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
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.