Support TP-Link TL-SG3428 24-ports + 4SFP

  • System Description: JetStream 24-Port Gigabit L2+ Managed Switch with 4 SFP Slots
  • Device Name: TL-SG3428
  • Device Location: Hong Kong
  • Contact Information:
  • Hardware Version: TL-SG3428 2.0
  • Firmware Version: 2.0.11 Build 20230602 Rel.76586
  • Boot Loader Version: TP-LINK BOOTUTIL(v1.0.0)

I managed to find the ROM chip on the motherboard and ground CLK (16) pin during start-up, which effectively starts kernel recovery via tftp. This fails however...

Hit any key to stop autoboot: 0
**********************************************
* TP-Link BOOTUTIL(v1.0.0) *
**********************************************
Copyright (c) 2022 TP-Link Corporation Limited
Create Date: May 20 2022 - 11:59:15

Boot Menu
0 - Print this boot menu
1 - Reboot
2 - Reset
3 - Start
4 - Activate Backup Image
5 - Display image(s) info
6 - Password recovery

Enter your choice(0-6)

tplink> 3
SF: Unsupported manufacturer ff
Failed to initialize SPI flash at 0:0
Wrong Image Format
The kernel has been damaged!
begin to fix kernel...
Please put the uimage.img into the tftpserver directory
You can press CTRL-C to stop loading
mvEgigaInit: egiga0 mvNetaPortEnable failed (error)
mvEgigaInit: egiga0 failed
mvEgigaInit: egiga1 mvNetaPortEnable failed (error)
mvEgigaInit: egiga1 failed
Download failed
The Startup Image does not exist

Begin to startup system, please wait a moment...

Starting kernel ...

I'm trying to use the first ethernet RJ-45 port, but even tried the last SFP port, seems to be no difference. To me it appears that this Bootutil is missing the required ethernet drivers. Does anyone have any idea on how to resolve this issue?

I also managed to use the DHCP autoinstall feature faq 2065of the device. However that process fails in the end due to the unencrypted openwrt image: "Failed to verify Rsa."

***************** User Access Login ********************

User:#2006-01-01 08:00:36,[NETIF]/5/Line protocol on Interface VLAN1, changed state to up.
#2006-01-01 08:00:39,[Port]/5/The STACK_SFP_PLUS Transceiver is inserted to Gi1/0/28.
#2006-01-01 08:00:47,[User]/5/Login the web by admin on web (192.168.0.113).
Failed to verify Rsa.
#2006-01-01 08:03:00,[AutoInstall]/3/Was not able to update the image.
#2006-01-01 08:03:00,[AutoInstall]/5/AutoInstall process is completed.

how is your post related to openwrt ?

I would like to run OpenWrt from it, much like detailed here https://openwrt.org/toh/tp-link/tl-sg2452p. The devices should be quite similar.

The first step is to boot from an OpenWrt kernel, but as I explained that seems to be non-trivial.

Hoping to hear from people familiar with similar hardware etc.

start by posting the stock boot log, add a stock firmware link too ...

This is the stock firmware: https://static.tp-link.com/upload/firmware/2023/202307/20230705/TL-SG3428(UN)_v2_2.0.11%20Build%2020230602.zip

The serial console does not reveal anything from the operating system unfortunately...

tplink> ?
Boot Menu
0 - Print this boot menu
1 - Reboot
2 - Reset
3 - Start
4 - Activate Backup Image
5 - Display image(s) info
6 - Password recovery

Enter your choice(0-6)

tplink> 5
Images in system:
index Attribute Size Filename


1 (b) 10485760 image1.bin
2 (*) 10485760 image2.bin


(*) - with the Startup attribute
(b) - with the Backup attribute
tplink> 3

Begin to startup system, please wait a moment...

Starting kernel ...

***************** User Access Login ********************

User:#2006-01-01 08:00:35,[Link]/5/Gi1/0/25 changed state to up.
#2006-01-01 08:00:36,[NETIF]/5/Line protocol on Interface VLAN1, changed state to up.
#2006-01-01 08:00:39,[Port]/5/The 10G_BASE_SR_SFP Transceiver is inserted to Gi1/0/25.

