aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/bluetooth/btmrvl_main.c
diff options
context:
space:
mode:
authorAmitkumar Karwar <akarwar@marvell.com>2015-01-07 00:36:56 -0500
committerMarcel Holtmann <marcel@holtmann.org>2015-01-08 00:36:50 -0500
commita9cc32d96c62b230c664a362b5f3206d3bcf35b8 (patch)
treec56bfdb6db4bd6a953618c7c424cb0acf155c4c7 /drivers/bluetooth/btmrvl_main.c
parent0333d6dd3bc17468f42d0c455113fd9d50f7746e (diff)
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>
Diffstat (limited to 'drivers/bluetooth/btmrvl_main.c')
-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 2578b29f1cd1..413597789c61 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,
207 wake_up_interruptible(&priv->main_thread.wait_q); 207 wake_up_interruptible(&priv->main_thread.wait_q);
208 208
209 if (!wait_event_interruptible_timeout(priv->adapter->cmd_wait_q, 209 if (!wait_event_interruptible_timeout(priv->adapter->cmd_wait_q,
210 priv->adapter->cmd_complete, 210 priv->adapter->cmd_complete ||
211 priv->surprise_removed,
211 WAIT_UNTIL_CMD_RESP)) 212 WAIT_UNTIL_CMD_RESP))
212 return -ETIMEDOUT; 213 return -ETIMEDOUT;
213 214
215 if (priv->surprise_removed)
216 return -EFAULT;
217
214 return 0; 218 return 0;
215} 219}
216 220
@@ -292,9 +296,10 @@ int btmrvl_enable_hs(struct btmrvl_private *priv)
292 } 296 }
293 297
294 ret = wait_event_interruptible_timeout(adapter->event_hs_wait_q, 298 ret = wait_event_interruptible_timeout(adapter->event_hs_wait_q,
295 adapter->hs_state, 299 adapter->hs_state ||
300 priv->surprise_removed,
296 WAIT_UNTIL_HS_STATE_CHANGED); 301 WAIT_UNTIL_HS_STATE_CHANGED);
297 if (ret < 0) { 302 if (ret < 0 || priv->surprise_removed) {
298 BT_ERR("event_hs_wait_q terminated (%d): %d,%d,%d", 303 BT_ERR("event_hs_wait_q terminated (%d): %d,%d,%d",
299 ret, adapter->hs_state, adapter->ps_state, 304 ret, adapter->hs_state, adapter->ps_state,
300 adapter->wakeup_tries); 305 adapter->wakeup_tries);