summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Tarnyagin <dmitry.tarnyagin@stericsson.com>2011-08-05 13:56:56 +0200
committerLee Jones <lee.jones@linaro.org>2012-01-05 10:19:52 +0000
commit6205a69068a4b0d8d0839dd14f62df871d86c80c (patch)
treec340fc3f0ea856ca9b5a4819734d903acb0fa164
parent06347db4c460baf7bf85232cd99ea7766c3b4610 (diff)
cw1200: Missing interrupt detection.
Missing interrupt (or slow response?) was observed on wsm_reset() call. Indication: [ 106.596252] ADDRCONF(NETDEV_UP): wlan0: link is not ready [ 108.681884] WARNING: at kernel/net/compat-wireless/drivers/staging/cw1200/ap.c:654 cw1200_bss_info_changed+0x2dc/0x9f8 [cw1200_core]() ... [ 108.931396] WARNING: at kernel/net/compat-wireless/drivers/staging/cw1200/wsm.c:1141 wsm_handle_rx+0x9bc/0x9f4 [cw1200_core]() ... [ 109.021667] WARNING: at kernel/net/compat-wireless/drivers/staging/cw1200/bh.c:411 cw1200_bh+0x718/0x95c [cw1200_core]() [ 109.095275] [BH] Fatal error, exitting. The patch implements missing interrupt detection and also increases timeout for the wsm_reset() call. Change-Id: I3fb9ad92ab62bc1be831c835fd16a7c600793bb6 Signed-off-by: Dmitry Tarnyagin <dmitry.tarnyagin@stericsson.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/28336 Reviewed-by: Bartosz MARKOWSKI <bartosz.markowski@tieto.com> Tested-by: Bartosz MARKOWSKI <bartosz.markowski@tieto.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/33502 Reviewed-by: Philippe LANGLAIS <philippe.langlais@stericsson.com>
-rw-r--r--drivers/staging/cw1200/bh.c8
-rw-r--r--drivers/staging/cw1200/wsm.c8
2 files changed, 11 insertions, 5 deletions
diff --git a/drivers/staging/cw1200/bh.c b/drivers/staging/cw1200/bh.c
index cddfd9dfaa4..1ecae7466f6 100644
--- a/drivers/staging/cw1200/bh.c
+++ b/drivers/staging/cw1200/bh.c
@@ -270,6 +270,9 @@ static int cw1200_bh(void *arg)
&& priv->powersave_enabled
&& !priv->device_can_sleep)
status = 1 * HZ;
+ else if (priv->hw_bufs_used)
+ /* Interrupt loss detection */
+ status = 1 * HZ;
else
status = MAX_SCHEDULE_TIMEOUT;
@@ -284,7 +287,10 @@ static int cw1200_bh(void *arg)
if (status < 0 || term)
break;
- if (!status) {
+ if (!status && priv->hw_bufs_used) {
+ wiphy_warn(priv->hw->wiphy, "Missed interrupt?\n");
+ rx = 1;
+ } else if (!status) {
bh_printk(KERN_DEBUG "[BH] Device wakedown.\n");
WARN_ON(cw1200_reg_write_16(priv,
ST90TDS_CONTROL_REG_ID, 0));
diff --git a/drivers/staging/cw1200/wsm.c b/drivers/staging/cw1200/wsm.c
index 1fe5e32a27a..f1ab481984b 100644
--- a/drivers/staging/cw1200/wsm.c
+++ b/drivers/staging/cw1200/wsm.c
@@ -27,10 +27,10 @@
#define wsm_printk(...)
#endif
-#define WSM_CMD_TIMEOUT (1 * HZ)
-#define WSM_CMD_JOIN_TIMEOUT (7 * HZ) /* Join timeout is 5 sec. in FW */
+#define WSM_CMD_TIMEOUT (2 * HZ) /* With respect to interrupt loss */
+#define WSM_CMD_JOIN_TIMEOUT (7 * HZ) /* Join timeout is 5 sec. in FW */
#define WSM_CMD_START_TIMEOUT (7 * HZ)
-#define WSM_TX_TIMEOUT (1 * HZ)
+#define WSM_CMD_RESET_TIMEOUT (3 * HZ) /* 2 sec. timeout was observed. */
#define WSM_CMD_LAST_CHANCE_TIMEOUT (10 * HZ)
#define WSM_SKIP(buf, size) \
@@ -184,7 +184,7 @@ int wsm_reset(struct cw1200_common *priv, const struct wsm_reset *arg)
wsm_cmd_lock(priv);
WSM_PUT32(buf, arg->reset_statistics ? 0 : 1);
- ret = wsm_cmd_send(priv, buf, NULL, cmd, WSM_CMD_TIMEOUT);
+ ret = wsm_cmd_send(priv, buf, NULL, cmd, WSM_CMD_RESET_TIMEOUT);
wsm_cmd_unlock(priv);
return ret;