[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20251110132225.2413017-2-quic_shuaz@quicinc.com>
Date: Mon, 10 Nov 2025 21:22:25 +0800
From: Shuai Zhang <quic_shuaz@...cinc.com>
To: Marcel Holtmann <marcel@...tmann.org>,
Luiz Augusto von Dentz <luiz.dentz@...il.com>
Cc: linux-bluetooth@...r.kernel.org, linux-kernel@...r.kernel.org,
linux-arm-msm@...r.kernel.org, quic_chejiang@...cinc.com,
quic_jiaymao@...cinc.com, quic_chezhou@...cinc.com,
Shuai Zhang <quic_shuaz@...cinc.com>
Subject: [PATCH v5 1/1] Bluetooth: btusb: add default nvm file
If no NVM file matches the board_id, load the default NVM file to ensure
basic Bluetooth functionality. The default NVM file may differ in
functionality and performance because specific NVM files enable certain
vendor commands based on chip capabilities. This fallback improves
compatibility when a dedicated NVM file is not available.
Also, pass board_id explicitly to select the correct NVM file. This is
required for proper NVM file determination.
Signed-off-by: Shuai Zhang <quic_shuaz@...cinc.com>
---
drivers/bluetooth/btusb.c | 28 +++++++++++++++++++---------
1 file changed, 19 insertions(+), 9 deletions(-)
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index dcbff7641..09e81320c 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -3482,15 +3482,14 @@ static int btusb_setup_qca_load_rampatch(struct hci_dev *hdev,
}
static void btusb_generate_qca_nvm_name(char *fwname, size_t max_size,
- const struct qca_version *ver)
+ const struct qca_version *ver,
+ u16 board_id)
{
u32 rom_version = le32_to_cpu(ver->rom_version);
const char *variant, *fw_subdir;
int len;
- u16 board_id;
fw_subdir = qca_get_fw_subdirectory(ver);
- board_id = qca_extract_board_id(ver);
switch (le32_to_cpu(ver->ram_version)) {
case WCN6855_2_0_RAM_VERSION_GF:
@@ -3517,14 +3516,14 @@ static void btusb_generate_qca_nvm_name(char *fwname, size_t max_size,
static int btusb_setup_qca_load_nvm(struct hci_dev *hdev,
struct qca_version *ver,
- const struct qca_device_info *info)
+ const struct qca_device_info *info,
+ u16 board_id)
{
const struct firmware *fw;
char fwname[80];
int err;
- btusb_generate_qca_nvm_name(fwname, sizeof(fwname), ver);
-
+ btusb_generate_qca_nvm_name(fwname, sizeof(fwname), ver, board_id);
err = request_firmware(&fw, fwname, &hdev->dev);
if (err) {
bt_dev_err(hdev, "failed to request NVM file: %s (%d)",
@@ -3606,10 +3605,21 @@ static int btusb_setup_qca(struct hci_dev *hdev)
btdata->qca_dump.controller_id = le32_to_cpu(ver.rom_version);
if (!(status & QCA_SYSCFG_UPDATED)) {
- err = btusb_setup_qca_load_nvm(hdev, &ver, info);
- if (err < 0)
- return err;
+ u16 board_id = qca_extract_board_id(&ver);
+ err = btusb_setup_qca_load_nvm(hdev, &ver, info, board_id);
+ if (err < 0) {
+ /* If the board-specific NVM file is not found, set board_id to 0
+ * and load the default NVM file to ensure basic functionality.
+ */
+ if (err == -ENOENT && board_id != 0) {
+ err = btusb_setup_qca_load_nvm(hdev, &ver, info, 0);
+ if (err < 0)
+ return err;
+ } else {
+ return err;
+ }
+ }
/* WCN6855 2.1 and later will reset to apply firmware downloaded here, so
* wait ~100ms for reset Done then go ahead, otherwise, it maybe
* cause potential enable failure.
--
2.34.1
Powered by blists - more mailing lists