[openwrt/openwrt] ath79: support Ruckus ZoneFlex 7321

LEDE Commits lede-commits at lists.infradead.org
Sat Sep 10 16:53:49 PDT 2022


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

commit f1d112ee5a43e8c4a22db05b94bbcd0677a34486
Author: Lech Perczak <lech.perczak at gmail.com>
AuthorDate: Tue Jun 14 22:49:40 2022 +0200

    ath79: support Ruckus ZoneFlex 7321
    
    Ruckus ZoneFlex 7321 is a dual-band, single radio 802.11n 2x2 MIMO enterprise
    access point. It is very similar to its bigger brother, ZoneFlex 7372.
    
    Hardware highligts:
    - CPU: Atheros AR9342 SoC at 533 MHz
    - RAM: 64MB DDR2
    - Flash: 32MB SPI-NOR
    - Wi-Fi: AR9342 built-in dual-band 2x2 MIMO radio
    - Ethernet: single Gigabit Ethernet port through AR8035 gigabit PHY
    - PoE: input through Gigabit port
    - Standalone 12V/1A power input
    - USB: optional single USB 2.0 host port on the 7321-U variant.
    
    Serial console: 115200-8-N-1 on internal H1 header.
    Pinout:
    
    H1 ----------
       |1|x3|4|5|
       ----------
    
    Pin 1 is near the "H1" marking.
    1 - RX
    x - no pin
    3 - VCC (3.3V)
    4 - GND
    5 - TX
    
    JTAG: Connector H5, unpopulated, similar to MIPS eJTAG, standard,
    but without the key in pin 12 and not every pin routed:
    
    ------- H5
    |1 |2 |
    -------
    |3 |4 |
    -------
    |5 |6 |
    -------
    |7 |8 |
    -------
    |9 |10|
    -------
    |11|12|
    -------
    |13|14|
    -------
    
    3 - TDI
    5 - TDO
    7 - TMS
    9 - TCK
    2,4,6,8,10 - GND
    14 - Vref
    1,11,12,13 - Not connected
    
    Installation:
    There are two methods of installation:
    - Using serial console [1] - requires some disassembly, 3.3V USB-Serial
      adapter, TFTP server,  and removing a single T10 screw,
      but with much less manual steps, and is generally recommended, being
      safer.
    - Using stock firmware root shell exploit, SSH and TFTP [2]. Does not
      work on some rare versions of stock firmware. A more involved, and
      requires installing `mkenvimage` from u-boot-tools package if you
      choose to rebuild your own environment, but can be used without
      disassembly or removal from installation point, if you have the
      credentials.
      If for some reason, size of your sysupgrade image exceeds 13312kB,
      proceed with method [1]. For official images this is not likely to
      happen ever.
    
    [1] Using serial console:
    0. Connect serial console to H1 header. Ensure the serial converter
       does not back-power the board, otherwise it will fail to boot.
    
    1. Power-on the board. Then quickly connect serial converter to PC and
       hit Ctrl+C in the terminal to break boot sequence. If you're lucky,
       you'll enter U-boot shell. Then skip to point 3.
       Connection parameters are 115200-8-N-1.
    
    2. Allow the board to boot.  Press the reset button, so the board
       reboots into U-boot again and go back to point 1.
    
    3. Set the "bootcmd" variable to disable the dual-boot feature of the
       system and ensure that uImage is loaded. This is critical step, and
       needs to be done only on initial installation.
    
       > setenv bootcmd "bootm 0x9f040000"
       > saveenv
    
    4. Boot the OpenWrt initramfs using TFTP. Replace IP addresses as needed:
    
       > setenv serverip 192.168.1.2
       > setenv ipaddr 192.168.1.1
       > tftpboot 0x81000000 openwrt-ath79-generic-ruckus_zf7321-initramfs-kernel.bin
       > bootm 0x81000000
    
    5. Optional, but highly recommended: back up contents of "firmware" partition:
    
       $ ssh root at 192.168.1.1 cat /dev/mtd1 > ruckus_zf7321_fw1_backup.bin
       $ ssh root at 192.168.1.1 cat /dev/mtd5 > ruckus_zf7321_fw2_backup.bin
    
    6. Copy over sysupgrade image, and perform actual installation. OpenWrt
       shall boot from flash afterwards:
    
       $ ssh root at 192.168.1.1
       # sysupgrade -n openwrt-ath79-generic-ruckus_zf7321-squashfs-sysupgrade.bin
    
    [2] Using stock root shell:
    0. Reset the device to factory defaullts. Power-on the device and after
       it boots, hold the reset button near Ethernet connectors for 5
       seconds.
    
    1. Connect the device to the network. It will acquire address over DHCP,
       so either find its address using list of DHCP leases by looking for
       label MAC address, or try finding it by scanning for SSH port:
    
       $ nmap 10.42.0.0/24 -p22
    
       From now on, we assume your computer has address 10.42.0.1 and the device
       has address 10.42.0.254.
    
    2. Set up a TFTP server on your computer. We assume that TFTP server
       root is at /srv/tftp.
    
    3. Obtain root shell. Connect to the device over SSH. The SSHD ond the
       frmware is pretty ancient and requires enabling HMAC-MD5.
    
       $ ssh 10.42.0.254 \
       -o UserKnownHostsFile=/dev/null \
       -o StrictHostKeyCheking=no \
       -o MACs=hmac-md5
    
       Login. User is "super", password is "sp-admin".
       Now execute a hidden command:
    
       Ruckus
    
       It is case-sensitive. Copy and paste the following string,
       including quotes. There will be no output on the console for that.
    
       ";/bin/sh;"
    
       Hit "enter". The AP will respond with:
    
       grrrr
       OK
    
       Now execute another hidden command:
    
       !v54!
    
       At "What's your chow?" prompt just hit "enter".
       Congratulations, you should now be dropped to Busybox shell with root
       permissions.
    
    4. Optional, but highly recommended: backup the flash contents before
       installation. At your PC ensure the device can write the firmware
       over TFTP:
    
       $ sudo touch /srv/tftp/ruckus_zf7321_firmware{1,2}.bin
       $ sudo chmod 666 /srv/tftp/ruckus_zf7321_firmware{1,2}.bin
    
       Locate partitions for primary and secondary firmware image.
       NEVER blindly copy over MTD nodes, because MTD indices change
       depending on the currently active firmware, and all partitions are
       writable!
    
       # grep rcks_wlan /proc/mtd
    
       Copy over both images using TFTP, this will be useful in case you'd
       like to return to stock FW in future. Make sure to backup both, as
       OpenWrt uses bot firmwre partitions for storage!
    
       # tftp -l /dev/<rcks_wlan.main_mtd> -r ruckus_zf7321_firmware1.bin -p 10.42.0.1
       # tftp -l /dev/<rcks_wlan.bkup_mtd> -r ruckus_zf7321_firmware2.bin -p 10.42.0.1
    
       When the command finishes, copy over the dump to a safe place for
       storage.
    
       $ cp /srv/tftp/ruckus_zf7321_firmware{1,2}.bin ~/
    
    5. Ensure the system is running from the BACKUP image, i.e. from
       rcks_wlan.bkup partition or "image 2". Otherwise the installation
       WILL fail, and you will need to access mtd0 device to write image
       which risks overwriting the bootloader, and so is not covered here
       and not supported.
    
       Switching to backup firmware can be achieved by executing a few
       consecutive reboots of the device, or by updating the stock firmware. The
       system will boot from the image it was not running from previously.
       Stock firmware available to update was conveniently dumped in point 4 :-)
    
    6. Prepare U-boot environment image.
       Install u-boot-tools package. Alternatively, if you build your own
       images, OpenWrt provides mkenvimage in host staging directory as well.
       It is recommended to extract environment from the device, and modify
       it, rather then relying on defaults:
    
       $ sudo touch /srv/tftp/u-boot-env.bin
       $ sudo chmod 666 /srv/tftp/u-boot-env.bin
    
       On the device, find the MTD partition on which environment resides.
       Beware, it may change depending on currently active firmware image!
    
       # grep u-boot-env /proc/mtd
    
       Now, copy over the partition
    
       # tftp -l /dev/mtd<N> -r u-boot-env.bin -p 10.42.0.1
    
       Store the stock environment in a safe place:
    
       $ cp /srv/tftp/u-boot-env.bin ~/
    
       Extract the values from the dump:
    
       $ strings u-boot-env.bin | tee u-boot-env.txt
    
       Now clean up the debris at the end of output, you should end up with
       each variable defined once. After that, set the bootcmd variable like
       this:
    
       bootcmd=bootm 0x9f040000
    
       You should end up with something like this:
    
    bootcmd=bootm 0x9f040000
    bootargs=console=ttyS0,115200 rootfstype=squashfs init=/sbin/init
    baudrate=115200
    ethaddr=0x00:0xaa:0xbb:0xcc:0xdd:0xee
    mtdparts=mtdparts=ar7100-nor0:256k(u-boot),13312k(rcks_wlan.main),2048k(datafs),256k(u-boot-env),512k(Board Data),13312k(rcks_wlan.bkup)
    mtdids=nor0=ar7100-nor0
    bootdelay=2
    ethact=eth0
    filesize=78a000
    fileaddr=81000000
    partition=nor0,0
    mtddevnum=0
    mtddevname=u-boot
    ipaddr=10.0.0.1
    serverip=10.0.0.5
    stdin=serial
    stdout=serial
    stderr=serial
    
       These are the defaults, you can use most likely just this as input to
       mkenvimage.
    
       Now, create environment image and copy it over to TFTP root:
    
       $ mkenvimage -s 0x40000 -b -o u-boot-env.bin u-boot-env.txt
       $ sudo cp u-boot-env.bin /srv/tftp
    
       This is the same image, gzipped and base64-encoded:
    
    H4sIAAAAAAAAA+3QQW7TQBQAUF8EKRtQI6XtJDS0VJoN4gYcAE3iCbWS2MF2Sss1ORDYqVq6YMEB3rP0
    Z/7Yf+aP3/56827VNP16X8Zx3E/Cw8dNuAqDYlxI7bcurpu6a3Y59v3jlzCbz5eLECbt8HbT9Y+HHLvv
    x9TdbbpJVVd9vOxWVX05TotVOpZt6nN8qilyf5fKso3hIYTb8JDSEFarIazXQyjLIeRc7PvykNq+iy+T
    1F7PQzivmzbcLpYftmfH87G56Wz+/v18sT1r19vu649dqi/2qaqns0W4utmelalPm27I/lac5/p+OluO
    NZ+a1JaTz8M3/9hmtT0epmMjVdnF8djXLZx+TJl36TEuTlda93EYQrGpdrmrfuZ4fZPGHzjmp/vezMNJ
    MV6n6qumPm06C+MRZb6vj/v4Mk/7HJ+6LarDqXweLsZnXnS5vc9tdXheWRbd0GIdh/Uq7cakOfavsty2
    z1nxGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAD+1x9eTkHLAAAEAA==
    
    7. Perform actual installation. Copy over OpenWrt sysupgrade image to
       TFTP root:
    
       $ sudo cp openwrt-ath79-generic-ruckus_zf7321-squashfs-sysupgrade.bin /srv/tftp
    
       Now load both to the device over TFTP:
    
       # tftp -l /tmp/u-boot-env.bin -r u-boot-env.bin -g 10.42.0.1
       # tftp -l /tmp/openwrt.bin -r openwrt-ath79-generic-ruckus_zf7321-squashfs-sysupgrade.bin -g 10.42.0.1
    
       Vverify checksums of both images to ensure the transfer over TFTP
       was completed:
    
       # sha256sum /tmp/u-boot-env.bin /tmp/openwrt.bin
    
       And compare it against source images:
    
       $ sha256sum /srv/tftp/u-boot-env.bin /srv/tftp/openwrt-ath79-generic-ruckus_zf7321-squashfs-sysupgrade.bin
    
       Locate MTD partition of the primary image:
    
       # grep rcks_wlan.main /proc/mtd
    
       Now, write the images in place. Write U-boot environment last, so
       unit still can boot from backup image, should power failure occur during
       this. Replace MTD placeholders with real MTD nodes:
    
       # flashcp /tmp/openwrt.bin /dev/<rcks_wlan.main_mtd>
       # flashcp /tmp/u-boot-env.bin /dev/<u-boot-env_mtd>
    
       Finally, reboot the device. The device should directly boot into
       OpenWrt. Look for the characteristic power LED blinking pattern.
    
       # reboot -f
    
       After unit boots, it should be available at the usual 192.168.1.1/24.
    
    Return to factory firmware:
    
    1. Boot into OpenWrt initramfs as for initial installation. To do that
       without disassembly, you can write an initramfs image to the device
       using 'sysupgrade -F' first.
    2. Unset the "bootcmd" variable:
       fw_setenv bootcmd ""
    3. Write factory images downloaded from manufacturer website into
       fwconcat0 and fwconcat1 MTD partitions, or restore backup you took
       before installation:
       mtd write ruckus_zf7321_fw1_backup.bin /dev/mtd1
       mtd write ruckus_zf7321_fw2_backup.bin /dev/mtd5
    4. Reboot the system, it should load into factory firmware again.
    
    Quirks and known issues:
    - Flash layout is changed from the factory, to use both firmware image
      partitions for storage using mtd-concat, and uImage format is used to
      actually boot the system, which rules out the dual-boot capability.
    - The 5GHz radio has its own EEPROM on board, not connected to CPU.
    - The stock firmware has dual-boot capability, which is not supported in
      OpenWrt by choice.
      It is controlled by data in the top 64kB of RAM which is unmapped,
      to avoid   the interference in the boot process and accidental
      switch to the inactive image, although boot script presence in
      form of "bootcmd" variable should prevent this entirely.
    - U-boot disables JTAG when starting. To re-enable it, you need to
      execute the following command before booting:
      mw.l 1804006c 40
      And also you need to disable the reset button in device tree if you
      intend to debug Linux, because reset button on GPIO0 shares the TCK
      pin.
    - On some versions of stock firmware, it is possible to obtain root shell,
      however not much is available in terms of debugging facitilies.
      1. Login to the rkscli
      2. Execute hidden command "Ruckus"
      3. Copy and paste ";/bin/sh;" including quotes. This is required only
         once, the payload will be stored in writable filesystem.
      4. Execute hidden command "!v54!". Press Enter leaving empty reply for
         "What's your chow?" prompt.
      5. Busybox shell shall open.
      Source: https://alephsecurity.com/vulns/aleph-2019014
    
    Signed-off-by: Lech Perczak <lech.perczak at gmail.com>
