[openwrt/openwrt] ath79: add support for Senao WatchGuard AP300

LEDE Commits lede-commits at lists.infradead.org
Sun Sep 11 12:55:44 PDT 2022


hauke pushed a commit to openwrt/openwrt.git, branch master:
https://git.openwrt.org/146aaeafb7e364ca667f6ddf5c1857148e8bffb2

commit 146aaeafb7e364ca667f6ddf5c1857148e8bffb2
Author: Michael Pratt <mcpratt at pm.me>
AuthorDate: Wed Feb 10 23:28:49 2021 -0500

    ath79: add support for Senao WatchGuard AP300
    
    FCC ID: Q6G-AP300
    
    WatchGuard AP300 is an indoor wireless access point with
    1 Gb ethernet port, dual-band wireless,
    internal antenna plates, and 802.3at PoE+
    
    this board is a Senao device:
    the hardware is equivalent to EnGenius EAP1750
    the software is modified Senao SDK which is based on openwrt and uboot
    including image checksum verification at boot time,
    and a failsafe image that boots if checksum fails
    
    **Specification:**
    
      - QCA9558 SOC         MIPS 74kc, 2.4 GHz WMAC, 3x3
      - QCA9880 WLAN        PCI card 168c:003c, 5 GHz, 3x3, 26dBm
      - AR8035-A PHY        RGMII GbE with PoE+ IN
      - 40 MHz clock
      - 32 MB FLASH         S25FL512S
      - 2x 64 MB RAM        NT5TU32M16
      - UART console        J10, populated
      - GPIO watchdog       GPIO 16, 20 sec toggle
      - 6 antennas          5 dBi, internal omni-directional plates
      - 5 LEDs              power, eth0 link/data, 2G, 5G
      - 1 button            reset
    
    **MAC addresses:**
    
      MAC address labeled as ETH
      Only one Vendor MAC address in flash at art 0x0
    
      eth0 ETH  *:3c art 0x0
      phy1 ---- *:3d ---
      phy0 ---- *:3e ---
    
    **Serial console access:**
    
      For this board, its not certain whether UART is possible
      it is likely that software is blocking console access
    
      the RX line on the board for UART is shorted to ground by resistor R176
      the resistors R175 and R176 are next to the UART RX pin at J10
    
      however console output is garbage even after this fix
    
    **Installation:**
    
      Method 1: OEM webpage
    
        use OEM webpage for firmware upgrade to upload factory.bin
    
      Method 2: root shell access
    
        downgrade XTM firewall to v2.0.0.1
        downgrade AP300 firmware: v1.0.1
        remove / unpair AP from controller
        perform factory reset with reset button
        connect ethernet to a computer
        login to OEM webpage with default address / pass: wgwap
        enable SSHD in OEM webpage settings
        access root shell with SSH as user 'root'
        modify uboot environment to automatically try TFTP at boot time
        (see command below)
    
        rename initramfs-kernel.bin to test.bin
        load test.bin over TFTP (see TFTP recovery)
        (optionally backup all mtdblocks to have flash backup)
        perform a sysupgrade with sysupgrade.bin
    
      NOTE: DHCP is not enabled by default after flashing
    
    **TFTP recovery:**
    
      server ip: 192.168.1.101
    
      reset button seems to do nothing at boot time...
      only possible with modified uboot environment,
      running this command in the root shell:
    
      fw_setenv bootcmd 'if ping 192.168.1.101; then tftp 0x82000000 test.bin && bootm 0x82000000; else bootm 0x9f0a0000; fi'
    
      and verify that it is correct with
    
      fw_printenv
    
      then, before boot, the device will attempt TFTP from 192.168.1.101
      looking for file 'test.bin'
    
      to return uboot environment to normal:
    
      fw_setenv bootcmd 'bootm 0x9f0a0000'
    
    **Return to OEM:**
    
      user should make backup of MTD partitions
      and write the backups back to mtd devices
      in order to revert to OEM
      (see installation method 2)
    
      It may be possible to use sysupgrade
      with an OEM image as well...
      (not tested)
    
    **OEM upgrade info:**
    
      The OEM upgrade script is at /etc/fwupgrade.sh
    
      OKLI kernel loader is required because the OEM software
      expects the kernel to be no greater than 1536k
      and the factory.bin upgrade procedure would otherwise
      overwrite part of the kernel when writing rootfs.
    
    **Note on eth0 PLL-data:**
    
      The default Ethernet Configuration register values will not work
      because of the external AR8035 switch between
      the SOC and the ethernet port.
    
      For QCA955x series, the PLL registers for eth0 and eth1
      can be see in the DTSI as 0x28 and 0x48 respectively.
      Therefore the PLL registers can be read from uboot
      for each link speed after attempting tftpboot
      or another network action using that link speed
      with `md 0x18050028 1` and `md 0x18050048 1`.
    
      The clock delay required for RGMII can be applied
      at the PHY side, using the at803x driver `phy-mode`.
      Therefore the PLL registers for GMAC0
      do not need the bits for delay on the MAC side.
      This is possible due to fixes in at803x driver
      since Linux 5.1 and 5.3
    
    **Note on WatchGuard Magic string:**
    
      The OEM upgrade script is a modified version of
      the generic Senao sysupgrade script
      which is used on EnGenius devices.
    
      On WatchGuard boards produced by Senao,
      images are verified using a md5sum checksum of
      the upgrade image concatenated with a magic string.
      this checksum is then appended to the end of the final image.
    
      This variable does not apply to all the senao devices
      so set to null string as default
    
    Tested-by: Alessandro Kornowski <ak at wski.org>
    Tested-by: John Wagner <john at wagner.us.org>
    Signed-off-by: Michael Pratt <mcpratt at pm.me>
