[openwrt/openwrt] qualcommax: ipq50xx: Add support for Xiaomi AX6000

LEDE Commits lede-commits at lists.infradead.org
Fri Jun 13 03:02:49 PDT 2025


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

commit d7f9e240c208891a7d26d7a1d308cabd70618cae
Author: George Moussalem <george.moussalem at outlook.com>
AuthorDate: Tue Jun 3 09:15:04 2025 +0400

    qualcommax: ipq50xx: Add support for Xiaomi AX6000
    
    Add support for Xiaomi AX6000.
    
    Speficiations:
    * SoC: Qualcomm IPQ5018 (64-bit dual-core ARM Cortex-A53 @ 1.0Ghz)
    * Memory: Etrontech EM6HE16EWAKG 512 MiB DDR3L-933
    * Serial Port: 1v8 TTL 115200n8
    * Wi-Fi: IPQ5018 (2x2 2.4 Ghz 802.11b/g/n/ax - up to 574 Mbps)
             QCN9024 (4x4 5 Ghz 802.11an/ac/ax - up to 4804 Mbps)
             QCA9887 (1x1 5 Ghz 802.11ac/n - up to 433 Mbps)
    * Ethernet: IPQ5018 integrated virtual switch connected to:
            - external QCA8337 switch   (3 LAN Ports 10/100/1000)
            - QCA8081 Phy WAN port  (10/100/1000/2500)
    * Flash: Either of:
            - Gigadevice GD5F1GQ4RE9IGD (128 MiB)
            - ESMT F50D1G41LB (128 MiB)
    * LEDs: 1x WLAN Link (GPIO 23 Active High)
            1x System Blue   (GPIO 24 Active High)
            1x System Yellow (GPIO 25 Active High)
            1x WAN Link Blue (GPIO 26 Active High)
            1x WAN Link Yellow   (GPIO 27 Active High)
            1x Green - Unused(GPIO 28 Active High)
            3x LAN Phy Green
            1x WAN Phy Green
    * Buttons: 1x Reset  (GPIO 38 Active Low)
    
    Known issue:
    - QCA9887 doesn't come up (possibly due to 1-lane PCIe phy not coming up or missing method to drive power),
      hence the host PCIe controller is disabled in the DTS.
    
    Flash instructions:
    
    Download XMIR Patcher: https://github.com/openwrt-xiaomi/xmir-patcher
    
    First flash a ubinized OpenWrt initramfs that will serve as the intermediate step, since
    OpenWrt uses unified rootfs in order to fully utilize NAND and provide enough space for
    packages, through either of the below two methods:
    
    Installation via XMIR Patcher:
    
    1. Load the initramfs image: openwrt-qualcommax-ipq50xx-xiaomi_ax6000-initramfs-factory.ubi
    
    Installation via ubiformat method, through SSH:
    
    1. If needed, enable SSH using XMIR Patcher.
    2. Copy the file openwrt-qualcommax-ipq50xx-xiaomi_ax6000-initramfs-factory.ubi to the /tmp directory
    3. Open an SSH shell to the router
    4. Check which rootfs partition is your router booted in (0 = rootfs | 1 = rootfs_1):
    nvram get flag_boot_rootfs
    5. Find the rootfs and rootfs_1 mtd indexes respectively:
    cat /proc/mtd
    Please confirm if mtd18 and mtd19 are the correct indexes from above!
    6. Use the command ubiformat to flash the opposite mtd with UBI image:
    If nvram get flag_boot_rootfs returned 0:
    ubiformat /dev/mtd19 -y -f /tmp/openwrt-qualcommax-ipq50xx-xiaomi_ax6000-initramfs-factory.ubi && nvram set flag_boot_rootfs=1 && nvram set flag_last_success=1 && nvram commit
    otherwise:
    ubiformat /dev/mtd18 -y -f /tmp/openwrt-qualcommax-ipq50xx-xiaomi_ax6000-initramfs-factory.ubi && nvram set flag_boot_rootfs=0 && nvram set flag_last_success=0 && nvram commit
    7. Reboot the device by:
    reboot
    
    Continue in order to pernamently flash OpenWrt:
    1. Upload the sysupgrade image to /tmp/ using SCP:
    scp -O <path to image> root at 192.168.1.1:/tmp/
    2. Open an SSH shell to 192.168.1.1 from a PC within the same subnet
    3. Use sysupgrade to flash the sysupgrade image:
    sysupgrade -n -v /tmp/openwrt-qualcommax-ipq50xx-xiaomi_ax6000-squashfs-sysupgrade.bin
    
    Device will reboot with OpenWrt, and then sysupgrade can be used to upgrade the device when desired.
    
    Signed-off-by: George Moussalem <george.moussalem at outlook.com>
    Link: https://github.com/openwrt/openwrt/pull/19004
    Signed-off-by: Robert Marko <robimarko at gmail.com>