Login invalid.

***************** User Access Login ********************

User:admin
Password:
#2006-01-01 08:02:17,[User]/5/Login the CLI by admin on console.

TL-SG3428>
broadcast - Write message to all users logged in,at most 256
characters
enable - Enter Privileged EXEC Mode
reboot - Reboot the system
reset - Reset the system
exit - Exit current mode
history - Display command history

TL-SG3428>

TL-SG3428>enable

TL-SG3428#
TL-SG3428#show boot
Boot config:
Current Startup Image - image2.bin
Next Startup Image - image2.bin
Backup Image - image1.bin
Current Startup Config - config2.cfg
Next Startup Config - config2.cfg
Backup Config - config1.cfg

TL-SG3428#show image-info
Image Info:
Current Startup Image - Exist & OK
Image Name - image2.bin
Flash Version - 1.3.0
Software Version - 2.0.11
Next Startup Image - Exist & OK
Image Name - image2.bin
Flash Version - 1.3.0
Software Version - 2.0.11
Backup Image - Exist & OK
Image Name - image1.bin
Flash Version - 1.3.0
Software Version - 2.0.7

TL-SG3428#

Any idea to make it more verbose?

I was in contact with TP-Link Support GPL@tp-link.com to obtain a link to the right GPL sources (and firmware).

Thank you for contacting TP-Link.

Here is the GPL Code for SG3428 V2.30, please check:
https://support.omadanetworks.com/en/product/sg3428/v2.30/?resourceType=download

BR2_ARCH="arm"
BR2_ENDIAN="LITTLE"
BR2_GCC_TARGET_ABI="aapcs-linux"
BR2_GCC_TARGET_CPU="cortex-a9"
BR2_GCC_TARGET_FLOAT_ABI="soft"
BR2_GCC_TARGET_MODE="arm"
....
#
# TPLINK
#
BR2_TPLINK_BUILD_SYSTEM=y
BR2_TPLINK_PROJECT_NAME="MV_AC3"
BR2_TPLINK_COM_SW=y
BR2_TPLINK_COM_SW_NAME="RTK_MAPLE"
BR2_TPLINK_COM_SW_SWITCH_LIST="T2700G_28TQ_V3 OSW_24G_400W TL_SG2210HP_M2 TL_SG3428_V2 TL_SG3428MP_V2 TL_SG3428MP_V3 TL_SG3428MP_V4"
BR2_TPLINK_SOURCE_DIR="$(TOPDIR)/../src"
BR2_TPLINK_IPV6=y
BR2_TPLINK_CFLAGS="$(BR2_TPLINK_CHIP_VENDOR_DEF) $(BR2_TPLINK_CHIP_PLATFORM_DEF) $(BR2_TPLINK_ARCH_DEF) $(BR2_TPLINK_ENDIAN_DEFS) $(BR2_TPLINK_INET6_DEF)"
BR2_TPLINK_ARCH_DEF="-D_CPU_ARCH=1 -D_CPU_ARCH_ARM=1"
BR2_TPLINK_ENDIAN_DEFS="-D_LITTLE_ENDIAN=1234 -D_BIG_ENDIAN=4321 -D_BYTE_ORDER=1234"
BR2_TPLINK_CHIP_PLATFORM_DEF="-D_CHIP_VENDOR_MARVELL_AC3"
BR2_TPLINK_INET6_DEF="-D_INET6_SUPPORT=1"

I managed to build the toolchain/firmware and u-boot...

