From 55fd2d5fb65bdba07420938cb644c7cee5679648 Mon Sep 17 00:00:00 2001 From: chriz Date: Wed, 28 Jan 2026 09:21:03 +0100 Subject: [PATCH 1/4] Add speed option to EEE function. --- rtl837x_port.c | 40 +++++++++++++++++++++++++++++++--------- rtl837x_port.h | 4 ++-- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/rtl837x_port.c b/rtl837x_port.c index 3f48c77..3be1ba3 100644 --- a/rtl837x_port.c +++ b/rtl837x_port.c @@ -431,17 +431,39 @@ uint16_t port_isolation_get(register uint8_t port) } -void port_eee_enable(uint8_t port) __banked +void port_eee_enable(__xdata uint8_t port,__xdata uint8_t speed) __banked { + print_string("EEE on for "); print_byte(port); print_string(" speed "); print_byte(speed); write_char('\n'); if (machine.is_sfp[port]) return; - 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 - phy_write(port, PHY_MMD_AN, PHY_EEE_ADV2, PHY_EEE_BIT_2G5); - phy_reset(port); + // Enable all speeds up to the specified speed + if (speed == EEE_100) { + 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); + phy_reset(port); + return; + } + if (speed == EEE_1000) { + 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 + phy_write(port, PHY_MMD_AN, PHY_EEE_ADV, PHY_EEE_BIT_1G | PHY_EEE_BIT_100M); + phy_reset(port); + return; + } + if (speed == EEE_2G5) { + 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 + phy_write(port, PHY_MMD_AN, PHY_EEE_ADV2, PHY_EEE_BIT_2G5); + phy_reset(port); + return; + } + } @@ -515,10 +537,10 @@ void port_eee_status(uint8_t port) __banked } -void port_eee_enable_all(void) __banked +void port_eee_enable_all(__xdata uint8_t speed) __banked { for (uint8_t i = machine.min_port; i <= machine.max_port; i++) { - port_eee_enable(i); + port_eee_enable(i, speed); } } diff --git a/rtl837x_port.h b/rtl837x_port.h index 22ea1dd..9049082 100644 --- a/rtl837x_port.h +++ b/rtl837x_port.h @@ -28,10 +28,10 @@ void port_ingress_filter(register uint8_t port, uint8_t type) __banked; void port_l2_setup(void) __banked; void port_lag_members_set(__xdata uint8_t lag, __xdata uint16_t members) __banked; void port_lag_hash_set(__xdata uint8_t lag, __xdata uint8_t hash) __banked; -void port_eee_enable_all(void) __banked; +void port_eee_enable_all(__xdata uint8_t speed) __banked; void port_eee_disable_all(void) __banked; void port_eee_status_all(void) __banked; -void port_eee_enable(uint8_t port) __banked; +void port_eee_enable(__xdata uint8_t port, __xdata uint8_t speed) __banked; void port_eee_disable(uint8_t port) __banked; void port_eee_status(uint8_t port) __banked; #endif From 3496d1211105e73548c19395d7c6e17ab5fc136e Mon Sep 17 00:00:00 2001 From: chriz Date: Thu, 5 Feb 2026 16:47:58 +0100 Subject: [PATCH 2/4] Extend command parser. --- cmd_parser.c | 73 +++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 52 insertions(+), 21 deletions(-) diff --git a/cmd_parser.c b/cmd_parser.c index f02cb09..ae52743 100644 --- a/cmd_parser.c +++ b/cmd_parser.c @@ -633,6 +633,57 @@ void parse_passwd(void) } +void parse_eee(void) +{ + __xdata int8_t port = -1; + __xdata uint8_t speed = EEE_2G5; + __xdata uint8_t speed_word = 0; + // Check if word 2 is a speed (contains 'g' or 'm') or a port number + if (cmd_words_b[3] > 0) { + uint8_t idx = cmd_words_b[2]; + // Skip digits to check if there's a letter after + while (isnumber(cmd_buffer[idx])) + idx++; + if (cmd_buffer[idx] == 'g' || cmd_buffer[idx] == 'm') { + // Word 2 is a speed (e.g., "2g5", "100m", "1g") + speed_word = 2; + } else if (cmd_buffer[idx] == ' ' || cmd_buffer[idx] == '\0') { + // Word 2 is a port number + port = cmd_buffer[cmd_words_b[2]] - '1'; + port = machine.phys_to_log_port[port]; + // Check if word 3 is a speed + if (cmd_words_b[4] > 0) + speed_word = 3; + } + } + // Parse speed if found + if (speed_word > 0) { + if (cmd_compare(speed_word, "100m")) + speed = EEE_100; + else if (cmd_compare(speed_word, "1g")) + speed = EEE_1000; + else if (cmd_compare(speed_word, "2g5")) + speed = EEE_2G5; + } + if (cmd_words_b[1] > 0 && cmd_compare(1, "on")) { + if (port >= 0) + port_eee_enable(port, speed); + else + port_eee_enable_all(speed); + } else if (cmd_words_b[1] > 0 && cmd_compare(1, "off")) { + if (port >= 0) + port_eee_disable(port); + else + port_eee_disable_all(); + } else if (cmd_words_b[1] > 0 && cmd_compare(1, "status")) { + if (port >= 0) + port_eee_status(port); + else + port_eee_status_all(); + } +} + + // Parse command into words uint8_t cmd_tokenize(void) __banked { @@ -895,27 +946,7 @@ void cmd_parser(void) __banked } else if (cmd_compare(0, "passwd")) { parse_passwd(); } else if (cmd_compare(0, "eee")) { - int8_t port = -1; - if (cmd_words_b[3] > 0) { - port = cmd_buffer[cmd_words_b[2]] - '1'; - port = machine.phys_to_log_port[port]; - } - if (cmd_words_b[1] > 0 && cmd_compare(1, "on")) { - if (port >= 0) - port_eee_enable(port); - else - port_eee_enable_all(); - } else if (cmd_words_b[1] > 0 && cmd_compare(1, "off")) { - if (port >= 0) - port_eee_disable(port); - else - port_eee_disable_all(); - } else if (cmd_words_b[1] > 0 && cmd_compare(1, "status")) { - if (port >= 0) - port_eee_status(port); - else - port_eee_status_all(); - } + parse_eee(); } else if (cmd_compare(0, "version")) { print_sw_version(); } else if (cmd_compare(0, "time")) { From ed37d75aba85943d1f481fb62bb773c1619c6b55 Mon Sep 17 00:00:00 2001 From: chriz Date: Thu, 5 Feb 2026 17:23:50 +0100 Subject: [PATCH 3/4] Enable EEE on boot, do not reset interfaces immediately to save boot time. --- rtl837x_port.c | 15 +++++++++------ rtl837x_regs.h | 1 + rtlplayground.c | 9 +++++++++ 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/rtl837x_port.c b/rtl837x_port.c index d0e7611..d7cbba9 100644 --- a/rtl837x_port.c +++ b/rtl837x_port.c @@ -429,29 +429,32 @@ void port_eee_enable(__xdata uint8_t port,__xdata uint8_t speed) __banked return; // Enable all speeds up to the specified speed - if (speed == EEE_100) { + if ((speed & (EEE_100 | EEE_1000 | EEE_2G5)) == EEE_100) { 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); - phy_reset(port); + if (!(speed & EEE_NORESET)) + phy_reset(port); return; } - if (speed == EEE_1000) { + if ((speed & (EEE_100 | EEE_1000 | EEE_2G5)) == EEE_1000) { 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 phy_write(port, PHY_MMD_AN, PHY_EEE_ADV, PHY_EEE_BIT_1G | PHY_EEE_BIT_100M); - phy_reset(port); + if (!(speed & EEE_NORESET)) + phy_reset(port); return; } - if (speed == EEE_2G5) { + if ((speed & (EEE_100 | EEE_1000 | EEE_2G5)) == EEE_2G5) { 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 phy_write(port, PHY_MMD_AN, PHY_EEE_ADV2, PHY_EEE_BIT_2G5); - phy_reset(port); + if (!(speed & EEE_NORESET)) + phy_reset(port); return; } diff --git a/rtl837x_regs.h b/rtl837x_regs.h index cd7a2eb..fcb2928 100644 --- a/rtl837x_regs.h +++ b/rtl837x_regs.h @@ -257,6 +257,7 @@ #define EEE_100 0x01 #define EEE_1000 0x04 #define EEE_2G5 0x10 +#define EEE_NORESET 0x80 /* * RANDOM diff --git a/rtlplayground.c b/rtlplayground.c index b2bc882..a24eaf8 100644 --- a/rtlplayground.c +++ b/rtlplayground.c @@ -1637,6 +1637,9 @@ void rtl8373_init(void) reg_bit_set(RTL837X_REG_HW_CONF, 0); + // enable EEE for all ports at 2.5G and 10G, but don't reset the PHYs + port_eee_enable_all(EEE_2G5 | EEE_NORESET); + // TODO: patch the PHYs // Re-enable PHY after configuration @@ -1700,6 +1703,10 @@ void rtl8372_init(void) reg_bit_set(RTL837X_REG_HW_CONF, 0); + + // enable EEE for all ports at 2.5G and 10G, but don't reset the PHYs + port_eee_enable_all(EEE_2G5 | EEE_NORESET); + // TODO: patch the PHYs // Re-enable PHY after configuration @@ -1954,6 +1961,8 @@ void bootloader(void) REG_SET(RTL837X_PIN_MUX_2, 0x0); // Disable pins for ACL init_smi(); + + rtl8373_revision(); if (machine_detected.isRTL8373) rtl8373_init(); From 68fd5d41a7960af6434488557f927fd45ae4a52e Mon Sep 17 00:00:00 2001 From: chriz Date: Sat, 7 Feb 2026 14:06:06 +0100 Subject: [PATCH 4/4] Add additional output. --- cmd_parser.c | 7 +++++++ rtl837x_port.c | 13 ++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/cmd_parser.c b/cmd_parser.c index ae52743..21e1d1c 100644 --- a/cmd_parser.c +++ b/cmd_parser.c @@ -664,6 +664,11 @@ void parse_eee(void) speed = EEE_1000; else if (cmd_compare(speed_word, "2g5")) speed = EEE_2G5; + else + { + print_string("Speed word invalid, use: [100m|1g|2g5]\n"); + return; + } } if (cmd_words_b[1] > 0 && cmd_compare(1, "on")) { if (port >= 0) @@ -680,6 +685,8 @@ void parse_eee(void) port_eee_status(port); else port_eee_status_all(); + } else { + print_string("eee [on|off|status] [port] [100m|1g|2g5]\n"); } } diff --git a/rtl837x_port.c b/rtl837x_port.c index d7cbba9..448431f 100644 --- a/rtl837x_port.c +++ b/rtl837x_port.c @@ -424,12 +424,17 @@ uint16_t port_isolation_get(register uint8_t port) void port_eee_enable(__xdata uint8_t port,__xdata uint8_t speed) __banked { - print_string("EEE on for "); print_byte(port); print_string(" speed "); print_byte(speed); write_char('\n'); - if (machine.is_sfp[port]) - return; + if (machine.is_sfp[port]) + { + print_string("EEE can't be enabled for SFP port "); print_byte(port); print_string("\n"); + return; + } + + 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) { + 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); @@ -438,6 +443,7 @@ void port_eee_enable(__xdata uint8_t port,__xdata uint8_t speed) __banked return; } if ((speed & (EEE_100 | EEE_1000 | EEE_2G5)) == 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); @@ -448,6 +454,7 @@ void port_eee_enable(__xdata uint8_t port,__xdata uint8_t speed) __banked return; } if ((speed & (EEE_100 | EEE_1000 | EEE_2G5)) == 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);