From abc9cb7afda37cc2f1a90a1a24cb27173007349b Mon Sep 17 00:00:00 2001 From: logicog Date: Tue, 24 Mar 2026 06:08:13 +0100 Subject: [PATCH] Add 5G speed display support and 5/10G EEE display/settings --- cmd_parser.c | 11 +++++++++ rtl837x_port.c | 65 ++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 69 insertions(+), 7 deletions(-) diff --git a/cmd_parser.c b/cmd_parser.c index cf66829..154b8b8 100644 --- a/cmd_parser.c +++ b/cmd_parser.c @@ -661,6 +661,14 @@ void parse_port(void) else if (cmd_compare(3, "full")) phy_settings.duplex = PHY_DUPLEX_FULL; phy_set_speed(); + } else if (cmd_compare(2, "10g")) { + print_string(" 10G\n"); + phy_settings.speed = PHY_SPEED_10G; + phy_set_speed(); + } else if (cmd_compare(2, "5g")) { + print_string(" 5G\n"); + phy_settings.speed = PHY_SPEED_5G; + phy_set_speed(); } else if (cmd_compare(2, "2g5")) { print_string(" 2.5G\n"); phy_settings.speed = PHY_SPEED_2G5; @@ -1062,6 +1070,9 @@ void parse_eee(void) __xdata int8_t port = -1; __xdata uint8_t speed = EEE_2G5; __xdata uint8_t speed_word = 0; + + if (machine.n_10g) + speed = EEE_10G; // Check if word 2 is a speed (contains 'g' or 'm') or a port number if (cmd_words_len >= 3) { uint8_t idx = cmd_words_b[2]; diff --git a/rtl837x_port.c b/rtl837x_port.c index 4c12a51..d1650aa 100644 --- a/rtl837x_port.c +++ b/rtl837x_port.c @@ -440,6 +440,9 @@ void port_stats_print(void) __banked case 5: print_string("2.5G\t"); break; + case 6: + print_string("5G\t"); + break; case 99: print_string("Down\t"); break; @@ -489,20 +492,19 @@ void port_eee_enable(__xdata uint8_t port,__xdata uint8_t speed) __banked return; } + REG_SET(RTL837X_EEE_CTRL_BASE + (port << 8), EEE_RX_ENABLE | EEE_TX_ENABLE); print_string("EEE on for "); print_byte(port); print_string(" speed "); // Enable all speeds up to the specified speed - if ((speed & (EEE_100 | EEE_1000 | EEE_2G5)) == EEE_100) { + if ((speed & (EEE_100 | EEE_1000 | EEE_2G5 | EEE_5G | EEE_10G)) == EEE_100) { print_string("100m\n"); - REG_SET(RTL8373_EEE_CTRL_BASE + (port << 2), EEE_100); // Enable EEE advertisement for 100BASE-T via EEE Advertisement Reg phy_write(port, PHY_MMD_AN, PHY_EEE_ADV, PHY_EEE_BIT_100M); if (!(speed & EEE_NORESET)) phy_reset(port); return; } - if ((speed & (EEE_100 | EEE_1000 | EEE_2G5)) == EEE_1000) { + if ((speed & (EEE_100 | EEE_1000 | EEE_2G5 | EEE_5G | EEE_10G)) == EEE_1000) { print_string("1g\n"); - REG_SET(RTL8373_EEE_CTRL_BASE + (port << 2), EEE_100 | EEE_1000); // Disable EEE advertisement for 2.5GBASE-T via EEE Advertisement Reg 2 phy_write(port, PHY_MMD_AN, PHY_EEE_ADV2, 0); // Enable EEE advertisement for 100/1000BASE-T via EEE Advertisement Reg @@ -511,9 +513,8 @@ void port_eee_enable(__xdata uint8_t port,__xdata uint8_t speed) __banked phy_reset(port); return; } - if ((speed & (EEE_100 | EEE_1000 | EEE_2G5)) == EEE_2G5) { + if ((speed & (EEE_100 | EEE_1000 | EEE_2G5 | EEE_5G | EEE_10G)) == EEE_2G5) { print_string("2g5\n"); - REG_SET(RTL8373_EEE_CTRL_BASE + (port << 2), EEE_100 | EEE_1000 | EEE_2G5); // Enable EEE advertisement for 100/1000BASE-T via EEE Advertisement Reg phy_write(port, PHY_MMD_AN, PHY_EEE_ADV, PHY_EEE_BIT_1G | PHY_EEE_BIT_100M); // Enable EEE advertisement for 2.5GBASE-T via EEE Advertisement Reg 2 @@ -522,6 +523,26 @@ void port_eee_enable(__xdata uint8_t port,__xdata uint8_t speed) __banked phy_reset(port); return; } + if ((speed & (EEE_100 | EEE_1000 | EEE_2G5 | EEE_5G | EEE_10G)) == EEE_5G) { + print_string("5g\n"); + // Enable EEE advertisement for 100/1000BASE-T via EEE Advertisement Reg + phy_write(port, PHY_MMD_AN, PHY_EEE_ADV, PHY_EEE_BIT_1G | PHY_EEE_BIT_100M); + // Enable EEE advertisement for 2.5GBASE-T via EEE Advertisement Reg 2 + phy_write(port, PHY_MMD_AN, PHY_EEE_ADV2, PHY_EEE_BIT_2G5 | PHY_EEE_BIT_5G); + if (!(speed & EEE_NORESET)) + phy_reset(port); + return; + } + if ((speed & (EEE_100 | EEE_1000 | EEE_2G5 | EEE_5G | EEE_10G)) == EEE_10G) { + print_string("10g\n"); + // Enable EEE advertisement for 100/1000BASE-T via EEE Advertisement Reg + phy_write(port, PHY_MMD_AN, PHY_EEE_ADV, PHY_EEE_BIT_10G | PHY_EEE_BIT_1G | PHY_EEE_BIT_100M); + // Enable EEE advertisement for 2.5GBASE-T via EEE Advertisement Reg 2 + phy_write(port, PHY_MMD_AN, PHY_EEE_ADV2, PHY_EEE_BIT_2G5 | PHY_EEE_BIT_5G); + if (!(speed & EEE_NORESET)) + phy_reset(port); + return; + } } @@ -532,7 +553,7 @@ void port_eee_disable(uint8_t port) __banked return; print_string("EEE off for "); print_byte(port); write_char('\n'); - REG_SET(RTL8373_EEE_CTRL_BASE + (port << 2), 0); + REG_SET(RTL837X_EEE_CTRL_BASE + (port << 8), 0); // Disable EEE advertisement for 100/1000BASE-T via EEE Advertisement Reg phy_write(port, PHY_MMD_AN, PHY_EEE_ADV, 0); // Disable EEE advertisement for 2.5GBASE-T via EEE Advertisement Reg 2 @@ -552,8 +573,24 @@ void port_eee_status(uint8_t port) __banked uint16_t v; print_string("Advertising: "); + + if (machine.n_10g) { + phy_read(port, PHY_MMD_AN, PHY_EEE_ADV); + v = SFR_DATA_U16; + if (v & PHY_EEE_BIT_10G) + print_string(" 10G"); + else + print_string(" "); + } phy_read(port, PHY_MMD_AN, PHY_EEE_ADV2); v = SFR_DATA_U16; + if (machine.n_10g) { + if (v & PHY_EEE_BIT_5G) + print_string(" 5G"); + else + print_string(" "); + } + v = SFR_DATA_U16; if (v & PHY_EEE_BIT_2G5) print_string(" 2.5G"); else @@ -570,8 +607,22 @@ void port_eee_status(uint8_t port) __banked print_string(" "); print_string(" Link Partner: "); + if (machine.n_10g) { + phy_read(port, PHY_MMD_AN, PHY_EEE_LP_ABILITY); + v = SFR_DATA_U16; + if (v & PHY_EEE_BIT_10G) + print_string(" 10G"); + else + print_string(" "); + } phy_read(port, PHY_MMD_AN, PHY_EEE_LP_ABILITY2); v = SFR_DATA_U16; + if (machine.n_10g) { + if (v & PHY_EEE_BIT_5G) + print_string(" 5G"); + else + print_string(" "); + } if (v & PHY_EEE_BIT_2G5) print_string(" 2.5G"); else