>>>   Executing post-image script board/marvell/common/post_image.sh
/var/tmp/tplink/MV-AC3_GPL/tplink/buildroot-marvell/build/mv-ac3/images
marvell.its:8.12-20.5: Warning (unit_address_vs_reg): /images/kernel@1: node has a unit name, but no reg property
marvell.its:17.11-19.6: Warning (unit_address_vs_reg): /images/kernel@1/hash@1: node has a unit name, but no reg property
marvell.its:22.9-31.5: Warning (unit_address_vs_reg): /images/fdt@1: node has a unit name, but no reg property
marvell.its:28.11-30.6: Warning (unit_address_vs_reg): /images/fdt@1/hash@1: node has a unit name, but no reg property
marvell.its:33.9-42.5: Warning (unit_address_vs_reg): /images/fdt@2: node has a unit name, but no reg property
marvell.its:39.11-41.6: Warning (unit_address_vs_reg): /images/fdt@2/hash@1: node has a unit name, but no reg property
marvell.its:47.10-51.5: Warning (unit_address_vs_reg): /configurations/conf@1: node has a unit name, but no reg property
marvell.its:53.10-57.5: Warning (unit_address_vs_reg): /configurations/conf@2: node has a unit name, but no reg property
FIT description: Linux kernel and FDT blob
Created:         Tue Feb 18 12:09:08 2025
 Image 0 (kernel@1)
  Description:  Marvell Linux
  Type:         Kernel Image
  Compression:  uncompressed
  Data Size:    6288024 Bytes = 6140.65 kB = 6.00 MB
  Architecture: ARM
  OS:           Linux
  Load Address: 0x02a00000
  Entry Point:  0x02a00000
  Hash algo:    crc32
  Hash value:   c6f342d1
 Image 1 (fdt@1)
  Description:  Flattened Device Tree blob - msys-ac3-rd.dtb
  Type:         Flat Device Tree
  Compression:  uncompressed
  Data Size:    10802 Bytes = 10.55 kB = 0.01 MB
  Architecture: ARM
  Hash algo:    crc32
  Hash value:   b366d773
 Image 2 (fdt@2)
  Description:  Flattened Device Tree blob - msys-ac3_tl-sg2210hp-m2.dtb
  Type:         Flat Device Tree
  Compression:  uncompressed
  Data Size:    10802 Bytes = 10.55 kB = 0.01 MB
  Architecture: ARM
  Hash algo:    crc32
  Hash value:   d92cbae6
 Default Configuration: 'conf@1'
 Configuration 0 (conf@1)
  Description:  Boot Linux kernel with FDT blob 1
  Kernel:       kernel@1
  FDT:          fdt@1
 Configuration 1 (conf@2)
  Description:  Boot Linux kernel with FDT blob 1
  Kernel:       kernel@1
  FDT:          fdt@2
/var/tmp/tplink/MV-AC3_GPL/tplink/buildroot-marvell


make[1]: Leaving directory '/var/tmp/tplink/MV-AC3_GPL/ldk_marvell/u-boot-2013.01-2016_T1.0.eng_drop_v6/examples/api'

**** [Creating Image]   *****


 Ext. headers = 1, Header size = 75904 bytes Hdr-to-Img gap = 0 bytes
New image size = 0xa39d0[670160] Source image size = 0xa39d0[670160]
====>>>> u-boot-msys-ac3-2016_t1.0-spi-uart.bin was created

 Ext. headers = 1, Header size = 83584 bytes Hdr-to-Img gap = 0 bytes
New image size = 0[0] Source image size = 0[0]
====>>>> u-boot-msys-ac3-2016_t1.0-spi-debug.bin was created

 Ext. headers = 1, Header size = 76640 bytes Hdr-to-Img gap = 0 bytes
New image size = 0xa39d4[670164] Source image size = 0xa39d0[670160]
====>>>> u-boot-msys-ac3-2016_t1.0-spi.bin was created

I found the ethernet initialization error in the u-boot sources in board/mv_ebu/common/USP/mv_egiga_neta.c. The Readme details that a tftpboot command will cause an eth->init(), which does a dev->init(), which ends up in "static int mvEgigaInit(struct eth_device *dev, bd_t *p)"

