realtek: add support for TP-Link SG2210P
authorAlexandru Gagniuc <mr.nuke.me@gmail.com>
Sat, 20 Aug 2022 18:49:52 +0000 (13:49 -0500)
committerSander Vanheule <sander@svanheule.net>
Tue, 13 Sep 2022 07:22:26 +0000 (09:22 +0200)
Add support for the TP-Link SG2210P switch. This is an RTL8380 based
switch with eight RJ-45 ports with 802.3af PoE, and two SFP ports.

This device shares the same board with the SG2008P and SG2008. To
model this, declare all the capabilities in the sg2xxx dtsi, and
disable unpopulated on the lower end models.

Specifications:
---------------
 - SoC:       Realtek RTL8380M
 - Flash:     32 MiB SPI flash (Vendor varies)
 - RAM:       256 MiB (Vendor varies)
 - Ethernet:  8x 10/100/1000 Mbps with PoE (all ports)
              2x SFP ports
 - Buttons:   1x "Reset" button on front panel
 - Power:     53.5V DC barrel jack
 - UART:      1x serial header, unpopulated
 - PoE:       2x TI TPS23861 I2C PoE controller

Works:
------
  - (8) RJ-45 ethernet ports
  - (2) SFP ports (with caveats)
  - Switch functions
  - System LED

Not yet enabled:
----------------
  - Power-over-Ethernet (driver works, but doesn't enable "auto" mode)
  - PoE LEDs

Enabling SFP ports:
-------------------

The SFP port control lines are hardwired, except for tx-disable. These
lines are controller by the RTL8231 in shift register mode. There is
no driver support for this yet.

However, to enable the lasers on SFP1 and SFP2 respectively:

    echo 0x0510ff00 > /sys/kernel/debug/rtl838x/led/led_p_en_ctrl
    echo      0x140 > /sys/kernel/debug/rtl838x/led/led_sw_p_ctrl.26
    echo      0x140 > /sys/kernel/debug/rtl838x/led/led_sw_p_ctrl.24

Install via serial console/tftp:
--------------------------------

The footprints R27 (0201) and R28 (0402) are not populated. To enable
serial console, 50 ohm resistors should be soldered -- any value from
0 ohm to 50 ohm will work. R27 can be replaced by a solder bridge.

The u-boot firmware drops to a TP-Link specific "BOOTUTIL" shell at
38400 baud. There is no known way to exit out of this shell, and no
way to do anything useful.

Ideally, one would trick the bootloader into flashing the sysupgrade
image first. However, if the image exceeds 6MiB in size, it will not
work. The sysupgrade image can also be flashed. To install OpenWrt:

Prepare a tftp server with:
 1. server address: 192.168.0.146
 2. the image as: "uImage.img"

Power on device, and stop boot by pressing any key.
Once the shell is active:
 1. Ground out the CLK (pin 16) of the ROM (U7)
 2. Select option "3. Start"
 3. Bootloader notes that "The kernel has been damaged!"
 4. Release CLK as sson as bootloader thinks image is corrupted.
 5. Bootloader enters automatic recovery -- details printed on console
 6. Watch as the bootloader flashes and boots OpenWrt.

Signed-off-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
[OpenWrt capitalisation in commit message]
Signed-off-by: Sander Vanheule <sander@svanheule.net>
package/boot/uboot-envtools/files/realtek
target/linux/realtek/base-files/etc/board.d/02_network
target/linux/realtek/base-files/lib/upgrade/platform.sh
target/linux/realtek/dts-5.10/rtl8380_tplink_sg2008p-v1.dts
target/linux/realtek/dts-5.10/rtl8380_tplink_sg2210p-v3.dts [new file with mode: 0644]
target/linux/realtek/dts-5.10/rtl8380_tplink_sg2xxx.dtsi
target/linux/realtek/image/rtl838x.mk

index 22568afd125e9ee3a97d7ed7e4540077d93585d2..f191503876822b42d960f2e7ea8d2610009ae5e8 100644 (file)
@@ -30,6 +30,7 @@ zyxel,gs1900-24hp-v2)
                ubootenv_add_uci_sys_config "/dev/mtd$idx2" "0x0" "0x1000" "0x10000"
        ;;
 tplink,sg2008p-v1|\
+tplink,sg2210p-v3|\
 tplink,sg2452p-v4)
        idx="$(find_mtd_index u-boot-env)"
        [ -n "$idx" ] && \
