diff mbox series

ramips: support TP-Link EAP615-Wall

Message ID 20220127220028.2738566-1-stijn@linux-ipv6.be
State Accepted
Delegated to: Stijn Tintel
Headers show
Series ramips: support TP-Link EAP615-Wall | expand

Commit Message

Stijn Tintel Jan. 27, 2022, 10 p.m. UTC
Add support for the TP-Link EAP615-Wall, an AX1800 Wall Plate WiFi 6 AP.
The device is very similar to the TP-Link EAP235-Wall.

Hardware:
* SoC: MediaTek MT7621AT
* RAM: 128MiB
* Flash: 16MiB SPI-NOR
* Ethernet: 4x GbE
  * Back: ETH0 (PoE-PD)
  * Bottom: ETH1, ETH2, ETH3 (PoE-PT)
* WiFi: MT7915E 2.4/5 GHz 2T2R
* LEDS: 1x white
* Buttons: 1x LED, 1x reset

Stock firmware uses a random MAC address for ethernet. OpenWrt uses the
MAC address that is on the device label for ethernet and the wireless
interfaces. MAC address must not be incremented, as this will cause MAC
address conflicts in case you have two devices with consecutive MAC
addresses. Instead, different locally administered addresses will be
generated automatically, based on the MAC on the label.

Installation via stock firmware:
* Enable SSH in the TP-Link web interface
* SSH to the device
* Run `cliclientd stopcs`
* Upload the OpenWrt factory image via the TP-Link webinterface

Installation via bootloader:
* Solder TTL header. Pinout: 1: TX, 2: RX, 3: GND, 4: VCC, with pin 1
  closest to ETH1. Baud rate 115200
* Interrupt boot process by holding a key during boot
* Boot the OpenWrt initramfs:
  # tftpboot 0x84000000 openwrt-ramips-mt7621-tplink_eap615-wall-v1-initramfs-kernel.bin
  # bootm
* Copy openwrt-ramips-mt7621-tplink_eap615-wall-v1-squashfs-sysupgrade.bin
  to /tmp and use sysupgrade to install it

Thanks to Sander Vanheule for his work on the EAP235-Wall, which made
adding support for the EAP615-Wall very easy.

Signed-off-by: Stijn Tintel <stijn@linux-ipv6.be>
---
 .../dts/mt7621_tplink_eap615-wall-v1.dts      | 250 ++++++++++++++++++
 target/linux/ramips/image/mt7621.mk           |  12 +
 .../mt7621/base-files/etc/board.d/02_network  |   3 +-
 tools/firmware-utils/patches/999-eap615.patch |  55 ++++
 4 files changed, 319 insertions(+), 1 deletion(-)
 create mode 100644 target/linux/ramips/dts/mt7621_tplink_eap615-wall-v1.dts
 create mode 100644 tools/firmware-utils/patches/999-eap615.patch

Comments

Sander Vanheule Jan. 29, 2022, 1:03 p.m. UTC | #1
Hi Stijn,

Thanks for the patch, been looking forward to this!

On Fri, 2022-01-28 at 00:00 +0200, Stijn Tintel wrote:
> Add support for the TP-Link EAP615-Wall, an AX1800 Wall Plate WiFi 6 AP.
> The device is very similar to the TP-Link EAP235-Wall.
> 
> Hardware:
> * SoC: MediaTek MT7621AT
> * RAM: 128MiB
> * Flash: 16MiB SPI-NOR
> * Ethernet: 4x GbE
>   * Back: ETH0 (PoE-PD)
>   * Bottom: ETH1, ETH2, ETH3 (PoE-PT)

PT > passthrough

> * WiFi: MT7915E 2.4/5 GHz 2T2R
> * LEDS: 1x white
> * Buttons: 1x LED, 1x reset
> 
> Stock firmware uses a random MAC address for ethernet. OpenWrt uses the
> MAC address that is on the device label for ethernet and the wireless
> interfaces. MAC address must not be incremented, as this will cause MAC
> address conflicts in case you have two devices with consecutive MAC
> addresses. Instead, different locally administered addresses will be
> generated automatically, based on the MAC on the label.
> 
> Installation via stock firmware:
> * Enable SSH in the TP-Link web interface
> * SSH to the device
> * Run `cliclientd stopcs`
> * Upload the OpenWrt factory image via the TP-Link webinterface
> 
> Installation via bootloader:
> * Solder TTL header. Pinout: 1: TX, 2: RX, 3: GND, 4: VCC, with pin 1
>   closest to ETH1. Baud rate 115200
> * Interrupt boot process by holding a key during boot
> * Boot the OpenWrt initramfs:
>   # tftpboot 0x84000000 openwrt-ramips-mt7621-tplink_eap615-wall-v1-initramfs-kernel.bin
>   # bootm
> * Copy openwrt-ramips-mt7621-tplink_eap615-wall-v1-squashfs-sysupgrade.bin
>   to /tmp and use sysupgrade to install it
> 
> Thanks to Sander Vanheule for his work on the EAP235-Wall, which made
> adding support for the EAP615-Wall very easy.
> 
> Signed-off-by: Stijn Tintel <stijn@linux-ipv6.be>
> ---
>  .../dts/mt7621_tplink_eap615-wall-v1.dts      | 250 ++++++++++++++++++
>  target/linux/ramips/image/mt7621.mk           |  12 +
>  .../mt7621/base-files/etc/board.d/02_network  |   3 +-
>  tools/firmware-utils/patches/999-eap615.patch |  55 ++++
>  4 files changed, 319 insertions(+), 1 deletion(-)
>  create mode 100644 target/linux/ramips/dts/mt7621_tplink_eap615-wall-v1.dts
>  create mode 100644 tools/firmware-utils/patches/999-eap615.patch
> 
> diff --git a/target/linux/ramips/dts/mt7621_tplink_eap615-wall-v1.dts
> b/target/linux/ramips/dts/mt7621_tplink_eap615-wall-v1.dts
> new file mode 100644
> index 0000000000..fd5a68973b
> --- /dev/null
> +++ b/target/linux/ramips/dts/mt7621_tplink_eap615-wall-v1.dts
> @@ -0,0 +1,250 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +
> +#include "mt7621.dtsi"
> +
> +#include <dt-bindings/gpio/gpio.h>
> +#include <dt-bindings/input/input.h>
> +#include <dt-bindings/leds/common.h>
> +
> +/ {
> +       compatible = "tplink,eap615-wall-v1", "mediatek,mt7621-soc";
> +       model = "TP-Link EAP615-Wall v1";
> +
> +       aliases {
> +               label-mac-device = &gmac0;
> +               led-boot = &led_status;
> +               led-failsafe = &led_status;
> +               led-running = &led_status;
> +               led-upgrade = &led_status;
> +       };
> +
> +       chosen {
> +               bootargs = "console=ttyS0,115200";
> +       };
> +
> +       leds {
> +               compatible = "gpio-leds";
> +
> +               led_status: status {
> +                       label = "white:status";
> +                       color = <LED_COLOR_ID_WHITE>;
> +                       function = LED_FUNCTION_STATUS;
> +                       gpios = <&gpio 12 GPIO_ACTIVE_LOW>;
> +               };
> +       };
> +
> +       keys {
> +               compatible = "gpio-keys";
> +
> +               led {
> +                       label = "led";
> +                       gpios = <&gpio 10 GPIO_ACTIVE_LOW>;
> +                       linux,code = <KEY_LIGHTS_TOGGLE>;
> +               };
> +
> +               reset {
> +                       label = "reset";
> +                       gpios = <&gpio 8 GPIO_ACTIVE_LOW>;
> +                       linux,code = <KEY_RESTART>;
> +               };
> +       };
> +
> +       gpio-export {
> +               compatible = "gpio-export";
> +
> +               poe_passthrough {
> +                       gpio-export,name = "poe-passthrough";
> +                       gpio-export,output = <0>;
> +                       gpios = <&gpio 7 GPIO_ACTIVE_HIGH>;
> +               };
> +       };
> +
> +       ethernet@1e100000 {
> +               reg = <0x1e100000 0xe000>;
> +
> +               mac@0 {
> +                       phy-mode = "rgmii";
> +
> +                       fixed-link {
> +                               pause;
> +                               speed = <1000>;
> +                       };
> +               };
> +
> +               mac@1 {
> +                       status = "okay";
> +
> +                       phy-mode = "rgmii";
> +
> +                       fixed-link {
> +                               full-duplex;
> +                               pause;
> +                               speed = <1000>;
> +                       };
> +               };

This node is labeled as "gmac1" in mt7621.dtsi, so you don't need to redefine
/ethernet@1e100000/mac@1 here to be able to modify the node. Use &gmac1 {...} like you do
with spi0.

You can also drop the references to ethernet@1e100000 and mac@0, since you don't modify
any of their properties.

> +       };
> +
> +};
> +
> +&spi0 {
> +       status = "okay";
> +
> +       flash@0 {
> +               compatible = "jedec,spi-nor";
> +               reg = <0>;
> +               spi-max-frequency = <20000000>;
> +
> +               partitions {
> +                       compatible = "fixed-partitions";
> +                       #address-cells = <1>;
> +                       #size-cells = <1>;
> +
> +                       partition@0 {
> +                               label = "u-boot";
> +                               reg = <0x0 0x80000>;
> +                               read-only;
> +                       };
> +
> +                       partition@80000 {
> +                               label = "partition-table";
> +                               reg = <0x80000 0x10000>;
> +                               read-only;
> +                       };
> +
> +                       info: partition@90000 {
> +                               label = "product-info";
> +                               reg = <0x90000 0x10000>;
> +                               read-only;
> +                       };
> +
> +                       partition@a0000 {
> +                               compatible = "denx,fit";
> +                               label = "firmware";
> +                               reg = <0x0a0000 0xcf0000>;
> +                       };
> +
> +                       partition@d90000 {
> +                               label = "user-config";
> +                               reg = <0xd90000 0x60000>;
> +                               read-only;
> +                       };
> +
> +                       partition@f30000 {
> +                               label = "mutil-log";
> +                               reg = <0xf30000 0x80000>;
> +                               read-only;
> +                       };
> +
> +                       partition@fb0000 {
> +                               label = "oops";
> +                               reg = <0xfb0000 0x040000>;
> +                               read-only;
> +                       };
> +
> +                       radio: partition@ff0000 {
> +                               label = "radio";
> +                               reg = <0xff0000 0x010000>;
> +                               read-only;
> +                       };
> +
> +                       partition@1000000 {
> +                               status = "disabled";
> +
> +                               label = "full";
> +                               reg = <0x0 0x1000000>;
> +                               read-only;
> +                       };

Is this the partition layout as defined in partition-table, or the runtime one from
/proc/mtd? We've noticed they can be different, and the runtime one is actually the one
that should be used in order to not erase the stock configuration.

> +
> +               };
> +       };
> +};
> +
> +&state_default {
> +       gpio {
> +               groups = "uart2", "uart3";
> +               function = "gpio";
> +       };
> +};
> +
> +&pcie {
> +       status = "okay";
> +
> +       bus-range = <0x00 0xff>;

This is the default value according to Documentation/devicetree/bindings/pci/host-generic-
pci.txt. Any particular reason you're specifying it here explicitly?

> +};
> +
> +&pcie1 {
> +       wifi@0,0 {
> +               compatible = "mediatek,mt76";
> +               reg = <0x0000 0 0 0 0>;
> +               mediatek,mtd-eeprom = <&radio 0x0>;
> +               nvmem-cells = <&macaddr_info_8>;
> +               nvmem-cell-names = "mac-address";
> +       };
> +};
> +
> +&pcie2 {
> +       status = "disabled";
> +};

Is pcie0 used for anything? Otherwise it can probably also be disabled, or you can drop
this block to make the device DTS smaller.

> +
> +&gmac0 {
> +       nvmem-cells = <&macaddr_info_8>;
> +       nvmem-cell-names = "mac-address";
> +};

Ah, so you *are* modifying gmac0! Maybe put the &gmac1 section here too, then.

> +
> +&switch0 {
> +       compatible = "mediatek,mt7530";
> +       ports {
> +               port@0 {
> +                       status = "okay";
> +                       label = "lan0";
> +               };
> +
> +               port@1 {
> +                       status = "okay";
> +                       label = "lan3";
> +               };
> +
> +               port@2 {
> +                       status = "okay";
> +                       label = "lan2";
> +               };
> +
> +               port@3 {
> +                       status = "okay";
> +                       label = "lan1";
> +               };
> +
> +               port@5 {
> +                       phy-mode = "rgmii";
> +                       reg = <5>;
> +
> +                       /*
> +                       fixed-link {
> +                               full-duplex;
> +                               speed = <1000>;
> +                       };
> +                       */

Does the CPU connect to the switch by both gmac-s? If so, leave a comment so this can be
enabled once support for this arrives. Otherwise I think you could drop port@5. You also
enable gmac1, but AFAICT it doesn't seem to be connected to anything.

> +               };
> +
> +               port@6 {
> +                       phy-mode = "rgmii";
> +                       ethernet = <&gmac0>;
> +
> +                       fixed-link {
> +                               pause;
> +                               speed = <1000>;
> +                       };
> +               };
> +
> +       };
> +};
> +
> +&info {
> +       compatible = "nvmem-cells";
> +       #address-cells = <1>;
> +       #size-cells = <1>;
> +
> +       macaddr_info_8: macaddr@8 {
> +               reg = <0x8 0x6>;
> +       };
> +};

