summaryrefslogtreecommitdiff
path: root/drivers/staging/cw1200/wsm.c
diff options
context:
space:
mode:
authorDmitry Tarnyagin <dmitry.tarnyagin@stericsson.com>2011-08-19 14:35:55 +0200
committerPhilippe Langlais <philippe.langlais@linaro.org>2012-03-19 09:01:51 +0100
commit2a5d56f26877bb8b519401deae950e0d5da716da (patch)
tree8fdeec970ed794be273436889092cb0512b7a595 /drivers/staging/cw1200/wsm.c
parent9186995f9d15ea3b5bf06042cc1d1876c9db62c9 (diff)
cw1200: Fix incorrect usage of wait_event_interruptible_timeout.
In many places in the driver wait_event_interruptible_timeout was wrongly used instead of wait_event_timeout. It caused several problems when upper layer received signals. A typical one was: [ 4553.767944] [BH] wakeup. [ 4553.768035] kernel BUG at drivers/staging/cw1200/wsm.c:1069! [ 4553.768066] Unable to handle kernel NULL pointer dereference at virtual address 00000000 ... [ 4553.770507] [<c003d550>] (__bug+0x1c/0x28) from [<bf0d8780>] (wsm_cmd_send+0x270/0x2cc [cw1200_core]) [ 4553.770538] [<bf0d8780>] (wsm_cmd_send+0x270/0x2cc [cw1200_core]) from [<bf0d9a5c>] (wsm_remove_key+0xf0/0x114 [cw1200_core]) ... [ 4553.771972] [<c03cb964>] (sock_sendmsg+0xa0/0xbc) from [<c03cbee8>] (sys_sendmsg+0x1b0/0x20c) [ 4553.772003] [<c03cbee8>] (sys_sendmsg+0x1b0/0x20c) from [<c0039680>] (ret_fast_syscall+0x0/0x30) Change-Id: Ie0c2ded7348379a324f1f23fae4416014c272530 Signed-off-by: Dmitry Tarnyagin <dmitry.tarnyagin@stericsson.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/29164 Reviewed-by: Bartosz MARKOWSKI <bartosz.markowski@tieto.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/33513 Reviewed-by: Philippe LANGLAIS <philippe.langlais@stericsson.com>
Diffstat (limited to 'drivers/staging/cw1200/wsm.c')
-rw-r--r--drivers/staging/cw1200/wsm.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/drivers/staging/cw1200/wsm.c b/drivers/staging/cw1200/wsm.c
index 37194870c56..2ad3eceaf69 100644
--- a/drivers/staging/cw1200/wsm.c
+++ b/drivers/staging/cw1200/wsm.c
@@ -842,7 +842,7 @@ static int wsm_startup_indication(struct cw1200_common *priv,
priv->wsm_caps.firmwareReady = 1;
- wake_up_interruptible(&priv->wsm_startup_done);
+ wake_up(&priv->wsm_startup_done);
return 0;
underflow:
@@ -929,7 +929,7 @@ static int wsm_channel_switch_indication(struct cw1200_common *priv,
WARN_ON(WSM_GET32(buf));
priv->channel_switch_in_progress = 0;
- wake_up_interruptible(&priv->channel_switch_done);
+ wake_up(&priv->channel_switch_done);
if (priv->wsm_cbc.channel_switch)
priv->wsm_cbc.channel_switch(priv);
@@ -1035,7 +1035,7 @@ int wsm_cmd_send(struct cw1200_common *priv,
do {
/* It's safe to use unprotected access to
* wsm_cmd.done here */
- ret = wait_event_interruptible_timeout(
+ ret = wait_event_timeout(
priv->wsm_cmd_wq,
priv->wsm_cmd.done, tmo);
rx_timestamp = jiffies - priv->rx_timestamp;
@@ -1059,7 +1059,7 @@ int wsm_cmd_send(struct cw1200_common *priv,
/* If wsm_handle_rx got stuck in _confirm we will hang
* system there. It's better than silently currupt
* stack or heap, isn't it? */
- BUG_ON(wait_event_interruptible_timeout(
+ BUG_ON(wait_event_timeout(
priv->wsm_cmd_wq, priv->wsm_cmd.done,
WSM_CMD_LAST_CHANCE_TIMEOUT) <= 0);
}
@@ -1081,7 +1081,7 @@ void wsm_lock_tx(struct cw1200_common *priv)
{
wsm_cmd_lock(priv);
if (atomic_add_return(1, &priv->tx_lock) == 1) {
- WARN_ON(wait_event_interruptible_timeout(priv->bh_evt_wq,
+ WARN_ON(wait_event_timeout(priv->bh_evt_wq,
!priv->hw_bufs_used, WSM_CMD_LAST_CHANCE_TIMEOUT) <= 0);
wsm_printk(KERN_DEBUG "[WSM] TX is locked.\n");
}
@@ -1097,7 +1097,7 @@ void wsm_lock_tx_async(struct cw1200_common *priv)
void wsm_flush_tx(struct cw1200_common *priv)
{
BUG_ON(!atomic_read(&priv->tx_lock));
- WARN_ON(wait_event_interruptible_timeout(priv->bh_evt_wq,
+ WARN_ON(wait_event_timeout(priv->bh_evt_wq,
!priv->hw_bufs_used, WSM_CMD_LAST_CHANCE_TIMEOUT) <= 0);
}
@@ -1269,7 +1269,7 @@ int wsm_handle_rx(struct cw1200_common *priv, int id,
spin_unlock(&priv->wsm_cmd.lock);
ret = 0; /* Error response from device should ne stop BH. */
- wake_up_interruptible(&priv->wsm_cmd_wq);
+ wake_up(&priv->wsm_cmd_wq);
} else if (id & 0x0800) {
switch (id) {
case 0x0801: