diff mbox series

[v5,11/11] Bluetooth: btintel: Fix the legacy bootloader returns tlv based version

Message ID 20210729183600.281586-12-hj.tedd.an@gmail.com (mailing list archive)
State Superseded
Headers show
Series Bluetooth: btintel: Refactoring setup routines | expand

Commit Message

Tedd Ho-Jeong An July 29, 2021, 6:36 p.m. UTC
From: Tedd Ho-Jeong An <tedd.an@intel.com>

From the ThP, it supports both old and TLV based HCI_Intel_Read_Version
command after downloading the operational firmware.
Starting from th JfP, it supports both old and TLV based
HCI_Intel_Read_Version command in the operational firmware and it causes
the setup() uses the TLV based setup instead of legacy setup.

So, as a workaround, this patch checks the fw variant from the TLV based
version and it uses the legacy HCI_Intel_Read_Version command 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>
---
 drivers/bluetooth/btintel.c | 25 ++++++++++++++++++++++++-
 1 file changed, 24 insertions(+), 1 deletion(-)

Comments

Marcel Holtmann July 29, 2021, 7:40 p.m. UTC | #1
Hi Tedd,

> From the ThP, it supports both old and TLV based HCI_Intel_Read_Version
> command after downloading the operational firmware.
> Starting from th JfP, it supports both old and TLV based
> HCI_Intel_Read_Version command in the operational firmware and it causes
> the setup() uses the TLV based setup instead of legacy setup.
> 
> So, as a workaround, this patch checks the fw variant from the TLV based
> version and it uses the legacy HCI_Intel_Read_Version command 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>
> ---
> drivers/bluetooth/btintel.c | 25 ++++++++++++++++++++++++-
> 1 file changed, 24 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/bluetooth/btintel.c b/drivers/bluetooth/btintel.c
> index 57b64d744f0a..f11882d10da7 100644
> --- a/drivers/bluetooth/btintel.c
> +++ b/drivers/bluetooth/btintel.c
> @@ -2254,10 +2254,33 @@ int btintel_setup_combined(struct hci_dev *hdev)
> 	/* For TLV type device, parse the tlv data */
> 	btintel_parse_version_tlv(hdev, &ver_tlv, skb);
> 
> +	/* 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 old bootloader device.
> +	 * Also, it is not easy to convert TLV based version to 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.
> +	 */

why is that again? If possible we should convert them. What information is missing from the TLV format that we need?

Regards

Marcel
Tedd Ho-Jeong An July 29, 2021, 8:02 p.m. UTC | #2
Hi Marcel,

On Thu, 2021-07-29 at 21:40 +0200, Marcel Holtmann wrote:
> Hi Tedd,
> 
> > From the ThP, it supports both old and TLV based HCI_Intel_Read_Version
> > command after downloading the operational firmware.
> > Starting from th JfP, it supports both old and TLV based
> > HCI_Intel_Read_Version command in the operational firmware and it causes
> > the setup() uses the TLV based setup instead of legacy setup.
> > 
> > So, as a workaround, this patch checks the fw variant from the TLV based
> > version and it uses the legacy HCI_Intel_Read_Version command 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>
> > ---
> > drivers/bluetooth/btintel.c | 25 ++++++++++++++++++++++++-
> > 1 file changed, 24 insertions(+), 1 deletion(-)
> > 
> > diff --git a/drivers/bluetooth/btintel.c b/drivers/bluetooth/btintel.c
> > index 57b64d744f0a..f11882d10da7 100644
> > --- a/drivers/bluetooth/btintel.c
> > +++ b/drivers/bluetooth/btintel.c
> > @@ -2254,10 +2254,33 @@ int btintel_setup_combined(struct hci_dev *hdev)
> > 	/* For TLV type device, parse the tlv data */
> > 	btintel_parse_version_tlv(hdev, &ver_tlv, skb);
> > 
> > +	/* 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 old bootloader device.
> > +	 * Also, it is not easy to convert TLV based version to 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.
> > +	 */
> 
> why is that again? If possible we should convert them. What information is missing from the TLV
> format that we need?
> 
It needs hw_variant, hw_revision, and fw_revision in order to get the firmware file for legacy
bootloader setup. But new TLV format doesn't provide those values.

Let me check with FW team if those values are wrapped in TLV somehow.


> Regards
> 
> Marcel
> 

Regards,
Tedd
diff mbox series

Patch

diff --git a/drivers/bluetooth/btintel.c b/drivers/bluetooth/btintel.c
index 57b64d744f0a..f11882d10da7 100644
--- a/drivers/bluetooth/btintel.c
+++ b/drivers/bluetooth/btintel.c
@@ -2254,10 +2254,33 @@  int btintel_setup_combined(struct hci_dev *hdev)
 	/* For TLV type device, parse the tlv data */
 	btintel_parse_version_tlv(hdev, &ver_tlv, skb);
 
+	/* 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 old bootloader device.
+	 * Also, it is not easy to convert TLV based version to 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.
+	 */
+	switch (INTEL_HW_VARIANT(ver_tlv.cnvi_bt)) {
+	case 0x11:      /* JfP */
+	case 0x12:      /* ThP */
+	case 0x13:      /* HrP */
+	case 0x14:      /* CcP */
+		err = btintel_read_version(hdev, &ver);
+		if (err)
+			return err;
+		return btintel_bootloader_setup(hdev, &ver);
+	default:
+		/* Nothing to do here */
+		break;
+	}
+
 	/* Display version information of TLV type */
 	btintel_version_info_tlv(hdev, &ver_tlv);
 
-	/* TODO: Need to filter the device for new generation */
 	err = btintel_bootloader_setup_tlv(hdev, &ver_tlv);
 
 	return err;