ipq807x: add QNAP 301w
authorDirk Buchwalder <buchwalder@posteo.de>
Sat, 1 Jan 2022 22:20:19 +0000 (23:20 +0100)
committerRobert Marko <robimarko@gmail.com>
Mon, 16 Jan 2023 11:42:23 +0000 (12:42 +0100)
QNAP 301w is a AX WIFI router with 4 1G and 2 10G ports.

Specifications:

    •     CPU: Qualcomm IPQ8072A Quad core Cortex-A53 2.2GHz
    •     RAM: 1024MB of DDR3
    •     Storage: 4GB eMMC (contains kernel and rootfs) / 8MB NOR
          (contains art and u-boot-env)
    •     Ethernet: 4x 1G RJ45 ports + 2 10G ports (Aquantia AQR113C)
    •     WLAN:
          2.4GHz: Qualcomm QCN5024 4x4 (40 MHz) 802.11b/g/n/ax 1174 Mbps PHY rate
          5GHz: Qualcomm QCN5054 4x4 (80 MHz) or 2x2 (160 MHz) 802.11a/b/g/n/ac/ax 2402 PHY rate

    •     LEDs:
          7 x GPIO-controlled dual color LEDs + 2 GPIO-controlled single color LEDs

            • Buttons: 1x soft reset / 1x WPS
            • Power: 12V DC jack

        A poulated serial header is onboard.
        RX/TX is working, bootwait is active, secure boot is not enabled.

        SSH can be activated in the stock firmware, hold WPS button til the second beep
(yes the router has a buzzer)
        SSH is available on port 22200, login with user admin and
password "mac address of the router".

        Installation Instructions:

            • obtain serial access (https://openwrt.org/inbox/toh/qnap/301w#serial)
            • stop auto boot
            • setenv serverip 192.168.10.1
            • setenv ipaddr 192.168.10.10
            • tftpboot the initramfs image
              (openwrt-ipq807x-generic-qnap_301w-initramfs-fit-uImage.itb)
            • bootm

            • make sure that current_entry is set to "0":
              "fw_printenv -n current_entry" should be print "0". If not,
       do "fw_setenv current_entry 0"
            • copy openwrt-ipq807x-generic-qnap_301w-squashfs-sysupgrade.bin
          to the device to /tmp folder
            • sysupgrade -n /tmp/openwrt-ipq807x-generic-qnap_301w-squashfs-sysupgrade.bin
              this flashes openwrt to the first kernel and rootfs partition (mmcblk0p1 / mmcblk0p4)
            • reboot

        Note: this leaves the second kernel / rootfs parition untouched. So if you want
              to go back to stock, stop u-boot autoboot, "setenv current_entry 1" ,
       "saveenv", "bootipq".
              Stock firmware should start from the second partition.
      Then do a firmwareupgrade in the stock gui, that should overwrite the openwrt
      in the first partitions

        Make 10G Aquantia phy's work:
              The aquantia phy's need a firmware to work. This can either be loaded
      in linux with a userspace tool or in u-boot.

              I was not successfull to load the firmware in linux (aq-fw-download) but luckily there is
      aq_load_fw available in u-boot. But first the right firmware needs to write
      to the 0:ETHPHYFW mtd partition (it is empty on my device)

              Grab the ethphy firmware image from:
      https://github.com/kirdesde/nbg7815_gpl/blob/master/target/linux/ipq/ipq807x_64/prebuilt_images/AQR_ethphyfw.mbn
      and scp that to openwrt.

              Check the 0:ETHPHYFW partition number:
              cat /proc/mtd|grep "0:ETHPHYFW", should be mtd10.

              Backup the 0:ETHPHYFW partition:
              dd if=/dev/mtd10 of=/tmp/ethphyfw.backup, scp ethphyfw.backup to a save place.

              Write the new firmware image to the 0:ETHPHYFW partition:
              "mtd erase /dev/mtd10", "mtd -n write AQR_ethphyfw.mbn /dev/mtd10".

              Reboot to u-boot.

              Check if aq_load_fw is working:

              "aq_load_fw 0", that checks the firmware and if successfull,
      loads iram and dram to one of the aquantia phy's.

              If that worked, add the aq_load_fw to the bootcmd:
              setenv bootcmd "aq_load_fw 0 && aq_load_fw 8 && bootipq"

              "saveenv"

              "reset"

              Board reboots and the firmware load to both phy's should start and
      then openwrt boots.

              Check if the 10G ports work.

              Note: lan port labeled "10G-2" is configured as WAN port as per default.
      All other port are in the br-lan. This can be changed in the network config.

Signed-off-by: Dirk Buchwalder <buchwalder@posteo.de>
package/boot/uboot-envtools/files/ipq807x
package/firmware/ipq-wifi/Makefile
package/firmware/ipq-wifi/board-qnap_301w.ipq8074 [new file with mode: 0644]
target/linux/ipq807x/Makefile
target/linux/ipq807x/base-files/etc/board.d/01_leds
target/linux/ipq807x/base-files/etc/board.d/02_network
target/linux/ipq807x/base-files/etc/hotplug.d/firmware/11-ath11k-caldata
target/linux/ipq807x/base-files/lib/upgrade/mmc.sh [new file with mode: 0644]
target/linux/ipq807x/base-files/lib/upgrade/platform.sh
target/linux/ipq807x/files/arch/arm64/boot/dts/qcom/ipq8072-301w.dts [new file with mode: 0644]
target/linux/ipq807x/image/generic.mk

index 636f3344129a73ecb5425489898751a7880db218..3961d4124e20717fa333a55d227f116329e2e060 100644 (file)
@@ -22,6 +22,11 @@ xiaomi,ax3600)
        [ -n "$idx2" ] && \
                ubootenv_add_uci_sys_config "/dev/mtd$idx2" "0x0" "0x10000" "0x20000"
        ;;