According to the sources these happen without "error":

  • mvNetaPortInit
  • mvNetaRxqInit
  • mvNetaTxqInit
  • mvNetaRxDescFill
  • mvBoardPhyAddrGet
  • mvNetaMacAddrSet
  • mvPPEthPhyReadSpeed if the speed is not auto

        /* start the hal - rx/tx activity */
        /* Check if link is up for 2 Sec */
        for (i = 1; i < 100 ; i++) {
                status = mvNetaPortEnable(priv->port);
                if (status == MV_OK) {
                        priv->devEnable = MV_TRUE;
                        break;
                }
                mvOsDelay(20);
        }
        if (status != MV_OK) {
                printf("%s: %s mvNetaPortEnable failed (error)\n", __func__, dev->name);
                goto error;
        }
        return 1;
error:
        if (priv->devInit)
                mvEgigaHalt(dev);

        printf("%s: %s failed\n", __func__, dev->name);
        return -1;
}

What fails is the mvNetaPortEnable. Both interfaces are attempted up to 2s for the port to get enabled and/or link, but that seems to fail (I see no LED coming up on the panel for any of the RJ45 and/or SFP)

This appears to be a Marvell XP based switch. There are some MikroTik switches supported by mainstream Linux that may be similar. See the DTS files for the MikroTik CRS305, CRS326, and CRS328 switches. OpenWrt doesn't currently have support for any Marvell based switches.

I see mach armada-370, armada-xp and armada-msys in kernel config

MV-AC3_GPL/tplink/buildroot-marvell$ grep MACH build/mv-ac3/build/linux-custom/.config
CONFIG_MACH_MVEBU_ANY=y
CONFIG_MACH_MVEBU_V7=y
CONFIG_MACH_ARMADA_370=y
# CONFIG_MACH_ARMADA_375 is not set
# CONFIG_MACH_ARMADA_38X is not set
# CONFIG_MACH_ARMADA_39X is not set
CONFIG_MACH_ARMADA_XP=y
# CONFIG_MACH_DOVE is not set
CONFIG_MACH_MSYS=y

The build produced two "new" dtbs, so I guess it must be one of these

MV-AC3_GPL/tplink/buildroot-marvell$ ls -lt ./build/mv-ac3/build/linux-custom/arch/arm/boot/dts/  |head
total 11048
-rwxr-xr-x 1 nobody nobody  10802 Feb 18 11:32 msys-ac3-rd.dtb
-rw-r--r-- 1 nobody nobody  10802 Feb 18 11:32 msys-ac3_tl-sg2210hp-m2.dtb
-rwxr-xr-x 1 nobody nobody   2234 Aug 30  2021 ste-ccu8540.dts
-rwxr-xr-x 1 nobody nobody   1546 Aug 30  2021 ste-ccu9540.dts
-rwxr-xr-x 1 nobody nobody  32659 Aug 30  2021 ste-dbx5x0.dtsi
-rwxr-xr-x 1 nobody nobody   9564 Aug 30  2021 ste-href-ab8500.dtsi
MV-AC3_GPL/tplink/buildroot-marvell$ find ./build/mv-ac3/build/linux-custom/arch/arm/ -name "*.dts" | grep msys
./build/mv-ac3/build/linux-custom/arch/arm/boot/dts/msys-ac3-db.dts
./build/mv-ac3/build/linux-custom/arch/arm/boot/dts/msys-ac3-rd.dts
./build/mv-ac3/build/linux-custom/arch/arm/boot/dts/msys-ac3_tl-sg2210hp-m2.dts

Both of these use msys-single.dtsi

/*
 * Device Tree Include file for Marvell Msys family SoC                                                               
 *                                                         
 * Copyright (C) 2015 Marvell                             
 *                                                                                                                    
 * This file is licensed under the terms of the GNU General Public                                                    
 * License version 2.  This program is licensed "as is" without any                                                   
 * warranty of any kind, whether express or implied.       
 *                                                      
 * Contains definitions specific to the Msys SoC that are not                                                         
 * common to all Armada SoCs.                 
 */                                                                                                                   
                                                           
#include "armada-370-xp.dtsi"                              
                                                           