This could also just go into the definition of partition@90000 itself, but either way is
fine for me.

> diff --git a/target/linux/ramips/image/mt7621.mk b/target/linux/ramips/image/mt7621.mk
> index a461c57f15..617c8adc37 100644
> --- a/target/linux/ramips/image/mt7621.mk
> +++ b/target/linux/ramips/image/mt7621.mk
> @@ -1461,6 +1461,18 @@ define Device/tplink_eap235-wall-v1
>  endef
>  TARGET_DEVICES += tplink_eap235-wall-v1
>  
> +define Device/tplink_eap615-wall-v1
> +  $(Device/tplink-safeloader)

Missing $(Device/dsa-migration).

> +  DEVICE_MODEL := EAP615-Wall
> +  DEVICE_VARIANT := v1
> +  DEVICE_PACKAGES := kmod-mt7915e
> +  TPLINK_BOARD_ID := EAP615-WALL-V1
> +  KERNEL := kernel-bin | lzma | fit lzma $$(KDIR)/image-$$(firstword
> $$(DEVICE_DTS)).dtb | pad-to 64k
> +  KERNEL_INITRAMFS := kernel-bin | lzma | fit lzma $$(KDIR)/image-$$(firstword
> $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k

Is the 'pad-to 64k' required? mtdsplit can split at arbitrary boundaries, so I think the
padding here isn't very useful. The other device with FIT images on mt7621 also don't add
padding to the kernel.

> +  IMAGE_SIZE := 13248k
> +endef
> +TARGET_DEVICES += tplink_eap615-wall-v1
> +
>  define Device/tplink_re350-v1
>    $(Device/dsa-migration)
>    $(Device/tplink-safeloader)
> diff --git a/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
> b/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
> index 52e0b6b572..3e34ede3be 100644
> --- a/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
> +++ b/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
> @@ -59,7 +59,8 @@ ramips_setup_interfaces()
>         mikrotik,routerboard-760igs)
>                 ucidef_set_interfaces_lan_wan "lan2 lan3 lan4 lan5" "wan sfp"
>                 ;;
> -       tplink,eap235-wall-v1)
> +       tplink,eap235-wall-v1|\
> +       tplink,eap615-wall-v1)
>                 ucidef_set_interface_lan "lan0 lan1 lan2 lan3"
>                 ;;
>         ubnt,edgerouter-x)
> diff --git a/tools/firmware-utils/patches/999-eap615.patch b/tools/firmware-
> utils/patches/999-eap615.patch
> new file mode 100644
> index 0000000000..2348bbce24
> --- /dev/null
> +++ b/tools/firmware-utils/patches/999-eap615.patch
> @@ -0,0 +1,55 @@
> +From 41c9244ee6347f00f8c85117d17d9d2429a25999 Mon Sep 17 00:00:00 2001
> +From: Stijn Tintel <stijn@linux-ipv6.be>
> +Date: Thu, 27 Jan 2022 11:35:54 +0200
> +Subject: [PATCH] tplink-safeloader: EAP615-Wall v1 support
> +
> +Signed-off-by: Stijn Tintel <stijn@linux-ipv6.be>

This is a patch against firmware-utils, so it should be submitted separately for that
repository.


Best,
Sander