---
 package/boot/uboot-envtools/files/ath79            |   1 +
 .../linux/ath79/dts/qca9558_watchguard_ap300.dts   | 132 +++++++++++++++++++++
 .../ath79/generic/base-files/etc/board.d/01_leds   |   3 +-
 .../generic/base-files/etc/board.d/02_network      |   1 +
 .../etc/hotplug.d/firmware/11-ath10k-caldata       |   3 +-
 .../generic/base-files/lib/upgrade/platform.sh     |   3 +-
 target/linux/ath79/image/common-senao.mk           |   9 +-
 target/linux/ath79/image/generic.mk                |  15 +++
 8 files changed, 163 insertions(+), 4 deletions(-)

diff --git a/package/boot/uboot-envtools/files/ath79 b/package/boot/uboot-envtools/files/ath79
index a27b751d9b..64b2b34d8a 100644
--- a/package/boot/uboot-envtools/files/ath79
+++ b/package/boot/uboot-envtools/files/ath79
@@ -67,6 +67,7 @@ openmesh,om5p-ac-v1|\
 openmesh,om5p-ac-v2|\
 samsung,wam250|\
 ubnt,nanostation-m|\
+watchguard,ap300|\
 yuncore,a770|\
 yuncore,a782|\
 yuncore,a930|\
