diff options
author | Dmitry Tarnyagin <dmitry.tarnyagin@stericsson.com> | 2011-08-19 14:35:55 +0200 |
---|---|---|
committer | Philippe Langlais <philippe.langlais@linaro.org> | 2012-03-19 09:01:51 +0100 |
commit | 2a5d56f26877bb8b519401deae950e0d5da716da (patch) | |
tree | 8fdeec970ed794be273436889092cb0512b7a595 /drivers/staging/cw1200/wsm.c | |
parent | 9186995f9d15ea3b5bf06042cc1d1876c9db62c9 (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.c | 14 |
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: |