---
 package/boot/uboot-envtools/files/ath79            |  1 +
 target/linux/ath79/dts/ar9342_ruckus_zf7321.dts    | 54 ++++++++++++++++++++++
 .../generic/base-files/etc/board.d/02_network      |  2 +
 target/linux/ath79/image/generic.mk                |  7 +++
 4 files changed, 64 insertions(+)

diff --git a/package/boot/uboot-envtools/files/ath79 b/package/boot/uboot-envtools/files/ath79
index 9e4d0ff96d..a27b751d9b 100644
--- a/package/boot/uboot-envtools/files/ath79
+++ b/package/boot/uboot-envtools/files/ath79
@@ -126,6 +126,7 @@ plasmacloud,pa300e)
 qihoo,c301)
 	ubootenv_add_uci_config "/dev/mtd9" "0x0" "0x10000" "0x10000"
 	;;
+ruckus,zf7321|\
 ruckus,zf7372)
 	ubootenv_add_uci_config "/dev/mtd2" "0x0" "0x40000" "0x10000"
 	;;
diff --git a/target/linux/ath79/dts/ar9342_ruckus_zf7321.dts b/target/linux/ath79/dts/ar9342_ruckus_zf7321.dts
new file mode 100644
index 0000000000..7bfc85d086
--- /dev/null
+++ b/target/linux/ath79/dts/ar9342_ruckus_zf7321.dts
@@ -0,0 +1,54 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+
+#include "ar934x_ruckus_zf73xx.dtsi"
+
+/ {
+	model = "Ruckus ZoneFlex 7321[-U]";
+	compatible = "ruckus,zf7321", "qca,ar9342";
+
+	leds {
+		air-green {
+			label = "green:air";
+			gpios = <&gpio 13 GPIO_ACTIVE_LOW>;
+		};
+
+		dir-green {
+			label = "green:dir";
+			gpios = <&gpio 12 GPIO_ACTIVE_LOW>;
+		};
+
+		power_red: power-red {
+			label = "red:power";
+			gpios = <&gpio 11 GPIO_ACTIVE_HIGH>;
+			panic-indicator;
+		};
+
+		wlan2g-green {
+			label = "green:wlan2g";
+			gpios = <&gpio 14 GPIO_ACTIVE_LOW>;
+			linux,default-trigger = "phy0assoc";
+		};
+
+		wlan2g-yellow {
+			label = "yellow:wlan2g";
+			gpios = <&gpio 15 GPIO_ACTIVE_LOW>;
+			linux,default-trigger = "phy0tpt";
+		};
+
+		wlan5g-green {
+			label = "green:wlan5g";
+			gpios = <&gpio 16 GPIO_ACTIVE_LOW>;
+			linux,default-trigger = "phy0assoc";
+		};
+
+		wlan5g-yellow {
+			label = "yellow:wlan5g";
+			gpios = <&gpio 17 GPIO_ACTIVE_LOW>;
+			linux,default-trigger = "phy0tpt";
+		};
+	};
+};
+
+&eth0 {
+	nvmem-cells = <&macaddr_board_data_66>;
+};
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 27482129ce..4683264c1c 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
@@ -65,6 +65,7 @@ ath79_setup_interfaces()
 	pisen,ts-d084|\
 	pisen,wmb001n|\
 	pisen,wmm003n|\