> +---
> + src/tplink-safeloader.c | 31 +++++++++++++++++++++++++++++++
> + 1 file changed, 31 insertions(+)
> +
> +diff --git a/src/tplink-safeloader.c b/src/tplink-safeloader.c
> +index 0565dcc..009b2c4 100644
> +--- a/src/tplink-safeloader.c
> ++++ b/src/tplink-safeloader.c
> +@@ -1703,6 +1703,37 @@ static struct device_info boards[] = {
> +               .last_sysupgrade_partition = "file-system"
> +       },
> + 
> ++      /** Firmware layout for the EAP615-Wall v1 */
> ++      {
> ++              .id = "EAP615-WALL-V1",
> ++              .soft_ver = SOFT_VER_DEFAULT,
> ++              .soft_ver_compat_level = 1,
> ++              .support_list =
> ++                      "SupportList:\r\n"
> ++                      "EAP615-Wall(TP-Link|UN|AX1800-D):1.0\r\n"
> ++                      "EAP615-Wall(TP-Link|CA|AX1800-D):1.0\r\n"
> ++                      "EAP615-Wall(TP-Link|JP|AX1800-D):1.0\r\n",
> ++              .part_trail = PART_TRAIL_NONE,
> ++
> ++              .partitions = {
> ++                      {"fs-uboot", 0x00000, 0x80000},
> ++                      {"partition-table", 0x80000, 0x02000},
> ++                      {"default-mac", 0x90000, 0x01000},
> ++                      {"support-list", 0x91000, 0x00100},
> ++                      {"product-info", 0x91100, 0x00400},
> ++                      {"soft-version", 0x92000, 0x00100},
> ++                      {"firmware", 0xa0000, 0xcf0000},
> ++                      {"user-config", 0xd90000, 0x60000},
> ++                      {"mutil-log", 0xf30000, 0x80000},
> ++                      {"oops", 0xfb0000, 0x40000},
> ++                      {"radio", 0xff0000, 0x10000},
> ++                      {NULL, 0, 0}
> ++              },
> ++
> ++              .first_sysupgrade_partition = "os-image",
> ++              .last_sysupgrade_partition = "file-system"
> ++      },
> ++
> +       /** Firmware layout for the TL-WA1201 v2 */
> +       {
> +               .id     = "TL-WA1201-V2",
> +-- 
> +2.34.1
> +
Arınç ÜNAL Jan. 29, 2022, 8 p.m. UTC | #2
On 29/01/2022 16:03, Sander Vanheule wrote:
> Hi Stijn,
> 
> Thanks for the patch, been looking forward to this!
> 
> On Fri, 2022-01-28 at 00:00 +0200, Stijn Tintel wrote:
>> Add support for the TP-Link EAP615-Wall, an AX1800 Wall Plate WiFi 6 AP.
>> The device is very similar to the TP-Link EAP235-Wall.
>>
>> Hardware:
>> * SoC: MediaTek MT7621AT
>> * RAM: 128MiB
>> * Flash: 16MiB SPI-NOR
>> * Ethernet: 4x GbE
>>    * Back: ETH0 (PoE-PD)
>>    * Bottom: ETH1, ETH2, ETH3 (PoE-PT)
> 
> PT > passthrough
> 
>> * WiFi: MT7915E 2.4/5 GHz 2T2R
>> * LEDS: 1x white
>> * Buttons: 1x LED, 1x reset
>>
>> Stock firmware uses a random MAC address for ethernet. OpenWrt uses the
>> MAC address that is on the device label for ethernet and the wireless
>> interfaces. MAC address must not be incremented, as this will cause MAC
>> address conflicts in case you have two devices with consecutive MAC
>> addresses. Instead, different locally administered addresses will be
>> generated automatically, based on the MAC on the label.
>>
>> Installation via stock firmware:
>> * Enable SSH in the TP-Link web interface
>> * SSH to the device
>> * Run `cliclientd stopcs`
>> * Upload the OpenWrt factory image via the TP-Link webinterface
>>
>> Installation via bootloader:
>> * Solder TTL header. Pinout: 1: TX, 2: RX, 3: GND, 4: VCC, with pin 1
>>    closest to ETH1. Baud rate 115200
>> * Interrupt boot process by holding a key during boot
>> * Boot the OpenWrt initramfs:
>>    # tftpboot 0x84000000 openwrt-ramips-mt7621-tplink_eap615-wall-v1-initramfs-kernel.bin
>>    # bootm
>> * Copy openwrt-ramips-mt7621-tplink_eap615-wall-v1-squashfs-sysupgrade.bin
>>    to /tmp and use sysupgrade to install it
>>
>> Thanks to Sander Vanheule for his work on the EAP235-Wall, which made
>> adding support for the EAP615-Wall very easy.
>>
>> Signed-off-by: Stijn Tintel <stijn@linux-ipv6.be>
>> ---
>>   .../dts/mt7621_tplink_eap615-wall-v1.dts      | 250 ++++++++++++++++++
>>   target/linux/ramips/image/mt7621.mk           |  12 +
>>   .../mt7621/base-files/etc/board.d/02_network  |   3 +-
>>   tools/firmware-utils/patches/999-eap615.patch |  55 ++++
>>   4 files changed, 319 insertions(+), 1 deletion(-)
>>   create mode 100644 target/linux/ramips/dts/mt7621_tplink_eap615-wall-v1.dts
>>   create mode 100644 tools/firmware-utils/patches/999-eap615.patch
>>
>> diff --git a/target/linux/ramips/dts/mt7621_tplink_eap615-wall-v1.dts
>> b/target/linux/ramips/dts/mt7621_tplink_eap615-wall-v1.dts
>> new file mode 100644
>> index 0000000000..fd5a68973b
>> --- /dev/null
>> +++ b/target/linux/ramips/dts/mt7621_tplink_eap615-wall-v1.dts
>> @@ -0,0 +1,250 @@
>> +// SPDX-License-Identifier: GPL-2.0-or-later
>> +
>> +#include "mt7621.dtsi"
>> +
>> +#include <dt-bindings/gpio/gpio.h>
>> +#include <dt-bindings/input/input.h>
>> +#include <dt-bindings/leds/common.h>
>> +
>> +/ {
>> +       compatible = "tplink,eap615-wall-v1", "mediatek,mt7621-soc";
>> +       model = "TP-Link EAP615-Wall v1";
>> +
>> +       aliases {
>> +               label-mac-device = &gmac0;
>> +               led-boot = &led_status;
>> +               led-failsafe = &led_status;
>> +               led-running = &led_status;
>> +               led-upgrade = &led_status;
>> +       };
>> +
>> +       chosen {
>> +               bootargs = "console=ttyS0,115200";
>> +       };
>> +
>> +       leds {
>> +               compatible = "gpio-leds";
>> +
>> +               led_status: status {
>> +                       label = "white:status";
>> +                       color = <LED_COLOR_ID_WHITE>;
>> +                       function = LED_FUNCTION_STATUS;
>> +                       gpios = <&gpio 12 GPIO_ACTIVE_LOW>;
>> +               };
>> +       };
>> +
>> +       keys {
>> +               compatible = "gpio-keys";
>> +
>> +               led {
>> +                       label = "led";
>> +                       gpios = <&gpio 10 GPIO_ACTIVE_LOW>;
>> +                       linux,code = <KEY_LIGHTS_TOGGLE>;
>> +               };
>> +
>> +               reset {
>> +                       label = "reset";
>> +                       gpios = <&gpio 8 GPIO_ACTIVE_LOW>;
>> +                       linux,code = <KEY_RESTART>;
>> +               };
>> +       };
>> +
>> +       gpio-export {
>> +               compatible = "gpio-export";
>> +
>> +               poe_passthrough {
>> +                       gpio-export,name = "poe-passthrough";
>> +                       gpio-export,output = <0>;
>> +                       gpios = <&gpio 7 GPIO_ACTIVE_HIGH>;
>> +               };
>> +       };
>> +
>> +       ethernet@1e100000 {
>> +               reg = <0x1e100000 0xe000>;
>> +
>> +               mac@0 {
>> +                       phy-mode = "rgmii";
>> +
>> +                       fixed-link {
>> +                               pause;
>> +                               speed = <1000>;
>> +                       };
>> +               };
>> +
>> +               mac@1 {
>> +                       status = "okay";
>> +
>> +                       phy-mode = "rgmii";
>> +
>> +                       fixed-link {
>> +                               full-duplex;
>> +                               pause;
>> +                               speed = <1000>;
>> +                       };
>> +               };
> 
> This node is labeled as "gmac1" in mt7621.dtsi, so you don't need to redefine
> /ethernet@1e100000/mac@1 here to be able to modify the node. Use &gmac1 {...} like you do
> with spi0.
> 
> You can also drop the references to ethernet@1e100000 and mac@0, since you don't modify
> any of their properties.
> 
>> +       };
>> +
>> +};
>> +
>> +&spi0 {
>> +       status = "okay";
>> +
>> +       flash@0 {
>> +               compatible = "jedec,spi-nor";
>> +               reg = <0>;
>> +               spi-max-frequency = <20000000>;
>> +
>> +               partitions {
>> +                       compatible = "fixed-partitions";
>> +                       #address-cells = <1>;
>> +                       #size-cells = <1>;
>> +
>> +                       partition@0 {
>> +                               label = "u-boot";
>> +                               reg = <0x0 0x80000>;
>> +                               read-only;
>> +                       };
>> +
>> +                       partition@80000 {
>> +                               label = "partition-table";
>> +                               reg = <0x80000 0x10000>;
>> +                               read-only;
>> +                       };
>> +
>> +                       info: partition@90000 {
>> +                               label = "product-info";
>> +                               reg = <0x90000 0x10000>;
>> +                               read-only;
>> +                       };
>> +
>> +                       partition@a0000 {
>> +                               compatible = "denx,fit";
>> +                               label = "firmware";
>> +                               reg = <0x0a0000 0xcf0000>;
>> +                       };
>> +
>> +                       partition@d90000 {
>> +                               label = "user-config";
>> +                               reg = <0xd90000 0x60000>;
>> +                               read-only;
>> +                       };
>> +
>> +                       partition@f30000 {
>> +                               label = "mutil-log";
>> +                               reg = <0xf30000 0x80000>;
>> +                               read-only;
>> +                       };
>> +
>> +                       partition@fb0000 {
>> +                               label = "oops";
>> +                               reg = <0xfb0000 0x040000>;
>> +                               read-only;
>> +                       };
>> +
>> +                       radio: partition@ff0000 {
>> +                               label = "radio";
>> +                               reg = <0xff0000 0x010000>;
>> +                               read-only;
>> +                       };
>> +
>> +                       partition@1000000 {
>> +                               status = "disabled";
>> +
>> +                               label = "full";
>> +                               reg = <0x0 0x1000000>;
>> +                               read-only;
>> +                       };
> 
> Is this the partition layout as defined in partition-table, or the runtime one from
> /proc/mtd? We've noticed they can be different, and the runtime one is actually the one
> that should be used in order to not erase the stock configuration.
> 
>> +
>> +               };
>> +       };
>> +};
>> +
>> +&state_default {
>> +       gpio {
>> +               groups = "uart2", "uart3";
>> +               function = "gpio";
>> +       };
>> +};
>> +
>> +&pcie {
>> +       status = "okay";
>> +
>> +       bus-range = <0x00 0xff>;
> 
> This is the default value according to Documentation/devicetree/bindings/pci/host-generic-
> pci.txt. Any particular reason you're specifying it here explicitly?
> 
>> +};
>> +
>> +&pcie1 {
>> +       wifi@0,0 {
>> +               compatible = "mediatek,mt76";
>> +               reg = <0x0000 0 0 0 0>;
>> +               mediatek,mtd-eeprom = <&radio 0x0>;
>> +               nvmem-cells = <&macaddr_info_8>;
>> +               nvmem-cell-names = "mac-address";
>> +       };
>> +};
>> +
>> +&pcie2 {
>> +       status = "disabled";
>> +};
> 
> Is pcie0 used for anything? Otherwise it can probably also be disabled, or you can drop
> this block to make the device DTS smaller.
> 
>> +
>> +&gmac0 {
>> +       nvmem-cells = <&macaddr_info_8>;
>> +       nvmem-cell-names = "mac-address";
>> +};
> 
> Ah, so you *are* modifying gmac0! Maybe put the &gmac1 section here too, then.
> 
>> +
>> +&switch0 {
>> +       compatible = "mediatek,mt7530";
>> +       ports {
>> +               port@0 {
>> +                       status = "okay";
>> +                       label = "lan0";
>> +               };
>> +
>> +               port@1 {
>> +                       status = "okay";
>> +                       label = "lan3";
>> +               };
>> +
>> +               port@2 {
>> +                       status = "okay";
>> +                       label = "lan2";
>> +               };
>> +
>> +               port@3 {
>> +                       status = "okay";
>> +                       label = "lan1";
>> +               };
>> +
>> +               port@5 {
>> +                       phy-mode = "rgmii";
>> +                       reg = <5>;
>> +
>> +                       /*
>> +                       fixed-link {
>> +                               full-duplex;
>> +                               speed = <1000>;
>> +                       };
>> +                       */
> 
> Does the CPU connect to the switch by both gmac-s? If so, leave a comment so this can be
> enabled once support for this arrives. Otherwise I think you could drop port@5. You also
> enable gmac1, but AFAICT it doesn't seem to be connected to anything.

gmac1 shouldn't even work right now. I recently had my patch applied 
upstream to fix it:
https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git/commit/?h=staging-next&id=0a93c0d75809582893e82039143591b9265b520e

port@5 is connected to gmac1 (and might share the rgmii bus with an 
external phy, refer to 
Documentation/devicetree/bindings/net/dsa/mt7530.txt) but mt7530 DSA 
driver doesn't support it as a CPU port at the moment, causes kernel 
panic. port@5 and gmac1 nodes can be dropped altogether.

Arınç
Stijn Tintel Feb. 4, 2022, 6:05 p.m. UTC | #3
On 29/01/2022 15:03, Sander Vanheule wrote:
> Hi Stijn,
>
> Thanks for the patch, been looking forward to this!
>
> On Fri, 2022-01-28 at 00:00 +0200, Stijn Tintel wrote:
>> Add support for the TP-Link EAP615-Wall, an AX1800 Wall Plate WiFi 6 AP.
>> The device is very similar to the TP-Link EAP235-Wall.
>>
>> Hardware:
>> * SoC: MediaTek MT7621AT
>> * RAM: 128MiB
>> * Flash: 16MiB SPI-NOR
>> * Ethernet: 4x GbE
>>   * Back: ETH0 (PoE-PD)
>>   * Bottom: ETH1, ETH2, ETH3 (PoE-PT)
> PT > passthrough
Not sure what else PoE-PT can refer to. I like that it's the same style
as PoE-PD.
>
>> * WiFi: MT7915E 2.4/5 GHz 2T2R
>> * LEDS: 1x white
>> * Buttons: 1x LED, 1x reset
>>
>> Stock firmware uses a random MAC address for ethernet. OpenWrt uses the
>> MAC address that is on the device label for ethernet and the wireless
>> interfaces. MAC address must not be incremented, as this will cause MAC
>> address conflicts in case you have two devices with consecutive MAC
>> addresses. Instead, different locally administered addresses will be
>> generated automatically, based on the MAC on the label.
>>
>> Installation via stock firmware:
>> * Enable SSH in the TP-Link web interface
>> * SSH to the device
>> * Run `cliclientd stopcs`
>> * Upload the OpenWrt factory image via the TP-Link webinterface
>>
>> Installation via bootloader:
>> * Solder TTL header. Pinout: 1: TX, 2: RX, 3: GND, 4: VCC, with pin 1
>>   closest to ETH1. Baud rate 115200
>> * Interrupt boot process by holding a key during boot
>> * Boot the OpenWrt initramfs:
>>   # tftpboot 0x84000000 openwrt-ramips-mt7621-tplink_eap615-wall-v1-initramfs-kernel.bin
>>   # bootm
>> * Copy openwrt-ramips-mt7621-tplink_eap615-wall-v1-squashfs-sysupgrade.bin
>>   to /tmp and use sysupgrade to install it
>>
>> Thanks to Sander Vanheule for his work on the EAP235-Wall, which made
>> adding support for the EAP615-Wall very easy.
>>
>> Signed-off-by: Stijn Tintel <stijn@linux-ipv6.be>
>> ---
>>  .../dts/mt7621_tplink_eap615-wall-v1.dts      | 250 ++++++++++++++++++
>>  target/linux/ramips/image/mt7621.mk           |  12 +
>>  .../mt7621/base-files/etc/board.d/02_network  |   3 +-
>>  tools/firmware-utils/patches/999-eap615.patch |  55 ++++
>>  4 files changed, 319 insertions(+), 1 deletion(-)
>>  create mode 100644 target/linux/ramips/dts/mt7621_tplink_eap615-wall-v1.dts
>>  create mode 100644 tools/firmware-utils/patches/999-eap615.patch
>>
>> diff --git a/target/linux/ramips/dts/mt7621_tplink_eap615-wall-v1.dts
>> b/target/linux/ramips/dts/mt7621_tplink_eap615-wall-v1.dts
>> new file mode 100644
>> index 0000000000..fd5a68973b
>> --- /dev/null
>> +++ b/target/linux/ramips/dts/mt7621_tplink_eap615-wall-v1.dts
>> @@ -0,0 +1,250 @@
>> +// SPDX-License-Identifier: GPL-2.0-or-later
>> +
>> +#include "mt7621.dtsi"
>> +
>> +#include <dt-bindings/gpio/gpio.h>
>> +#include <dt-bindings/input/input.h>
>> +#include <dt-bindings/leds/common.h>
>> +
>> +/ {
>> +       compatible = "tplink,eap615-wall-v1", "mediatek,mt7621-soc";
>> +       model = "TP-Link EAP615-Wall v1";
>> +
>> +       aliases {
>> +               label-mac-device = &gmac0;
>> +               led-boot = &led_status;
>> +               led-failsafe = &led_status;
>> +               led-running = &led_status;
>> +               led-upgrade = &led_status;
>> +       };
>> +
>> +       chosen {
>> +               bootargs = "console=ttyS0,115200";
>> +       };
>> +
>> +       leds {
>> +               compatible = "gpio-leds";
>> +
>> +               led_status: status {
>> +                       label = "white:status";
>> +                       color = <LED_COLOR_ID_WHITE>;
>> +                       function = LED_FUNCTION_STATUS;
>> +                       gpios = <&gpio 12 GPIO_ACTIVE_LOW>;
>> +               };
>> +       };
>> +
>> +       keys {
>> +               compatible = "gpio-keys";
>> +
>> +               led {
>> +                       label = "led";
>> +                       gpios = <&gpio 10 GPIO_ACTIVE_LOW>;
>> +                       linux,code = <KEY_LIGHTS_TOGGLE>;
>> +               };
>> +
>> +               reset {
>> +                       label = "reset";
>> +                       gpios = <&gpio 8 GPIO_ACTIVE_LOW>;
>> +                       linux,code = <KEY_RESTART>;
>> +               };
>> +       };
>> +
>> +       gpio-export {
>> +               compatible = "gpio-export";
>> +
>> +               poe_passthrough {
>> +                       gpio-export,name = "poe-passthrough";
>> +                       gpio-export,output = <0>;
>> +                       gpios = <&gpio 7 GPIO_ACTIVE_HIGH>;
>> +               };
>> +       };
>> +
>> +       ethernet@1e100000 {
>> +               reg = <0x1e100000 0xe000>;
>> +
>> +               mac@0 {
>> +                       phy-mode = "rgmii";
>> +
>> +                       fixed-link {
>> +                               pause;
>> +                               speed = <1000>;
>> +                       };
>> +               };
>> +
>> +               mac@1 {
>> +                       status = "okay";
>> +
>> +                       phy-mode = "rgmii";
>> +
>> +                       fixed-link {
>> +                               full-duplex;
>> +                               pause;
>> +                               speed = <1000>;
>> +                       };
>> +               };
> This node is labeled as "gmac1" in mt7621.dtsi, so you don't need to redefine
> /ethernet@1e100000/mac@1 here to be able to modify the node. Use &gmac1 {...} like you do
> with spi0.
>
> You can also drop the references to ethernet@1e100000 and mac@0, since you don't modify
> any of their properties.

mt7621.dsti:
reg = <0x1e100000 0x10000>;

eap615:
reg = <0x1e100000 0xe000>;

Moved to &ethernet and dropped the rest. Also dropped speed from mac@0,
as the dtsi sets this to 1000 already.

>
>> +       };
>> +
>> +};
>> +
>> +&spi0 {
>> +       status = "okay";
>> +
>> +       flash@0 {
>> +               compatible = "jedec,spi-nor";
>> +               reg = <0>;
>> +               spi-max-frequency = <20000000>;
>> +
>> +               partitions {
>> +                       compatible = "fixed-partitions";
>> +                       #address-cells = <1>;
>> +                       #size-cells = <1>;
>> +
>> +                       partition@0 {
>> +                               label = "u-boot";
>> +                               reg = <0x0 0x80000>;
>> +                               read-only;
>> +                       };
>> +
>> +                       partition@80000 {
>> +                               label = "partition-table";
>> +                               reg = <0x80000 0x10000>;
>> +                               read-only;
>> +                       };
>> +
>> +                       info: partition@90000 {
>> +                               label = "product-info";
>> +                               reg = <0x90000 0x10000>;
>> +                               read-only;
>> +                       };
>> +
>> +                       partition@a0000 {
>> +                               compatible = "denx,fit";
>> +                               label = "firmware";
>> +                               reg = <0x0a0000 0xcf0000>;
>> +                       };
>> +
>> +                       partition@d90000 {
>> +                               label = "user-config";
>> +                               reg = <0xd90000 0x60000>;
>> +                               read-only;
>> +                       };
>> +
>> +                       partition@f30000 {
>> +                               label = "mutil-log";
>> +                               reg = <0xf30000 0x80000>;
>> +                               read-only;
>> +                       };
>> +
>> +                       partition@fb0000 {
>> +                               label = "oops";
>> +                               reg = <0xfb0000 0x040000>;
>> +                               read-only;
>> +                       };
>> +
>> +                       radio: partition@ff0000 {
>> +                               label = "radio";
>> +                               reg = <0xff0000 0x010000>;
>> +                               read-only;
>> +                       };
>> +
>> +                       partition@1000000 {
>> +                               status = "disabled";
>> +
>> +                               label = "full";
>> +                               reg = <0x0 0x1000000>;
>> +                               read-only;
>> +                       };
> Is this the partition layout as defined in partition-table, or the runtime one from
> /proc/mtd? We've noticed they can be different, and the runtime one is actually the one
> that should be used in order to not erase the stock configuration.
I honestly don't recall, and I don't have an unmodified EAP615-Wall
anymore. Can anyone get me that runtime OEM partition layout?
>> +
>> +               };
>> +       };
>> +};
>> +
>> +&state_default {
>> +       gpio {
>> +               groups = "uart2", "uart3";
>> +               function = "gpio";
>> +       };
>> +};
>> +
>> +&pcie {
>> +       status = "okay";
>> +
>> +       bus-range = <0x00 0xff>;
> This is the default value according to Documentation/devicetree/bindings/pci/host-generic-
> pci.txt. Any particular reason you're specifying it here explicitly?
OEM DTS leftover; removed.
>
>> +};
>> +
>> +&pcie1 {
>> +       wifi@0,0 {
>> +               compatible = "mediatek,mt76";
>> +               reg = <0x0000 0 0 0 0>;
>> +               mediatek,mtd-eeprom = <&radio 0x0>;
>> +               nvmem-cells = <&macaddr_info_8>;
>> +               nvmem-cell-names = "mac-address";
>> +       };
>> +};
>> +
>> +&pcie2 {
>> +       status = "disabled";
>> +};
> Is pcie0 used for anything? Otherwise it can probably also be disabled, or you can drop
> this block to make the device DTS smaller.

Disabling pcie0 breaks WiFi.
Disabling pcie2 avoids this message during boot:

[    1.324025] mt7621-pci 1e140000.pcie: pcie2 no card, disable it (RST
& CLK)

>
>> +
>> +&gmac0 {
>> +       nvmem-cells = <&macaddr_info_8>;
>> +       nvmem-cell-names = "mac-address";
>> +};
> Ah, so you *are* modifying gmac0! Maybe put the &gmac1 section here too, then.
>
>> +
>> +&switch0 {
>> +       compatible = "mediatek,mt7530";
>> +       ports {
>> +               port@0 {
>> +                       status = "okay";
>> +                       label = "lan0";
>> +               };
>> +
>> +               port@1 {
>> +                       status = "okay";
>> +                       label = "lan3";
>> +               };
>> +
>> +               port@2 {
>> +                       status = "okay";
>> +                       label = "lan2";
>> +               };
>> +
>> +               port@3 {
>> +                       status = "okay";
>> +                       label = "lan1";
>> +               };
>> +
>> +               port@5 {
>> +                       phy-mode = "rgmii";
>> +                       reg = <5>;
>> +
>> +                       /*
>> +                       fixed-link {
>> +                               full-duplex;
>> +                               speed = <1000>;
>> +                       };
>> +                       */
> Does the CPU connect to the switch by both gmac-s? If so, leave a comment so this can be
> enabled once support for this arrives. Otherwise I think you could drop port@5. You also
> enable gmac1, but AFAICT it doesn't seem to be connected to anything.
OEM DTS leftover; removed.
>
>> +               };
>> +
>> +               port@6 {
>> +                       phy-mode = "rgmii";
>> +                       ethernet = <&gmac0>;
>> +
>> +                       fixed-link {
>> +                               pause;
>> +                               speed = <1000>;
>> +                       };
>> +               };
>> +
>> +       };
>> +};
>> +
>> +&info {
>> +       compatible = "nvmem-cells";
>> +       #address-cells = <1>;
>> +       #size-cells = <1>;
>> +
>> +       macaddr_info_8: macaddr@8 {
>> +               reg = <0x8 0x6>;
>> +       };
>> +};
> This could also just go into the definition of partition@90000 itself, but either way is
> fine for me.
Prefer to keep as-is, like in the DTS of its sibling.
>
>> diff --git a/target/linux/ramips/image/mt7621.mk b/target/linux/ramips/image/mt7621.mk
>> index a461c57f15..617c8adc37 100644
>> --- a/target/linux/ramips/image/mt7621.mk
>> +++ b/target/linux/ramips/image/mt7621.mk
>> @@ -1461,6 +1461,18 @@ define Device/tplink_eap235-wall-v1
>>  endef
>>  TARGET_DEVICES += tplink_eap235-wall-v1
>>  
>> +define Device/tplink_eap615-wall-v1
>> +  $(Device/tplink-safeloader)
> Missing $(Device/dsa-migration).
This is a new device, so there isn't anything to migrate. This sounds weird?
>
>> +  DEVICE_MODEL := EAP615-Wall
>> +  DEVICE_VARIANT := v1
>> +  DEVICE_PACKAGES := kmod-mt7915e
>> +  TPLINK_BOARD_ID := EAP615-WALL-V1
>> +  KERNEL := kernel-bin | lzma | fit lzma $$(KDIR)/image-$$(firstword
>> $$(DEVICE_DTS)).dtb | pad-to 64k
>> +  KERNEL_INITRAMFS := kernel-bin | lzma | fit lzma $$(KDIR)/image-$$(firstword
>> $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k
> Is the 'pad-to 64k' required? mtdsplit can split at arbitrary boundaries, so I think the
> padding here isn't very useful. The other device with FIT images on mt7621 also don't add
> padding to the kernel.
Removed.
>
>> +  IMAGE_SIZE := 13248k
>> +endef
>> +TARGET_DEVICES += tplink_eap615-wall-v1
>> +
>>  define Device/tplink_re350-v1
>>    $(Device/dsa-migration)
>>    $(Device/tplink-safeloader)
>> diff --git a/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
>> b/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
>> index 52e0b6b572..3e34ede3be 100644
>> --- a/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
>> +++ b/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
>> @@ -59,7 +59,8 @@ ramips_setup_interfaces()
>>         mikrotik,routerboard-760igs)
>>                 ucidef_set_interfaces_lan_wan "lan2 lan3 lan4 lan5" "wan sfp"
>>                 ;;
>> -       tplink,eap235-wall-v1)
>> +       tplink,eap235-wall-v1|\
>> +       tplink,eap615-wall-v1)
>>                 ucidef_set_interface_lan "lan0 lan1 lan2 lan3"
>>                 ;;
>>         ubnt,edgerouter-x)
>> diff --git a/tools/firmware-utils/patches/999-eap615.patch b/tools/firmware-
>> utils/patches/999-eap615.patch
>> new file mode 100644
>> index 0000000000..2348bbce24
>> --- /dev/null
>> +++ b/tools/firmware-utils/patches/999-eap615.patch
>> @@ -0,0 +1,55 @@
>> +From 41c9244ee6347f00f8c85117d17d9d2429a25999 Mon Sep 17 00:00:00 2001
>> +From: Stijn Tintel <stijn@linux-ipv6.be>
>> +Date: Thu, 27 Jan 2022 11:35:54 +0200
>> +Subject: [PATCH] tplink-safeloader: EAP615-Wall v1 support
>> +
>> +Signed-off-by: Stijn Tintel <stijn@linux-ipv6.be>
> This is a patch against firmware-utils, so it should be submitted separately for that
> repository.
Yes, just keeping all changes together for review purposes. Have you
reviewed this part? If so I'll push it to firmware-utils already.
>
>
> Best,
> Sander
>
>> +---
>> + src/tplink-safeloader.c | 31 +++++++++++++++++++++++++++++++
>> + 1 file changed, 31 insertions(+)
>> +
>> +diff --git a/src/tplink-safeloader.c b/src/tplink-safeloader.c
>> +index 0565dcc..009b2c4 100644
>> +--- a/src/tplink-safeloader.c
>> ++++ b/src/tplink-safeloader.c
>> +@@ -1703,6 +1703,37 @@ static struct device_info boards[] = {
>> +               .last_sysupgrade_partition = "file-system"
>> +       },
>> + 
>> ++      /** Firmware layout for the EAP615-Wall v1 */
>> ++      {
>> ++              .id = "EAP615-WALL-V1",
>> ++              .soft_ver = SOFT_VER_DEFAULT,
>> ++              .soft_ver_compat_level = 1,
>> ++              .support_list =
>> ++                      "SupportList:\r\n"
>> ++                      "EAP615-Wall(TP-Link|UN|AX1800-D):1.0\r\n"
>> ++                      "EAP615-Wall(TP-Link|CA|AX1800-D):1.0\r\n"
>> ++                      "EAP615-Wall(TP-Link|JP|AX1800-D):1.0\r\n",
>> ++              .part_trail = PART_TRAIL_NONE,
>> ++
>> ++              .partitions = {
>> ++                      {"fs-uboot", 0x00000, 0x80000},
>> ++                      {"partition-table", 0x80000, 0x02000},
>> ++                      {"default-mac", 0x90000, 0x01000},
>> ++                      {"support-list", 0x91000, 0x00100},
>> ++                      {"product-info", 0x91100, 0x00400},
>> ++                      {"soft-version", 0x92000, 0x00100},
>> ++                      {"firmware", 0xa0000, 0xcf0000},
>> ++                      {"user-config", 0xd90000, 0x60000},
>> ++                      {"mutil-log", 0xf30000, 0x80000},
>> ++                      {"oops", 0xfb0000, 0x40000},
>> ++                      {"radio", 0xff0000, 0x10000},
>> ++                      {NULL, 0, 0}
>> ++              },
>> ++
>> ++              .first_sysupgrade_partition = "os-image",
>> ++              .last_sysupgrade_partition = "file-system"
>> ++      },
>> ++
>> +       /** Firmware layout for the TL-WA1201 v2 */
>> +       {
>> +               .id     = "TL-WA1201-V2",
>> +-- 
>> +2.34.1
>> +

Thanks,
Stijn
Nathan Lutchansky Feb. 4, 2022, 6:54 p.m. UTC | #4
On 2/4/22 1:05 PM, Stijn Tintel wrote:
> On 29/01/2022 15:03, Sander Vanheule wrote:
>>
>> Is this the partition layout as defined in partition-table, or the runtime one from
>> /proc/mtd? We've noticed they can be different, and the runtime one is actually the one
>> that should be used in order to not erase the stock configuration.
> I honestly don't recall, and I don't have an unmodified EAP615-Wall
> anymore. Can anyone get me that runtime OEM partition layout?

I've got a new EAP615-Wall on the way, but due to the winter storms here 
in the eastern US, it won't be here until Monday. When it arrives I can 
check.  -Nathan
Stijn Tintel Feb. 5, 2022, 11:36 a.m. UTC | #5
On 4/02/2022 20:05, Stijn Tintel wrote:
>>> +  DEVICE_MODEL := EAP615-Wall
>>> +  DEVICE_VARIANT := v1
>>> +  DEVICE_PACKAGES := kmod-mt7915e
>>> +  TPLINK_BOARD_ID := EAP615-WALL-V1
>>> +  KERNEL := kernel-bin | lzma | fit lzma $$(KDIR)/image-$$(firstword
>>> $$(DEVICE_DTS)).dtb | pad-to 64k
>>> +  KERNEL_INITRAMFS := kernel-bin | lzma | fit lzma $$(KDIR)/image-$$(firstword
>>> $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k
>> Is the 'pad-to 64k' required? mtdsplit can split at arbitrary boundaries, so I think the
>> padding here isn't very useful. The other device with FIT images on mt7621 also don't add
>> padding to the kernel.
> Removed.

Removing the padding causes this logging line during boot:

[    0.712046] mtd: partition "rootfs" doesn't start on an erase/write
block boundary -- force read-only

While it doesn't cause any real issues, I prefer to not have this
message. The datasheet leaves me clueless about the erase block size,
but in sysfs I can find 64k, so I'm going to add back pad-to 64k to KERNEL.

Stijn
Sander Vanheule Feb. 5, 2022, 12:21 p.m. UTC | #6
On Fri, 2022-02-04 at 20:05 +0200, Stijn Tintel wrote:
> On 29/01/2022 15:03, Sander Vanheule wrote:
> > Hi Stijn,
> > 
> > Thanks for the patch, been looking forward to this!
> > 
> > On Fri, 2022-01-28 at 00:00 +0200, Stijn Tintel wrote:
> > > Add support for the TP-Link EAP615-Wall, an AX1800 Wall Plate WiFi 6 AP.
> > > The device is very similar to the TP-Link EAP235-Wall.
> > > 
> > > Hardware:
> > > * SoC: MediaTek MT7621AT
> > > * RAM: 128MiB
> > > * Flash: 16MiB SPI-NOR
> > > * Ethernet: 4x GbE
> > >   * Back: ETH0 (PoE-PD)
> > >   * Bottom: ETH1, ETH2, ETH3 (PoE-PT)
> > PT > passthrough
> Not sure what else PoE-PT can refer to. I like that it's the same style
> as PoE-PD.

AFAICT the PD (powered device) and PSE (power sourcing equipment) names are part of the
PoE standard, while 'PT' isn't.

> > 
> > > * WiFi: MT7915E 2.4/5 GHz 2T2R
> > > * LEDS: 1x white
> > > * Buttons: 1x LED, 1x reset
> > > 
> > > Stock firmware uses a random MAC address for ethernet. OpenWrt uses the
> > > MAC address that is on the device label for ethernet and the wireless
> > > interfaces. MAC address must not be incremented, as this will cause MAC
> > > address conflicts in case you have two devices with consecutive MAC
> > > addresses. Instead, different locally administered addresses will be
> > > generated automatically, based on the MAC on the label.
> > > 
> > > Installation via stock firmware:
> > > * Enable SSH in the TP-Link web interface
> > > * SSH to the device
> > > * Run `cliclientd stopcs`
> > > * Upload the OpenWrt factory image via the TP-Link webinterface
> > > 
> > > Installation via bootloader:
> > > * Solder TTL header. Pinout: 1: TX, 2: RX, 3: GND, 4: VCC, with pin 1
> > >   closest to ETH1. Baud rate 115200
> > > * Interrupt boot process by holding a key during boot
> > > * Boot the OpenWrt initramfs:
> > >   # tftpboot 0x84000000 openwrt-ramips-mt7621-tplink_eap615-wall-v1-initramfs-
> > > kernel.bin
> > >   # bootm
> > > * Copy openwrt-ramips-mt7621-tplink_eap615-wall-v1-squashfs-sysupgrade.bin
> > >   to /tmp and use sysupgrade to install it
> > > 
> > > Thanks to Sander Vanheule for his work on the EAP235-Wall, which made
> > > adding support for the EAP615-Wall very easy.
> > > 
> > > Signed-off-by: Stijn Tintel <stijn@linux-ipv6.be>
> > > ---
> > >  .../dts/mt7621_tplink_eap615-wall-v1.dts      | 250 ++++++++++++++++++
> > >  target/linux/ramips/image/mt7621.mk           |  12 +
> > >  .../mt7621/base-files/etc/board.d/02_network  |   3 +-
> > >  tools/firmware-utils/patches/999-eap615.patch |  55 ++++
> > >  4 files changed, 319 insertions(+), 1 deletion(-)
> > >  create mode 100644 target/linux/ramips/dts/mt7621_tplink_eap615-wall-v1.dts
> > >  create mode 100644 tools/firmware-utils/patches/999-eap615.patch
> > > 
> > > diff --git a/target/linux/ramips/dts/mt7621_tplink_eap615-wall-v1.dts
> > > b/target/linux/ramips/dts/mt7621_tplink_eap615-wall-v1.dts
> > > new file mode 100644
> > > index 0000000000..fd5a68973b
> > > --- /dev/null
> > > +++ b/target/linux/ramips/dts/mt7621_tplink_eap615-wall-v1.dts
> > > @@ -0,0 +1,250 @@
> > > +// SPDX-License-Identifier: GPL-2.0-or-later
> > > +
> > > +#include "mt7621.dtsi"
> > > +
> > > +#include <dt-bindings/gpio/gpio.h>
> > > +#include <dt-bindings/input/input.h>
> > > +#include <dt-bindings/leds/common.h>
> > > +
> > > +/ {
> > > +       compatible = "tplink,eap615-wall-v1", "mediatek,mt7621-soc";
> > > +       model = "TP-Link EAP615-Wall v1";
> > > +
> > > +       aliases {
> > > +               label-mac-device = &gmac0;
> > > +               led-boot = &led_status;
> > > +               led-failsafe = &led_status;
> > > +               led-running = &led_status;
> > > +               led-upgrade = &led_status;
> > > +       };
> > > +
> > > +       chosen {
> > > +               bootargs = "console=ttyS0,115200";
> > > +       };
> > > +
> > > +       leds {
> > > +               compatible = "gpio-leds";
> > > +
> > > +               led_status: status {
> > > +                       label = "white:status";
> > > +                       color = <LED_COLOR_ID_WHITE>;
> > > +                       function = LED_FUNCTION_STATUS;
> > > +                       gpios = <&gpio 12 GPIO_ACTIVE_LOW>;
> > > +               };
> > > +       };
> > > +
> > > +       keys {
> > > +               compatible = "gpio-keys";
> > > +
> > > +               led {
> > > +                       label = "led";
> > > +                       gpios = <&gpio 10 GPIO_ACTIVE_LOW>;
> > > +                       linux,code = <KEY_LIGHTS_TOGGLE>;
> > > +               };
> > > +
> > > +               reset {
> > > +                       label = "reset";
> > > +                       gpios = <&gpio 8 GPIO_ACTIVE_LOW>;
> > > +                       linux,code = <KEY_RESTART>;
> > > +               };
> > > +       };
> > > +
> > > +       gpio-export {
> > > +               compatible = "gpio-export";
> > > +
> > > +               poe_passthrough {
> > > +                       gpio-export,name = "poe-passthrough";
> > > +                       gpio-export,output = <0>;
> > > +                       gpios = <&gpio 7 GPIO_ACTIVE_HIGH>;
> > > +               };
> > > +       };
> > > +
> > > +       ethernet@1e100000 {
> > > +               reg = <0x1e100000 0xe000>;
> > > +
> > > +               mac@0 {
> > > +                       phy-mode = "rgmii";
> > > +
> > > +                       fixed-link {
> > > +                               pause;
> > > +                               speed = <1000>;
> > > +                       };
> > > +               };
> > > +
> > > +               mac@1 {
> > > +                       status = "okay";
> > > +
> > > +                       phy-mode = "rgmii";
> > > +
> > > +                       fixed-link {
> > > +                               full-duplex;
> > > +                               pause;
> > > +                               speed = <1000>;
> > > +                       };
> > > +               };
> > This node is labeled as "gmac1" in mt7621.dtsi, so you don't need to redefine
> > /ethernet@1e100000/mac@1 here to be able to modify the node. Use &gmac1 {...} like you
> > do
> > with spi0.
> > 
> > You can also drop the references to ethernet@1e100000 and mac@0, since you don't
> > modify
> > any of their properties.
> 
> mt7621.dsti:
> reg = <0x1e100000 0x10000>;
> 
> eap615:
> reg = <0x1e100000 0xe000>;
> 
> Moved to &ethernet and dropped the rest. Also dropped speed from mac@0,
> as the dtsi sets this to 1000 already.
> 

So it has the same offset, but a smaller region size. Why is it smaller, and which one is
correct?

> > 
> > > +       };
> > > +
> > > +};
> > > +
> > > +&spi0 {
> > > +       status = "okay";
> > > +
> > > +       flash@0 {
> > > +               compatible = "jedec,spi-nor";
> > > +               reg = <0>;
> > > +               spi-max-frequency = <20000000>;
> > > +
> > > +               partitions {
> > > +                       compatible = "fixed-partitions";
> > > +                       #address-cells = <1>;
> > > +                       #size-cells = <1>;
> > > +
> > > +                       partition@0 {
> > > +                               label = "u-boot";
> > > +                               reg = <0x0 0x80000>;
> > > +                               read-only;
> > > +                       };
> > > +
> > > +                       partition@80000 {
> > > +                               label = "partition-table";
> > > +                               reg = <0x80000 0x10000>;
> > > +                               read-only;
> > > +                       };
> > > +
> > > +                       info: partition@90000 {
> > > +                               label = "product-info";
> > > +                               reg = <0x90000 0x10000>;
> > > +                               read-only;
> > > +                       };
> > > +
> > > +                       partition@a0000 {
> > > +                               compatible = "denx,fit";
> > > +                               label = "firmware";
> > > +                               reg = <0x0a0000 0xcf0000>;
> > > +                       };
> > > +
> > > +                       partition@d90000 {
> > > +                               label = "user-config";
> > > +                               reg = <0xd90000 0x60000>;
> > > +                               read-only;
> > > +                       };
> > > +
> > > +                       partition@f30000 {
> > > +                               label = "mutil-log";
> > > +                               reg = <0xf30000 0x80000>;
> > > +                               read-only;
> > > +                       };
> > > +
> > > +                       partition@fb0000 {
> > > +                               label = "oops";
> > > +                               reg = <0xfb0000 0x040000>;
> > > +                               read-only;
> > > +                       };
> > > +
> > > +                       radio: partition@ff0000 {
> > > +                               label = "radio";
> > > +                               reg = <0xff0000 0x010000>;
> > > +                               read-only;
> > > +                       };
> > > +
> > > +                       partition@1000000 {
> > > +                               status = "disabled";
> > > +
> > > +                               label = "full";
> > > +                               reg = <0x0 0x1000000>;
> > > +                               read-only;
> > > +                       };
> > Is this the partition layout as defined in partition-table, or the runtime one from
> > /proc/mtd? We've noticed they can be different, and the runtime one is actually the
> > one
> > that should be used in order to not erase the stock configuration.
> I honestly don't recall, and I don't have an unmodified EAP615-Wall
> anymore. Can anyone get me that runtime OEM partition layout?
> > > +
> > > +               };
> > > +       };
> > > +};
> > > +
> > > +&state_default {
> > > +       gpio {
> > > +               groups = "uart2", "uart3";
> > > +               function = "gpio";
> > > +       };
> > > +};
> > > +
> > > +&pcie {
> > > +       status = "okay";
> > > +
> > > +       bus-range = <0x00 0xff>;
> > This is the default value according to Documentation/devicetree/bindings/pci/host-
> > generic-
> > pci.txt. Any particular reason you're specifying it here explicitly?
> OEM DTS leftover; removed.
> > 
> > > +};
> > > +
> > > +&pcie1 {
> > > +       wifi@0,0 {
> > > +               compatible = "mediatek,mt76";
> > > +               reg = <0x0000 0 0 0 0>;
> > > +               mediatek,mtd-eeprom = <&radio 0x0>;
> > > +               nvmem-cells = <&macaddr_info_8>;
> > > +               nvmem-cell-names = "mac-address";
> > > +       };
> > > +};
> > > +
> > > +&pcie2 {
> > > +       status = "disabled";
> > > +};
> > Is pcie0 used for anything? Otherwise it can probably also be disabled, or you can
> > drop
> > this block to make the device DTS smaller.
> 
> Disabling pcie0 breaks WiFi.
> Disabling pcie2 avoids this message during boot:
> 
> [    1.324025] mt7621-pci 1e140000.pcie: pcie2 no card, disable it (RST
> & CLK)

Thanks for checking.

> > 
> > > +
> > > +&gmac0 {
> > > +       nvmem-cells = <&macaddr_info_8>;
> > > +       nvmem-cell-names = "mac-address";
> > > +};
> > Ah, so you *are* modifying gmac0! Maybe put the &gmac1 section here too, then.
> > 
> > > +
> > > +&switch0 {
> > > +       compatible = "mediatek,mt7530";
> > > +       ports {
> > > +               port@0 {
> > > +                       status = "okay";
> > > +                       label = "lan0";
> > > +               };
> > > +
> > > +               port@1 {
> > > +                       status = "okay";
> > > +                       label = "lan3";
> > > +               };
> > > +
> > > +               port@2 {
> > > +                       status = "okay";
> > > +                       label = "lan2";
> > > +               };
> > > +
> > > +               port@3 {
> > > +                       status = "okay";
> > > +                       label = "lan1";
> > > +               };
> > > +
> > > +               port@5 {
> > > +                       phy-mode = "rgmii";
> > > +                       reg = <5>;
> > > +
> > > +                       /*
> > > +                       fixed-link {
> > > +                               full-duplex;
> > > +                               speed = <1000>;
> > > +                       };
> > > +                       */
> > Does the CPU connect to the switch by both gmac-s? If so, leave a comment so this can
> > be
> > enabled once support for this arrives. Otherwise I think you could drop port@5. You
> > also
> > enable gmac1, but AFAICT it doesn't seem to be connected to anything.
> OEM DTS leftover; removed.
> > 
> > > +               };
> > > +
> > > +               port@6 {
> > > +                       phy-mode = "rgmii";
> > > +                       ethernet = <&gmac0>;
> > > +
> > > +                       fixed-link {
> > > +                               pause;
> > > +                               speed = <1000>;
> > > +                       };
> > > +               };
> > > +
> > > +       };
> > > +};
> > > +
> > > +&info {
> > > +       compatible = "nvmem-cells";
> > > +       #address-cells = <1>;
> > > +       #size-cells = <1>;
> > > +
> > > +       macaddr_info_8: macaddr@8 {
> > > +               reg = <0x8 0x6>;
> > > +       };
> > > +};
> > This could also just go into the definition of partition@90000 itself, but either way
> > is
> > fine for me.
> Prefer to keep as-is, like in the DTS of its sibling.
> > 
> > > diff --git a/target/linux/ramips/image/mt7621.mk
> > > b/target/linux/ramips/image/mt7621.mk
> > > index a461c57f15..617c8adc37 100644
> > > --- a/target/linux/ramips/image/mt7621.mk
> > > +++ b/target/linux/ramips/image/mt7621.mk
> > > @@ -1461,6 +1461,18 @@ define Device/tplink_eap235-wall-v1
> > >  endef
> > >  TARGET_DEVICES += tplink_eap235-wall-v1
> > >  
> > > +define Device/tplink_eap615-wall-v1
> > > +  $(Device/tplink-safeloader)
> > Missing $(Device/dsa-migration).
> This is a new device, so there isn't anything to migrate. This sounds weird?
> > 
> > > +  DEVICE_MODEL := EAP615-Wall
> > > +  DEVICE_VARIANT := v1
> > > +  DEVICE_PACKAGES := kmod-mt7915e
> > > +  TPLINK_BOARD_ID := EAP615-WALL-V1
> > > +  KERNEL := kernel-bin | lzma | fit lzma $$(KDIR)/image-$$(firstword
> > > $$(DEVICE_DTS)).dtb | pad-to 64k
> > > +  KERNEL_INITRAMFS := kernel-bin | lzma | fit lzma $$(KDIR)/image-$$(firstword
> > > $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k
> > Is the 'pad-to 64k' required? mtdsplit can split at arbitrary boundaries, so I think
> > the
> > padding here isn't very useful. The other device with FIT images on mt7621 also don't
> > add
> > padding to the kernel.
> Removed.
> > 
> > > +  IMAGE_SIZE := 13248k
> > > +endef
> > > +TARGET_DEVICES += tplink_eap615-wall-v1
> > > +
> > >  define Device/tplink_re350-v1
> > >    $(Device/dsa-migration)
> > >    $(Device/tplink-safeloader)
> > > diff --git a/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
> > > b/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
> > > index 52e0b6b572..3e34ede3be 100644
> > > --- a/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
> > > +++ b/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
> > > @@ -59,7 +59,8 @@ ramips_setup_interfaces()
> > >         mikrotik,routerboard-760igs)
> > >                 ucidef_set_interfaces_lan_wan "lan2 lan3 lan4 lan5" "wan sfp"
> > >                 ;;
> > > -       tplink,eap235-wall-v1)
> > > +       tplink,eap235-wall-v1|\
> > > +       tplink,eap615-wall-v1)
> > >                 ucidef_set_interface_lan "lan0 lan1 lan2 lan3"
> > >                 ;;
> > >         ubnt,edgerouter-x)
> > > diff --git a/tools/firmware-utils/patches/999-eap615.patch b/tools/firmware-
> > > utils/patches/999-eap615.patch
> > > new file mode 100644
> > > index 0000000000..2348bbce24
> > > --- /dev/null
> > > +++ b/tools/firmware-utils/patches/999-eap615.patch
> > > @@ -0,0 +1,55 @@
> > > +From 41c9244ee6347f00f8c85117d17d9d2429a25999 Mon Sep 17 00:00:00 2001
> > > +From: Stijn Tintel <stijn@linux-ipv6.be>
> > > +Date: Thu, 27 Jan 2022 11:35:54 +0200
> > > +Subject: [PATCH] tplink-safeloader: EAP615-Wall v1 support
> > > +
> > > +Signed-off-by: Stijn Tintel <stijn@linux-ipv6.be>
> > This is a patch against firmware-utils, so it should be submitted separately for that
> > repository.
> Yes, just keeping all changes together for review purposes. Have you
> reviewed this part? If so I'll push it to firmware-utils already.

