diff options
author | Tedd Ho-Jeong An <tedd.an@intel.com> | 2021-08-05 03:32:12 +0300 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2021-08-05 17:03:29 +0300 |
commit | ea7c4c0e44ee6d8cdf149af4e4084b16154ef216 (patch) | |
tree | 34f7e2466ea49a53e9860d7d884787017797b137 /drivers/bluetooth/btintel.c | |
parent | 53492a668e3b9b823fc9a3ba563a5d10fef32c03 (diff) | |
download | linux-ea7c4c0e44ee6d8cdf149af4e4084b16154ef216.tar.xz |
Bluetooth: btintel: Fix the first HCI command not work with ROM device
The some legacy ROM controllers have a bug with the first HCI command
sent to it returning number of completed commands as zero, which would
stall the command processing in the Bluetooth core.
As a workaround, send HCI Rest command first which will reset the
controller to fix the issue.
Signed-off-by: Tedd Ho-Jeong An <tedd.an@intel.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'drivers/bluetooth/btintel.c')
-rw-r--r-- | drivers/bluetooth/btintel.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/bluetooth/btintel.c b/drivers/bluetooth/btintel.c index a6d75afad71b..8e6b497a2164 100644 --- a/drivers/bluetooth/btintel.c +++ b/drivers/bluetooth/btintel.c @@ -1676,6 +1676,26 @@ static int btintel_setup_combined(struct hci_dev *hdev) BT_DBG("%s", hdev->name); + /* The some controllers have a bug with the first HCI command sent to it + * returning number of completed commands as zero. This would stall the + * command processing in the Bluetooth core. + * + * As a workaround, send HCI Reset command first which will reset the + * number of completed commands and allow normal command processing + * from now on. + */ + if (btintel_test_flag(hdev, INTEL_BROKEN_INITIAL_NCMD)) { + skb = __hci_cmd_sync(hdev, HCI_OP_RESET, 0, NULL, + HCI_INIT_TIMEOUT); + if (IS_ERR(skb)) { + bt_dev_err(hdev, + "sending initial HCI reset failed (%ld)", + PTR_ERR(skb)); + return PTR_ERR(skb); + } + kfree_skb(skb); + } + /* Starting from TyP device, the command parameter and response are * changed even though the OCF for HCI_Intel_Read_Version command * remains same. The legacy devices can handle even if the |