1G SFP mode: the port does not link under Linux (U-Boot patches only its own device tree)

Any SFP+ slot set to 1G through the RCW (Using 1G SFPs: bl2_qspi_*_xg1_sfp_1g.pbl or bl2_qspi_*_both_sfp_1g.pbl in the bl2 flash partition, built by build-atf.sh) does not link under Linux: the device tree Linux gets still says phy-connection-type = "10gbase-r" for that DPMAC while the lane runs at 1G. Seen here with the top slot at 1G (dpmac1, bl2_qspi_1600_xg1_sfp_1g.pbl). U-Boot’s ten64_fdt_fixup_sfps() is applied to U-Boot’s own device tree only (board_fix_fdt()), not to the one handed to the OS (ft_board_setup()), so U-Boot’s networking works and Linux’s doesn’t. Same in ten64-rebase-2026-02, where the one-1G case additionally patches ethernet@2 in the FDT fixup while the DPC fixup a few lines above (and the hardware) use DPMAC1.

Fix, on the v0.9.1 tree (df72b6d8416, board/traverse/ten64/ten64.c):

diff --git i/board/traverse/ten64/ten64.c w/board/traverse/ten64/ten64.c
index b6dcb321cdb..2c6ea608b45 100644
--- i/board/traverse/ten64/ten64.c
+++ w/board/traverse/ten64/ten64.c
@@ -405,6 +405,13 @@ int ft_board_setup(void *blob, struct bd_info *bd)
        if (IS_ENABLED(CONFIG_FSL_MC_ENET))
                fdt_fixup_board_enet(blob);

+       /* Also tell the OS which SFP+ ports the RCW runs at 1G, as done
+        * for U-Boot's own FDT in board_fix_fdt(). The mode written is
+        * "sgmii"; Linux selects 1000BASE-X or SGMII per inserted module
+        * anyway, as the PCS supports both on the same lane.
+        */
+       ten64_fdt_fixup_sfps(blob, false);
+
        ten64_fdt_change_sfp_mode(blob);

        fdt_fixup_icid(blob);

Workaround without reflashing, at the U-Boot prompt (s during autoboot), for OpenWrt in slot B, using the bootm subcommands and fdt set:

ubi part ubib
ubi read 0xa0000000 kernel
setenv bootargs root=/dev/ubiblock0_1 earlycon ubi.mtd=ubib
bootm start 0xa0000000#ten64
bootm loados
bootm ramdisk
bootm fdt
fdt set /soc/fsl-mc@80c000000/dpmacs/ethernet@1 phy-connection-type 1000base-x
bootm prep
bootm go

I believe that got that fixed a few months ago; we noticed on FreeBSD; it’s somewhere in a ten64 u-boot dev branch.

I checked ten64-rebase-2026-10 today: the 1G fixup runs only in board_fix_fdt(), on U-Boot’s own device tree (ten64.c#L351). That tree is what an EFI boot hands to the OS (FreeBSD, Debian), so it works there. But OpenWrt’s FIT image brings its own DTB, which only goes through ft_board_setup() (ten64.c#L272-333), and that has no 1G fixup. So the patch above is still needed for OpenWrt.

The post should probably say “OpenWrt” instead of “Linux”, but can’t edit the first message anymore.