The patch looks good to me, but you don't have a commit message yet.

> > 
> > 
> > Best,
> > Sander
> > 
> > > +---
> > > + src/tplink-safeloader.c | 31 +++++++++++++++++++++++++++++++
> > > + 1 file changed, 31 insertions(+)
> > > +
> > > +diff --git a/src/tplink-safeloader.c b/src/tplink-safeloader.c
> > > +index 0565dcc..009b2c4 100644
> > > +--- a/src/tplink-safeloader.c
> > > ++++ b/src/tplink-safeloader.c
> > > +@@ -1703,6 +1703,37 @@ static struct device_info boards[] = {
> > > +               .last_sysupgrade_partition = "file-system"
> > > +       },
> > > + 
> > > ++      /** Firmware layout for the EAP615-Wall v1 */
> > > ++      {
> > > ++              .id = "EAP615-WALL-V1",
> > > ++              .soft_ver = SOFT_VER_DEFAULT,
> > > ++              .soft_ver_compat_level = 1,
> > > ++              .support_list =
> > > ++                      "SupportList:\r\n"
> > > ++                      "EAP615-Wall(TP-Link|UN|AX1800-D):1.0\r\n"
> > > ++                      "EAP615-Wall(TP-Link|CA|AX1800-D):1.0\r\n"
> > > ++                      "EAP615-Wall(TP-Link|JP|AX1800-D):1.0\r\n",
> > > ++              .part_trail = PART_TRAIL_NONE,
> > > ++
> > > ++              .partitions = {
> > > ++                      {"fs-uboot", 0x00000, 0x80000},
> > > ++                      {"partition-table", 0x80000, 0x02000},
> > > ++                      {"default-mac", 0x90000, 0x01000},
> > > ++                      {"support-list", 0x91000, 0x00100},
> > > ++                      {"product-info", 0x91100, 0x00400},
> > > ++                      {"soft-version", 0x92000, 0x00100},
> > > ++                      {"firmware", 0xa0000, 0xcf0000},
> > > ++                      {"user-config", 0xd90000, 0x60000},
> > > ++                      {"mutil-log", 0xf30000, 0x80000},
> > > ++                      {"oops", 0xfb0000, 0x40000},
> > > ++                      {"radio", 0xff0000, 0x10000},
> > > ++                      {NULL, 0, 0}
> > > ++              },
> > > ++
> > > ++              .first_sysupgrade_partition = "os-image",
> > > ++              .last_sysupgrade_partition = "file-system"
> > > ++      },
> > > ++
> > > +       /** Firmware layout for the TL-WA1201 v2 */
> > > +       {
> > > +               .id     = "TL-WA1201-V2",
> > > +-- 
> > > +2.34.1
> > > +
> 
> Thanks,
> Stijn
> 
> 
>
Stijn Tintel Feb. 5, 2022, 12:25 p.m. UTC | #7
On 5/02/2022 14:21, Sander Vanheule wrote:
> On Fri, 2022-02-04 at 20:05 +0200, Stijn Tintel wrote:
>> On 29/01/2022 15:03, Sander Vanheule wrote:
>>> Hi Stijn,
>>>
>>> Thanks for the patch, been looking forward to this!
>>>
>>> On Fri, 2022-01-28 at 00:00 +0200, Stijn Tintel wrote:
>>>> Add support for the TP-Link EAP615-Wall, an AX1800 Wall Plate WiFi 6 AP.
>>>> The device is very similar to the TP-Link EAP235-Wall.
>>>>
>>>> Hardware:
>>>> * SoC: MediaTek MT7621AT
>>>> * RAM: 128MiB
>>>> * Flash: 16MiB SPI-NOR
>>>> * Ethernet: 4x GbE
>>>>   * Back: ETH0 (PoE-PD)
>>>>   * Bottom: ETH1, ETH2, ETH3 (PoE-PT)
>>> PT > passthrough
>> Not sure what else PoE-PT can refer to. I like that it's the same style
>> as PoE-PD.
> AFAICT the PD (powered device) and PSE (power sourcing equipment) names are part of the
> PoE standard, while 'PT' isn't.
Ok.
>
>>>> * WiFi: MT7915E 2.4/5 GHz 2T2R
>>>> * LEDS: 1x white
>>>> * Buttons: 1x LED, 1x reset
>>>>
>>>> Stock firmware uses a random MAC address for ethernet. OpenWrt uses the
>>>> MAC address that is on the device label for ethernet and the wireless
>>>> interfaces. MAC address must not be incremented, as this will cause MAC
>>>> address conflicts in case you have two devices with consecutive MAC
>>>> addresses. Instead, different locally administered addresses will be
>>>> generated automatically, based on the MAC on the label.
>>>>
>>>> Installation via stock firmware:
>>>> * Enable SSH in the TP-Link web interface
>>>> * SSH to the device
>>>> * Run `cliclientd stopcs`
>>>> * Upload the OpenWrt factory image via the TP-Link webinterface
>>>>
>>>> Installation via bootloader:
>>>> * Solder TTL header. Pinout: 1: TX, 2: RX, 3: GND, 4: VCC, with pin 1
>>>>   closest to ETH1. Baud rate 115200
>>>> * Interrupt boot process by holding a key during boot
>>>> * Boot the OpenWrt initramfs:
>>>>   # tftpboot 0x84000000 openwrt-ramips-mt7621-tplink_eap615-wall-v1-initramfs-
>>>> kernel.bin
>>>>   # bootm
>>>> * Copy openwrt-ramips-mt7621-tplink_eap615-wall-v1-squashfs-sysupgrade.bin
>>>>   to /tmp and use sysupgrade to install it
>>>>
>>>> Thanks to Sander Vanheule for his work on the EAP235-Wall, which made
>>>> adding support for the EAP615-Wall very easy.
>>>>
>>>> Signed-off-by: Stijn Tintel <stijn@linux-ipv6.be>
>>>> ---
>>>>  .../dts/mt7621_tplink_eap615-wall-v1.dts      | 250 ++++++++++++++++++
>>>>  target/linux/ramips/image/mt7621.mk           |  12 +
>>>>  .../mt7621/base-files/etc/board.d/02_network  |   3 +-
>>>>  tools/firmware-utils/patches/999-eap615.patch |  55 ++++
>>>>  4 files changed, 319 insertions(+), 1 deletion(-)
>>>>  create mode 100644 target/linux/ramips/dts/mt7621_tplink_eap615-wall-v1.dts
>>>>  create mode 100644 tools/firmware-utils/patches/999-eap615.patch
>>>>
>>>> diff --git a/target/linux/ramips/dts/mt7621_tplink_eap615-wall-v1.dts
>>>> b/target/linux/ramips/dts/mt7621_tplink_eap615-wall-v1.dts
>>>> new file mode 100644
>>>> index 0000000000..fd5a68973b
>>>> --- /dev/null
>>>> +++ b/target/linux/ramips/dts/mt7621_tplink_eap615-wall-v1.dts
>>>> @@ -0,0 +1,250 @@
>>>> +// SPDX-License-Identifier: GPL-2.0-or-later
>>>> +
>>>> +#include "mt7621.dtsi"
>>>> +
>>>> +#include <dt-bindings/gpio/gpio.h>
>>>> +#include <dt-bindings/input/input.h>
>>>> +#include <dt-bindings/leds/common.h>
>>>> +
>>>> +/ {
>>>> +       compatible = "tplink,eap615-wall-v1", "mediatek,mt7621-soc";
>>>> +       model = "TP-Link EAP615-Wall v1";
>>>> +
>>>> +       aliases {
>>>> +               label-mac-device = &gmac0;
>>>> +               led-boot = &led_status;
>>>> +               led-failsafe = &led_status;
>>>> +               led-running = &led_status;
>>>> +               led-upgrade = &led_status;
>>>> +       };
>>>> +
>>>> +       chosen {
>>>> +               bootargs = "console=ttyS0,115200";
>>>> +       };
>>>> +
>>>> +       leds {
>>>> +               compatible = "gpio-leds";
>>>> +
>>>> +               led_status: status {
>>>> +                       label = "white:status";
>>>> +                       color = <LED_COLOR_ID_WHITE>;
>>>> +                       function = LED_FUNCTION_STATUS;
>>>> +                       gpios = <&gpio 12 GPIO_ACTIVE_LOW>;
>>>> +               };
>>>> +       };
>>>> +
>>>> +       keys {
>>>> +               compatible = "gpio-keys";
>>>> +
>>>> +               led {
>>>> +                       label = "led";
>>>> +                       gpios = <&gpio 10 GPIO_ACTIVE_LOW>;
>>>> +                       linux,code = <KEY_LIGHTS_TOGGLE>;
>>>> +               };
>>>> +
>>>> +               reset {
>>>> +                       label = "reset";
>>>> +                       gpios = <&gpio 8 GPIO_ACTIVE_LOW>;
>>>> +                       linux,code = <KEY_RESTART>;
>>>> +               };
>>>> +       };
>>>> +
>>>> +       gpio-export {
>>>> +               compatible = "gpio-export";
>>>> +
>>>> +               poe_passthrough {
>>>> +                       gpio-export,name = "poe-passthrough";
>>>> +                       gpio-export,output = <0>;
>>>> +                       gpios = <&gpio 7 GPIO_ACTIVE_HIGH>;
>>>> +               };
>>>> +       };
>>>> +
>>>> +       ethernet@1e100000 {
>>>> +               reg = <0x1e100000 0xe000>;
>>>> +
>>>> +               mac@0 {
>>>> +                       phy-mode = "rgmii";
>>>> +
>>>> +                       fixed-link {
>>>> +                               pause;
>>>> +                               speed = <1000>;
>>>> +                       };
>>>> +               };
>>>> +
>>>> +               mac@1 {
>>>> +                       status = "okay";
>>>> +
>>>> +                       phy-mode = "rgmii";
>>>> +
>>>> +                       fixed-link {
>>>> +                               full-duplex;
>>>> +                               pause;
>>>> +                               speed = <1000>;
>>>> +                       };
>>>> +               };
>>> This node is labeled as "gmac1" in mt7621.dtsi, so you don't need to redefine
>>> /ethernet@1e100000/mac@1 here to be able to modify the node. Use &gmac1 {...} like you
>>> do
>>> with spi0.
>>>
>>> You can also drop the references to ethernet@1e100000 and mac@0, since you don't
>>> modify
>>> any of their properties.
>> mt7621.dsti:
>> reg = <0x1e100000 0x10000>;
>>
>> eap615:
>> reg = <0x1e100000 0xe000>;
>>
>> Moved to &ethernet and dropped the rest. Also dropped speed from mac@0,
>> as the dtsi sets this to 1000 already.
>>
> So it has the same offset, but a smaller region size. Why is it smaller, and which one is
> correct?
Why? Beats me. It was in the OEM DTS like this. With the value from
mt7621.dtsi, ethernet doesn't work.
>>>> +       };
>>>> +
>>>> +};
>>>> +
>>>> +&spi0 {
>>>> +       status = "okay";
>>>> +
>>>> +       flash@0 {
>>>> +               compatible = "jedec,spi-nor";
>>>> +               reg = <0>;
>>>> +               spi-max-frequency = <20000000>;
>>>> +
>>>> +               partitions {
>>>> +                       compatible = "fixed-partitions";
>>>> +                       #address-cells = <1>;
>>>> +                       #size-cells = <1>;
>>>> +
>>>> +                       partition@0 {
>>>> +                               label = "u-boot";
>>>> +                               reg = <0x0 0x80000>;
>>>> +                               read-only;
>>>> +                       };
>>>> +
>>>> +                       partition@80000 {
>>>> +                               label = "partition-table";
>>>> +                               reg = <0x80000 0x10000>;
>>>> +                               read-only;
>>>> +                       };
>>>> +
>>>> +                       info: partition@90000 {
>>>> +                               label = "product-info";
>>>> +                               reg = <0x90000 0x10000>;
>>>> +                               read-only;
>>>> +                       };
>>>> +
>>>> +                       partition@a0000 {
>>>> +                               compatible = "denx,fit";
>>>> +                               label = "firmware";
>>>> +                               reg = <0x0a0000 0xcf0000>;
>>>> +                       };
>>>> +
>>>> +                       partition@d90000 {
>>>> +                               label = "user-config";
>>>> +                               reg = <0xd90000 0x60000>;
>>>> +                               read-only;
>>>> +                       };
>>>> +
>>>> +                       partition@f30000 {
>>>> +                               label = "mutil-log";
>>>> +                               reg = <0xf30000 0x80000>;
>>>> +                               read-only;
>>>> +                       };
>>>> +
>>>> +                       partition@fb0000 {
>>>> +                               label = "oops";
>>>> +                               reg = <0xfb0000 0x040000>;
>>>> +                               read-only;
>>>> +                       };
>>>> +
>>>> +                       radio: partition@ff0000 {
>>>> +                               label = "radio";
>>>> +                               reg = <0xff0000 0x010000>;
>>>> +                               read-only;
>>>> +                       };
>>>> +
>>>> +                       partition@1000000 {
>>>> +                               status = "disabled";
>>>> +
>>>> +                               label = "full";
>>>> +                               reg = <0x0 0x1000000>;
>>>> +                               read-only;
>>>> +                       };
>>> Is this the partition layout as defined in partition-table, or the runtime one from
>>> /proc/mtd? We've noticed they can be different, and the runtime one is actually the
>>> one
>>> that should be used in order to not erase the stock configuration.
>> I honestly don't recall, and I don't have an unmodified EAP615-Wall
>> anymore. Can anyone get me that runtime OEM partition layout?
>>>> +
>>>> +               };
>>>> +       };
>>>> +};
>>>> +
>>>> +&state_default {
>>>> +       gpio {
>>>> +               groups = "uart2", "uart3";
>>>> +               function = "gpio";
>>>> +       };
>>>> +};
>>>> +
>>>> +&pcie {
>>>> +       status = "okay";
>>>> +
>>>> +       bus-range = <0x00 0xff>;
>>> This is the default value according to Documentation/devicetree/bindings/pci/host-
>>> generic-
>>> pci.txt. Any particular reason you're specifying it here explicitly?
>> OEM DTS leftover; removed.
>>>> +};
>>>> +
>>>> +&pcie1 {
>>>> +       wifi@0,0 {
>>>> +               compatible = "mediatek,mt76";
>>>> +               reg = <0x0000 0 0 0 0>;
>>>> +               mediatek,mtd-eeprom = <&radio 0x0>;
>>>> +               nvmem-cells = <&macaddr_info_8>;
>>>> +               nvmem-cell-names = "mac-address";
>>>> +       };
>>>> +};
>>>> +
>>>> +&pcie2 {
>>>> +       status = "disabled";
>>>> +};
>>> Is pcie0 used for anything? Otherwise it can probably also be disabled, or you can
>>> drop
>>> this block to make the device DTS smaller.
>> Disabling pcie0 breaks WiFi.
>> Disabling pcie2 avoids this message during boot:
>>
>> [    1.324025] mt7621-pci 1e140000.pcie: pcie2 no card, disable it (RST
>> & CLK)
> Thanks for checking.
>
>>>> +
>>>> +&gmac0 {
>>>> +       nvmem-cells = <&macaddr_info_8>;
>>>> +       nvmem-cell-names = "mac-address";
>>>> +};
>>> Ah, so you *are* modifying gmac0! Maybe put the &gmac1 section here too, then.
>>>
>>>> +
>>>> +&switch0 {
>>>> +       compatible = "mediatek,mt7530";
>>>> +       ports {
>>>> +               port@0 {
>>>> +                       status = "okay";
>>>> +                       label = "lan0";
>>>> +               };
>>>> +
>>>> +               port@1 {
>>>> +                       status = "okay";
>>>> +                       label = "lan3";
>>>> +               };
>>>> +
>>>> +               port@2 {
>>>> +                       status = "okay";
>>>> +                       label = "lan2";
>>>> +               };
>>>> +
>>>> +               port@3 {
>>>> +                       status = "okay";
>>>> +                       label = "lan1";
>>>> +               };
>>>> +
>>>> +               port@5 {
>>>> +                       phy-mode = "rgmii";
>>>> +                       reg = <5>;
>>>> +
>>>> +                       /*
>>>> +                       fixed-link {
>>>> +                               full-duplex;
>>>> +                               speed = <1000>;
>>>> +                       };
>>>> +                       */
>>> Does the CPU connect to the switch by both gmac-s? If so, leave a comment so this can
>>> be
>>> enabled once support for this arrives. Otherwise I think you could drop port@5. You
>>> also
>>> enable gmac1, but AFAICT it doesn't seem to be connected to anything.
>> OEM DTS leftover; removed.
>>>> +               };
>>>> +
>>>> +               port@6 {
>>>> +                       phy-mode = "rgmii";
>>>> +                       ethernet = <&gmac0>;
>>>> +
>>>> +                       fixed-link {
>>>> +                               pause;
>>>> +                               speed = <1000>;
>>>> +                       };
>>>> +               };
>>>> +
>>>> +       };
>>>> +};
>>>> +
>>>> +&info {
>>>> +       compatible = "nvmem-cells";
>>>> +       #address-cells = <1>;
>>>> +       #size-cells = <1>;
>>>> +
>>>> +       macaddr_info_8: macaddr@8 {
>>>> +               reg = <0x8 0x6>;
>>>> +       };
>>>> +};
>>> This could also just go into the definition of partition@90000 itself, but either way
>>> is
>>> fine for me.
>> Prefer to keep as-is, like in the DTS of its sibling.
>>>> diff --git a/target/linux/ramips/image/mt7621.mk
>>>> b/target/linux/ramips/image/mt7621.mk
>>>> index a461c57f15..617c8adc37 100644
>>>> --- a/target/linux/ramips/image/mt7621.mk
>>>> +++ b/target/linux/ramips/image/mt7621.mk
>>>> @@ -1461,6 +1461,18 @@ define Device/tplink_eap235-wall-v1
>>>>  endef
>>>>  TARGET_DEVICES += tplink_eap235-wall-v1
>>>>  
>>>> +define Device/tplink_eap615-wall-v1
>>>> +  $(Device/tplink-safeloader)
>>> Missing $(Device/dsa-migration).
>> This is a new device, so there isn't anything to migrate. This sounds weird?
>>>> +  DEVICE_MODEL := EAP615-Wall
>>>> +  DEVICE_VARIANT := v1
>>>> +  DEVICE_PACKAGES := kmod-mt7915e
>>>> +  TPLINK_BOARD_ID := EAP615-WALL-V1
>>>> +  KERNEL := kernel-bin | lzma | fit lzma $$(KDIR)/image-$$(firstword
>>>> $$(DEVICE_DTS)).dtb | pad-to 64k
>>>> +  KERNEL_INITRAMFS := kernel-bin | lzma | fit lzma $$(KDIR)/image-$$(firstword
>>>> $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k
>>> Is the 'pad-to 64k' required? mtdsplit can split at arbitrary boundaries, so I think
>>> the
>>> padding here isn't very useful. The other device with FIT images on mt7621 also don't
>>> add
>>> padding to the kernel.
>> Removed.
>>>> +  IMAGE_SIZE := 13248k
>>>> +endef
>>>> +TARGET_DEVICES += tplink_eap615-wall-v1
>>>> +
>>>>  define Device/tplink_re350-v1
>>>>    $(Device/dsa-migration)
>>>>    $(Device/tplink-safeloader)
>>>> diff --git a/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
>>>> b/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
>>>> index 52e0b6b572..3e34ede3be 100644
>>>> --- a/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
>>>> +++ b/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
>>>> @@ -59,7 +59,8 @@ ramips_setup_interfaces()
>>>>         mikrotik,routerboard-760igs)
>>>>                 ucidef_set_interfaces_lan_wan "lan2 lan3 lan4 lan5" "wan sfp"
>>>>                 ;;
>>>> -       tplink,eap235-wall-v1)
>>>> +       tplink,eap235-wall-v1|\
>>>> +       tplink,eap615-wall-v1)
>>>>                 ucidef_set_interface_lan "lan0 lan1 lan2 lan3"
>>>>                 ;;
>>>>         ubnt,edgerouter-x)
>>>> diff --git a/tools/firmware-utils/patches/999-eap615.patch b/tools/firmware-
>>>> utils/patches/999-eap615.patch
>>>> new file mode 100644
>>>> index 0000000000..2348bbce24
>>>> --- /dev/null
>>>> +++ b/tools/firmware-utils/patches/999-eap615.patch
>>>> @@ -0,0 +1,55 @@
>>>> +From 41c9244ee6347f00f8c85117d17d9d2429a25999 Mon Sep 17 00:00:00 2001
>>>> +From: Stijn Tintel <stijn@linux-ipv6.be>
>>>> +Date: Thu, 27 Jan 2022 11:35:54 +0200
>>>> +Subject: [PATCH] tplink-safeloader: EAP615-Wall v1 support
>>>> +
>>>> +Signed-off-by: Stijn Tintel <stijn@linux-ipv6.be>
>>> This is a patch against firmware-utils, so it should be submitted separately for that
>>> repository.
>> Yes, just keeping all changes together for review purposes. Have you
>> reviewed this part? If so I'll push it to firmware-utils already.
> The patch looks good to me, but you don't have a commit message yet.
>
>>>
>>> Best,
>>> Sander
>>>
>>>> +---
>>>> + src/tplink-safeloader.c | 31 +++++++++++++++++++++++++++++++
>>>> + 1 file changed, 31 insertions(+)
>>>> +
>>>> +diff --git a/src/tplink-safeloader.c b/src/tplink-safeloader.c
>>>> +index 0565dcc..009b2c4 100644
>>>> +--- a/src/tplink-safeloader.c
>>>> ++++ b/src/tplink-safeloader.c
>>>> +@@ -1703,6 +1703,37 @@ static struct device_info boards[] = {
>>>> +               .last_sysupgrade_partition = "file-system"
>>>> +       },
>>>> + 
>>>> ++      /** Firmware layout for the EAP615-Wall v1 */
>>>> ++      {
>>>> ++              .id = "EAP615-WALL-V1",
>>>> ++              .soft_ver = SOFT_VER_DEFAULT,
>>>> ++              .soft_ver_compat_level = 1,
>>>> ++              .support_list =
>>>> ++                      "SupportList:\r\n"
>>>> ++                      "EAP615-Wall(TP-Link|UN|AX1800-D):1.0\r\n"
>>>> ++                      "EAP615-Wall(TP-Link|CA|AX1800-D):1.0\r\n"
>>>> ++                      "EAP615-Wall(TP-Link|JP|AX1800-D):1.0\r\n",
>>>> ++              .part_trail = PART_TRAIL_NONE,
>>>> ++
>>>> ++              .partitions = {
>>>> ++                      {"fs-uboot", 0x00000, 0x80000},
>>>> ++                      {"partition-table", 0x80000, 0x02000},
>>>> ++                      {"default-mac", 0x90000, 0x01000},
>>>> ++                      {"support-list", 0x91000, 0x00100},
>>>> ++                      {"product-info", 0x91100, 0x00400},
>>>> ++                      {"soft-version", 0x92000, 0x00100},
>>>> ++                      {"firmware", 0xa0000, 0xcf0000},
>>>> ++                      {"user-config", 0xd90000, 0x60000},
>>>> ++                      {"mutil-log", 0xf30000, 0x80000},
>>>> ++                      {"oops", 0xfb0000, 0x40000},
>>>> ++                      {"radio", 0xff0000, 0x10000},
>>>> ++                      {NULL, 0, 0}
>>>> ++              },
>>>> ++
>>>> ++              .first_sysupgrade_partition = "os-image",
>>>> ++              .last_sysupgrade_partition = "file-system"
>>>> ++      },
>>>> ++
>>>> +       /** Firmware layout for the TL-WA1201 v2 */
>>>> +       {
>>>> +               .id     = "TL-WA1201-V2",
>>>> +-- 
>>>> +2.34.1
>>>> +
>> Thanks,
>> Stijn
>>
>>
>>
Stijn
Sander Vanheule Feb. 5, 2022, 12:30 p.m. UTC | #8
On Sat, 2022-02-05 at 13:36 +0200, Stijn Tintel wrote:
> On 4/02/2022 20:05, Stijn Tintel wrote:
> > > > +  DEVICE_MODEL := EAP615-Wall
> > > > +  DEVICE_VARIANT := v1
> > > > +  DEVICE_PACKAGES := kmod-mt7915e
> > > > +  TPLINK_BOARD_ID := EAP615-WALL-V1
> > > > +  KERNEL := kernel-bin | lzma | fit lzma $$(KDIR)/image-$$(firstword
> > > > $$(DEVICE_DTS)).dtb | pad-to 64k
> > > > +  KERNEL_INITRAMFS := kernel-bin | lzma | fit lzma $$(KDIR)/image-$$(firstword
> > > > $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k
> > > Is the 'pad-to 64k' required? mtdsplit can split at arbitrary boundaries, so I think
> > > the
> > > padding here isn't very useful. The other device with FIT images on mt7621 also
> > > don't add
> > > padding to the kernel.
> > Removed.
> 
> Removing the padding causes this logging line during boot:
> 
> [    0.712046] mtd: partition "rootfs" doesn't start on an erase/write
> block boundary -- force read-only
> 
> While it doesn't cause any real issues, I prefer to not have this
> message. The datasheet leaves me clueless about the erase block size,
> but in sysfs I can find 64k, so I'm going to add back pad-to 64k to KERNEL.

You should also be able to use the BLOCKSIZE variable instead of "64k".

The warning you get was patched out previously with target/linux/generic/pending-5.4/411-
mtd-partial_eraseblock_write.patch, but I don't remember seeing that on my own 5.10
builds...

Can anyone more experienced with mtd(split) tell if the padding is required here?

Best,
Sander
Sander Vanheule Feb. 6, 2022, 7:01 p.m. UTC | #9
On Fri, 2022-02-04 at 20:05 +0200, Stijn Tintel wrote:
> > > diff --git a/target/linux/ramips/image/mt7621.mk
> > > b/target/linux/ramips/image/mt7621.mk
> > > index a461c57f15..617c8adc37 100644
> > > --- a/target/linux/ramips/image/mt7621.mk
> > > +++ b/target/linux/ramips/image/mt7621.mk
> > > @@ -1461,6 +1461,18 @@ define Device/tplink_eap235-wall-v1
> > >  endef
> > >  TARGET_DEVICES += tplink_eap235-wall-v1
> > >  
> > > +define Device/tplink_eap615-wall-v1
> > > +  $(Device/tplink-safeloader)
> > Missing $(Device/dsa-migration).
> This is a new device, so there isn't anything to migrate. This sounds weird?
> 

The same was needed for the EAP235-Wall, even though that device also only ever used DSA.
See
https://patchwork.ozlabs.org/project/openwrt/patch/20210214100322.246853-1-sander@svanheule.net/#2633386

Best,
Sander
diff mbox series

Patch

diff --git a/target/linux/ramips/dts/mt7621_tplink_eap615-wall-v1.dts b/target/linux/ramips/dts/mt7621_tplink_eap615-wall-v1.dts
new file mode 100644
index 0000000000..fd5a68973b
--- /dev/null
+++ b/target/linux/ramips/dts/mt7621_tplink_eap615-wall-v1.dts
@@ -0,0 +1,250 @@ 
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "mt7621.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/leds/common.h>
+
+/ {
+	compatible = "tplink,eap615-wall-v1", "mediatek,mt7621-soc";
+	model = "TP-Link EAP615-Wall v1";
+
+	aliases {
+		label-mac-device = &gmac0;
+		led-boot = &led_status;
+		led-failsafe = &led_status;
+		led-running = &led_status;
+		led-upgrade = &led_status;
+	};
+
+	chosen {
+		bootargs = "console=ttyS0,115200";
+	};
+
+	leds {
+		compatible = "gpio-leds";
+
+		led_status: status {
+			label = "white:status";
+			color = <LED_COLOR_ID_WHITE>;
+			function = LED_FUNCTION_STATUS;
+			gpios = <&gpio 12 GPIO_ACTIVE_LOW>;
+		};
+	};
+
+	keys {
+		compatible = "gpio-keys";
+
+		led {
+			label = "led";
+			gpios = <&gpio 10 GPIO_ACTIVE_LOW>;
+			linux,code = <KEY_LIGHTS_TOGGLE>;
+		};
+
+		reset {
+			label = "reset";
+			gpios = <&gpio 8 GPIO_ACTIVE_LOW>;
+			linux,code = <KEY_RESTART>;
+		};
+	};
+
+	gpio-export {
+		compatible = "gpio-export";
+
+		poe_passthrough {
+			gpio-export,name = "poe-passthrough";
+			gpio-export,output = <0>;
+			gpios = <&gpio 7 GPIO_ACTIVE_HIGH>;
+		};
+	};
+
+	ethernet@1e100000 {
+		reg = <0x1e100000 0xe000>;
+
+		mac@0 {
+			phy-mode = "rgmii";
+
+			fixed-link {
+				pause;
+				speed = <1000>;
+			};
+		};
+
+		mac@1 {
+			status = "okay";
+
+			phy-mode = "rgmii";
+
+			fixed-link {
+				full-duplex;
+				pause;
+				speed = <1000>;
+			};
+		};
+	};
+
+};
+
+&spi0 {
+	status = "okay";
+
+	flash@0 {
+		compatible = "jedec,spi-nor";
+		reg = <0>;
+		spi-max-frequency = <20000000>;
+
+		partitions {
+			compatible = "fixed-partitions";
+			#address-cells = <1>;
+			#size-cells = <1>;
+
+			partition@0 {
+				label = "u-boot";
+				reg = <0x0 0x80000>;
+				read-only;
+			};
+
+			partition@80000 {
+				label = "partition-table";
+				reg = <0x80000 0x10000>;
+				read-only;
+			};
+
+			info: partition@90000 {
+				label = "product-info";
+				reg = <0x90000 0x10000>;
+				read-only;
+			};
+
+			partition@a0000 {
+				compatible = "denx,fit";
+				label = "firmware";
+				reg = <0x0a0000 0xcf0000>;
+			};
+
+			partition@d90000 {
+				label = "user-config";
+				reg = <0xd90000 0x60000>;
+				read-only;
+			};
+
+			partition@f30000 {
+				label = "mutil-log";
+				reg = <0xf30000 0x80000>;
+				read-only;
+			};
+
+			partition@fb0000 {
+				label = "oops";
+				reg = <0xfb0000 0x040000>;
+				read-only;
+			};
+
+			radio: partition@ff0000 {
+				label = "radio";
+				reg = <0xff0000 0x010000>;
+				read-only;
+			};
+
+			partition@1000000 {
+				status = "disabled";
+
+				label = "full";
+				reg = <0x0 0x1000000>;
+				read-only;
+			};
+
+		};
+	};
+};
+
+&state_default {
+	gpio {
+		groups = "uart2", "uart3";
+		function = "gpio";
+	};
+};
+
+&pcie {
+	status = "okay";
+
+	bus-range = <0x00 0xff>;
+};
+
+&pcie1 {
+	wifi@0,0 {
+		compatible = "mediatek,mt76";
+		reg = <0x0000 0 0 0 0>;
+		mediatek,mtd-eeprom = <&radio 0x0>;
+		nvmem-cells = <&macaddr_info_8>;
+		nvmem-cell-names = "mac-address";
+	};
+};
+
+&pcie2 {
+	status = "disabled";
+};
+
+&gmac0 {
+	nvmem-cells = <&macaddr_info_8>;
+	nvmem-cell-names = "mac-address";
+};
+
+&switch0 {
+	compatible = "mediatek,mt7530";
+	ports {
+		port@0 {
+			status = "okay";
+			label = "lan0";
+		};
+
+		port@1 {
+			status = "okay";
+			label = "lan3";
+		};
+
+		port@2 {
+			status = "okay";
+			label = "lan2";
+		};
+
+		port@3 {
+			status = "okay";
+			label = "lan1";
+		};
+
+		port@5 {
+			phy-mode = "rgmii";
+			reg = <5>;
+
+			/*
+			fixed-link {
+				full-duplex;
+				speed = <1000>;
+			};
+			*/
+		};
+
+		port@6 {
+			phy-mode = "rgmii";
+			ethernet = <&gmac0>;
+
+			fixed-link {
+				pause;
+				speed = <1000>;
+			};
+		};
+
+	};
+};
+
+&info {
+	compatible = "nvmem-cells";
+	#address-cells = <1>;
+	#size-cells = <1>;
+
+	macaddr_info_8: macaddr@8 {
+		reg = <0x8 0x6>;
+	};
+};
diff --git a/target/linux/ramips/image/mt7621.mk b/target/linux/ramips/image/mt7621.mk
index a461c57f15..617c8adc37 100644
--- a/target/linux/ramips/image/mt7621.mk
+++ b/target/linux/ramips/image/mt7621.mk
@@ -1461,6 +1461,18 @@  define Device/tplink_eap235-wall-v1
 endef
 TARGET_DEVICES += tplink_eap235-wall-v1
 
+define Device/tplink_eap615-wall-v1
+  $(Device/tplink-safeloader)
+  DEVICE_MODEL := EAP615-Wall
+  DEVICE_VARIANT := v1
+  DEVICE_PACKAGES := kmod-mt7915e
+  TPLINK_BOARD_ID := EAP615-WALL-V1
+  KERNEL := kernel-bin | lzma | fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb | pad-to 64k
+  KERNEL_INITRAMFS := kernel-bin | lzma | fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k
+  IMAGE_SIZE := 13248k
+endef
+TARGET_DEVICES += tplink_eap615-wall-v1
+
 define Device/tplink_re350-v1
   $(Device/dsa-migration)
   $(Device/tplink-safeloader)
diff --git a/target/linux/ramips/mt7621/base-files/etc/board.d/02_network b/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
index 52e0b6b572..3e34ede3be 100644
--- a/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
+++ b/target/linux/ramips/mt7621/base-files/etc/board.d/02_network
@@ -59,7 +59,8 @@  ramips_setup_interfaces()
 	mikrotik,routerboard-760igs)
 		ucidef_set_interfaces_lan_wan "lan2 lan3 lan4 lan5" "wan sfp"
 		;;
-	tplink,eap235-wall-v1)
+	tplink,eap235-wall-v1|\
+	tplink,eap615-wall-v1)
 		ucidef_set_interface_lan "lan0 lan1 lan2 lan3"
 		;;
 	ubnt,edgerouter-x)
