[openwrt/openwrt] Revert "qualcommax: ipq50xx: remove ipq5018 and qcn6122 wifi m3 fw"

LEDE Commits lede-commits at lists.infradead.org
Sat Dec 27 03:16:40 PST 2025


robimarko pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/6a1f105e7276b098a82c1b6b06405b4c76478985

commit 6a1f105e7276b098a82c1b6b06405b4c76478985
Author: Robert Marko <robimarko at gmail.com>
AuthorDate: Sat Dec 27 12:16:15 2025 +0100

    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 <robimarko at gmail.com>
---
 .../arch/arm64/boot/dts/qcom/ipq5018-ax6000.dts    |   3 +-
 .../arch/arm64/boot/dts/qcom/ipq5018-ax850.dts     |   3 +-
 .../arch/arm64/boot/dts/qcom/ipq5018-mr5500.dts    |   3 +-
 .../arch/arm64/boot/dts/qcom/ipq5018-mx5500.dts    |   3 +-
 .../arch/arm64/boot/dts/qcom/ipq5018-qcn6122.dtsi  |   4 +-
 .../arch/arm64/boot/dts/qcom/ipq5018-spnmx56.dts   |   3 +-
 ...-qcom-wcss-sec-add-split-firmware-support.patch | 102 +++++++++++++++++++++
 7 files changed, 115 insertions(+), 6 deletions(-)

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 a0b94bd2f7..4782101483 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 0593c955e0..592fc84c5b 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 8ff30ec436..4c1f50938c 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 0ea27d3373..73d232e05c 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 ceb03b00a3..a59c6ceda3 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 90a87299a6..1dafa63414 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 0000000000..29644e3fdb
--- /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 <george.moussalem at outlook.com>
+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 <george.moussalem at outlook.com>
+---
+--- 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)




More information about the lede-commits mailing list