ath79: add support for Senao WatchGuard AP300
authorMichael Pratt <mcpratt@pm.me>
Thu, 11 Feb 2021 04:28:49 +0000 (23:28 -0500)
committerHauke Mehrtens <hauke@hauke-m.de>
Sun, 11 Sep 2022 19:54:00 +0000 (21:54 +0200)
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@wski.org>
Tested-by: John Wagner <john@wagner.us.org>
Signed-off-by: Michael Pratt <mcpratt@pm.me>
package/boot/uboot-envtools/files/ath79
target/linux/ath79/dts/qca9558_watchguard_ap300.dts [new file with mode: 0644]
target/linux/ath79/generic/base-files/etc/board.d/01_leds
target/linux/ath79/generic/base-files/etc/board.d/02_network
target/linux/ath79/generic/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
target/linux/ath79/generic/base-files/lib/upgrade/platform.sh
target/linux/ath79/image/common-senao.mk
target/linux/ath79/image/generic.mk

index a27b751d9bdb7b5595d2e9a7ebfa015fc676f15d..64b2b34d8ae0a3ce1e6f276ceb9b2d57ccb9ae92 100644 (file)
@@ -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 (file)
index 0000000..90f5cdd
--- /dev/null
@@ -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@5 {
+               reg = <5>;
+               eee-broken-100tx;
+               eee-broken-1000t;
+       };
+};
+
+&partitions {
+       fwconcat2: partition@ff0000 {
+               label = "fwconcat2";
+               reg = <0xff0000 0x1000000>;
+       };
+
+       art: partition@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@0 {
+               reg = <0x0 0x6>;
+       };
+};
index 477382652013481710d657397c79934dd3663e41..d5395e74b71a9b1224c110e7b187b22aac5d49dd 100644 (file)
@@ -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"
        ;;
index 4683264c1cc0e886cfdca049e2893e214b4a325b..95260c016a5b9f988adf32e30156401f2b32983b 100644 (file)
@@ -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|\
index 9d258083070d10fa61e6233e1f5840befd8dff7c..a47b29e7c7fd443deb59494df393c6318a678026 100644 (file)
@@ -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)
                ;;
index f161540a68770d1df6468e53afa99193ff6bed47..d80927679d08bb90532e404591207e9db2d1a670 100644 (file)
@@ -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"
index dda7da6776e7b0afa90299b50bb3295a4cf4eaeb..e0e60dbe277730e33090f595eaf4dab97ea43e30 100644 (file)
@@ -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
index ff7c3b156eba32185d2a271c661b41c3b9e8fc64..b0b8b70ba40c585ba6fd7fc326b1f713d0f1f6f4 100644 (file)
@@ -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