Skip to content

Commit

Permalink
Bluetooth: btusb: Add support for variant WCN6855 by using different nvm
Browse files Browse the repository at this point in the history
the RF performance of wcn6855 soc chip from different foundries will be
difference, so we should use different nvm to configure them.

Signed-off-by: Tim Jiang <tjiang@codeaurora.org>
  • Loading branch information
tjiang123 authored and intel-lab-lkp committed Oct 11, 2021
1 parent b15bfa4 commit ac46dc5
Showing 1 changed file with 40 additions and 14 deletions.
54 changes: 40 additions & 14 deletions drivers/bluetooth/btusb.c
Expand Up @@ -3190,6 +3190,9 @@ static int btusb_set_bdaddr_wcn6855(struct hci_dev *hdev,
#define QCA_DFU_TIMEOUT 3000
#define QCA_FLAG_MULTI_NVM 0x80

#define WCN6855_2_0_RAM_VERSION_GF 0x400c1200
#define WCN6855_2_1_RAM_VERSION_GF 0x400c1211

struct qca_version {
__le32 rom_version;
__le32 patch_version;
Expand Down Expand Up @@ -3221,6 +3224,7 @@ static const struct qca_device_info qca_devices_table[] = {
{ 0x00000302, 28, 4, 16 }, /* Rome 3.2 */
{ 0x00130100, 40, 4, 16 }, /* WCN6855 1.0 */
{ 0x00130200, 40, 4, 16 }, /* WCN6855 2.0 */
{ 0x00130201, 40, 4, 16 }, /* WCN6855 2.1 */
};

static int btusb_qca_send_vendor_req(struct usb_device *udev, u8 request,
Expand Down Expand Up @@ -3375,6 +3379,41 @@ static int btusb_setup_qca_load_rampatch(struct hci_dev *hdev,
return err;
}

static void btusb_generate_qca_nvm_name(char *fwname,
size_t max_size,
struct qca_version *ver)
{
u32 rom_version = le32_to_cpu(ver->rom_version);

if (((ver->flag >> 8) & 0xff) == QCA_FLAG_MULTI_NVM) {
u16 board_id = le16_to_cpu(ver->board_id);
const char *variant;

switch (ver->ram_version) {
case WCN6855_2_0_RAM_VERSION_GF:
case WCN6855_2_1_RAM_VERSION_GF:
variant = "_gf";
break;
default:
variant = "";
break;
}

/* if boardid equal 0, use default nvm without suffix */
if (board_id == 0x0) {
snprintf(fwname, max_size, "qca/nvm_usb_%08x%s.bin",
rom_version, variant);
} else {
snprintf(fwname, max_size, "qca/nvm_usb_%08x%s_%04x.bin",
rom_version, variant, board_id);
}
} else {
snprintf(fwname, max_size, "qca/nvm_usb_%08x.bin",
rom_version);
}

}

static int btusb_setup_qca_load_nvm(struct hci_dev *hdev,
struct qca_version *ver,
const struct qca_device_info *info)
Expand All @@ -3383,20 +3422,7 @@ static int btusb_setup_qca_load_nvm(struct hci_dev *hdev,
char fwname[64];
int err;

if (((ver->flag >> 8) & 0xff) == QCA_FLAG_MULTI_NVM) {
/* if boardid equal 0, use default nvm without surfix */
if (le16_to_cpu(ver->board_id) == 0x0) {
snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x.bin",
le32_to_cpu(ver->rom_version));
} else {
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));
}
btusb_generate_qca_nvm_name(fwname, sizeof(fwname), ver);

err = request_firmware(&fw, fwname, &hdev->dev);
if (err) {
Expand Down

0 comments on commit ac46dc5

Please sign in to comment.