---
 .../uboot-envtools/files/qualcommax_ipq50xx        |  16 +
 package/firmware/ipq-wifi/Makefile                 |   2 +
 .../arch/arm64/boot/dts/qcom/ipq5018-ax6000.dts    | 642 +++++++++++++++++++++
 target/linux/qualcommax/image/ipq50xx.mk           |  23 +
 .../ipq50xx/base-files/etc/board.d/01_leds         |   8 +
 .../ipq50xx/base-files/etc/board.d/02_network      |   3 +-
 .../etc/hotplug.d/firmware/11-ath11k-caldata       |   6 +
 .../ipq50xx/base-files/lib/upgrade/platform.sh     |  48 ++
 8 files changed, 747 insertions(+), 1 deletion(-)

diff --git a/package/boot/uboot-tools/uboot-envtools/files/qualcommax_ipq50xx b/package/boot/uboot-tools/uboot-envtools/files/qualcommax_ipq50xx
index a1d96b465d..c2fc03da09 100644
--- a/package/boot/uboot-tools/uboot-envtools/files/qualcommax_ipq50xx
+++ b/package/boot/uboot-tools/uboot-envtools/files/qualcommax_ipq50xx
@@ -7,6 +7,18 @@ touch /etc/config/ubootenv
 
 board=$(board_name)
 
+ubootenv_add_mtd() {
+	local idx="$(find_mtd_index "${1}")"
+	[ -n "$idx" ] && \
+		ubootenv_add_uci_config "/dev/mtd$idx" "${2}" "${3}" "${4}"
+}
+
+ubootenv_add_sys_mtd() {
+	local idx="$(find_mtd_index "${1}")"
+	[ -n "$idx" ] && \
+		ubootenv_add_uci_sys_config "/dev/mtd$idx" "${2}" "${3}" "${4}"
+}
+
 case "$board" in
 elecom,wrc-x3000gs2|\
 iodata,wn-dax3000gr)
@@ -27,6 +39,10 @@ linksys,spnmx56)
 	[ -n "$idx" ] && \
 		ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x40000" "0x20000"
 	;;
+xiaomi,ax6000)
+	ubootenv_add_mtd "0:appsblenv" "0x0" "0x10000" "0x20000"
+	ubootenv_add_sys_mtd "bdata" "0x0" "0x10000" "0x20000"
+	;;
 esac
 
 config_load ubootenv
diff --git a/package/firmware/ipq-wifi/Makefile b/package/firmware/ipq-wifi/Makefile
index 6b67a340a0..1626f92f33 100644
--- a/package/firmware/ipq-wifi/Makefile
+++ b/package/firmware/ipq-wifi/Makefile
@@ -79,6 +79,7 @@ ALLWIFIBOARDS:= \
 	tplink_archer-c6-v2 \
 	wallys_dr40x9 \
 	xiaomi_ax3600 \
+	xiaomi_ax6000 \
 	xiaomi_ax9000 \
 	yyets_le1 \
 	yuncore_ax880 \