diff --git a/target/linux/ath79/dts/qca9558_watchguard_ap300.dts b/target/linux/ath79/dts/qca9558_watchguard_ap300.dts
new file mode 100644
index 0000000000..90f5cddfa7
--- /dev/null
+++ b/target/linux/ath79/dts/qca9558_watchguard_ap300.dts
@@ -0,0 +1,132 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+
+#include "qca955x_senao_loader.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+/ {
+	compatible = "watchguard,ap300", "qca,qca9558";
+	model = "WatchGuard AP300";
+
+	aliases {
+		label-mac-device = &eth0;
+		led-boot = &led_power;
+		led-failsafe = &led_power;
+		led-running = &led_power;
+		led-upgrade = &led_power;
+	};
+
+	keys {
+		compatible = "gpio-keys";
+
+		reset {
+			linux,code = <KEY_RESTART>;
+			gpios = <&gpio 17 GPIO_ACTIVE_LOW>;
+			debounce-interval = <60>;
+		};
+	};
+
+	leds {
+		compatible = "gpio-leds";
+
+		led_power: power {
+			label = "green:power";
+			gpios = <&gpio 22 GPIO_ACTIVE_LOW>;
+			default-state = "on";
+		};
+
+		lan_data {
+			label = "orange:lan_data";
+			gpios = <&gpio 12 GPIO_ACTIVE_LOW>;
+		};
+
+		lan_link {
+			label = "green:lan_link";
+			gpios = <&gpio 13 GPIO_ACTIVE_LOW>;
+		};
+
+		wifi_amber {
+			label = "amber:wifi";
+			gpios = <&gpio 23 GPIO_ACTIVE_LOW>;
+			linux,default-trigger = "phy1tpt";
+		};
+
+		wifi_green {
+			label = "green:wifi";
+			gpios = <&gpio 19 GPIO_ACTIVE_LOW>;
+			linux,default-trigger = "phy0tpt";
+		};
+	};
+
+	virtual_flash {
+		devices = <&fwconcat0 &fwconcat1 &fwconcat2>;
+	};
+
+	watchdog {
+		compatible = "linux,wdt-gpio";
+		gpios = <&gpio 16 GPIO_ACTIVE_LOW>;
+		hw_algo = "toggle";
+		hw_margin_ms = <20000>;
+		always-running;
+	};
+};
+
+&eth0 {
+	status = "okay";
+
+	nvmem-cells = <&macaddr_art_0>;
+	nvmem-cell-names = "mac-address";
+
+	phy-handle = <&phy5>;
+	phy-mode = "rgmii-id";
+
+	pll-data = <0x82000000 0x80000101 0x80001313>;
+};
+
+&mdio0 {
+	status = "okay";
+
+	phy5: ethernet-phy at 5 {
+		reg = <5>;
+		eee-broken-100tx;
+		eee-broken-1000t;
+	};
+};
+
+&partitions {
+	fwconcat2: partition at ff0000 {
+		label = "fwconcat2";
+		reg = <0xff0000 0x1000000>;
+	};
+
+	art: partition at 1ff0000 {
+		label = "art";
+		reg = <0x1ff0000 0x010000>;
+		read-only;
+	};
+};
+
+&wdt {
+	status = "disabled";
+};
+
+&wmac {
+	status = "okay";
+
+	mtd-cal-data = <&art 0x1000>;
+
+	nvmem-cells = <&macaddr_art_0>;
+	nvmem-cell-names = "mac-address";
+	mac-address-increment = <1>;
+};
+
+&art {
+	compatible = "nvmem-cells";
+	#address-cells = <1>;
+	#size-cells = <1>;
+
+	macaddr_art_0: macaddr at 0 {
+		reg = <0x0 0x6>;
+	};
+};
diff --git a/target/linux/ath79/generic/base-files/etc/board.d/01_leds b/target/linux/ath79/generic/base-files/etc/board.d/01_leds
index 4773826520..d5395e74b7 100644
--- a/target/linux/ath79/generic/base-files/etc/board.d/01_leds
+++ b/target/linux/ath79/generic/base-files/etc/board.d/01_leds
@@ -40,7 +40,8 @@ alfa-network,n5q)
 	ucidef_set_led_rssi "signal3" "SIGNAL3" "green:signal3" "wlan0" "50" "100"
 	ucidef_set_led_rssi "signal4" "SIGNAL4" "green:signal4" "wlan0" "75" "100"
 	;;
-alfa-network,pi-wifi4)
+alfa-network,pi-wifi4|\
+watchguard,ap300)
 	ucidef_set_led_netdev "lan_data" "LAN_DATA" "orange:lan_data" "eth0" "tx rx"
 	ucidef_set_led_netdev "lan_link" "LAN_LINK" "green:lan_link" "eth0" "link"
 	;;
diff --git a/target/linux/ath79/generic/base-files/etc/board.d/02_network b/target/linux/ath79/generic/base-files/etc/board.d/02_network
index 4683264c1c..95260c016a 100644
--- a/target/linux/ath79/generic/base-files/etc/board.d/02_network
+++ b/target/linux/ath79/generic/base-files/etc/board.d/02_network
@@ -110,6 +110,7 @@ ath79_setup_interfaces()
 	ubnt,unifiac-lr|\
 	ubnt,unifiac-mesh|\
 	ubnt,unifi|\
+	watchguard,ap300|\
 	wd,mynet-wifi-rangeextender|\
 	winchannel,wb2000|\
 	zyxel,nwa1100-nh|\