+qnap,301w)
+       idx="$(find_mtd_index 0:appsblenv)"
+       [ -n "$idx" ] && \
+               ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x20000" "0x20000" "1"
+       ;;
 esac
 
 config_load ubootenv
index 276722808010101ef1d84e7a8aa9ef16f2abc820..dbc2b4e227e424225e0e03beb6ccd7eeb24a7876 100644 (file)
@@ -38,6 +38,7 @@ ALLWIFIBOARDS:= \
        linksys_whw03v2 \
        p2w_r619ac \
        pakedge_wr-1 \
+       qnap_301w \
        qxwlan_e2600ac-c1 \
        qxwlan_e2600ac-c2 \
        redmi_ax6 \
@@ -130,6 +131,7 @@ $(eval $(call generate-ipq-wifi-package,linksys_ea8300,Linksys EA8300))
 $(eval $(call generate-ipq-wifi-package,linksys_whw03v2,Linksys WHW03 V2))
 $(eval $(call generate-ipq-wifi-package,p2w_r619ac,P&W R619AC))
 $(eval $(call generate-ipq-wifi-package,pakedge_wr-1,Pakedge WR-1))
+$(eval $(call generate-ipq-wifi-package,qnap_301w,QNAP 301w))
 $(eval $(call generate-ipq-wifi-package,qxwlan_e2600ac-c1,Qxwlan E2600AC C1))
 $(eval $(call generate-ipq-wifi-package,qxwlan_e2600ac-c2,Qxwlan E2600AC C2))
 $(eval $(call generate-ipq-wifi-package,redmi_ax6,Redmi AX6))
diff --git a/package/firmware/ipq-wifi/board-qnap_301w.ipq8074 b/package/firmware/ipq-wifi/board-qnap_301w.ipq8074
new file mode 100644 (file)
index 0000000..6b8f8b9
Binary files /dev/null and b/package/firmware/ipq-wifi/board-qnap_301w.ipq8074 differ
index d02256abf2f11940cb47beedc59d764ab199d134..539d930ce35e7b3827cf4b031124bb38e21ce843 100644 (file)
@@ -3,7 +3,7 @@ include $(TOPDIR)/rules.mk
 ARCH:=aarch64
 BOARD:=ipq807x
 BOARDNAME:=Qualcomm Atheros IPQ807x