@@ -235,6 +236,7 @@ $(eval $(call generate-ipq-wifi-package,tplink_eap660hd-v1,TP-Link EAP660 HD v1)
 $(eval $(call generate-ipq-wifi-package,tplink_archer-c6-v2,TP-Link Archer C6 V2))
 $(eval $(call generate-ipq-wifi-package,wallys_dr40x9,Wallys DR40X9))
 $(eval $(call generate-ipq-wifi-package,xiaomi_ax3600,Xiaomi AX3600))
+$(eval $(call generate-ipq-wifi-package,xiaomi_ax6000,Xiaomi AX6000))
 $(eval $(call generate-ipq-wifi-package,xiaomi_ax9000,Xiaomi AX9000))
 $(eval $(call generate-ipq-wifi-package,yyets_le1,YYeTs LE1))
 $(eval $(call generate-ipq-wifi-package,yuncore_ax880,Yuncore AX880))
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
new file mode 100644
index 0000000000..1d2e4f0e85
--- /dev/null
+++ b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-ax6000.dts
@@ -0,0 +1,642 @@
+/dts-v1/;
+
+#include "ipq5018.dtsi"
+#include "ipq5018-ess.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/leds/common.h>
+
+/ {
+	model = "Xiaomi AX6000";
+	compatible = "xiaomi,ax6000", "qcom,ipq5018";
+
+	aliases {
+		label-mac-device = &dp1;
+		led-boot = &led_system_blue;
+		led-failsafe = &led_system_yellow;
+		led-running = &led_system_blue;
+		led-upgrade = &led_system_yellow;
+		serial0 = &blsp1_uart1;
+	};
+
+	chosen {
+		/* Xiaomi's U-boot sets bootargs to:
+		 * ubi.mtd=rootfs_1 root=mtd:ubi_rootfs rootfstype=squashfs rootwait uart_en=1
+		 * so we need to override and set ubi.mtd=rootfs
+		 */
+		bootargs-append = " ubi.mtd=rootfs root=/dev/ubiblock0_0 coherent_pool=2M";
+		stdout-path = "serial0:115200n8";
+	};
+
+	keys {
+		compatible = "gpio-keys";
+
+		pinctrl-0 = <&button_pins>;
+		pinctrl-names = "default";
+
+		reset-button {
+			label = "reset";
+			gpios = <&tlmm 38 GPIO_ACTIVE_LOW>;
+			linux,code = <KEY_RESTART>;
+		};
+	};
+
+	leds {
+		compatible = "gpio-leds";
+
+		pinctrl-0 = <&leds_pins>;
+		pinctrl-names = "default";
+
+		led_wlan_green: wlan-green {
+			color = <LED_COLOR_ID_GREEN>;
+			function = LED_FUNCTION_WLAN;
+			gpio = <&tlmm 23 GPIO_ACTIVE_HIGH>;
+		};
+
+		led_system_blue: system-blue {
+			color = <LED_COLOR_ID_BLUE>;
+			function = LED_FUNCTION_POWER;
+			gpio = <&tlmm 24 GPIO_ACTIVE_HIGH>;
+		};
+
+		led_system_yellow: system-yellow {
+			color = <LED_COLOR_ID_YELLOW>;
+			function = LED_FUNCTION_POWER;
+			gpio = <&tlmm 25 GPIO_ACTIVE_HIGH>;
+		};
+
+		led_net_blue: net-blue {
+			color = <LED_COLOR_ID_BLUE>;
+			function = LED_FUNCTION_WAN_ONLINE;
+			gpio = <&tlmm 26 GPIO_ACTIVE_HIGH>;
+		};
+
+		led_net_yellow: net-yellow {
+			color = <LED_COLOR_ID_YELLOW>;
+			function = LED_FUNCTION_WAN;
+			gpio = <&tlmm 27 GPIO_ACTIVE_HIGH>;
+		};
+
+		led_phy_green: phy-green {
+			color = <LED_COLOR_ID_GREEN>;
+			function = LED_FUNCTION_LAN;
+			gpio = <&tlmm 28 GPIO_ACTIVE_HIGH>;
+		};
+	};
+
+	reserved-memory {
+		q6_mem_regions: q6_mem_regions at 4b000000 {
+			no-map;
+			reg = <0x0 0x4b000000 0x0 0x3000000>;
+		};
+	};
+};
+
+&sleep_clk {
+	clock-frequency = <32000>;
+};
+
+&xo_board_clk {
+	clock-frequency = <24000000>;
+};
+
+&blsp1_uart1 {
+	status = "okay";
+
+	pinctrl-0 = <&serial_0_pins>;
+	pinctrl-names = "default";
+};
+
+&crypto {
+	status = "okay";
+};
+
+&cryptobam {
+	status = "okay";
+};
+
+&prng {
+	status = "okay";
+};
+
+&qfprom {
+	status = "okay";
+};
+
+&qpic_bam {
+	status = "okay";
+};
+
+&qpic_nand {
+	pinctrl-0 = <&qpic_pins>;
+	pinctrl-names = "default";
+	status = "okay";
+
+	nand at 0 {
+		compatible = "spi-nand";
+		reg = <0>;
+		#address-cells = <1>;
+		#size-cells = <1>;
+
+		nand-ecc-engine = <&qpic_nand>;
+		nand-bus-width = <8>;
+
+		partitions {
+			compatible = "fixed-partitions";
+			#address-cells = <1>;
+			#size-cells = <1>;
+
+			partition at 0 {
+				label = "0:sbl1";
+				reg = <0x00000000 0x80000>;
+				read-only;
+			};
+
+			partition at 80000 {
+				label = "0:mibib";
+				reg = <0x00080000 0x80000>;
+				read-only;
+			};
+
+			partition at 100000 {
+				label = "0:bootconfig";
+				reg = <0x00100000 0x40000>;
+				read-only;
+			};
+
+			partition at 140000 {
+				label = "0:bootconfig1";
+				reg = <0x00140000 0x40000>;
+				read-only;
+			};
+
+			partition at 180000 {
+				label = "0:qsee";
+				reg = <0x00180000 0x100000>;
+				read-only;
+			};
+
+			partition at 280000 {
+				label = "0:qsee_1";
+				reg = <0x00280000 0x100000>;
+				read-only;
+			};
+
+			partition at 380000 {
+				label = "0:devcfg";
+				reg = <0x00380000 0x40000>;
+				read-only;
+			};
+
+			partition at 3c0000 {
+				label = "0:devcfg_1";
+				reg = <0x003c0000 0x40000>;
+				read-only;
+			};
+
+			partition at 400000 {
+				label = "0:cdt";
+				reg = <0x00400000 0x40000>;
+				read-only;
+			};
+
+			partition at 440000 {
+				label = "0:cdt_1`";
+				reg = <0x00440000 0x40000>;
+				read-only;
+			};
+
+			partition at 480000 {
+				label = "0:appsblenv";
+				reg = <0x00480000 0x80000>;
+			};
+
+			partition at 500000 {
+				label = "0:appsbl";
+				reg = <0x00500000 0x140000>;
+				read-only;
+			};
+
+			partition at 640000 {
+				label = "0:appsbl_1";
+				reg = <0x00640000 0x140000>;
+				read-only;
+			};
+
+			partition at 780000 {
+				label = "0:art";
+				reg = <0x00780000 0x100000>;
+				read-only;
+
+				nvmem-layout {
+					compatible = "fixed-layout";
+					#address-cells = <1>;
+					#size-cells = <1>;
+
+					mac_addr_dp1: macaddr at 0 {
+						reg = <0x0 0x6>;
+					};
+
+					mac_addr_dp2: macaddr at 6 {
+						reg = <0x6 0x6>;
+					};
+
+					caldata_qca9889: caldata at 4d000 {
+						reg = <0x4d000 0x844>;
+					};
+				};
+			};
+
+			partition at 880000 {
+				label = "0:training";
+				reg = <0x00880000 0x80000>;
+				read-only;
+			};
+
+			partition at 900000 {
+				label = "bdata";
+				reg = <0x00900000 0x80000>;
+			};
+
+			partition at 980000 {
+				label = "crash";
+				reg = <0x00980000 0x80000>;
+			};
+
+			partition at a00000 {
+				label = "crash_syslog";
+				reg = <0x00a00000 0x80000>;
+			};
+
+			partition at a80000 {
+				label = "ubi_kernel";
+				reg = <0x00a80000 0x2400000>;
+			};
+
+			partition at 2e80000 {
+				label = "rootfs";
+				reg = <0x02e80000 0x5180000>;
+			};
+		};
+	};
+};
+
+/*
+* =================================================================
+*     _______________________             _______________________
+*    |        IPQ5018        |           |        QCA8337        |
+*    | +------+   +--------+ |           | +--------+   +------+ |
+*    | | MAC0 |---| GE Phy |-+--- MDI ---+ | Phy3   |---| MAC4 | |
+*    | +------+   +--------+ |           | +--------+   +------+ |
+*    |                       |           |_______________________|
+*    |                       |            _______________________
+*    |                       |           |        QCA8081        |
+*    | +------+   +--------+ |           | +-------------------+ |
+*    | | MAC1 |---| Uniphy |-+-- SGMII+--+ |        Phy        | |
+*    | +------+   +--------+ |           | +-------------------+ |
+*    |_______________________|           |_______________________|
+*
+* =================================================================
+*/
+
+&switch {
+	status = "okay";
+
+	switch_mac_mode = <MAC_MODE_SGMII_CHANNEL0>;
+
+	qcom,port_phyinfo {
+		// MAC0 -> GE Phy --- MDI --- QCA8337 Switch
+		port at 0 {
+			port_id = <1>;
+			mdiobus = <&mdio0>;
+			phy_address = <7>;
+			phy_dac = <0x10 0x10>;
+		};
+
+		// MAC1 -> Uniphy --- SGMII --- QCA8081
+		port at 1 {
+			port_id = <2>;
+			mdiobus = <&mdio1>;
+			phy_address = <8>;
+			port_mac_sel = "QGMAC_PORT";
+		};
+	};
+};
+
+// MAC0 -> GE Phy
+&dp1 {
+	status = "okay";
+
+	nvmem-cells = <&mac_addr_dp1 0>;
+	nvmem-cell-names = "mac-address";
+};
+
+// MAC1 ---SGMII---> QCA8081
+&dp2 {
+	status = "okay";
+
+	label = "wan";
+	phy-handle = <&qca8081>;
+	nvmem-cells = <&mac_addr_dp2 0>;
+	nvmem-cell-names = "mac-address";
+};
+
+&mdio0 {
+	status = "okay";
+};
+
+// IPQ5018 GE Phy -> QCA8337 PHY0
+&ge_phy {
+	qcom,dac-preset-short-cable;
+};
+
+&mdio1 {
+	status = "okay";
+
+	pinctrl-0 = <&mdio1_pins>;
+	pinctrl-names = "default";
+	reset-gpios = <&tlmm 39 GPIO_ACTIVE_LOW>;
+
+	// QCA8337 Phy0 -> LAN1
+	qca8337_0: ethernet-phy at 0 {
+		reg = <0>;
+	};
+
+	// QCA8337 Phy1 -> LAN2
+	qca8337_1: ethernet-phy at 1 {
+		reg = <1>;
+	};
+
+	// QCA8337 Phy2 -> LAN3
+	qca8337_2: ethernet-phy at 2 {
+		reg = <2>;
+	};
+
+	// QCA8337 Phy3 -> IPQ5018 GE Phy
+	qca8337_3: ethernet-phy at 3 {
+		reg = <3>;
+	};
+
+	// QCA8081 Phy -> WAN
+	qca8081: ethernet-phy at 8 {
+		compatible = "ethernet-phy-id004d.d101";
+		reg = <8>;
+
+		leds {
+			#address-cells = <1>;
+			#size-cells = <0>;
+
+			led at 0 {
+				reg = <0>;
+				color = <LED_COLOR_ID_GREEN>;
+				function = LED_FUNCTION_WAN;
+				default-state = "keep";
+			};
+		};
+	};
+
+	// QCA8337 switch
+	ethernet-switch at 11 {
+		compatible = "qca,qca8337";
+		reg = <17>;
+
+		ports {
+			port at 1 {
+				reg = <1>;
+				label = "lan1";
+				phy-handle = <&qca8337_0>;
+
+				leds {
+					#address-cells = <1>;
+					#size-cells = <0>;
+
+					led at 0 {
+						reg = <0>;
+						color = <LED_COLOR_ID_GREEN>;
+						function = LED_FUNCTION_LAN;
+						default-state = "keep";
+					};
+				};
+			};
+
+			port at 2 {
+				reg = <2>;
+				label = "lan2";
+				phy-handle = <&qca8337_1>;
+
+				leds {
+					#address-cells = <1>;
+					#size-cells = <0>;
+
+					led at 0 {
+						reg = <0>;
+						color = <LED_COLOR_ID_GREEN>;
+						function = LED_FUNCTION_LAN;
+						default-state = "keep";
+					};
+				};
+			};
+
+			port at 3 {
+				reg = <3>;
+				label = "lan3";
+				phy-handle = <&qca8337_2>;
+
+				leds {
+					#address-cells = <1>;
+					#size-cells = <0>;
+
+					led at 0 {
+						reg = <0>;
+						color = <LED_COLOR_ID_GREEN>;
+						function = LED_FUNCTION_LAN;
+						default-state = "keep";
+					};
+				};
+			};
+
+			port at 4 {
+				reg = <4>;
+				phy-handle = <&qca8337_3>;
+				phy-mode = "gmii";
+				ethernet = <&dp1>;
+			};
+		};
+	};
+};
+
+&tlmm {
+	button_pins: button-state {
+		pins = "gpio38";
+		function = "gpio";
+		drive-strength = <8>;
+		bias-pull-up;
+	};
+
+	leds_pins: leds-state {
+		pins = "gpio23", "gpio24", "gpio25",
+		       "gpio26", "gpio27", "gpio28";
+		function = "gpio";
+		drive-strength = <8>;
+		bias-pull-down;
+	};
+
+	mdio1_pins: mdio-state {
+		mdc-pins {
+			pins = "gpio36";
+			function = "mdc";
+			drive-strength = <8>;
+			bias-pull-up;
+		};
+
+		mdio-pins {
+			pins = "gpio37";
+			function = "mdio";
+			drive-strength = <8>;
+			bias-pull-up;
+		};
+	};
+
+	qpic_pins: qpic-state {
+		clock-pins {
+			pins = "gpio9";
+			function = "qspi_clk";
+			drive-strength = <8>;
+			bias-disable;
+		};
+
+		cs-pins {
+			pins = "gpio8";
+			function = "qspi_cs";
+			drive-strength = <8>;
+			bias-disable;
+		};
+
+		data-pins {
+			pins = "gpio4", "gpio5", "gpio6", "gpio7";
+			function = "qspi_data";
+			drive-strength = <8>;
+			bias-disable;
+		};
+	};
+
+	serial_0_pins: uart0-state {
+		pins = "gpio20", "gpio21";
+		function = "blsp0_uart0";
+		bias-disable;
+	};
+};
+
+&tsens {
+	status = "okay";
+};
+
+&pcie0_phy {
+	status = "okay";
+};
+
+&pcie0 {
+	status = "okay";
+
+	perst-gpios = <&tlmm 15 GPIO_ACTIVE_LOW>;
+
+	pcie at 0 {
+		wifi at 0,0 {
+			status = "okay";
+
+			/* QCN9074: ath11k lacks DT compatible for PCI cards */
+			compatible = "pci17cb,1104";
+			reg = <0x00010000 0 0 0 0>;
+
+			qcom,ath11k-calibration-variant = "Xiaomi-AX6000";
+		};
+	};
+};
+
+&pcie1_phy {
+	status = "okay";
+};
+
+&pcie1 {
+	/*
+	 * although the pcie1 phy probes successfully, the controller is unable
+	 * to bring it up. So let's disable it until a solution is found.
+	 */
+	status = "disbled";
+
+	perst-gpios = <&tlmm 18 GPIO_ACTIVE_LOW>;
+
+	pcie at 0 {
+		wifi at 0,0 {
+			status = "okay";
+
+			compatible = "qcom,ath10k";
+			reg = <0x00010000 0 0 0 0>;
+
+			qcom,ath10k-calibration-variant = "Xiaomi-AX6000";
+			nvmem-cell-names = "calibration";
+			nvmem-cells = <&caldata_qca9889>;
+		};
+	};
+};
+
+&q6v5_wcss {
+	status = "okay";
+
+	memory-region = <&q6_mem_regions>;
+	firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt",
+			"ath11k/IPQ5018/hw1.0/m3_fw.mdt";
+
+	// IPQ5018
+	q6_wcss_pd1: pd-1 {
+		firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt";
+
+		resets =
+			<&gcc GCC_WCSSAON_RESET>,
+			<&gcc GCC_WCSS_BCR>,
+			<&gcc GCC_CE_BCR>;
+		reset-names =
+			"wcss_aon_reset",
+			"wcss_reset",
+			"ce_reset";
+
+		clocks =
+			<&gcc GCC_WCSS_AHB_S_CLK>,
+			<&gcc GCC_WCSS_ACMT_CLK>,
+			<&gcc GCC_WCSS_AXI_M_CLK>;
+		clock-names =
+			"gcc_wcss_ahb_s_clk",
+			"gcc_wcss_acmt_clk",
+			"gcc_wcss_axi_m_clk";
+
+		interrupts-extended =
+			<&wcss_smp2p_in 8 0>,
+			<&wcss_smp2p_in 9 0>,
+			<&wcss_smp2p_in 12 0>,
+			<&wcss_smp2p_in 11 0>;
+		interrupt-names =
+			"fatal",
+			"ready",
+			"spawn-ack",
+			"stop-ack";
+
+		qcom,smem-states =
+			<&wcss_smp2p_out 8>,
+			<&wcss_smp2p_out 9>,
+			<&wcss_smp2p_out 10>;
+		qcom,smem-state-names =
+			"shutdown",
+			"stop",
+			"spawn";
+	};
+};
+
+&wifi0 {
+	status = "okay";
+
+	qcom,rproc = <&q6_wcss_pd1>;
+	qcom,ath11k-calibration-variant = "Xiaomi-AX6000";
+	qcom,ath11k-fw-memory-mode = <1>;
+	qcom,bdf-addr = <0x4c400000>;
+};
diff --git a/target/linux/qualcommax/image/ipq50xx.mk b/target/linux/qualcommax/image/ipq50xx.mk
index a15039e728..6ef61a7993 100644
--- a/target/linux/qualcommax/image/ipq50xx.mk
+++ b/target/linux/qualcommax/image/ipq50xx.mk
@@ -127,3 +127,26 @@ define Device/linksys_spnmx56
 		ipq-wifi-linksys_spnmx56
 endef
 TARGET_DEVICES += linksys_spnmx56
+
+define Device/xiaomi_ax6000
+	$(call Device/FitImage)
+	$(call Device/UbiFit)
+	DEVICE_VENDOR := Xiaomi
+	DEVICE_MODEL := AX6000
+	BLOCKSIZE := 128k
+	PAGESIZE := 2048
+	DEVICE_DTS_CONFIG := config at mp03.1
+	SOC := ipq5018
+	KERNEL_SIZE := 36864k
+	NAND_SIZE := 128m
+	DEVICE_PACKAGES := kmod-ath11k-pci \
+		ath11k-firmware-qcn9074 \
+		kmod-ath10k-ct-smallbuffers \
+		ath10k-firmware-qca9887-ct \
+		ipq-wifi-xiaomi_ax6000
+ifneq ($(CONFIG_TARGET_ROOTFS_INITRAMFS),)
+	ARTIFACTS := initramfs-factory.ubi
+	ARTIFACT/initramfs-factory.ubi := append-image-stage initramfs-uImage.itb | ubinize-kernel
+endif
+endef
+TARGET_DEVICES += xiaomi_ax6000
diff --git a/target/linux/qualcommax/ipq50xx/base-files/etc/board.d/01_leds b/target/linux/qualcommax/ipq50xx/base-files/etc/board.d/01_leds
index 89c6dc27f2..9792cb45bf 100644
--- a/target/linux/qualcommax/ipq50xx/base-files/etc/board.d/01_leds
+++ b/target/linux/qualcommax/ipq50xx/base-files/etc/board.d/01_leds
@@ -25,6 +25,14 @@ linksys,mr5500)
 	ucidef_set_led_netdev "wan-port-link" "WAN-PORT-LINK" "qca8k-0.0:04:green:wan" "wan" "link_10 link_100 link_1000"
 	ucidef_set_led_netdev "wan-port-activity" "WAN-PORT-ACTIVITY" "qca8k-0.0:04:amber:wan" "wan" "tx rx"
 	;;
