[PATCH 94/99] cw1200: WSM debug improvements

Dmitry Tarnyagin dmitry.tarnyagin at stericsson.com
Wed Feb 29 14:15:41 UTC 2012


From: Janusz Dziedzic <janusz.dziedzic at tieto.com>

New config options added:
* CW1200_WSM_DUMPS_SHORT
* CW1200_DUMP_ON_ERROR

ST-Ericsson ID: 419537
ST-Ericsson FOSS-OUT ID: NA

Signed-off-by: Janusz Dziedzic <janusz.dziedzic at tieto.com>
Signed-off-by: Bartosz Markowski <bartosz.markowski at tieto.com>
Change-Id: Ib47989fb8b21d418507ef9109c48f440e10b4a18
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/50378
Reviewed-by: QATOOLS
---
 drivers/staging/cw1200/Kconfig  |    6 ++++
 drivers/staging/cw1200/bh.c     |   22 ++++++++++++++--
 drivers/staging/cw1200/cw1200.h |    1 +
 drivers/staging/cw1200/debug.c  |   52 ++++++++++++++++++++++++++++++++++++++-
 drivers/staging/cw1200/main.c   |    3 ++
 5 files changed, 80 insertions(+), 4 deletions(-)

diff --git a/drivers/staging/cw1200/Kconfig b/drivers/staging/cw1200/Kconfig
index 044f7e6..4be840c 100644
--- a/drivers/staging/cw1200/Kconfig
+++ b/drivers/staging/cw1200/Kconfig
@@ -78,6 +78,9 @@ config CW1200_WSM_DEBUG
 config CW1200_WSM_DUMPS
       bool "Verbose WSM API logging (DEVELOPMENT)"
 
+config CW1200_WSM_DUMPS_SHORT
+      bool "Dump only first x bytes (default 20) (DEVELOPMENT)"
+
 config CW1200_TXRX_DEBUG
       bool "Enable TX/RX debug messages (DEVELOPMENT)"
 
@@ -87,6 +90,9 @@ config CW1200_TX_POLICY_DEBUG
 config CW1200_STA_DEBUG
       bool "Enable STA/AP debug (DEVELOPMENT)"
 
+config CW1200_DUMP_ON_ERROR
+      bool "Dump kernel in case of critical error (DEVELOPMENT)"
+
 endmenu
 
 config CW1200_ITP
diff --git a/drivers/staging/cw1200/bh.c b/drivers/staging/cw1200/bh.c
index 5c0fc62..1acc972 100644
--- a/drivers/staging/cw1200/bh.c
+++ b/drivers/staging/cw1200/bh.c
@@ -265,6 +265,7 @@ static int cw1200_bh(void *arg)
 	int tx_burst;
 	int rx_burst = 0;
 	long status;
+	size_t wsm_dump_max = -1;
 	u32 dummy;
 
 	for (;;) {
@@ -283,6 +284,9 @@ static int cw1200_bh(void *arg)
 				(atomic_read(&priv->bh_tx) == 0)))
 			cw1200_reg_read(priv, ST90TDS_CONFIG_REG_ID,
 					&dummy, sizeof(dummy));