-FEATURES:=squashfs ramdisk fpu nand rtc
+FEATURES:=squashfs ramdisk fpu nand rtc emmc
 KERNELNAME:=Image dtbs
 CPU_TYPE:=cortex-a53
 SUBTARGETS:=generic
index a13ddcbb08467f3bc0722d33b1c6eb0ab2d1c72c..f0a2bdd7bb9bb776a11d34f0f04c75edbf10708e 100644 (file)
@@ -10,6 +10,14 @@ redmi,ax6|\
 xiaomi,ax3600)
        ucidef_set_led_netdev "wan" "WAN" "blue:network" "wan"
        ;;
+qnap,301w)
+       ucidef_set_led_netdev "lan1" "LAN1" "green:lan1" "lan1"
+       ucidef_set_led_netdev "lan2" "LAN2" "green:lan2" "lan2"
+       ucidef_set_led_netdev "lan3" "LAN3" "green:lan3" "lan3"
+       ucidef_set_led_netdev "lan4" "LAN4" "green:lan4" "lan4"
+       ucidef_set_led_netdev "10G_1" "10G_1" "green:10g_1" "10g-1"
+       ucidef_set_led_netdev "10G_2" "10G_2" "green:10g_2" "10g-2"
+       ;;
 esac
 
 board_config_flush
index e3f4d4f576d3fbfe4f3a919ffbbdcc46e4f0b57f..a6ff418a19412463981f0bd0ca506cee86398530 100644 (file)
@@ -14,6 +14,9 @@ ipq807x_setup_interfaces()
        edimax,cax1800)
                ucidef_set_interfaces_lan_wan "lan"
                ;;
+       qnap,301w)
+               ucidef_set_interfaces_lan_wan "lan1 lan2 lan3 lan4 10g-2" "10g-1"
+               ;;
        redmi,ax6|\
        xiaomi,ax3600)
                ucidef_set_interfaces_lan_wan "lan1 lan2 lan3" "wan"
index 7f919bafc5d07dccc851785f5ee5b78124edcd25..fd431d07da22f8f75ab6649012d269959212b14c 100644 (file)
@@ -10,6 +10,7 @@ case "$FIRMWARE" in
 "ath11k/IPQ8074/hw2.0/cal-ahb-c000000.wifi.bin")
        case "$board" in
        edimax,cax1800|\
+       qnap,301w|\
        redmi,ax6|\
        xiaomi,ax3600)
                caldata_extract "0:art" 0x1000 0x20000
