* [PATCH v6 0/2] Bluetooth: btqca: move WCN7850 WA and add WCN6855 firmware priority selection feature @ 2026-01-05 5:56 Shuai Zhang 2026-01-05 5:56 ` [PATCH v6 1/2] Bluetooth: btqca: move WCN7850 workaround to the caller Shuai Zhang 2026-01-05 5:56 ` [PATCH v6 2/2] Bluetooth: btqca: Add WCN6855 firmware priority selection feature Shuai Zhang 0 siblings, 2 replies; 6+ messages in thread From: Shuai Zhang @ 2026-01-05 5:56 UTC (permalink / raw) To: Bartosz Golaszewski, Marcel Holtmann, Luiz Augusto von Dentz Cc: linux-arm-msm, linux-bluetooth, linux-kernel, cheng.jiang, quic_chezhou, wei.deng, jinwang.li, mengshi.wu, shuai.zhang patch1: Move WCN7850 workaround to the caller patch2: Update WCN6855 firmware to use the new FW file and added a fallback mechanism. Changes v6 - Add WCN7850 workaround details in the commit. - Reduce the logic nesting level. - Link to v5: https://lore.kernel.org/all/20251231075817.2611848-1-shuai.zhang@oss.qualcomm.com/ Changes v5 - Separate move WCN7850 and add WCN6855 fw name commit. - remove WCN7850 unuseless condition. - Link to v4: https://lore.kernel.org/all/20251226075621.3223336-1-shuai.zhang@oss.qualcomm.com/ Changed v4: - move WCN7850 WA to the caller. handle cases where the firmware cannot be found. - Link to v3 https://lore.kernel.org/all/20251117021645.712753-1-shuai.zhang@oss.qualcomm.com/ changed v3: - Remove CC satble - Update commit - add test steps and log - Link to v2 https://lore.kernel.org/all/20251114081751.3940541-2-shuai.zhang@oss.qualcomm.com/ Changes v2: - Add Fixes tag. - Add comments in the commit and code to explain the reason for the changes. - Link to v1 https://lore.kernel.org/all/20251112074638.1592864-1-quic_shuaz@quicinc.com/ Shuai Zhang (2): Bluetooth: btqca: move WCN7850 workaround to the caller Bluetooth: btqca: Add WCN6855 firmware priority selection feature drivers/bluetooth/btqca.c | 66 ++++++++++++++++++++++++--------------- 1 file changed, 41 insertions(+), 25 deletions(-) -- 2.34.1 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v6 1/2] Bluetooth: btqca: move WCN7850 workaround to the caller 2026-01-05 5:56 [PATCH v6 0/2] Bluetooth: btqca: move WCN7850 WA and add WCN6855 firmware priority selection feature Shuai Zhang @ 2026-01-05 5:56 ` Shuai Zhang 2026-01-06 0:21 ` Dmitry Baryshkov 2026-01-05 5:56 ` [PATCH v6 2/2] Bluetooth: btqca: Add WCN6855 firmware priority selection feature Shuai Zhang 1 sibling, 1 reply; 6+ messages in thread From: Shuai Zhang @ 2026-01-05 5:56 UTC (permalink / raw) To: Bartosz Golaszewski, Marcel Holtmann, Luiz Augusto von Dentz Cc: linux-arm-msm, linux-bluetooth, linux-kernel, cheng.jiang, quic_chezhou, wei.deng, jinwang.li, mengshi.wu, shuai.zhang WCN7850 will first attempt to use ELF_TYPE_PATCH, and if that fails, it will fall back to TLV_TYPE_PATCH. To code uniformity, move WCN7850 workaround to the caller. Signed-off-by: Shuai Zhang <shuai.zhang@oss.qualcomm.com> --- drivers/bluetooth/btqca.c | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/drivers/bluetooth/btqca.c b/drivers/bluetooth/btqca.c index 7c958d606..561e51fa9 100644 --- a/drivers/bluetooth/btqca.c +++ b/drivers/bluetooth/btqca.c @@ -581,28 +581,11 @@ static int qca_download_firmware(struct hci_dev *hdev, ret = request_firmware(&fw, config->fwname, &hdev->dev); if (ret) { - /* For WCN6750, if mbn file is not present then check for - * tlv file. - */ - if (soc_type == QCA_WCN6750 && config->type == ELF_TYPE_PATCH) { - bt_dev_dbg(hdev, "QCA Failed to request file: %s (%d)", - config->fwname, ret); - config->type = TLV_TYPE_PATCH; - snprintf(config->fwname, sizeof(config->fwname), - "qca/msbtfw%02x.tlv", rom_ver); - bt_dev_info(hdev, "QCA Downloading %s", config->fwname); - ret = request_firmware(&fw, config->fwname, &hdev->dev); - if (ret) { - bt_dev_err(hdev, "QCA Failed to request file: %s (%d)", - config->fwname, ret); - return ret; - } - } /* If the board-specific file is missing, try loading the default * one, unless that was attempted already. */ - else if (config->type == TLV_TYPE_NVM && - qca_get_alt_nvm_file(config->fwname, sizeof(config->fwname))) { + if (config->type == TLV_TYPE_NVM && + qca_get_alt_nvm_file(config->fwname, sizeof(config->fwname))) { bt_dev_info(hdev, "QCA Downloading %s", config->fwname); ret = request_firmware(&fw, config->fwname, &hdev->dev); if (ret) { @@ -861,8 +844,22 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate, } err = qca_download_firmware(hdev, &config, soc_type, rom_ver); - if (err < 0) { - bt_dev_err(hdev, "QCA Failed to download patch (%d)", err); + /* For WCN6750, if mbn file is not present then check for + * tlv file. + */ + if (err < 0 && soc_type == QCA_WCN6750) { + bt_dev_dbg(hdev, "QCA Failed to request file: %s (%d)", + config.fwname, err); + config.type = TLV_TYPE_PATCH; + snprintf(config.fwname, sizeof(config.fwname), + "qca/msbtfw%02x.tlv", rom_ver); + bt_dev_info(hdev, "QCA Downloading %s", config.fwname); + err = qca_download_firmware(hdev, &config, soc_type, rom_ver); + } + + if (err) { + bt_dev_err(hdev, "QCA Failed to request file: %s (%d)", + config.fwname, err); return err; } -- 2.34.1 ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v6 1/2] Bluetooth: btqca: move WCN7850 workaround to the caller 2026-01-05 5:56 ` [PATCH v6 1/2] Bluetooth: btqca: move WCN7850 workaround to the caller Shuai Zhang @ 2026-01-06 0:21 ` Dmitry Baryshkov 2026-01-06 1:50 ` Shuai Zhang 0 siblings, 1 reply; 6+ messages in thread From: Dmitry Baryshkov @ 2026-01-06 0:21 UTC (permalink / raw) To: Shuai Zhang Cc: Bartosz Golaszewski, Marcel Holtmann, Luiz Augusto von Dentz, linux-arm-msm, linux-bluetooth, linux-kernel, cheng.jiang, quic_chezhou, wei.deng, jinwang.li, mengshi.wu On Mon, Jan 05, 2026 at 01:56:45PM +0800, Shuai Zhang wrote: > WCN7850 will first attempt to use ELF_TYPE_PATCH, > and if that fails, it will fall back to TLV_TYPE_PATCH. > > To code uniformity, move WCN7850 workaround to the caller. > > Signed-off-by: Shuai Zhang <shuai.zhang@oss.qualcomm.com> > --- > drivers/bluetooth/btqca.c | 39 ++++++++++++++++++--------------------- > 1 file changed, 18 insertions(+), 21 deletions(-) > > diff --git a/drivers/bluetooth/btqca.c b/drivers/bluetooth/btqca.c > index 7c958d606..561e51fa9 100644 > --- a/drivers/bluetooth/btqca.c > +++ b/drivers/bluetooth/btqca.c > @@ -581,28 +581,11 @@ static int qca_download_firmware(struct hci_dev *hdev, > > ret = request_firmware(&fw, config->fwname, &hdev->dev); > if (ret) { > - /* For WCN6750, if mbn file is not present then check for > - * tlv file. > - */ > - if (soc_type == QCA_WCN6750 && config->type == ELF_TYPE_PATCH) { > - bt_dev_dbg(hdev, "QCA Failed to request file: %s (%d)", > - config->fwname, ret); > - config->type = TLV_TYPE_PATCH; > - snprintf(config->fwname, sizeof(config->fwname), > - "qca/msbtfw%02x.tlv", rom_ver); > - bt_dev_info(hdev, "QCA Downloading %s", config->fwname); > - ret = request_firmware(&fw, config->fwname, &hdev->dev); > - if (ret) { > - bt_dev_err(hdev, "QCA Failed to request file: %s (%d)", > - config->fwname, ret); > - return ret; > - } > - } > /* If the board-specific file is missing, try loading the default > * one, unless that was attempted already. > */ > - else if (config->type == TLV_TYPE_NVM && > - qca_get_alt_nvm_file(config->fwname, sizeof(config->fwname))) { > + if (config->type == TLV_TYPE_NVM && > + qca_get_alt_nvm_file(config->fwname, sizeof(config->fwname))) { > bt_dev_info(hdev, "QCA Downloading %s", config->fwname); > ret = request_firmware(&fw, config->fwname, &hdev->dev); > if (ret) { > @@ -861,8 +844,22 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate, > } > > err = qca_download_firmware(hdev, &config, soc_type, rom_ver); > - if (err < 0) { > - bt_dev_err(hdev, "QCA Failed to download patch (%d)", err); > + /* For WCN6750, if mbn file is not present then check for > + * tlv file. > + */ > + if (err < 0 && soc_type == QCA_WCN6750) { > + bt_dev_dbg(hdev, "QCA Failed to request file: %s (%d)", > + config.fwname, err); > + config.type = TLV_TYPE_PATCH; > + snprintf(config.fwname, sizeof(config.fwname), > + "qca/msbtfw%02x.tlv", rom_ver); > + bt_dev_info(hdev, "QCA Downloading %s", config.fwname); > + err = qca_download_firmware(hdev, &config, soc_type, rom_ver); > + } > + > + if (err) { You can keep the `if (err < 0) {` here. > + bt_dev_err(hdev, "QCA Failed to request file: %s (%d)", > + config.fwname, err); > return err; > } > > -- > 2.34.1 > -- With best wishes Dmitry ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v6 1/2] Bluetooth: btqca: move WCN7850 workaround to the caller 2026-01-06 0:21 ` Dmitry Baryshkov @ 2026-01-06 1:50 ` Shuai Zhang 0 siblings, 0 replies; 6+ messages in thread From: Shuai Zhang @ 2026-01-06 1:50 UTC (permalink / raw) To: Dmitry Baryshkov Cc: Bartosz Golaszewski, Marcel Holtmann, Luiz Augusto von Dentz, linux-arm-msm, linux-bluetooth, linux-kernel, cheng.jiang, quic_chezhou, wei.deng, jinwang.li, mengshi.wu On 1/6/2026 8:21 AM, Dmitry Baryshkov wrote: > On Mon, Jan 05, 2026 at 01:56:45PM +0800, Shuai Zhang wrote: >> WCN7850 will first attempt to use ELF_TYPE_PATCH, >> and if that fails, it will fall back to TLV_TYPE_PATCH. >> >> To code uniformity, move WCN7850 workaround to the caller. >> >> Signed-off-by: Shuai Zhang <shuai.zhang@oss.qualcomm.com> >> --- >> drivers/bluetooth/btqca.c | 39 ++++++++++++++++++--------------------- >> 1 file changed, 18 insertions(+), 21 deletions(-) >> >> diff --git a/drivers/bluetooth/btqca.c b/drivers/bluetooth/btqca.c >> index 7c958d606..561e51fa9 100644 >> --- a/drivers/bluetooth/btqca.c >> +++ b/drivers/bluetooth/btqca.c >> @@ -581,28 +581,11 @@ static int qca_download_firmware(struct hci_dev *hdev, >> >> ret = request_firmware(&fw, config->fwname, &hdev->dev); >> if (ret) { >> - /* For WCN6750, if mbn file is not present then check for >> - * tlv file. >> - */ >> - if (soc_type == QCA_WCN6750 && config->type == ELF_TYPE_PATCH) { >> - bt_dev_dbg(hdev, "QCA Failed to request file: %s (%d)", >> - config->fwname, ret); >> - config->type = TLV_TYPE_PATCH; >> - snprintf(config->fwname, sizeof(config->fwname), >> - "qca/msbtfw%02x.tlv", rom_ver); >> - bt_dev_info(hdev, "QCA Downloading %s", config->fwname); >> - ret = request_firmware(&fw, config->fwname, &hdev->dev); >> - if (ret) { >> - bt_dev_err(hdev, "QCA Failed to request file: %s (%d)", >> - config->fwname, ret); >> - return ret; >> - } >> - } >> /* If the board-specific file is missing, try loading the default >> * one, unless that was attempted already. >> */ >> - else if (config->type == TLV_TYPE_NVM && >> - qca_get_alt_nvm_file(config->fwname, sizeof(config->fwname))) { >> + if (config->type == TLV_TYPE_NVM && >> + qca_get_alt_nvm_file(config->fwname, sizeof(config->fwname))) { >> bt_dev_info(hdev, "QCA Downloading %s", config->fwname); >> ret = request_firmware(&fw, config->fwname, &hdev->dev); >> if (ret) { >> @@ -861,8 +844,22 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate, >> } >> >> err = qca_download_firmware(hdev, &config, soc_type, rom_ver); >> - if (err < 0) { >> - bt_dev_err(hdev, "QCA Failed to download patch (%d)", err); >> + /* For WCN6750, if mbn file is not present then check for >> + * tlv file. >> + */ >> + if (err < 0 && soc_type == QCA_WCN6750) { >> + bt_dev_dbg(hdev, "QCA Failed to request file: %s (%d)", >> + config.fwname, err); >> + config.type = TLV_TYPE_PATCH; >> + snprintf(config.fwname, sizeof(config.fwname), >> + "qca/msbtfw%02x.tlv", rom_ver); >> + bt_dev_info(hdev, "QCA Downloading %s", config.fwname); >> + err = qca_download_firmware(hdev, &config, soc_type, rom_ver); >> + } >> + >> + if (err) { > You can keep the `if (err < 0) {` here. I will update it. > >> + bt_dev_err(hdev, "QCA Failed to request file: %s (%d)", >> + config.fwname, err); >> return err; >> } >> >> -- >> 2.34.1 >> ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v6 2/2] Bluetooth: btqca: Add WCN6855 firmware priority selection feature 2026-01-05 5:56 [PATCH v6 0/2] Bluetooth: btqca: move WCN7850 WA and add WCN6855 firmware priority selection feature Shuai Zhang 2026-01-05 5:56 ` [PATCH v6 1/2] Bluetooth: btqca: move WCN7850 workaround to the caller Shuai Zhang @ 2026-01-05 5:56 ` Shuai Zhang 2026-01-06 0:22 ` Dmitry Baryshkov 1 sibling, 1 reply; 6+ messages in thread From: Shuai Zhang @ 2026-01-05 5:56 UTC (permalink / raw) To: Bartosz Golaszewski, Marcel Holtmann, Luiz Augusto von Dentz Cc: linux-arm-msm, linux-bluetooth, linux-kernel, cheng.jiang, quic_chezhou, wei.deng, jinwang.li, mengshi.wu, shuai.zhang Historically, WCN685x and QCA2066 shared the same firmware files. Now, changes are planned for the firmware that will make it incompatible with QCA2066, so a new firmware name is required for WCN685x. Test Steps: - Boot device - Check the BTFW loading status via dmesg Sanity pass and Test Log: QCA Downloading qca/wcnhpbftfw21.tlv Direct firmware load for qca/wcnhpbftfw21.tlv failed with error -2 QCA Downloading qca/hpbftfw21.tlv Signed-off-by: Shuai Zhang <shuai.zhang@oss.qualcomm.com> --- drivers/bluetooth/btqca.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/drivers/bluetooth/btqca.c b/drivers/bluetooth/btqca.c index 561e51fa9..1617f41d8 100644 --- a/drivers/bluetooth/btqca.c +++ b/drivers/bluetooth/btqca.c @@ -830,8 +830,12 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate, "qca/msbtfw%02x.mbn", rom_ver); break; case QCA_WCN6855: + /* Due to historical reasons, WCN685x chip has been using firmware + * without the "wcn" prefix. The mapping between the chip and its + * corresponding firmware has now been corrected. + */ snprintf(config.fwname, sizeof(config.fwname), - "qca/hpbtfw%02x.tlv", rom_ver); + "qca/wcnhpbtfw%02x.tlv", rom_ver); break; case QCA_WCN7850: snprintf(config.fwname, sizeof(config.fwname), @@ -855,6 +859,10 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate, "qca/msbtfw%02x.tlv", rom_ver); bt_dev_info(hdev, "QCA Downloading %s", config.fwname); err = qca_download_firmware(hdev, &config, soc_type, rom_ver); + } else if (err < 0 && !rampatch_name && soc_type == QCA_WCN6855) { + snprintf(config.fwname, sizeof(config.fwname), + "qca/hpbtfw%02x.tlv", rom_ver); + err = qca_download_firmware(hdev, &config, soc_type, rom_ver); } if (err) { @@ -920,7 +928,7 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate, case QCA_WCN6855: qca_read_fw_board_id(hdev, &boardid); qca_get_nvm_name_by_board(config.fwname, sizeof(config.fwname), - "hpnv", soc_type, ver, rom_ver, boardid); + "wcnhpnv", soc_type, ver, rom_ver, boardid); break; case QCA_WCN7850: qca_get_nvm_name_by_board(config.fwname, sizeof(config.fwname), @@ -933,8 +941,15 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate, } err = qca_download_firmware(hdev, &config, soc_type, rom_ver); - if (err < 0) { - bt_dev_err(hdev, "QCA Failed to download NVM (%d)", err); + if (err < 0 && !firmware_name && soc_type == QCA_WCN6855) { + qca_get_nvm_name_by_board(config.fwname, sizeof(config.fwname), + "hpnv", soc_type, ver, rom_ver, boardid); + err = qca_download_firmware(hdev, &config, soc_type, rom_ver); + } + + if (err) { + bt_dev_err(hdev, "QCA Failed to request file: %s (%d)", + config.fwname, err); return err; } -- 2.34.1 ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v6 2/2] Bluetooth: btqca: Add WCN6855 firmware priority selection feature 2026-01-05 5:56 ` [PATCH v6 2/2] Bluetooth: btqca: Add WCN6855 firmware priority selection feature Shuai Zhang @ 2026-01-06 0:22 ` Dmitry Baryshkov 0 siblings, 0 replies; 6+ messages in thread From: Dmitry Baryshkov @ 2026-01-06 0:22 UTC (permalink / raw) To: Shuai Zhang Cc: Bartosz Golaszewski, Marcel Holtmann, Luiz Augusto von Dentz, linux-arm-msm, linux-bluetooth, linux-kernel, cheng.jiang, quic_chezhou, wei.deng, jinwang.li, mengshi.wu On Mon, Jan 05, 2026 at 01:56:46PM +0800, Shuai Zhang wrote: > Historically, WCN685x and QCA2066 shared the same firmware files. > Now, changes are planned for the firmware that will make it incompatible > with QCA2066, so a new firmware name is required for WCN685x. > > Test Steps: > - Boot device > - Check the BTFW loading status via dmesg > > Sanity pass and Test Log: > QCA Downloading qca/wcnhpbftfw21.tlv > Direct firmware load for qca/wcnhpbftfw21.tlv failed with error -2 > QCA Downloading qca/hpbftfw21.tlv > > Signed-off-by: Shuai Zhang <shuai.zhang@oss.qualcomm.com> > --- > drivers/bluetooth/btqca.c | 23 +++++++++++++++++++---- > 1 file changed, 19 insertions(+), 4 deletions(-) > Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com> -- With best wishes Dmitry ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-01-06 1:50 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2026-01-05 5:56 [PATCH v6 0/2] Bluetooth: btqca: move WCN7850 WA and add WCN6855 firmware priority selection feature Shuai Zhang 2026-01-05 5:56 ` [PATCH v6 1/2] Bluetooth: btqca: move WCN7850 workaround to the caller Shuai Zhang 2026-01-06 0:21 ` Dmitry Baryshkov 2026-01-06 1:50 ` Shuai Zhang 2026-01-05 5:56 ` [PATCH v6 2/2] Bluetooth: btqca: Add WCN6855 firmware priority selection feature Shuai Zhang 2026-01-06 0:22 ` Dmitry Baryshkov
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®