+xiaomi,ax6000)
+	ucidef_set_led_netdev "lan1-port-link" "LAN1-PORT-LINK" "90000.mdio-1:00:green:lan" "lan1" "tx rx link_10 link_100 link_1000"
+	ucidef_set_led_netdev "lan2-port-link" "LAN2-PORT-LINK" "90000.mdio-1:01:green:lan" "lan2" "tx rx link_10 link_100 link_1000"
+	ucidef_set_led_netdev "lan3-port-link" "LAN3-PORT-LINK" "90000.mdio-1:02:green:lan" "lan3" "tx rx link_10 link_100 link_1000"
+	ucidef_set_led_netdev "wan-port-link" "WAN-PORT-LINK" "90000.mdio-1:08:green:wan" "wan" "tx rx link_10 link_100 link_1000 link_2500"
+	ucidef_set_led_netdev "wan-port-link-top-blue" "WAN-PORT-LINK-TOP-BLUE" "blue:wan" "wan" "link_1000 link_2500"
+	ucidef_set_led_netdev "wan-port-link-top-yellow" "WAN-PORT-LINK-TOP-YELLOW" "yellow:wan" "wan" "link_10 link_100"
+	;;
 esac
 
 board_config_flush
diff --git a/target/linux/qualcommax/ipq50xx/base-files/etc/board.d/02_network b/target/linux/qualcommax/ipq50xx/base-files/etc/board.d/02_network
index 05b73e4d80..d40cdc5169 100644
--- a/target/linux/qualcommax/ipq50xx/base-files/etc/board.d/02_network
+++ b/target/linux/qualcommax/ipq50xx/base-files/etc/board.d/02_network
@@ -17,7 +17,8 @@ ipq50xx_setup_interfaces()
 		;;
 	linksys,mx2000|\
 	linksys,mx5500|\
