Bluetooth: btmrvl: fix card reset and suspend race issue
authorAmitkumar Karwar <akarwar@marvell.com>
Wed, 7 Jan 2015 05:36:56 +0000 (21:36 -0800)
committerMarcel Holtmann <marcel@holtmann.org>
Thu, 8 Jan 2015 05:36:50 +0000 (06:36 +0100)
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>
drivers/bluetooth/btmrvl_main.c

index 2578b29f1cd14b8a4a193d0c820a443f636482b4..413597789c61d61686737ceb0b7c8501427c3b42 100644 (file)
@@ -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);