diff --git a/target/linux/ipq807x/base-files/lib/upgrade/mmc.sh b/target/linux/ipq807x/base-files/lib/upgrade/mmc.sh
new file mode 100644 (file)
index 0000000..dac9ddd
--- /dev/null
@@ -0,0 +1,83 @@
+#
+# Copyright (C) 2016 lede-project.org
+#
+
+# this can be used as a generic mmc upgrade script
+# just add a device entry in platform.sh, 
+# define "kernelname" and "rootfsname" and call mmc_do_upgrade
+# after the kernel and rootfs flash a loopdev (as overlay) is 
+# setup on top of the rootfs partition
+# for the proper function a padded rootfs image is needed, basically 
+# append "pad-to 64k" to the image definition
+# this is based on the ipq806x zyxel.sh mmc upgrade
+
+. /lib/functions.sh
+
+mmc_do_upgrade() {
+       local tar_file="$1"
+       local rootfs=
+       local kernel=
+
+                       [ -z "$kernel" ] && kernel=$(find_mmc_part ${kernelname})
+                       [ -z "$rootfs" ] && rootfs=$(find_mmc_part ${rootfsname})
+
+                       [ -z "$kernel" ] && echo "Upgrade failed: kernel partition not found! Rebooting..." && reboot -f
+                       [ -z "$rootfs" ] && echo "Upgrade failed: rootfs partition not found! Rebooting..." && reboot -f
+
+       mmc_do_flash $tar_file $kernel $rootfs
+
+       return 0
+}
+
+mmc_do_flash() {
+       local tar_file=$1
+       local kernel=$2
+       local rootfs=$3
+       
+       # keep sure its unbound
+       losetup --detach-all || {
+               echo Failed to detach all loop devices. Skip this try.
+               reboot -f
+       }
+
+       # use the first found directory in the tar archive
+       local board_dir=$(tar tf $tar_file | grep -m 1 '^sysupgrade-.*/$')
+       board_dir=${board_dir%/}
+
+       echo "flashing kernel to $kernel"
+       tar xf $tar_file ${board_dir}/kernel -O >$kernel
+
+       echo "flashing rootfs to ${rootfs}"
+       tar xf $tar_file ${board_dir}/root -O >"${rootfs}"
+
+       # a padded rootfs is needed for overlay fs creation
+       local offset=$(tar xf $tar_file ${board_dir}/root -O | wc -c)
+       [ $offset -lt 65536 ] && {
+               echo Wrong size for rootfs: $offset
+               sleep 10
+               reboot -f
+       }
+
+       # Mount loop for rootfs_data
+       local loopdev="$(losetup -f)"
+       losetup -o $offset $loopdev $rootfs || {
+               echo "Failed to mount looped rootfs_data."
+               sleep 10
+               reboot -f
+       }
+
+       echo "Format new rootfs_data at position ${offset}."
+       mkfs.ext4 -F -L rootfs_data $loopdev
+       mkdir /tmp/new_root
+       mount -t ext4 $loopdev /tmp/new_root && {
+               echo "Saving config to rootfs_data at position ${offset}."
+               cp -v "$UPGRADE_BACKUP" "/tmp/new_root/$BACKUP_FILE"
+               umount /tmp/new_root
+       }
+
+       # Cleanup
+       losetup -d $loopdev >/dev/null 2>&1
+       sync
+       umount -a
+       reboot -f
+}
index d6e5d04a31eca951825e59fb45b6c50d7f742842..9e8f4796cfa1bc7d77dcf9b98c967c2e62379873 100644 (file)
@@ -45,6 +45,11 @@ platform_do_upgrade() {
        edimax,cax1800)
                nand_do_upgrade "$1"
                ;;
+       qnap,301w)
+               kernelname="0:HLOS"
+               rootfsname="rootfs"
+               mmc_do_upgrade "$1"
+               ;;
        redmi,ax6|\
        xiaomi,ax3600)
                # Make sure that UART is enabled