+	ruckus,zf7321|\
 	siemens,ws-ap3610|\
 	sophos,ap15|\
 	sophos,ap55|\
@@ -699,6 +700,7 @@ ath79_setup_macs()
 		wan_mac=$(mtd_get_mac_binary factory 0x0)
 		lan_mac=$(macaddr_setbit_la "$wan_mac")
 		;;
+	ruckus,zf7321|\
 	ruckus,zf7372)
 		lan_mac=$(mtd_get_mac_binary board-data 0x807E)
 		label_mac=$lan_mac
diff --git a/target/linux/ath79/image/generic.mk b/target/linux/ath79/image/generic.mk
index 2439429c60..ff7c3b156e 100644
--- a/target/linux/ath79/image/generic.mk
+++ b/target/linux/ath79/image/generic.mk
@@ -2389,6 +2389,13 @@ define Device/ruckus_zf73xx_common
   KERNEL_INITRAMFS := kernel-bin | append-dtb | lzma | loader-kernel | uImage none
 endef
 
+define Device/ruckus_zf7321
+  $(Device/ruckus_zf73xx_common)
+  SOC := ar9342
+  DEVICE_MODEL := ZoneFlex 7321[-U]
+endef
+TARGET_DEVICES += ruckus_zf7321
+
 define Device/ruckus_zf7372
   $(Device/ruckus_zf73xx_common)
   SOC := ar9344




More information about the lede-commits mailing list