/ {                                                                                                                   
        model = "Marvell Msys family SoC";                                                                            
        compatible = "marvell,msys", "marvell,armada-370-xp";                                                         
                                                                                                                      
        aliases {                                          
                gpio0 = &gpio0;                            
                gpio1 = &gpio1;               
        };                                                                                                            
                                                           
        cpus {                                                                                                        
                #address-cells = <1>;                
                #size-cells = <0>;                         
                                                           
                cpu@0 {                                
                        device_type = "cpu";                                                                          
                        compatible = "marvell,sheeva-v7";
                        reg = <0>;
                        resets = <&cpurst 0>;
                };
        };

        soc {
                compatible = "marvell,armadaxp-mbus", "simple-bus";

                pcie-mem-aperture = <0xe8000000 0x7e00000>; 
                pcie-io-aperture  = <0xefe00000 0x100000>;

                bootrom {
                        compatible = "marvell,bootrom";
                        reg = <MBUS_ID(0x01, 0x1d) 0 0x100000>;
                };

                dfx: dfx-server {
                        #address-cells = <1>;
                        #size-cells = <1>;
                        ranges = <0 MBUS_ID(0x08, 0x00) 0 0x100000>;
                        reg = <MBUS_ID(0x08, 0x00) 0 0x100000>;

                        coreclk: mvebu-sar@f8204 {
                                compatible = "marvell,msys-core-clock";
                                reg = <0xf8204 0x4>;
                                #clock-cells = <1>;
                        };

                        soc-id@f8244 {
                                compatible = "marvell,msys-soc-id";
                                reg = <0xf8244 0x4>;
                        };

                        coredivclk: corediv-clock@f8268 {
                                compatible = "marvell,msys-corediv-clock";
                                reg = <0xf8268 0xc>;
                                #clock-cells = <1>;
                                clocks = <&coreclk 3>;
                                clock-output-names = "nand";
                        };
                };

                ireg: internal-regs {
                        reg = <MBUS_ID(0xf0, 0x01) 0 0x100000>;

                        sdramc@1400 {
                                compatible = "marvell,armada-xp-sdram-controller";
                                reg = <0x1400 0x500>;                                                                                                                                                                                        
                        };

                        L2: l2-cache {
                                compatible = "marvell,aurora-system-cache";
                                reg = <0x08000 0x1000>;
                                cache-id-part = <0x100>;
                                cache-level = <2>;
                                cache-unified;
                                wt-override;
                        };

                        spi0: spi@10600 {
                                compatible = "marvell,armada-xp-spi",
                                                "marvell,orion-spi";
                                pinctrl-0 = <&spi_pins>;
                                pinctrl-names = "default";
                        };

                        i2c0: i2c@11000 {
                                reg = <0x11000 0x20>;
                                status = "okay";
                                clock-frequency = <100000>; 
                        };

                        pinctrl@18000 {
                                reg = <0x18000 0x20>;

                                devbus_pins: devbus-pins {
                                        marvell,pins = "mpp0", "mpp1", "mpp2",
                                                                        "mpp3", "mpp5", "mpp6",
                                                                        "mpp7", "mpp8", "mpp9",
                                                                        "mpp10", "mpp11", "mpp12",
                                                                        "mpp16", "mpp17",
                                                                        "mpp20", "mpp21", "mpp22",
                                                                        "mpp23", "mpp24", "mpp25",
                                                                        "mpp26", "mpp27", "mpp28",
                                                                        "mpp29", "mpp30";
                                        marvell,function = "dev";
                                };

                                nand_pins: nand-pins {
                                        marvell,pins = "mpp4", "mpp16", "mpp19",
                                                                        "mpp20", "mpp21", "mpp22",
                                                                        "mpp23", "mpp24", "mpp25",
                                                                        "mpp26", "mpp27", "mpp28",
                                                                        "mpp29", "mpp30";
                                        marvell,function = "nf";
                                };

                                sdio_pins: sdio-pins {
                                        marvell,pins = "mpp5", "mpp6", "mpp7",
                                                                        "mpp8", "mpp9", "mpp10";
                                        marvell,function = "sdio";
                                };

                                spi_pins: spi-pins {
                                        marvell,pins = "mpp0", "mpp1", "mpp2",
                                                                        "mpp3";
                                        marvell,function = "spi";
                                };

                                uart1_pins: uart1-pins {
                                        marvell,pins = "mpp11", "mpp12";
                                        marvell,function = "uart1";
                                };

                                pp_pin: pp-pin {
                                        marvell,pins = "mpp13";
                                        marvell,function = "pp";
                                };

                                i2c0_pins: i2c0-pins {
                                        marvell,pins = "mpp14", "mpp15";
                                        marvell,function = "i2c0";
                                };
                                                                                                                                                                                                                                             
                                slvsmi_pins: slvsmi-pins {
                                        marvell,pins = "mpp31", "mpp32";
                                        marvell,function = "slvsmi";
                                };                                                                                    
                                                           
                        };                              
                                                           
                        gpio0: gpio@18100 {   
                                compatible = "marvell,orion-gpio";
                                reg = <0x18100 0x40>;
                                ngpios = <32>;
                                gpio-controller;
                                #gpio-cells = <2>;                                                                    
                                interrupt-controller;                                                                 
                                #interrupt-cells = <2>; 
                                interrupts = <82>, <83>, <84>, <85>;
                        };

                        gpio1: gpio@18180 {
                                compatible = "marvell,orion-gpio";
                                reg = <0x18180 0x40>;
                                ngpios = <1>;                                                                         
                                gpio-controller;
                                #gpio-cells = <2>;
                                interrupt-controller;
                                #interrupt-cells = <2>;
                                interrupts = <87>;
                        };                                
                                                                                                                      
                        system-controller@18200 {                                                                     
                                compatible = "marvell,armada-370-xp-system-controller";        
                                reg = <0x18200 0x500>;                                                                
                        };                                                                                            
                                                                                                                      
                        gateclk: clock-gating-control@18220 {                                     
                                compatible = "marvell,msys-gating-clock";                         
                                reg = <0x18220 0x4>;                                                                  
                                clocks = <&coreclk 0>;                                                                
                                #clock-cells = <1>;
                        };
                                                           
                        timer@20300 {                                                                                 
                                compatible = "marvell,armada-xp-timer";                           
                                clocks = <&coreclk 0>, <&refclk>;                                 
                                clock-names = "nbclk", "fixed";                                   
                        };                                                                                            
                                                                                                                      
                        cpurst: cpurst@20800 {
                                compatible = "marvell,armada-370-cpu-reset";
                                reg = <0x20800 0x10>; 
                                #reset-cells = <1>;                                                                   
                        };                                                                                            
                                                                                                                      
                        interrupt-controller@20a00 {
                              reg = <0x20a00 0x2d0>, <0x21070 0x58>, <0x21870 0x390>;
                        };                          
                                                                                                                      
                        pmsu@22000 {                                                                                  
                                compatible = "marvell,msys-pmsu";
                                reg = <0x22000 0x1000>, <0x20984 0x4>;
                        };
                                                           
                        /* Overwrite FIFO size */                                                                     
                        eth0: ethernet@70000 {                                                                        
                                tx-csum-limit = <9800>;
                        };
                                                           
                        eth1: ethernet@74000 {                                                                        
                                tx-csum-limit = <9800>;                                                               
                        };        

                        xor@f0800 {                   
                                compatible = "marvell,orion-xor";       
                                reg = <0xF0800 0x100                                                                  
                                       0xF0A00 0x100>;
                                clocks = <&gateclk 22>;
                        };                                
                                                                                                                      
                        system-controller@18200 {                                                                     
                                compatible = "marvell,armada-370-xp-system-controller";                               
                                reg = <0x18200 0x500>;                                                                
                        };                                                                                            
                                                                                                                      
                        gateclk: clock-gating-control@18220 {                                     
                                compatible = "marvell,msys-gating-clock";                         
                                reg = <0x18220 0x4>;                                                                  
                                clocks = <&coreclk 0>;                                                                
                                #clock-cells = <1>;
                        };                                                                                            
                                                                                                                      
                        timer@20300 {                                                                                 
                                compatible = "marvell,armada-xp-timer";                           
                                clocks = <&coreclk 0>, <&refclk>;                                 
                                clock-names = "nbclk", "fixed";                                   
                        };                                                                                            
                                                                                                                      
                        cpurst: cpurst@20800 {       
                                compatible = "marvell,armada-370-cpu-reset";                                          
                                reg = <0x20800 0x10>; 
                                #reset-cells = <1>;                                                                   
                        };                                                                                            
                                                                                                                      
                        interrupt-controller@20a00 {
                              reg = <0x20a00 0x2d0>, <0x21070 0x58>, <0x21870 0x390>;                                 
                        };                                                                                            
                                                                                                                      
                        pmsu@22000 {                                                                                  
                                compatible = "marvell,msys-pmsu";                                                     
                                reg = <0x22000 0x1000>, <0x20984 0x4>;                                                
                        };                                                                                            
                                                                                                                      
                        /* Overwrite FIFO size */                                                                     
                        eth0: ethernet@70000 {                                                                        
                                tx-csum-limit = <9800>;                                                               
                        };                                 
                                                           
                        eth1: ethernet@74000 {                                                                        
                                tx-csum-limit = <9800>;                                                               
                        };                                                                                            
                                                                                                                      
                        xor@f0800 {                                                                                   
                                compatible = "marvell,orion-xor";                                                     
                                reg = <0xF0800 0x100                                                                  
                                       0xF0A00 0x100>;
                                clocks = <&gateclk 22>;                                                               
                                status = "okay";          
                                                                                                                      
                                xor00 {                                                                               
                                        interrupts = <51>;                                                            
                                        dmacap,memcpy;     
                                        dmacap,xor;                                                                   
                                };                         
                                xor01 {                                                                               
                                        interrupts = <52>;                                                            
                                        dmacap,memcpy;                                                                
                                        dmacap,xor;                                                                   
                                        dmacap,memset;
                                };                         
                        };                                                                                            
                };                                                                                                    
        };                                                                                                            
                                                           
        clocks {                                           
                /* 25 MHz reference crystal */                                                                        
                refclk: oscillator {                                                                                  
                        compatible = "fixed-clock";  
                        #clock-cells = <0>;  
                        clock-frequency = <25000000>; 
                };                                                                                                    
        };                                                                                                            
};