diff --git a/target/linux/ipq807x/files/arch/arm64/boot/dts/qcom/ipq8072-301w.dts b/target/linux/ipq807x/files/arch/arm64/boot/dts/qcom/ipq8072-301w.dts
new file mode 100644 (file)
index 0000000..d3e788a
--- /dev/null
@@ -0,0 +1,410 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+/* Copyright (c) 2021, Dirk Buchwalder <buchwalder@posteo.de> */
+
+/dts-v1/;
+
+#include "ipq8074.dtsi"
+#include "ipq8074-hk-cpu.dtsi"
+#include "ipq8074-ess.dtsi"
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/leds/common.h>
+
+/ {
+       model = "QNAP 301w";
+       compatible = "qnap,301w", "qcom,ipq8074";
+
+       aliases {
+               serial0 = &blsp1_uart5;
+               /*
+                * Aliases as required by u-boot
+                * to patch MAC addresses
+                */
+               led-boot = &led_system_red;
+               led-failsafe = &led_system_red;
+               led-running = &led_pwr_green;
+               led-upgrade = &led_system_red;
+               ethernet0 = &dp1;
+               ethernet1 = &dp2;
+               ethernet2 = &dp3;
+               ethernet3 = &dp4;
+               ethernet4 = &dp5;
+               ethernet5 = &dp6_syn;
+               label-mac-device = &dp1;
+       };
+
+       chosen {
+               stdout-path = "serial0:115200n8";
+       };
+
+       keys {
+               compatible = "gpio-keys";
+               pinctrl-0 = <&button_pins>;
+               pinctrl-names = "default";
+
+               wps-button {
+                       label = "wps";
+                       gpios = <&tlmm 57 GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_WPS_BUTTON>;
+               };
+
+               reset-button {
+                       label = "reset";
+                       gpios = <&tlmm 67 GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_RESTART>;
+               };
+       };
+
+       leds {
+               compatible = "gpio-leds";
+               pinctrl-0 = <&leds_pins>;
+               pinctrl-names = "default";
+
+               led_system_green: led-system-green {
+                       label = "green:system";
+                       gpios = <&tlmm 1 GPIO_ACTIVE_HIGH>;
+                       color = <LED_COLOR_ID_GREEN>;
+               };
+
+               led_system_red: led-system-red {
+                       label = "red:system";
+                       gpios = <&tlmm 3 GPIO_ACTIVE_HIGH>;
+                       color = <LED_COLOR_ID_RED>;
+               };
+
+               led_pwr_green: led-pwr-green {
+                       label = "green:pwr";
+                       gpios = <&tlmm 4 GPIO_ACTIVE_HIGH>;
+                       color = <LED_COLOR_ID_GREEN>;
+               };
+
+               led-wifi-green {
+                       label = "green:wifi";
+                       gpios = <&tlmm 42 GPIO_ACTIVE_HIGH>;
+                       color = <LED_COLOR_ID_GREEN>;
+               };
+
+               led-lan4-green {
+                       label = "green:lan4";
+                       gpios = <&tlmm 6 GPIO_ACTIVE_HIGH>;
+                       color = <LED_COLOR_ID_GREEN>;
+               };
+
+               led-lan4-amber {
+                       label = "amber:lan4";
+                       gpios = <&tlmm 7 GPIO_ACTIVE_HIGH>;
+                       color = <LED_COLOR_ID_AMBER>;
+               };
+
+               led-lan3-green {
+                       label = "green:lan3";
+                       gpios = <&tlmm 8 GPIO_ACTIVE_HIGH>;
+                       color = <LED_COLOR_ID_GREEN>;
+               };
+
+               led-lan3-amber {
+                       label = "amber:lan3";
+                       gpios = <&tlmm 11 GPIO_ACTIVE_HIGH>;
+                       color = <LED_COLOR_ID_AMBER>;
+               };
+
+               led-lan2-green {
+                       label = "green:lan2";
+                       gpios = <&tlmm 12 GPIO_ACTIVE_HIGH>;
+                       color = <LED_COLOR_ID_GREEN>;
+               };
+
+               led-lan2-amber {
+                       label = "amber:lan2";
+                       gpios = <&tlmm 13 GPIO_ACTIVE_HIGH>;
+                       color = <LED_COLOR_ID_AMBER>;
+               };
+
+               led-lan1-green {
+                       label = "green:lan1";
+                       gpios = <&tlmm 14 GPIO_ACTIVE_HIGH>;
+                       color = <LED_COLOR_ID_GREEN>;
+               };
+
+               led-lan1-amber {
+                       label = "amber:lan1";
+                       gpios = <&tlmm 15 GPIO_ACTIVE_HIGH>;
+                       color = <LED_COLOR_ID_AMBER>;
+               };
+
+               led-10g-1-green {
+                       label = "green:10g_1";
+                       gpios = <&tlmm 54 GPIO_ACTIVE_HIGH>;
+                       color = <LED_COLOR_ID_GREEN>;
+               };
+
+               led-10g-1-amber {
+                       label = "amber:10g_1";
+                       gpios = <&tlmm 56 GPIO_ACTIVE_HIGH>;
+                       color = <LED_COLOR_ID_AMBER>;
+               };
+
+               led-10g-2-green {
+                       label = "green:10g_2";
+                       gpios = <&tlmm 51 GPIO_ACTIVE_HIGH>;
+                       color = <LED_COLOR_ID_GREEN>;
+               };
+
+               led-10g-2-amber {
+                       label = "amber:10g_2";
+                       gpios = <&tlmm 52 GPIO_ACTIVE_HIGH>;
+                       color = <LED_COLOR_ID_AMBER>;
+               };
+       };
+};
+
+&tlmm {
+
+       mdio_pins: mdio-state {
+               mdc-pins {
+                       pins = "gpio68";
+                       function = "mdc";
+                       drive-strength = <8>;
+                       bias-pull-up;
+               };
+
+               mdio-pins {
+                       pins = "gpio69";
+                       function = "mdio";
+                       drive-strength = <8>;
+                       bias-pull-up;
+               };
+       };
+
+       button_pins: button-state {
+               wps-pins {
+                       pins = "gpio57";
+                       function = "gpio";
+                       drive-strength = <8>;
+                       bias-pull-up;
+               };
+
+               rst-pins {
+                       pins = "gpio67";
+                       function = "gpio";
+                       drive-strength = <8>;
+                       bias-pull-up;
+               };
+       };
+
+       leds_pins: leds-state {
+               pins = "gpio1", "gpio3", "gpio4", "gpio6", "gpio7", "gpio8",
+                      "gpio11", "gpio12", "gpio13", "gpio14", "gpio15", "gpio42",
+                      "gpio51", "gpio52", "gpio54", "gpio56";
+               function = "gpio";
+               drive-strength = <8>;
+               bias-pull-down;
+    };
+};
+
+&blsp1_uart5 {
+       status = "okay";
+};
+
+&prng {
+       status = "okay";
+};
+
+&ssphy_0 {
+       status = "okay";
+};
+
+&qusb_phy_0 {
+       status = "okay";
+};
+
+&ssphy_1 {
+       status = "okay";
+};
+
+&qusb_phy_1 {
+       status = "okay";
+};
+
+&usb_0 {
+       status = "okay";
+};
+
+&usb_1 {
+       status = "okay";
+};
+
+&cryptobam {
+       status = "okay";
+};
+
+&crypto {
+       status = "okay";
+};
+
+&qpic_bam {
+       status = "okay";
+};
+
+&blsp1_spi1 { /* BLSP1 QUP1 */
+       pinctrl-0 = <&spi_0_pins>;
+       pinctrl-names = "default";
+       cs-gpios = <0>;
+       status = "okay";
+
+       flash@0 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               reg = <0>;
+               compatible = "jedec,spi-nor";
+               spi-max-frequency = <50000000>;
+
+               partitions {
+                       compatible = "qcom,smem-part";
+               };
+       };
+};
+
+&mdio {
+       status = "okay";
+
+       pinctrl-0 = <&mdio_pins>;
+       pinctrl-names = "default";
+       reset-gpios = <&tlmm 37 GPIO_ACTIVE_LOW>;
+
+       aqr113c_0: ethernet-phy@0 {
+               compatible ="ethernet-phy-ieee802.3-c45";
+               reg = <0>;
+               reset-gpios = <&tlmm 59 GPIO_ACTIVE_LOW>;
+       };
+
+       aqr113c_8: ethernet-phy@8 {
+               compatible ="ethernet-phy-ieee802.3-c45";
+               reg = <8>;
+               reset-gpios = <&tlmm 44 GPIO_ACTIVE_LOW>;
+       };
+
+       qca8075_16: ethernet-phy@16 {
+               compatible = "ethernet-phy-ieee802.3-c22";
+               reg = <16>;
+       };
+
+       qca8075_17: ethernet-phy@17 {
+               compatible = "ethernet-phy-ieee802.3-c22";
+               reg = <17>;
+       };
+
+       qca8075_18: ethernet-phy@18 {
+               compatible = "ethernet-phy-ieee802.3-c22";
+               reg = <18>;
+       };
+
+       qca8075_19: ethernet-phy@19 {
+               compatible = "ethernet-phy-ieee802.3-c22";
+               reg = <19>;
+       };
+};
+
+&sdhc_1 {
+       status = "okay";
+
+       /* According to the stock dts from the QNAP gpl drop
+        * the emmc has a problem with the hs400 > hs200 speed switch.
+        * Therefore remove the mmc-hs400-1_8v property
+       */
+       /delete-property/ mmc-hs400-1_8v;
+       mmc-hs200-1_8v;
+       mmc-ddr-1_8v;
+       vqmmc-supply = <&l11>;
+};
+
+&switch {
+       status = "okay";
+
+       switch_cpu_bmp = <0x1>;  /* cpu port bitmap */
+       switch_lan_bmp = <0x3e>; /* lan port bitmap */
+       switch_wan_bmp = <0xc0>; /* wan port bitmap */
+       switch_mac_mode = <0xb>; /* mac mode for uniphy instance0*/
+       switch_mac_mode1 = <0xd>; /* mac mode for uniphy instance1*/
+       switch_mac_mode2 = <0xd>; /* mac mode for uniphy instance2*/
+       bm_tick_mode = <0>; /* bm tick mode */
+       tm_tick_mode = <0>; /* tm tick mode */
+
+       qcom,port_phyinfo {
+               port@0 {
+                       port_id = <1>;
+                       phy_address = <16>;
+               };
+               port@1 {
+                       port_id = <2>;
+                       phy_address = <17>;
+               };
+               port@2 {
+                       port_id = <3>;
+                       phy_address = <18>;
+               };
+               port@3 {
+                       port_id = <4>;
+                       phy_address = <19>;
+               };
+               port@4 {
+                       port_id = <5>;
+                       phy_address = <8>;
+                       compatible = "ethernet-phy-ieee802.3-c45";
+                       ethernet-phy-ieee802.3-c45;
+               };
+               port@5 {
+                       port_id = <6>;
+                       phy_address = <0>;
+                       compatible = "ethernet-phy-ieee802.3-c45";
+                       ethernet-phy-ieee802.3-c45;
+               };
+       };
+};
+
+&edma {
+       status = "okay";
+};
+
+&dp1 {
+       status = "okay";
+       phy-handle = <&qca8075_16>;
+       label = "lan4";
+};
+
+&dp2 {
+       status = "okay";
+       phy-handle = <&qca8075_17>;
+       label = "lan3";
+};
+
+&dp3 {
+       status = "okay";
+       phy-handle = <&qca8075_18>;
+       label = "lan2";
+};
+
+&dp4 {
+       status = "okay";
+       phy-handle = <&qca8075_19>;
+       label = "lan1";
+};
+
+&dp5 {
+       status = "okay";
+       qcom,mactype = <1>;
+       phy-handle = <&aqr113c_8>;
+       label = "10g-1";
+};
+
+&dp6_syn {
+       status = "okay";
+       phy-handle = <&aqr113c_0>;
+       label = "10g-2";
+};
+
+&wifi {
+       status = "okay";
+
+       qcom,ath11k-calibration-variant = "QNAP-301w";
+};
index 95937512a95cf9e3248a13d10de04a519198f139..7bf659f80fff09b82515eaef8458e83b35048561 100644 (file)
@@ -30,6 +30,21 @@ define Device/edimax_cax1800
 endef
 TARGET_DEVICES += edimax_cax1800
 
+define Device/qnap_301w
+       $(call Device/FitImage)
+       DEVICE_VENDOR := QNAP
+       DEVICE_MODEL := 301w
+       DEVICE_DTS_CONFIG := config@hk01
+       KERNEL_SIZE := 16384k
+       BLOCKSIZE := 512k
+       SOC := ipq8072
+       IMAGES += factory.bin sysupgrade.bin
+       IMAGE/factory.bin := append-rootfs | pad-rootfs | pad-to 64k
+       IMAGE/sysupgrade.bin/squashfs := append-rootfs | pad-to 64k | sysupgrade-tar rootfs=$$$$@ | append-metadata
+       DEVICE_PACKAGES := ipq-wifi-qnap_301w e2fsprogs kmod-fs-ext4 losetup
+endef
+TARGET_DEVICES += qnap_301w
+
 define Device/redmi_ax6
        $(call Device/xiaomi_ax3600)
        DEVICE_VENDOR := Redmi