index aacbef77b4f77b8d501d81cc91bd135f1b41cc37..1dea2ad5a68e2f8cbef69426aa0046c27db5548c 100644 (file)
@@ -40,6 +40,7 @@ hpe,1920-24g)
        lan_mac_end=$(macaddr_add $lan_mac $((mac_count2-mac_count1)))
        ;;
 tplink,sg2008p-v1|\
+tplink,sg2210p-v3|\
 tplink,sg2452p-v4)
        label_mac=$(get_mac_label)
        lan_mac="$label_mac"
index b39b33206310d3a2ff4a8fd2bfaa130890bbb3a2..6faded74b5bbdf93236e0e0ddbf7b37e4cf64d56 100644 (file)
@@ -27,7 +27,8 @@ platform_do_upgrade() {
        local board=$(board_name)
 
        case "$board" in
-       tplink,sg2008p-v1)
+       tplink,sg2008p-v1|\
+       tplink,sg2210p-v3)
                tplink_sg2xxx_fix_mtdparts
                default_do_upgrade "$1"
                ;;
index 0fef52984c12cbc796a8fc8a446acf155d9489c3..bf43e412b1c6c3a54ed9ce3f3486c3a6e25e510e 100644 (file)
@@ -6,3 +6,23 @@
        compatible = "tplink,sg2008p-v1", "realtek,rtl838x-soc";
        model = "TP-Link SG2008P v1";
 };
+
+&tps23861_20 {
+       status = "disabled";
+};
+
+&phy24 {
+       status = "disabled";
+};
+
+&phy26 {
+       status = "disabled";
+};
+
+&port24 {
+       status = "disabled";
+};
+
+&port26 {
+       status = "disabled";
+};
diff --git a/target/linux/realtek/dts-5.10/rtl8380_tplink_sg2210p-v3.dts b/target/linux/realtek/dts-5.10/rtl8380_tplink_sg2210p-v3.dts
new file mode 100644 (file)
index 0000000..4b0022c
--- /dev/null
@@ -0,0 +1,16 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "rtl8380_tplink_sg2xxx.dtsi"
+
+/ {
+       compatible = "tplink,sg2210p-v3", "realtek,rtl838x-soc";
+       model = "TP-Link SG2210P v3";
+};
+
+&port24 {
+       label = "lan-sfp2";
+};
+
+&port26 {
+       label = "lan-sfp1";
+};
index 8eb309d8a848bca94f6b6d390dde5d2531d39995..e727a9405ad75b966f2c9fe0e1167e774499033d 100644 (file)
                #address-cells = <1>;
                #size-cells = <0>;
 
-               tps23861@28 {
+               tps23861_20: tps23861@20 {
+                       compatible = "ti,tps23861";
+                       reg = <0x20>;
+                       shunt-resistor-micro-ohms = <255000>;
+               };
+
+               tps23861_28: tps23861@28 {
                        compatible = "ti,tps23861";
                        reg = <0x28>;
                        shunt-resistor-micro-ohms = <255000>;
                INTERNAL_PHY(13)
                INTERNAL_PHY(14)
                INTERNAL_PHY(15)
+
+               INTERNAL_PHY(24)
+               INTERNAL_PHY(26)
        };
 };
 
                SWITCH_PORT(9, 7, internal)
                SWITCH_PORT(8, 8, internal)
 
+               SWITCH_SFP_PORT(24, 9, 1000base-x)
+               SWITCH_SFP_PORT(26, 10, 1000base-x)
+
                port@28 {
                        ethernet = <&ethernet0>;
                        reg = <28>;
index 3e27576bdaeb46b56e7eba52b4e42db5bd3d9e16..36b19b3cbbf75cf8606cebc10f8d77e9f6780585 100644 (file)
@@ -188,6 +188,17 @@ define Device/tplink_sg2008p-v1
 endef
 TARGET_DEVICES += tplink_sg2008p-v1
 
+define Device/tplink_sg2210p-v3
+  SOC := rtl8380
+  KERNEL_SIZE := 6m
+  IMAGE_SIZE := 26m
+  DEVICE_VENDOR := TP-Link
+  DEVICE_MODEL := SG2210P
+  DEVICE_VARIANT := v3
+  DEVICE_PACKAGES := kmod-hwmon-tps23861
+endef
+TARGET_DEVICES += tplink_sg2210p-v3
+
 define Device/zyxel_gs1900
   SOC := rtl8380
   IMAGE_SIZE := 6976k