ipq40xx: add MikroTik wAP ac (RBwAPG-5HacD2HnD) support
authorMark Mentovai <mark@mentovai.com>
Mon, 4 Oct 2021 14:48:29 +0000 (10:48 -0400)
committerChristian Marangi <ansuelsmth@gmail.com>
Sun, 17 Jul 2022 23:45:47 +0000 (01:45 +0200)
The MikroTik wAP ac (RBwAPG-5HacD2HnD) is a dual-band dual-radio
802.11ac wireless access point with integrated antenna and two Ethernet
ports in a weatherproof enclosure. See
https://mikrotik.com/product/wap_ac for more information.

Important: this is the new ipq40xx-based wAP ac, not the older
ath79-based wAP ac (RBwAPG-5HacT2HnD), already supported in OpenWrt.

Specifications:
 - SoC: Qualcomm Atheros IPQ4018
 - CPU: 4x ARM Cortex A7
 - RAM: 128MB
 - Storage: 16MB NOR flash
 - Wireless
    - 2.4GHz: Built-in IPQ4018 (SoC) 802.11b/g/n 2x2:2, 2.5 dBi antennae
    - 5GHz: Built-in IPQ4018 (SoC) 802.11a/n/ac 2x2:2, 2.5 dBi antennae
 - Ethernet: Built-in IPQ4018 (SoC, QCA8075), 2x 1000/100/10Mb/s ports,
   one with 802.3af/at PoE in

Installation:
Boot the initramfs image via TFTP, then flash the sysupgrade image using
sysupgrade. Details at https://openwrt.org/toh/mikrotik/common.

Notes:
This preserves the MAC addresses of the physical Ethernet ports:
 - eth0 corresponds to the physical port labeled ETH1 and has the base
   MAC address. This port can be used to power the device.
 - eth1 corresponds to the physical port labeled ETH2 and has a MAC
   address one greater than the base.

MAC addresses are set from /lib/preinit/05_set_iface_mac_ipq40xx.sh
rather than /etc/board.d/02_network so that they are in effect for
preinit. This should likely be done for other MikroTik devices and
possibly other non-MikroTik devices as well.

As this device has 2 physical ports, they are each connected to their
respective PHYs, allowing the link status to be visible to software.
Since they are not marked on the case with any role (such as LAN or
WAN), both are bridged to the lan network by default, although this can
easily be changed if needed.

Signed-off-by: Mark Mentovai <mark@mentovai.com>
target/linux/ipq40xx/base-files/etc/board.d/02_network
target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
target/linux/ipq40xx/base-files/lib/preinit/05_set_iface_mac_ipq40xx.sh
target/linux/ipq40xx/base-files/lib/upgrade/platform.sh
target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4018-wap-ac.dts [new file with mode: 0644]
target/linux/ipq40xx/image/mikrotik.mk
target/linux/ipq40xx/patches-5.10/901-arm-boot-add-dts-files.patch
target/linux/ipq40xx/patches-5.15/901-arm-boot-add-dts-files.patch

index 8e98f5bc25b56f178cf6572c9c160c7f7d760546..5843987627b0ba1f9478e6424ccafefecd96e694 100644 (file)
@@ -90,7 +90,8 @@ ipq40xx_setup_interfaces()
                ;;
        compex,wpj419|\
        compex,wpj428|\
-       engenius,eap2200)
+       engenius,eap2200|\
+       mikrotik,wap-ac)
                ucidef_set_interface_lan "eth0 eth1"
                ;;
        buffalo,wtr-m2133hp)
index 19ce3faf78a078af8de0a7f19d835cebaa774248..f1c424a28d225277bfa98b7dff22d1c937014b50 100644 (file)
@@ -117,7 +117,8 @@ case "$FIRMWARE" in
                ;;
        mikrotik,cap-ac |\
        mikrotik,hap-ac2 |\
-       mikrotik,hap-ac3)
+       mikrotik,hap-ac3 |\
+       mikrotik,wap-ac)
                wlan_data="/sys/firmware/mikrotik/hard_config/wlan_data"
                ( [ -f "$wlan_data" ] && caldata_sysfsload_from_file "$wlan_data" 0x0 0x2f20 ) || \
                ( [ -d "$wlan_data" ] && caldata_sysfsload_from_file "$wlan_data/data_0" 0x0 0x2f20 )
