From b85ef3fd664e8c73e9979e56af72ae13b44eadd6 Mon Sep 17 00:00:00 2001 From: Janusz Dziedzic Date: Wed, 29 Feb 2012 15:15:41 +0100 Subject: 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 Signed-off-by: Bartosz Markowski 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 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; } -- cgit v1.2.3