diff --git a/srcpkgs/linux6.12/patches/x13s-bluetooth-fw.patch b/srcpkgs/linux6.12/patches/x13s-bluetooth-fw.patch new file mode 100644 index 00000000000..c27a1fc1ced --- /dev/null +++ b/srcpkgs/linux6.12/patches/x13s-bluetooth-fw.patch @@ -0,0 +1,112 @@ +From 12d8f091a79829e79dead7d87a353aa019415b2b Mon Sep 17 00:00:00 2001 +From: Zijun Hu +Date: Sat, 16 Nov 2024 07:49:23 -0800 +Subject: [PATCH] Bluetooth: qca: Support downloading board ID specific NVM for + WCN6855 + +For WCN6855, board ID specific NVM needs to be downloaded once board ID +is available, but the default NVM is always downloaded currently, and +the wrong NVM causes poor RF performance which effects user experience. + +Fix by downloading board ID specific NVM if board ID is available. + +Cc: Bjorn Andersson +Cc: Aiqun Yu (Maria) +Cc: Cheng Jiang +Cc: Johan Hovold +Cc: Jens Glathe +Cc: Steev Klimaszewski +Cc: Paul Menzel +Fixes: 095327fede00 ("Bluetooth: hci_qca: Add support for QTI Bluetooth chip wcn6855") +Cc: stable@vger.kernel.org # 6.4 +Reviewed-by: Johan Hovold +Tested-by: Johan Hovold +Tested-by: Steev Klimaszewski +Tested-by: Jens Glathe +Signed-off-by: Zijun Hu +Link: https://lore.kernel.org/r/20241116-x13s_wcn6855_fix-v2-1-c08c298d5fbf@quicinc.com +Signed-off-by: Johan Hovold +--- + drivers/bluetooth/btqca.c | 44 ++++++++++++++++++++++++++++++++++++--- + 1 file changed, 41 insertions(+), 3 deletions(-) + +diff --git a/drivers/bluetooth/btqca.c b/drivers/bluetooth/btqca.c +index dfbbac92242a84..ddfe7e3c9b5003 100644 +--- a/drivers/bluetooth/btqca.c ++++ b/drivers/bluetooth/btqca.c +@@ -717,6 +717,29 @@ static void qca_generate_hsp_nvm_name(char *fwname, size_t max_size, + snprintf(fwname, max_size, "qca/hpnv%02x%s.%x", rom_ver, variant, bid); + } + ++static void qca_get_hsp_nvm_name_generic(struct qca_fw_config *cfg, ++ struct qca_btsoc_version ver, ++ u8 rom_ver, u16 bid) ++{ ++ const char *variant; ++ ++ /* hsp gf chip */ ++ if ((le32_to_cpu(ver.soc_id) & QCA_HSP_GF_SOC_MASK) == QCA_HSP_GF_SOC_ID) ++ variant = "g"; ++ else ++ variant = ""; ++ ++ if (bid == 0x0) ++ snprintf(cfg->fwname, sizeof(cfg->fwname), "qca/hpnv%02x%s.bin", ++ rom_ver, variant); ++ else if (bid & 0xff00) ++ snprintf(cfg->fwname, sizeof(cfg->fwname), "qca/hpnv%02x%s.b%x", ++ rom_ver, variant, bid); ++ else ++ snprintf(cfg->fwname, sizeof(cfg->fwname), "qca/hpnv%02x%s.b%02x", ++ rom_ver, variant, bid); ++} ++ + static inline void qca_get_nvm_name_generic(struct qca_fw_config *cfg, + const char *stem, u8 rom_ver, u16 bid) + { +@@ -810,8 +833,15 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate, + /* Give the controller some time to get ready to receive the NVM */ + msleep(10); + +- if (soc_type == QCA_QCA2066 || soc_type == QCA_WCN7850) ++ switch (soc_type) { ++ case QCA_QCA2066: ++ case QCA_WCN6855: ++ case QCA_WCN7850: + qca_read_fw_board_id(hdev, &boardid); ++ break; ++ default: ++ break; ++ } + + /* Download NVM configuration */ + config.type = TLV_TYPE_NVM; +@@ -848,8 +878,7 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate, + "qca/msnv%02x.bin", rom_ver); + break; + case QCA_WCN6855: +- snprintf(config.fwname, sizeof(config.fwname), +- "qca/hpnv%02x.bin", rom_ver); ++ qca_get_hsp_nvm_name_generic(&config, ver, rom_ver, boardid); + break; + case QCA_WCN7850: + qca_get_nvm_name_generic(&config, "hmt", rom_ver, boardid); +@@ -861,9 +890,18 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate, + } + } + ++download_nvm: + 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 == -ENOENT && boardid != 0 && ++ soc_type == QCA_WCN6855) { ++ boardid = 0; ++ qca_get_hsp_nvm_name_generic(&config, ver, ++ rom_ver, boardid); ++ bt_dev_warn(hdev, "QCA fallback to default NVM"); ++ goto download_nvm; ++ } + return err; + } + diff --git a/srcpkgs/linux6.12/template b/srcpkgs/linux6.12/template index fa3f74ab6d8..633ffdacea4 100644 --- a/srcpkgs/linux6.12/template +++ b/srcpkgs/linux6.12/template @@ -1,7 +1,7 @@ # Template file for 'linux6.12' pkgname=linux6.12 version=6.12.6 -revision=1 +revision=2 short_desc="Linux kernel and modules (${version%.*} series)" maintainer="Duncaen " license="GPL-2.0-only"