summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJanusz Dziedzic <janusz.dziedzic@tieto.com>2012-02-29 15:15:41 +0100
committerPhilippe Langlais <philippe.langlais@stericsson.com>2012-05-22 11:06:50 +0200
commitb85ef3fd664e8c73e9979e56af72ae13b44eadd6 (patch)
tree78072a4b099758dce9de7a4878ff8fdd81c84ef1
parent30044654a02bc9fcf123b015c17a192d95f22190 (diff)
cw1200: WSM debug improvements
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@tieto.com> Signed-off-by: Bartosz Markowski <bartosz.markowski@tieto.com> Change-Id: Ib47989fb8b21d418507ef9109c48f440e10b4a18 Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/50378 Reviewed-by: QATOOLS
-rw-r--r--drivers/staging/cw1200/Kconfig6
-rw-r--r--drivers/staging/cw1200/bh.c22
-rw-r--r--drivers/staging/cw1200/cw1200.h1
-rw-r--r--drivers/staging/cw1200/debug.c52
-rw-r--r--drivers/staging/cw1200/main.c3
5 files changed, 80 insertions, 4 deletions
diff --git a/drivers/staging/cw1200/Kconfig b/drivers/staging/cw1200/Kconfig
index 044f7e6585a..4be840c1576 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 5c0fc628a89..1acc972b6d4 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 81b453339ae..5869c917fe6 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 46db83316d5..3da603ac87d 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 579aee899c5..92f127e2f33 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;
}