summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmitkumar Karwar <akarwar@marvell.com>2015-01-07 05:36:56 (GMT)
committerMarcel Holtmann <marcel@holtmann.org>2015-01-08 05:36:50 (GMT)
commita9cc32d96c62b230c664a362b5f3206d3bcf35b8 (patch)
treec56bfdb6db4bd6a953618c7c424cb0acf155c4c7
parent0333d6dd3bc17468f42d0c455113fd9d50f7746e (diff)
downloadlinux-a9cc32d96c62b230c664a362b5f3206d3bcf35b8.tar.xz
Bluetooth: btmrvl: fix card reset and suspend race issue
Sometimes suspend thread queues a command and wait for it's response, meanwhile WLAN driver power cycles the card which leads to crash. This patch makes sure that suspend thread is woken up in remove path. Signed-off-by: Amitkumar Karwar <akarwar@marvell.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
-rw-r--r--drivers/bluetooth/btmrvl_main.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/drivers/bluetooth/btmrvl_main.c b/drivers/bluetooth/btmrvl_main.c
index 2578b29..4135977 100644
--- a/drivers/bluetooth/btmrvl_main.c
+++ b/drivers/bluetooth/btmrvl_main.c
@@ -207,10 +207,14 @@ static int btmrvl_send_sync_cmd(struct btmrvl_private *priv, u16 opcode,
wake_up_interruptible(&priv->main_thread.wait_q);
if (!wait_event_interruptible_timeout(priv->adapter->cmd_wait_q,
- priv->adapter->cmd_complete,
+ priv->adapter->cmd_complete ||
+ priv->surprise_removed,
WAIT_UNTIL_CMD_RESP))
return -ETIMEDOUT;
+ if (priv->surprise_removed)
+ return -EFAULT;
+
return 0;
}
@@ -292,9 +296,10 @@ int btmrvl_enable_hs(struct btmrvl_private *priv)
}
ret = wait_event_interruptible_timeout(adapter->event_hs_wait_q,
- adapter->hs_state,
+ adapter->hs_state ||
+ priv->surprise_removed,
WAIT_UNTIL_HS_STATE_CHANGED);
- if (ret < 0) {
+ if (ret < 0 || priv->surprise_removed) {
BT_ERR("event_hs_wait_q terminated (%d): %d,%d,%d",
ret, adapter->hs_state, adapter->ps_state,
adapter->wakeup_tries);