-	linksys,spnmx56)
+	linksys,spnmx56|\
+	xiaomi,ax6000)
 		ucidef_set_interfaces_lan_wan "lan1 lan2 lan3" "wan"
 		;;
 	esac
diff --git a/target/linux/qualcommax/ipq50xx/base-files/etc/hotplug.d/firmware/11-ath11k-caldata b/target/linux/qualcommax/ipq50xx/base-files/etc/hotplug.d/firmware/11-ath11k-caldata
index f0d356956f..f448a75b84 100644
--- a/target/linux/qualcommax/ipq50xx/base-files/etc/hotplug.d/firmware/11-ath11k-caldata
+++ b/target/linux/qualcommax/ipq50xx/base-files/etc/hotplug.d/firmware/11-ath11k-caldata
@@ -31,6 +31,9 @@ case "$FIRMWARE" in
 		ath11k_remove_regdomain
 		ath11k_set_macflag
 		;;
+	xiaomi,ax6000)
+		caldata_extract "0:art" 0x1000 0x20000
+		;;
 	esac
 	;;
 "ath11k/QCN6122/hw1.0/cal-ahb-b00a040.wifi1.bin")
@@ -67,6 +70,9 @@ case "$FIRMWARE" in
 		ath11k_remove_regdomain
 		ath11k_set_macflag
 		;;