+#if defined(CONFIG_CW1200_WSM_DUMPS_SHORT)
+		wsm_dump_max = priv->wsm_dump_max_size;
+#endif /* CONFIG_CW1200_WSM_DUMPS_SHORT */
 
 		status = wait_event_interruptible_timeout(priv->bh_wq, ({
 				rx = atomic_xchg(&priv->bh_rx, 0);
@@ -298,6 +302,9 @@ static int cw1200_bh(void *arg)
 		if (!status && priv->hw_bufs_used) {
 			wiphy_warn(priv->hw->wiphy, "Missed interrupt?\n");
 			rx = 1;
+#if defined(CONFIG_CW1200_DUMP_ON_ERROR)
+			BUG_ON(1);
+#endif /* CONFIG_CW1200_DUMP_ON_ERROR */
 		} else if (!status) {
 			bh_printk(KERN_DEBUG "[BH] Device wakedown.\n");
 			WARN_ON(cw1200_reg_write_16(priv,
@@ -400,7 +407,7 @@ rx:
 			if (unlikely(priv->wsm_enable_wsm_dumps))
 				print_hex_dump_bytes("<-- ",
 					DUMP_PREFIX_NONE,
-					data, wsm_len);
+					data, min(wsm_len, wsm_dump_max));
 #endif /* CONFIG_CW1200_WSM_DUMPS */
 
 			wsm_id  = __le32_to_cpu(wsm->id) & 0xFFF;
@@ -414,8 +421,12 @@ rx:
 					wsm_len - sizeof(*wsm));
 				break;
 			} else if (unlikely(!rx_resync)) {
-				if (WARN_ON(wsm_seq != priv->wsm_rx_seq))
+				if (WARN_ON(wsm_seq != priv->wsm_rx_seq)) {
+#if defined(CONFIG_CW1200_DUMP_ON_ERROR)
+					BUG_ON(1);
+#endif /* CONFIG_CW1200_DUMP_ON_ERROR */
 					break;
+				}
 			}
 			priv->wsm_rx_seq = (wsm_seq + 1) & 7;
 			rx_resync = 0;
@@ -525,7 +536,9 @@ tx:
 				if (unlikely(priv->wsm_enable_wsm_dumps))
 					print_hex_dump_bytes("--> ",
 						DUMP_PREFIX_NONE,
-						data, __le32_to_cpu(wsm->len));
+						data,
+						min(__le32_to_cpu(wsm->len),
+						 wsm_dump_max));
 #endif /* CONFIG_CW1200_WSM_DUMPS */
 
 				wsm_txed(priv, data);
@@ -552,6 +565,9 @@ tx:
 
 	if (!term) {
 		cw1200_dbg(CW1200_DBG_ERROR, "[BH] Fatal error, exitting.\n");
+#if defined(CONFIG_CW1200_DUMP_ON_ERROR)
+		BUG_ON(1);
+#endif /* CONFIG_CW1200_DUMP_ON_ERROR */
 		priv->bh_error = 1;
 #if defined(CONFIG_CW1200_USE_STE_EXTENSIONS)
 		ieee80211_driver_hang_notify(priv->vif, GFP_KERNEL);
diff --git a/drivers/staging/cw1200/cw1200.h b/drivers/staging/cw1200/cw1200.h
index 81b4533..5869c91 100644
--- a/drivers/staging/cw1200/cw1200.h
+++ b/drivers/staging/cw1200/cw1200.h
@@ -208,6 +208,7 @@ struct cw1200_common {
 
 	/* WSM debug */
 	int				wsm_enable_wsm_dumps;
+	u32				wsm_dump_max_size;
 
 	/* Scan status */
 	struct cw1200_scan scan;
diff --git a/drivers/staging/cw1200/debug.c b/drivers/staging/cw1200/debug.c
index 46db833..3da603a 100644
--- a/drivers/staging/cw1200/debug.c
+++ b/drivers/staging/cw1200/debug.c
@@ -493,6 +493,50 @@ static const struct file_operations fops_wsm_dumps = {
 	.llseek = default_llseek,
 };
 
+#if defined(CONFIG_CW1200_WSM_DUMPS_SHORT)
+static ssize_t cw1200_short_dump_read(struct file *file,
+	char __user *user_buf, size_t count, loff_t *ppos)
+{
+	struct cw1200_common *priv = file->private_data;
+	char buf[20];
+	size_t size = 0;
+
+	sprintf(buf, "Size: %u\n", priv->wsm_dump_max_size);
+	size = strlen(buf);
+
+	return simple_read_from_buffer(user_buf, count, ppos,
+					buf, size);
+}
+
+static ssize_t cw1200_short_dump_write(struct file *file,
+	const char __user *user_buf, size_t count, loff_t *ppos)
+{
+	struct cw1200_common *priv = file->private_data;
+	char buf[20];
+	unsigned long dump_size = 0;
+
+	if (!count || count > 20)
+		return -EINVAL;
+	if (copy_from_user(buf, user_buf, count))
+		return -EFAULT;
+
+	if (kstrtoul(buf, 10, &dump_size))
+		return -EINVAL;
+	printk(KERN_ERR "%s get %lu\n", __func__, dump_size);
+
+	priv->wsm_dump_max_size = dump_size;
+
+	return count;
+}
+
+static const struct file_operations fops_short_dump = {
+	.open = cw1200_generic_open,
+	.write = cw1200_short_dump_write,
+	.read = cw1200_short_dump_read,
+	.llseek = default_llseek,
+};
+#endif /* CONFIG_CW1200_WSM_DUMPS_SHORT */
+
 int cw1200_debug_init(struct cw1200_common *priv)
 {
 	int ret = -ENOMEM;
@@ -529,6 +573,12 @@ int cw1200_debug_init(struct cw1200_common *priv)
 			priv, &fops_wsm_dumps))
 		goto err;
 
+#if defined(CONFIG_CW1200_WSM_DUMPS_SHORT)
+	if (!debugfs_create_file("wsm_dump_size", S_IRUSR | S_IWUSR,
+			d->debugfs_phy, priv, &fops_short_dump))
+		goto err;
+#endif /* CONFIG_CW1200_WSM_DUMPS_SHORT */
+
 	ret = cw1200_itp_init(priv);
 	if (ret)
 		goto err;
@@ -550,7 +600,7 @@ void cw1200_debug_release(struct cw1200_common *priv)
 		priv->debug = NULL;
 		kfree(d);
 	}
-	}
+}
 
 int cw1200_print_fw_version(struct cw1200_common *priv, u8 *buf, size_t len)
 {
diff --git a/drivers/staging/cw1200/main.c b/drivers/staging/cw1200/main.c
index 579aee8..92f127e 100644
--- a/drivers/staging/cw1200/main.c
+++ b/drivers/staging/cw1200/main.c
@@ -389,6 +389,9 @@ struct ieee80211_hw *cw1200_init_common(size_t priv_data_len)
 	wsm_buf_init(&priv->wsm_cmd_buf);
 	spin_lock_init(&priv->wsm_cmd.lock);
 	tx_policy_init(priv);
+#if defined(CONFIG_CW1200_WSM_DUMPS_SHORT)
+	priv->wsm_dump_max_size = 20;
+#endif /* CONFIG_CW1200_WSM_DUMPS_SHORT */
 
 	return hw;
 }
-- 
1.7.8.3



More information about the kernel mailing list