--- /dev/null
+#
+# 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
+}
--- /dev/null
+// 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";
+};