Bluetooth: hci_sync: Fix handling of HCI_OP_CREATE_CONN_CANCEL
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Thu, 3 Aug 2023 04:08:53 +0000 (21:08 -0700)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Fri, 11 Aug 2023 18:53:10 +0000 (11:53 -0700)
When sending HCI_OP_CREATE_CONN_CANCEL it shall Wait for
HCI_EV_CONN_COMPLETE, not HCI_EV_CMD_STATUS, when the reason is
anything but HCI_ERROR_REMOTE_POWER_OFF. This reason is used when
suspending or powering off, where we don't want to wait for the peer's
response.

Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
net/bluetooth/hci_sync.c

index e114409..a9b048d 100644 (file)
@@ -5321,6 +5321,17 @@ static int hci_connect_cancel_sync(struct hci_dev *hdev, struct hci_conn *conn,
        if (hdev->hci_ver < BLUETOOTH_VER_1_2)
                return 0;
 
+       /* Wait for HCI_EV_CONN_COMPLETE, not HCI_EV_CMD_STATUS, when the
+        * reason is anything but HCI_ERROR_REMOTE_POWER_OFF. This reason is
+        * used when suspending or powering off, where we don't want to wait
+        * for the peer's response.
+        */
+       if (reason != HCI_ERROR_REMOTE_POWER_OFF)
+               return __hci_cmd_sync_status_sk(hdev, HCI_OP_CREATE_CONN_CANCEL,
+                                               6, &conn->dst,
+                                               HCI_EV_CONN_COMPLETE,
+                                               HCI_CMD_TIMEOUT, NULL);
+
        return __hci_cmd_sync_status(hdev, HCI_OP_CREATE_CONN_CANCEL,
                                     6, &conn->dst, HCI_CMD_TIMEOUT);
 }