@@ -199,7 +200,8 @@ case "$FIRMWARE" in
        mikrotik,cap-ac |\
        mikrotik,hap-ac2 |\
        mikrotik,hap-ac3 |\
-       mikrotik,sxtsq-5-ac)
+       mikrotik,sxtsq-5-ac |\
+       mikrotik,wap-ac)
                wlan_data="/sys/firmware/mikrotik/hard_config/wlan_data"
                ( [ -f "$wlan_data" ] && caldata_sysfsload_from_file "$wlan_data" 0x8000 0x2f20 ) || \
                ( [ -d "$wlan_data" ] && caldata_sysfsload_from_file "$wlan_data/data_2" 0x0 0x2f20 )
@@ -222,7 +224,8 @@ case "$FIRMWARE" in
        case "$board" in
        mikrotik,cap-ac |\
        mikrotik,hap-ac2 |\
-       mikrotik,hap-ac3)
+       mikrotik,hap-ac3 |\
+       mikrotik,wap-ac)
                wlan_data="/sys/firmware/mikrotik/hard_config/wlan_data"
                ( [ -f "$wlan_data" ] && caldata_sysfsload_from_file "$wlan_data" 0x2f20 0x2f20 ) || \
                ( [ -d "$wlan_data" ] && caldata_sysfsload_from_file "$wlan_data/data_0" 0x2f20 0x2f20 )
@@ -234,7 +237,8 @@ case "$FIRMWARE" in
        mikrotik,cap-ac |\
        mikrotik,hap-ac2 |\
        mikrotik,hap-ac3 |\
-       mikrotik,sxtsq-5-ac)
+       mikrotik,sxtsq-5-ac |\
+       mikrotik,wap-ac)
                wlan_data="/sys/firmware/mikrotik/hard_config/wlan_data"
                ( [ -f "$wlan_data" ] && caldata_sysfsload_from_file "$wlan_data" 0xaf20 0x2f20 ) || \
                ( [ -d "$wlan_data" ] && caldata_sysfsload_from_file "$wlan_data/data_2" 0x2f20 0x2f20 )
index cf89624ea3747ecb49185880a13e7f17f10ae4e7..ba1c1963980ecc0c66f262677177e95da440d851 100644 (file)
@@ -26,6 +26,11 @@ preinit_set_mac_address() {
                mac_lan=$(get_mac_binary "/sys/bus/i2c/devices/0-0050/eeprom" 0x66)
                [ -n "$mac_lan" ] && ip link set dev eth0 address "$mac_lan"
                ;;
+       mikrotik,wap-ac)
+               base_mac=$(cat /sys/firmware/mikrotik/hard_config/mac_base)
+               ip link set dev eth0 address "$base_mac"
+               ip link set dev eth1 address $(macaddr_add "$base_mac" 1)
+               ;;
        zyxel,nbg6617)
                base_mac=$(cat /sys/class/net/eth0/address)
                ip link set dev eth0 address $(macaddr_add "$base_mac" 2)
index 4b320209a369c089fdfd7a2d27de976e9d89d521..0fa30db7cfc9490a4ccbdbb56753777f5255bc2e 100644 (file)
@@ -173,7 +173,8 @@ platform_do_upgrade() {
        mikrotik,cap-ac|\
        mikrotik,hap-ac2|\
        mikrotik,lhgg-60ad|\
-       mikrotik,sxtsq-5-ac)
+       mikrotik,sxtsq-5-ac|\
+       mikrotik,wap-ac)
                [ "$(rootfs_type)" = "tmpfs" ] && mtd erase firmware
                default_do_upgrade "$1"
                ;;
