Bluetooth: btusb: support download nvm with different board id for wcn6855
authorTim Jiang <tjiang@codeaurora.org>
Thu, 3 Dec 2020 04:57:14 +0000 (12:57 +0800)
committerJohan Hedberg <johan.hedberg@intel.com>
Mon, 7 Dec 2020 15:01:21 +0000 (17:01 +0200)
we define many nvm files for wcn6855 btsoc and host driver
should find the correct nvm file based on board ID and then
download it.

Signed-off-by: Tim Jiang <tjiang@codeaurora.org>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
drivers/bluetooth/btusb.c

index c9ae6ea..af47c02 100644 (file)
@@ -3774,12 +3774,14 @@ static int btusb_set_bdaddr_wcn6855(struct hci_dev *hdev,
 #define QCA_SYSCFG_UPDATED     0x40
 #define QCA_PATCH_UPDATED      0x80
 #define QCA_DFU_TIMEOUT                3000
+#define QCA_FLAG_MULTI_NVM      0x80
 
 struct qca_version {
        __le32  rom_version;
        __le32  patch_version;
        __le32  ram_version;
-       __le32  ref_clock;
+       __le16  board_id;
+       __le16  flag;
        __u8    reserved[4];
 } __packed;
 
@@ -3962,8 +3964,14 @@ static int btusb_setup_qca_load_nvm(struct hci_dev *hdev,
        char fwname[64];
        int err;
 
-       snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x.bin",
-                le32_to_cpu(ver->rom_version));
+       if (((ver->flag >> 8) & 0xff) == QCA_FLAG_MULTI_NVM) {
+               snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x_%04x.bin",
+                        le32_to_cpu(ver->rom_version),
+                        le16_to_cpu(ver->board_id));
+       } else {
+               snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x.bin",
+                        le32_to_cpu(ver->rom_version));
+       }
 
        err = request_firmware(&fw, fwname, &hdev->dev);
        if (err) {
@@ -4030,6 +4038,11 @@ static int btusb_setup_qca(struct hci_dev *hdev)
                        return err;
        }
 
+       err = btusb_qca_send_vendor_req(udev, QCA_GET_TARGET_VERSION, &ver,
+                                       sizeof(ver));
+       if (err < 0)
+               return err;
+
        if (!(status & QCA_SYSCFG_UPDATED)) {
                err = btusb_setup_qca_load_nvm(hdev, &ver, info);
                if (err < 0)