Bluetooth: btintel: Fix the legacy bootloader returns tlv based version
authorTedd Ho-Jeong An <tedd.an@intel.com>
Thu, 5 Aug 2021 00:32:18 +0000 (17:32 -0700)
committerMarcel Holtmann <marcel@holtmann.org>
Thu, 5 Aug 2021 14:03:30 +0000 (16:03 +0200)
From the ThP, it supports both legacy and TLV based HCI_Intel_Read_Version
command after downloading the operational firmware, and it causes the
driver to choose the wrong setup routines and missing firmware/ddc file.

So, as a workaround, this patch checks the fw variant from the TLV based
version, and if the device is legacy bootloader device, the legacy
HCI_Intel_Read_Version command is used to get the legacy version
information and run the legacy bootloader setup with it.

Signed-off-by: Tedd Ho-Jeong An <tedd.an@intel.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
drivers/bluetooth/btintel.c

index 4f0ba6031c57175bcc4064f4f3b6ae785165f141..2941d33d0bc2195794830a377196fcb280a0f5e6 100644 (file)
@@ -2312,6 +2312,27 @@ static int btintel_setup_combined(struct hci_dev *hdev)
         * along.
         */
        switch (INTEL_HW_VARIANT(ver_tlv.cnvi_bt)) {
+       case 0x11:      /* JfP */
+       case 0x12:      /* ThP */
+       case 0x13:      /* HrP */
+       case 0x14:      /* CcP */
+               /* Some legacy bootloader devices from JfP supports both old
+                * and TLV based HCI_Intel_Read_Version command. But we don't
+                * want to use the TLV based setup routines for those legacy
+                * bootloader device.
+                *
+                * Also, it is not easy to convert TLV based version from the
+                * legacy version format.
+                *
+                * So, as a workaround for those devices, use the legacy
+                * HCI_Intel_Read_Version to get the version information and
+                * run the legacy bootloader setup.
+                */
+               err = btintel_read_version(hdev, &ver);
+               if (err)
+                       return err;
+               err = btintel_bootloader_setup(hdev, &ver);
+               break;
        case 0x17:
        case 0x18:
        case 0x19: