mvebu: add support for IIJ SA-W2
authorINAGAKI Hiroshi <musashino.open@gmail.com>
Sun, 13 Nov 2022 08:22:26 +0000 (17:22 +0900)
committerHauke Mehrtens <hauke@hauke-m.de>
Tue, 31 Oct 2023 13:02:01 +0000 (14:02 +0100)
Internet Initiative Japan Inc. (IIJ) SA-W2 is a network appliance with
11ac (Wi-Fi 5) wlan, based on 88F6810.

Specification:

- SoC         : Marvell Armada 380 88F6810
- RAM         : DDR3 256 MiB (Micron MT41K64M16TW-107:J x2)
- Flash       : SPI-NOR 32 MiB (Winbond W25Q256JVFIQ)
- WLAN        : 2.4/5 GHz, Mini PCI-E
  - 2.4 GHz   : Silex SX-PCEGN (Atheros AR9287 (2T2R))
  - 5 GHz     : Silex SX-PCEAC (Qualcomm Atheros QCA9880 (3T3R))
- Ethernet    : 10/100/1000 Mbps x5
  - Switch    : Marvell 88E6172
- LEDs/Keys   : 12x/1x
- UART        : "CONSOLE" port (RJ-45, RS-232C)
  - settings  : 115200n8
  - assignment: 1:NC,  2:NC,  3:TXD, 4:GND,
                5:GND, 6:RXD, 7:NC,  8:NC
  - note      : compatible with Cisco console cable
- Power       : DC Input or PoE
  - DC Input  : 12 VDC, 3 A
  - PoE       : 802.3af
    - module  : Silvertel Ag9712-2BR
    - note    : USB ports shouldn't be used when powered by PoE
- Bootloader  : PMON2000 based
- Stock       : NetBSD based

Flash instruction using sysupgrade image:

1. Prepare TFTP server with IP address 192.168.0.10 and put sysupgrade
   image to TFTP directory
2. Connect PC to "GE0/PoE" port on SA-W2
3. Power on SA-W2, interrupt count-down by Esc and enter to bootloader
   CLI
4. Set IP address of the device

   address 192.168.0.1

5. Download sysupgrade image and flash to storage

   tftpload 192.168.0.10 <image name>
   firmwrite

   example:

   #tftpload 192.168.0.10 openwrt-mvebu-cortexa9-iij_sa-w2-squashfs-sysupgrade.bin
   Loading openwrt-mvebu-cortexa9-iij_sa-w2-squashfs-sysupgrade.bin
   loaded 8127268 byte(s)
   #firmwrite
   Erasing FLASH block  32 Done 0x00200000.
   Erasing FLASH block  33 Done 0x00210000.
   ...
   Erasing FLASH block 155 Done 0x009b0000.
   Erasing FLASH block 156 Done 0x009c0000.
   Programming FLASH. Done.
   Verifying FLASH. No Errors found.

6. Check the flashed firmware

   firmcheck

   example:

   #firmcheck
   [Normal firmware]
   ident: 'SEIL2015'
   copyright: 'ARM OpenWrt Linux-5.15.93'
   version format: 1
   version major: 9
   version minor: 99
   version release: 'r22060+36-5163bb5e54'
   body size: 3578524
   checksum: 0x8a083cb8

   [Rescue firmware]
   ident: 'SEIL2015'
   copyright: 'Copyright (c) 2017 Internet Initiative Japan Inc. All rights reserved.'
   version format: 1
   version major: 3
   version minor: 70
   version release: 'Release'
   body size: 10152458
   checksum: 0x8f9518c2

7. Boot with the flashed firmware

   boot

Note:

- The bootloader on this device is not U-Boot and it's environment space
  ("bootloader-env") has no compatibility with U-Boot tools.

- eth1 is connected to port6 of 88E6172 switch, but multi-cpu port can't
  be handled on Linux Kernel and not defined.

- Powering by PoE hasn't been tested yet.

- This device has 2x OS images on flash and they can be switched by
  setting "BOOTDEV" variable on bootloader CLI.
  That variable supports the following values:

  - "flash" : primary image on flash ("firmware")
  - "rescue": secondary image on flash ("rescue")
  - "usb"   : usb storage (broken?)
  - "lan0/1": network

  command to set:

  set BOOTDEV=<dev>

  example:

    set BOOTDEV=rescue

  This commit also supports booting from secondary partition.

- To execute initramfs image on bootloader CLI, use "go" command.
  ("go" command is not listed on the output of "help", but available)

  example (download and execute):

    address 192.168.0.1
    tftpload 192.168.0.10 openwrt-mvebu-cortexa9-iij_sa-w2-initramfs-kernel.bin
    go

MAC addresses:

LAN    : 00:E0:4D:xx:xx:19 (none)
WAN    : 00:E0:4D:xx:xx:18 (board_info, 0x6 (hex))
2.4 GHz: 84:25:3F:xx:xx:xx (Mini PCI-E card)
5 GHz  : 84:25:3F:xx:xx:xx (Mini PCI-E card)

Signed-off-by: INAGAKI Hiroshi <musashino.open@gmail.com>
target/linux/mvebu/cortexa9/base-files/etc/board.d/02_network
target/linux/mvebu/cortexa9/base-files/lib/upgrade/platform.sh
target/linux/mvebu/files/arch/arm/boot/dts/armada-380-iij-sa-w2.dts [new file with mode: 0644]
target/linux/mvebu/image/cortexa9.mk

index 147ae0b31f7f5dd801c2d6615b79d735cdec3531..5c176d4963d5fa4b435a6d7ecc9fb14193e1fef7 100644 (file)
@@ -30,6 +30,9 @@ mvebu_setup_interfaces()
        fortinet,fg-50e)
                ucidef_set_interfaces_lan_wan "lan1 lan2 lan3 lan4 lan5" "eth1 eth2"
                ;;
+       iij,sa-w2)
+               ucidef_set_interfaces_lan_wan "ge1_0 ge1_1 ge1_2 ge1_3" "ge0"
+               ;;
        iptime,nas1dual)
                ucidef_set_interface_lan "eth0 eth1" "dhcp"
                ;;
index 8432fdbfc81e765c08aee7af9c06420146578218..7f45aa8a9157de6683c1d80f1088cefb4e00f6cc 100755 (executable)
@@ -56,6 +56,20 @@ platform_do_upgrade() {
        fortinet,fg-50e)
                fortinet_do_upgrade "$1"
                ;;
+       iij,sa-w2)
+               local envmtd=$(find_mtd_part "bootloader-env")
+               local bootdev=$(grep "BOOTDEV=" "$envmtd")
+               case "${bootdev#*=}" in
+               flash)  PART_NAME="firmware" ;;
+               rescue) PART_NAME="rescue"   ;;
+               *)
+                       echo "invalid BOOTDEV is set (\"${bootdev#*=}\")"
+                       umount -a
+                       reboot -f
+                       ;;
+               esac
+               default_do_upgrade "$1"
+               ;;
        linksys,wrt1200ac|\
        linksys,wrt1900ac-v1|\
        linksys,wrt1900ac-v2|\
diff --git a/target/linux/mvebu/files/arch/arm/boot/dts/armada-380-iij-sa-w2.dts b/target/linux/mvebu/files/arch/arm/boot/dts/armada-380-iij-sa-w2.dts
new file mode 100644 (file)
index 0000000..d248361
--- /dev/null
@@ -0,0 +1,390 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+
+/dts-v1/;
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/leds/common.h>
+#include "armada-380.dtsi"
+
+/ {
+       model = "IIJ SA-W2";
+       compatible = "iij,sa-w2", "marvell,armada380";
+
+       aliases {
+               led-boot = &led_power_green;
+               led-failsafe = &led_power_red;
+               led-running = &led_power_green;
+               led-upgrade = &led_power_green;
+               label-mac-device = &ge0;
+       };
+
+       chosen {
+               stdout-path = "serial0:115200n8";
+       };
+
+       memory@0 {
+               device_type = "memory";
+               reg = <0x00000000 0x10000000>; /* 256MB */
+       };
+
+       soc {
+               ranges = <MBUS_ID(0xf0, 0x01) 0 0xd0000000 0x100000
+                         MBUS_ID(0x01, 0x1d) 0 0xfff00000 0x100000
+                         MBUS_ID(0x09, 0x19) 0 0xf1100000 0x10000
+                         MBUS_ID(0x09, 0x15) 0 0xf1110000 0x10000
+                         MBUS_ID(0x0c, 0x04) 0 0xf1200000 0x100000>;
+
+               pcie {
+                       status = "okay";
+
+                       pcie@1,0 {
+                               status = "okay";
+                       };
+
+                       pcie@3,0 {
+                               status = "okay";
+                       };
+               };
+       };
+
+       keys {
+               compatible = "gpio-keys";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pmx_keys_pins>;
+
+               button-init {
+                       label = "init";
+                       linux,code = <KEY_RESTART>;
+                       gpios = <&gpio0 18 GPIO_ACTIVE_LOW>;
+               };
+       };
+
+       leds {
+               compatible = "gpio-leds";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pmx_leds_pins>;
+
+               led-0 {
+                       label = "green:wlan5g";
+                       gpios = <&gpio0 19 GPIO_ACTIVE_HIGH>;
+                       color = <LED_COLOR_ID_GREEN>;
+                       linux,default-trigger = "phy0tpt";
+               };
+
+               led-1 {
+                       label = "red:wlan5g";
+                       gpios = <&gpio0 20 GPIO_ACTIVE_HIGH>;
+                       color = <LED_COLOR_ID_RED>;
+               };
+
+               led-2 {
+                       label = "green:status";
+                       gpios = <&gpio1 1 GPIO_ACTIVE_HIGH>;
+                       color = <LED_COLOR_ID_GREEN>;
+                       function = LED_FUNCTION_STATUS;
+               };
+
+               led-3 {
+                       label = "red:status";
+                       gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
+                       color = <LED_COLOR_ID_RED>;
+                       function = LED_FUNCTION_STATUS;
+               };
+
+               led-4 {
+                       label = "green:mobile";
+                       gpios = <&gpio1 3 GPIO_ACTIVE_HIGH>;
+                       color = <LED_COLOR_ID_GREEN>;
+               };
+
+               led-5 {
+                       label = "red:mobile";
+                       gpios = <&gpio1 4 GPIO_ACTIVE_HIGH>;
+                       color = <LED_COLOR_ID_RED>;
+               };
+
+               led-6 {
+                       label = "green:wlan2g";
+                       gpios = <&gpio1 12 GPIO_ACTIVE_HIGH>;
+                       color = <LED_COLOR_ID_GREEN>;
+                       linux,default-trigger = "phy1tpt";
+               };
+
+               led-7 {
+                       label = "red:wlan2g";
+                       gpios = <&gpio1 13 GPIO_ACTIVE_HIGH>;
+                       color = <LED_COLOR_ID_RED>;
+               };
+
+               led_power_green: led-8 {
+                       label = "green:power";
+                       gpios = <&gpio1 14 GPIO_ACTIVE_LOW>;
+                       color = <LED_COLOR_ID_GREEN>;
+               };
+
+               led_power_red: led-9 {
+                       label = "red:power";
+                       gpios = <&gpio1 15 GPIO_ACTIVE_HIGH>;
+                       color = <LED_COLOR_ID_RED>;
+               };
+
+               led-10 {
+                       label = "green:usb1";
+                       gpios = <&gpio1 22 GPIO_ACTIVE_LOW>;
+                       color = <LED_COLOR_ID_GREEN>;
+                       linux,default-trigger = "usbport";
+                       trigger-sources = <&hub_port2>;
+               };
+
+               led-11 {
+                       label = "green:usb0";
+                       gpios = <&gpio1 23 GPIO_ACTIVE_LOW>;
+                       color = <LED_COLOR_ID_GREEN>;
+                       linux,default-trigger = "usbport";
+                       trigger-sources = <&hub_port1>;
+               };
+       };
+
+       regulator-vbus-usb0 {
+               compatible = "regulator-fixed";
+               regulator-name = "vbus-usb0";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               gpio = <&gpio1 20 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+               regulator-always-on;
+       };
+
+       regulator-vbus-usb1 {
+               compatible = "regulator-fixed";
+               regulator-name = "vbus-usb1";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               gpio = <&gpio1 21 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+               regulator-always-on;
+       };
+};
+
+&uart0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart0_pins>;
+       status = "okay";
+};
+
+&pinctrl {
+       pmx_usb_pins: usb-pins {
+               marvell,pins = "mpp2",           /* smsc usb2514b reset */
+                              "mpp48", "mpp49", /* port over current */
+                              "mpp52", "mpp53"; /* port vbus */
+               marvell,function = "gpio";
+       };
+
+       pmx_keys_pins: keys-pins {
+               marvell,pins = "mpp18";
+               marvell,function = "gpio";
+       };
+
+       pmx_leds_pins: leds-pins {
+               marvell,pins = "mpp19", "mpp20", "mpp33", "mpp34", "mpp35",
+                              "mpp36", "mpp44", "mpp45", "mpp46", "mpp47",
+                              "mpp54", "mpp55";
+               marvell,function = "gpio";
+       };
+};
+
+&gpio0 {
+       usb-hub-reset {
+               gpio-hog;
+               gpios = <2 GPIO_ACTIVE_HIGH>;
+               output-high;
+       };
+};
+
+&usb0 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pmx_usb_pins>;
+       status = "okay";
+       #address-cells = <1>;
+       #size-cells = <0>;
+
+       /* SMSC USB2514B on PCB */
+       hub@1 {
+               compatible = "usb424,2514";
+               reg = <1>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               hub_port1: port@1 {
+                       reg = <1>;
+                       #trigger-source-cells = <0>;
+               };
+
+               hub_port2: port@2 {
+                       reg = <2>;
+                       #trigger-source-cells = <0>;
+               };
+       };
+};
+
+&bm {
+       status = "okay";
+};
+
+&bm_bppi {
+       status = "okay";
+};
+
+&eth1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&ge1_rgmii_pins>;
+       status = "okay";
+
+       phy-connection-type = "rgmii-id";
+       buffer-manager = <&bm>;
+       bm,pool-long = <2>;
+       bm,pool-short = <3>;
+
+       nvmem-cells = <&macaddr_bdinfo_6 1>;
+       nvmem-cell-names = "mac-address";
+
+       fixed-link {
+               speed = <1000>;
+               full-duplex;
+       };
+};
+
+&mdio {
+       pinctrl-names = "default";
+       pinctrl-0 = <&mdio_pins>;
+       status = "okay";
+
+       /* Marvell 88E6172 */
+       switch@0 {
+               compatible = "marvell,mv88e6085";
+               reg = <0x0>;
+               interrupt-controller;
+               #interrupt-cells = <2>;
+               interrupt-parent = <&gpio1>;
+               interrupts = <10 IRQ_TYPE_LEVEL_LOW>;
+
+               ports {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       port@0 {
+                               reg = <0>;
+                               label = "ge1_0";
+                       };
+
+                       port@1 {
+                               reg = <1>;
+                               label = "ge1_1";
+                       };
+
+                       port@2 {
+                               reg = <2>;
+                               label = "ge1_2";
+                       };
+
+                       port@3 {
+                               reg = <3>;
+                               label = "ge1_3";
+                       };
+
+                       ge0: port@4 {
+                               reg = <4>;
+                               label = "ge0";
+                               nvmem-cells = <&macaddr_bdinfo_6 0>;
+                               nvmem-cell-names = "mac-address";
+                       };
+
+                       /*
+                        * eth0 is connected to port5 for WAN connection
+                        * on port4 ("GE0")
+                        */
+
+                       port@6 {
+                               reg = <6>;
+                               label = "cpu";
+                               ethernet = <&eth1>;
+                               phy-connection-type = "rgmii-id";
+
+                               fixed-link {
+                                       speed = <1000>;
+                                       full-duplex;
+                               };
+                       };
+               };
+       };
+};
+
+&rtc {
+       status = "disabled";
+};
+
+&spi1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&spi1_pins>;
+       status = "okay";
+
+       flash@0 {
+               compatible = "jedec,spi-nor";
+               reg = <0>;
+               spi-max-frequency = <40000000>;
+
+               partitions {
+                       compatible = "fixed-partitions";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+
+                       partition@0 {
+                               reg = <0x0 0x100000>;
+                               label = "bootloader";
+                               read-only;
+                       };
+
+                       partition@100000 {
+                               reg = <0x100000 0x10000>;
+                               label = "bootloader-env";
+                               read-only;
+                       };
+
+                       partition@110000 {
+                               compatible = "nvmem-cells";
+                               reg = <0x110000 0xf0000>;
+                               label = "board_info";
+                               read-only;
+
+                               nvmem-layout {
+                                       compatible = "fixed-layout";
+                                       #address-cells = <1>;
+                                       #size-cells = <1>;
+
+                                       macaddr_bdinfo_6: macaddr@6 {
+                                               compatible = "mac-base";
+                                               reg = <0x6 0x6>;
+                                               #nvmem-cell-cells = <1>;
+                                       };
+                               };
+                       };
+
+                       partition@200000 {
+                               compatible = "iij,seil-firmware";
+                               reg = <0x200000 0xf00000>;
+                               label = "firmware";
+                               iij,bootdev-name = "flash";
+                               iij,seil-id = <0x5345494c 0x32303135>;
+                       };
+
+                       partition@1100000 {
+                               compatible = "iij,seil-firmware";
+                               reg = <0x1100000 0xf00000>;
+                               label = "rescue";
+                               iij,bootdev-name = "rescue";
+                               iij,seil-id = <0x5345494c 0x32303135>;
+                       };
+               };
+       };
+};
index 27f41c58a8d153ac55a7d870b54448c761835069..3234d62cd99d138d7374c7c8744614da66c07907 100644 (file)
@@ -16,6 +16,23 @@ define Build/fortigate-header
   mv $@.new $@
 endef
 
+define Build/seil-header
+  ( \
+    data_size_crc="$$(gzip -c $@ | tail -c8 | \
+        od -An -tx8 --endian little | tr -d ' \n')"; \
+    printf "SEIL2015"; \
+    printf "$(call toupper,$(LINUX_KARCH)) $(VERSION_DIST) Linux-$(LINUX_VERSION)" | \
+        dd bs=80 count=1 conv=sync 2>/dev/null; \
+    printf "$$(echo $${data_size_crc:8:8} | sed 's/../\\x&/g')"; \
+    printf "\x00\x00\x00\x01\x00\x00\x00\x09\x00\x00\x00\x63"; \
+    printf "$(REVISION)" | dd bs=32 count=1 conv=sync 2>/dev/null; \
+    printf "\x00\x00\x00\x00"; \
+    printf "$$(echo $${data_size_crc:0:8} | sed 's/../\\x&/g')"; \
+    cat $@; \
+  ) > $@.new
+  mv $@.new $@
+endef
+
 define Device/dsa-migration
   DEVICE_COMPAT_VERSION := 1.1
   DEVICE_COMPAT_MESSAGE := Config cannot be migrated from swconfig to DSA
@@ -134,6 +151,20 @@ define Device/globalscale_mirabox
 endef
 TARGET_DEVICES += globalscale_mirabox
 
+define Device/iij_sa-w2
+  DEVICE_VENDOR := IIJ
+  DEVICE_MODEL := SA-W2
+  SOC := armada-380
+  KERNEL := kernel-bin | append-dtb | seil-header
+  DEVICE_DTS := armada-380-iij-sa-w2
+  IMAGE_SIZE := 15360k
+  IMAGE/sysupgrade.bin := append-kernel | pad-to 64k | \
+    append-rootfs | pad-rootfs | check-size | append-metadata
+  DEVICE_PACKAGES := kmod-ath9k kmod-ath10k-ct ath10k-firmware-qca988x-ct \
+    wpad-basic-mbedtls
+endef
+TARGET_DEVICES += iij_sa-w2
+
 define Device/iptime_nas1dual
   DEVICE_VENDOR := ipTIME
   DEVICE_MODEL := NAS1dual