diff --git a/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4018-wap-ac.dts b/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4018-wap-ac.dts
new file mode 100644 (file)
index 0000000..a77b85a
--- /dev/null
@@ -0,0 +1,221 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+/* Copyright (c) 2020, Robert Marko <robimarko@gmail.com> */
+
+#include "qcom-ipq4019.dtsi"
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/soc/qcom,tcsr.h>
+
+/ {
+       model = "MikroTik wAP ac";
+       compatible = "mikrotik,wap-ac";
+
+       memory {
+               device_type = "memory";
+               reg = <0x80000000 0x08000000>;
+       };
+
+       chosen {
+               stdout-path = "serial0:115200n8";
+       };
+
+       aliases {
+               led-boot = &led_user;
+               led-failsafe = &led_user;
+               led-running = &led_user;
+               led-upgrade = &led_user;
+       };
+
+       soc {
+               counter@4a1000 {
+                       compatible = "qcom,qca-gcnt";
+                       reg = <0x4a1000 0x4>;
+               };
+
+               tcsr@1949000 {
+                       compatible = "qcom,tcsr";
+                       reg = <0x1949000 0x100>;
+                       qcom,wifi_glb_cfg = <TCSR_WIFI_GLB_CFG>;
+               };
+
+               ess_tcsr@1953000 {
+                       compatible = "qcom,tcsr";
+                       reg = <0x1953000 0x1000>;
+                       qcom,ess-interface-select = <TCSR_ESS_PSGMII>;
+               };
+
+               tcsr@1957000 {
+                       compatible = "qcom,tcsr";
+                       reg = <0x1957000 0x100>;
+                       qcom,wifi_noc_memtype_m0_m2 = <TCSR_WIFI_NOC_MEMTYPE_M0_M2>;
+               };
+
+               ess-switch@c000000 {
+                       status = "okay";
+               };
+
+               edma@c080000 {
+                       status = "okay";
+               };
+       };
+
+       keys {
+               compatible = "gpio-keys";
+
+               reset {
+                       label = "reset";
+                       gpios = <&tlmm 63 GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_RESTART>;
+               };
+       };
+
+       leds {
+               compatible = "gpio-leds";
+
+               power {
+                       label = "blue:power";
+                       gpios = <&tlmm 0 GPIO_ACTIVE_HIGH>;
+                       default-state = "keep";
+               };
+
+               led_user: user {
+                       label = "green:user";
+                       gpios = <&tlmm 3 GPIO_ACTIVE_HIGH>;
+                       panic-indicator;
+               };
+       };
+};
+
+&prng {
+       status = "okay";
+};
+
+&tlmm {
+       serial_pins: serial_pinmux {
+               mux {
+                       pins = "gpio60", "gpio61";
+                       function = "blsp_uart0";
+                       bias-disable;
+               };
+       };
+
+       spi_0_pins: spi_0_pinmux {
+               pin {
+                       function = "blsp_spi0";
+                       pins = "gpio55", "gpio56", "gpio57";
+                       drive-strength = <2>;
+                       bias-disable;
+               };
+               pin_cs {
+                       function = "gpio";
+                       pins = "gpio54";
+                       drive-strength = <2>;
+                       bias-disable;
+                       output-high;
+               };
+       };
+};
+
+&blsp_dma {
+       status = "okay";
+};
+
+&blsp1_spi1 {
+       status = "okay";
+
+       pinctrl-0 = <&spi_0_pins>;
+       pinctrl-names = "default";
+       cs-gpios = <&tlmm 54 GPIO_ACTIVE_HIGH>;
+
+       flash@0 {
+               reg = <0>;
+               compatible = "jedec,spi-nor";
+               spi-max-frequency = <40000000>;
+
+               partitions {
+                       compatible = "fixed-partitions";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+
+                       partition@0 {
+                               label = "Qualcomm";
+                               reg = <0x0 0x80000>;
+                               read-only;
+                       };
+
+                       partition@80000 {
+                               compatible = "mikrotik,routerboot-partitions";
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               label = "RouterBoot";
+                               reg = <0x80000 0x80000>;
+
+                               hard_config {
+                                       read-only;
+                                       size = <0x2000>;
+                               };
+
+                               dtb_config {
+                                       read-only;
+                               };
+
+                               soft_config {
+                               };
+                       };
+
+                       partition@100000 {
+                               compatible = "mikrotik,minor";
+                               label = "firmware";
+                               reg = <0x100000 0xf00000>;
+                       };
+               };
+       };
+};
+
+&blsp1_uart1 {
+       status = "okay";
+
+       pinctrl-0 = <&serial_pins>;
+       pinctrl-names = "default";
+};
+
+&cryptobam {
+       status = "okay";
+};
+
+&crypto {
+       status = "okay";
+};
+
+&watchdog {
+       status = "okay";
+};
+
+&mdio {
+       status = "okay";
+};
+
+&gmac0 {
+       qcom,phy_mdio_addr = <4>;
+       qcom,poll_required = <1>;
+       qcom,forced_speed = <1000>;
+       qcom,forced_duplex = <1>;
+       vlan_tag = <2 0x20>;
+};
+
+&gmac1 {
+       qcom,phy_mdio_addr = <3>;
+       vlan_tag = <1 0x10>;
+};
+
+&wifi0 {
+       status = "okay";
+
+       qcom,ath10k-calibration-variant = "MikroTik-wAP-ac";
+};
+
+&wifi1 {
+       status = "okay";
+
+       qcom,ath10k-calibration-variant = "MikroTik-wAP-ac";
+};
index b2e8428e94224372445ac99d33fb47a279c0c274..d1f0829cd3f3d43d0e2a447847dac0058e0b030e 100644 (file)
@@ -62,3 +62,11 @@ define Device/mikrotik_sxtsq-5-ac
        DEVICE_PACKAGES := rssileds
 endef
 TARGET_DEVICES += mikrotik_sxtsq-5-ac
