From: Robert Marko Date: Sat, 27 Dec 2025 11:16:15 +0000 (+0100) Subject: Revert "qualcommax: ipq50xx: remove ipq5018 and qcn6122 wifi m3 fw" X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6a1f105e7276b098a82c1b6b06405b4c76478985;p=thirdparty%2Fopenwrt.git Revert "qualcommax: ipq50xx: remove ipq5018 and qcn6122 wifi m3 fw" This reverts commit 423cda97f9e5152c6e9ad210d7a6b089d3664f28. It appears that this broke remoteproc on some devices, so revert for now. Signed-off-by: Robert Marko --- diff --git a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-ax6000.dts b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-ax6000.dts index a0b94bd2f79..4782101483b 100644 --- a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-ax6000.dts +++ b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-ax6000.dts @@ -572,7 +572,8 @@ }; &q6v5_wcss { - firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt"; + firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt", + "ath11k/IPQ5018/hw1.0/m3_fw.mdt"; }; &wifi { diff --git a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-ax850.dts b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-ax850.dts index 0593c955e01..592fc84c5bc 100644 --- a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-ax850.dts +++ b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-ax850.dts @@ -399,7 +399,8 @@ }; &q6v5_wcss { - firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt"; + firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt", + "ath11k/IPQ5018/hw1.0/m3_fw.mdt"; }; &wifi { diff --git a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-mr5500.dts b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-mr5500.dts index 8ff30ec436c..4c1f50938cb 100644 --- a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-mr5500.dts +++ b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-mr5500.dts @@ -326,7 +326,8 @@ }; &q6v5_wcss { - firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt"; + firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt", + "ath11k/IPQ5018/hw1.0/m3_fw.mdt"; }; &wifi { diff --git a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-mx5500.dts b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-mx5500.dts index 0ea27d3373a..73d232e05c6 100644 --- a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-mx5500.dts +++ b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-mx5500.dts @@ -173,7 +173,8 @@ }; &q6v5_wcss { - firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt"; + firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt", + "ath11k/IPQ5018/hw1.0/m3_fw.mdt"; }; &wifi { diff --git a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-qcn6122.dtsi b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-qcn6122.dtsi index ceb03b00a35..a59c6ceda36 100644 --- a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-qcn6122.dtsi +++ b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-qcn6122.dtsi @@ -12,7 +12,9 @@ &q6v5_wcss { compatible = "qcom,ipq5018-q6-mpd"; - firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt"; + firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt", + "ath11k/IPQ5018/hw1.0/m3_fw.mdt", + "ath11k/QCN6122/hw1.0/m3_fw.mdt"; // IPQ5018 q6_wcss_pd1: pd-1 { diff --git a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-spnmx56.dts b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-spnmx56.dts index 90a87299a6a..1dafa63414c 100644 --- a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-spnmx56.dts +++ b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-spnmx56.dts @@ -184,7 +184,8 @@ }; &q6v5_wcss { - firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt"; + firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt", + "ath11k/IPQ5018/hw1.0/m3_fw.mdt"; }; &wifi { diff --git a/target/linux/qualcommax/patches-6.12/0808-remoteproc-qcom-wcss-sec-add-split-firmware-support.patch b/target/linux/qualcommax/patches-6.12/0808-remoteproc-qcom-wcss-sec-add-split-firmware-support.patch new file mode 100644 index 00000000000..29644e3fdb3 --- /dev/null +++ b/target/linux/qualcommax/patches-6.12/0808-remoteproc-qcom-wcss-sec-add-split-firmware-support.patch @@ -0,0 +1,102 @@ +From: George Moussalem +Date: Tue, 21 Oct 2025 15:26:31 +0400 +Subject: [PATCH] remoteproc: qcom: wcss-sec: add split firmware support + +The driver currently expects only one firmware file to be loaded as part +of bringing up WCSS. For IPQ5018 and QCN6122, multiple firmware files are +required, both the q6 and m3 firmware files. As such, add support for +loading up to 3 firmware files. + +Signed-off-by: George Moussalem +--- +--- a/drivers/remoteproc/qcom_q6v5_wcss_sec.c ++++ b/drivers/remoteproc/qcom_q6v5_wcss_sec.c +@@ -25,6 +25,8 @@ + + #define Q6_WAIT_TIMEOUT (5 * HZ) + ++#define MAX_FIRMWARE 3 ++ + struct wcss_sec { + struct device *dev; + struct qcom_rproc_glink glink_subdev; +@@ -35,6 +37,7 @@ struct wcss_sec { + void *mem_region; + size_t mem_size; + const struct wcss_data *desc; ++ const char **firmware; + + struct mbox_client mbox_client; + struct mbox_chan *mbox_chan; +@@ -137,7 +140,8 @@ static int wcss_sec_load(struct rproc *r + { + struct wcss_sec *wcss = rproc->priv; + struct device *dev = wcss->dev; +- int ret; ++ const struct firmware *fw_hdl; ++ int i, ret; + + if (wcss->desc->use_tmelcom) { + wcss->metadata = qcom_mdt_read_metadata(fw, &wcss->metadata_len, +@@ -161,6 +165,28 @@ static int wcss_sec_load(struct rproc *r + wcss->mem_phys, wcss->mem_size, &wcss->mem_reloc); + if (ret) + return ret; ++ ++ for (i = 1; i < MAX_FIRMWARE; i++) { ++ if (!wcss->firmware[i]) ++ continue; ++ ++ ret = request_firmware(&fw_hdl, wcss->firmware[i], dev); ++ ++ if (ret) ++ continue; ++ ++ ret = qcom_mdt_load_no_init(dev, fw_hdl, wcss->firmware[i], 0, ++ wcss->mem_region, wcss->mem_phys, ++ wcss->mem_size, &wcss->mem_reloc); ++ ++ release_firmware(fw_hdl); ++ ++ if (ret) { ++ dev_err(dev, "error %d loading firmware %s\n", ++ ret, wcss->firmware[i]); ++ return ret; ++ } ++ } + } + + qcom_pil_info_store("wcss", wcss->mem_phys, wcss->mem_size); +@@ -291,17 +317,20 @@ static int wcss_sec_probe(struct platfor + struct wcss_sec *wcss; + struct clk *sleep_clk; + struct clk *int_clk; +- const char *fw_name = NULL; ++ const char **firmware = NULL; + const struct wcss_data *desc = of_device_get_match_data(&pdev->dev); + int ret; + +- ret = of_property_read_string(pdev->dev.of_node, "firmware-name", +- &fw_name); ++ firmware = devm_kcalloc(&pdev->dev, MAX_FIRMWARE, ++ sizeof(*firmware), GFP_KERNEL); ++ ++ ret = of_property_read_string_array(pdev->dev.of_node, "firmware-name", ++ firmware, MAX_FIRMWARE); + if (ret < 0) + return ret; + + rproc = devm_rproc_alloc(&pdev->dev, desc->ss_name, &wcss_sec_ops, +- fw_name, sizeof(*wcss)); ++ firmware[0], sizeof(*wcss)); + if (!rproc) { + dev_err(&pdev->dev, "failed to allocate rproc\n"); + return -ENOMEM; +@@ -310,6 +339,7 @@ static int wcss_sec_probe(struct platfor + wcss = rproc->priv; + wcss->dev = &pdev->dev; + wcss->desc = desc; ++ wcss->firmware = firmware; + + ret = wcss_sec_alloc_memory_region(wcss); + if (ret)