+	xiaomi,ax6000)
+		caldata_extract "0:art" 0x26800 0x20000
+		;;
 	esac
 	;;
 *)
diff --git a/target/linux/qualcommax/ipq50xx/base-files/lib/upgrade/platform.sh b/target/linux/qualcommax/ipq50xx/base-files/lib/upgrade/platform.sh
index 760bc20927..b13ecb5743 100644
--- a/target/linux/qualcommax/ipq50xx/base-files/lib/upgrade/platform.sh
+++ b/target/linux/qualcommax/ipq50xx/base-files/lib/upgrade/platform.sh
@@ -4,6 +4,29 @@ REQUIRE_IMAGE_METADATA=1
 RAMFS_COPY_BIN='dumpimage fw_printenv fw_setenv head seq'
 RAMFS_COPY_DATA='/etc/fw_env.config /var/lock/fw_printenv.lock'
 
+xiaomi_initramfs_prepare() {
+	# Wipe UBI if running initramfs
+	[ "$(rootfs_type)" = "tmpfs" ] || return 0
+
+	local rootfs_mtdnum="$( find_mtd_index rootfs )"
+	if [ ! "$rootfs_mtdnum" ]; then
+		echo "unable to find mtd partition rootfs"
+		return 1
+	fi
+
+	local kern_mtdnum="$( find_mtd_index ubi_kernel )"
+	if [ ! "$kern_mtdnum" ]; then
+		echo "unable to find mtd partition ubi_kernel"
+		return 1
+	fi
+
+	ubidetach -m "$rootfs_mtdnum"
+	ubiformat /dev/mtd$rootfs_mtdnum -y
+
+	ubidetach -m "$kern_mtdnum"
+	ubiformat /dev/mtd$kern_mtdnum -y
+}
+
 remove_oem_ubi_volume() {
 	local oem_volume_name="$1"
 	local oem_ubivol
@@ -69,6 +92,14 @@ platform_check_image() {
 	return 0;
 }
 
+platform_pre_upgrade() {
+	case "$(board_name)" in
+	xiaomi,ax6000)
+		xiaomi_initramfs_prepare
+		;;
+	esac
+}
+
 platform_do_upgrade() {
 	case "$(board_name)" in
 	elecom,wrc-x3000gs2|\
@@ -97,6 +128,23 @@ platform_do_upgrade() {
 		remove_oem_ubi_volume squashfs
 		nand_do_upgrade "$1"
 		;;
+	xiaomi,ax6000)
+		# Make sure that UART is enabled
+		fw_setenv boot_wait on
+		fw_setenv uart_en 1
+
+		# Enforce single partition.
+		fw_setenv flag_boot_rootfs 0
+		fw_setenv flag_last_success 0
+		fw_setenv flag_boot_success 1
+		fw_setenv flag_try_sys1_failed 8
+		fw_setenv flag_try_sys2_failed 8
+
+		# Kernel and rootfs are placed in 2 different UBI
+		CI_KERN_UBIPART="ubi_kernel"
+		CI_ROOT_UBIPART="rootfs"
+		nand_do_upgrade "$1"
+		;;
 	*)
 		default_do_upgrade "$1"
 		;;




More information about the lede-commits mailing list