+
+define Device/mikrotik_wap-ac
+       $(call Device/mikrotik_nor)
+       DEVICE_MODEL := wAP ac
+       SOC := qcom-ipq4018
+       DEVICE_PACKAGES := -kmod-ath10k-ct kmod-ath10k-ct-smallbuffers
+endef
+TARGET_DEVICES += mikrotik_wap-ac
index 70e8c9d27f0ef25b1820a6fa48bc36fbd17d72ce..21de771fca4bad781382a2a255055735a8e20f73 100644 (file)
@@ -10,7 +10,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
 
 --- a/arch/arm/boot/dts/Makefile
 +++ b/arch/arm/boot/dts/Makefile
-@@ -903,11 +903,78 @@ dtb-$(CONFIG_ARCH_QCOM) += \
+@@ -903,11 +903,79 @@ dtb-$(CONFIG_ARCH_QCOM) += \
        qcom-apq8074-dragonboard.dtb \
        qcom-apq8084-ifc6540.dtb \
        qcom-apq8084-mtp.dtb \
@@ -40,6 +40,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
 +      qcom-ipq4018-rt-ac58u.dtb \
 +      qcom-ipq4018-rutx10.dtb \
 +      qcom-ipq4018-wac510.dtb \
++      qcom-ipq4018-wap-ac.dtb \
 +      qcom-ipq4018-whw01-v1.dtb \
 +      qcom-ipq4018-wre6606.dtb \
 +      qcom-ipq4018-wrtq-329acn.dtb \
index 19d6b4bb3479a94267a8d92e3574dc3d9bb62b80..efe469395ffd6e03de2bb67aa3ed98f3f24d649b 100644 (file)
@@ -10,7 +10,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
 
 --- a/arch/arm/boot/dts/Makefile
 +++ b/arch/arm/boot/dts/Makefile
-@@ -951,11 +951,77 @@ dtb-$(CONFIG_ARCH_QCOM) += \
+@@ -951,11 +951,78 @@ dtb-$(CONFIG_ARCH_QCOM) += \
        qcom-ipq4018-ap120c-ac.dtb \
        qcom-ipq4018-ap120c-ac-bit.dtb \
        qcom-ipq4018-jalapeno.dtb \
@@ -39,6 +39,7 @@ Signed-off-by: John Crispin <john@phrozen.org>
 +      qcom-ipq4018-rt-ac58u.dtb \
 +      qcom-ipq4018-rutx10.dtb \
 +      qcom-ipq4018-wac510.dtb \
++      qcom-ipq4018-wap-ac.dtb \
 +      qcom-ipq4018-whw01-v1.dtb \
 +      qcom-ipq4018-wre6606.dtb \
 +      qcom-ipq4018-wrtq-329acn.dtb \