diff --git a/tools/firmware-utils/patches/999-eap615.patch b/tools/firmware-utils/patches/999-eap615.patch
new file mode 100644
index 0000000000..2348bbce24
--- /dev/null
+++ b/tools/firmware-utils/patches/999-eap615.patch
@@ -0,0 +1,55 @@ 
+From 41c9244ee6347f00f8c85117d17d9d2429a25999 Mon Sep 17 00:00:00 2001
+From: Stijn Tintel <stijn@linux-ipv6.be>
+Date: Thu, 27 Jan 2022 11:35:54 +0200
+Subject: [PATCH] tplink-safeloader: EAP615-Wall v1 support
+
+Signed-off-by: Stijn Tintel <stijn@linux-ipv6.be>
+---
+ src/tplink-safeloader.c | 31 +++++++++++++++++++++++++++++++
+ 1 file changed, 31 insertions(+)
+
+diff --git a/src/tplink-safeloader.c b/src/tplink-safeloader.c
+index 0565dcc..009b2c4 100644
+--- a/src/tplink-safeloader.c
++++ b/src/tplink-safeloader.c
+@@ -1703,6 +1703,37 @@ static struct device_info boards[] = {
+ 		.last_sysupgrade_partition = "file-system"
+ 	},
+ 
++	/** Firmware layout for the EAP615-Wall v1 */
++	{
++		.id = "EAP615-WALL-V1",
++		.soft_ver = SOFT_VER_DEFAULT,
++		.soft_ver_compat_level = 1,
++		.support_list =
++			"SupportList:\r\n"
++			"EAP615-Wall(TP-Link|UN|AX1800-D):1.0\r\n"
++			"EAP615-Wall(TP-Link|CA|AX1800-D):1.0\r\n"
++			"EAP615-Wall(TP-Link|JP|AX1800-D):1.0\r\n",
++		.part_trail = PART_TRAIL_NONE,
++
++		.partitions = {
++			{"fs-uboot", 0x00000, 0x80000},
++			{"partition-table", 0x80000, 0x02000},
++			{"default-mac", 0x90000, 0x01000},
++			{"support-list", 0x91000, 0x00100},
++			{"product-info", 0x91100, 0x00400},
++			{"soft-version", 0x92000, 0x00100},
++			{"firmware", 0xa0000, 0xcf0000},
++			{"user-config", 0xd90000, 0x60000},
++			{"mutil-log", 0xf30000, 0x80000},
++			{"oops", 0xfb0000, 0x40000},
++			{"radio", 0xff0000, 0x10000},
++			{NULL, 0, 0}
++		},
++
++		.first_sysupgrade_partition = "os-image",
++		.last_sysupgrade_partition = "file-system"
++	},
++
+ 	/** Firmware layout for the TL-WA1201 v2 */
+ 	{
+ 		.id     = "TL-WA1201-V2",
+-- 
+2.34.1
+