And have some small differences:

MV-AC3_GPL/tplink/buildroot-marvell$ diff -u  ./build/mv-ac3/build/linux-custom/arch/arm/boot/dts/msys-ac3-rd.dts ./build/mv-ac3/build/linux-custom/arch/arm/boot/dts/msys-ac3_tl-sg2210hp-m2.dts 
--- ./build/mv-ac3/build/linux-custom/arch/arm/boot/dts/msys-ac3-rd.dts 2021-08-30 03:54:24.000000000 +0200
+++ ./build/mv-ac3/build/linux-custom/arch/arm/boot/dts/msys-ac3_tl-sg2210hp-m2.dts     2021-08-30 03:54:24.000000000 +0200
@@ -139,17 +139,17 @@
                                        reg = <0x01000000 0x3f000000>;
                                };
                        };
-
+
                        system-controller@18200 {
                                compatible = "marvell,armada-370-xp-system-controller";
-                               rst-gpio = <17>;
+                               rst-gpio = <28>;
                                rst-invt = <1>;
                        };
                };
 
                i2c-gpio{
                        compatible = "i2c-gpio";
-                       gpios=<&gpio0 4 0 &gpio0 28 0>;
+                       gpios=<&gpio0 18 0 &gpio0 4 0>;
                        i2c-gpio,delay-us = <5>;
                        i2c-gpio,timeout-ms = <10>;
                        status = "okay";

So OpenWrt target should mvebu, right...

Something close to this...