From 55fd2d5fb65bdba07420938cb644c7cee5679648 Mon Sep 17 00:00:00 2001 From: chriz Date: Wed, 28 Jan 2026 09:21:03 +0100 Subject: [PATCH] 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