diff --git a/target/linux/ath79/generic/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ath79/generic/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
index 9d25808307..a47b29e7c7 100644
--- a/target/linux/ath79/generic/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
+++ b/target/linux/ath79/generic/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
@@ -15,7 +15,8 @@ case "$FIRMWARE" in
 	araknis,an-700-ap-i-ac|\
 	engenius,eap1200h|\
 	engenius,enstationac-v1|\
-	glinet,gl-x750)
+	glinet,gl-x750|\
+	watchguard,ap300)
 		caldata_extract "art" 0x5000 0x844
 		ath10k_patch_mac $(macaddr_add $(mtd_get_mac_binary art 0x0) 2)
 		;;
diff --git a/target/linux/ath79/generic/base-files/lib/upgrade/platform.sh b/target/linux/ath79/generic/base-files/lib/upgrade/platform.sh
index f161540a68..d80927679d 100644
--- a/target/linux/ath79/generic/base-files/lib/upgrade/platform.sh
+++ b/target/linux/ath79/generic/base-files/lib/upgrade/platform.sh
@@ -40,7 +40,8 @@ platform_do_upgrade() {
 	engenius,eap600|\
 	engenius,ecb600|\
 	engenius,ens202ext-v1|\
-	engenius,enstationac-v1)
+	engenius,enstationac-v1|\
+	watchguard,ap300)
 		IMAGE_LIST="tar tzf $1"
 		IMAGE_CMD="tar xzOf $1"
 		KERNEL_PART="loader"
diff --git a/target/linux/ath79/image/common-senao.mk b/target/linux/ath79/image/common-senao.mk
index dda7da6776..e0e60dbe27 100644
--- a/target/linux/ath79/image/common-senao.mk
+++ b/target/linux/ath79/image/common-senao.mk
@@ -1,4 +1,4 @@
-DEVICE_VARS += SENAO_IMGNAME
+DEVICE_VARS += SENAO_IMGNAME WATCHGUARD_MAGIC
 
 # This needs to make OEM config archive 'sysupgrade.tgz' an empty file prior to OEM
 # sysupgrade, as otherwise it will implant the old configuration from
@@ -27,6 +27,13 @@ define Build/senao-tar-gz
 	rm -rf $@.tmp $@.len $@.md5
 endef
 
+define Build/watchguard-cksum
+	-echo -n $(word 1,$(1)) | cat $@ - | md5sum | \
+		cut -d ' ' -f1 | tr -d '\n' > $@.md5 && \
+	cat $@.md5 >> $@ && \
+	rm -rf $@.md5
+endef
+
 define Device/senao_loader_okli
   $(Device/loader-okli-uimage)
   KERNEL := kernel-bin | append-dtb | lzma | uImage lzma -M 0x73714f4b
diff --git a/target/linux/ath79/image/generic.mk b/target/linux/ath79/image/generic.mk
index ff7c3b156e..b0b8b70ba4 100644
--- a/target/linux/ath79/image/generic.mk
+++ b/target/linux/ath79/image/generic.mk
@@ -2589,6 +2589,21 @@ define Device/wallys_dr531
 endef
 TARGET_DEVICES += wallys_dr531
 
+define Device/watchguard_ap300
+  $(Device/senao_loader_okli)
+  SOC := qca9558
+  DEVICE_VENDOR := WatchGuard
+  DEVICE_MODEL := AP300
+  DEVICE_PACKAGES := ath10k-firmware-qca988x-ct kmod-ath10k-ct
+  IMAGE_SIZE := 11584k
+  LOADER_FLASH_OFFS := 0x220000
+  SENAO_IMGNAME := senao-ap300
+  WATCHGUARD_MAGIC := 82kdlzk2
+  IMAGE/factory.bin := append-kernel | pad-to $$$$(BLOCKSIZE) | append-rootfs | pad-rootfs | \
+	check-size | senao-tar-gz $$$$(SENAO_IMGNAME) | watchguard-cksum $$$$(WATCHGUARD_MAGIC)
+endef
+TARGET_DEVICES += watchguard_ap300
+
 define Device/wd_mynet-n600
   $(Device/seama)
   SOC := ar9344




More information about the lede-commits mailing list