diff options
author | Dmitry Tarnyagin <dmitry.tarnyagin@stericsson.com> | 2011-08-05 13:56:56 +0200 |
---|---|---|
committer | Philippe LANGLAIS <philippe.langlais@stericsson.com> | 2011-10-13 09:59:34 +0200 |
commit | 192d16d112c1e94e56539af1265c61673d046a9d (patch) | |
tree | 7a8acfe507b0be6ac82c4cab6e327151247af496 | |
parent | a28df94af01d14da8d3a13b08c5f3bdacf4fcbff (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.c | 8 | ||||
-rw-r--r-- | drivers/staging/cw1200/wsm.c | 8 |
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; |