浏览代码

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>
Amitkumar Karwar 10 年之前
父节点
当前提交
a9cc32d96c
共有 1 个文件被更改,包括 8 次插入3 次删除
  1. 8 3
      drivers/bluetooth/btmrvl_main.c

+ 8 - 3
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);