diff --git a/cmd_parser.c b/cmd_parser.c index 4538c3d..361670a 100644 --- a/cmd_parser.c +++ b/cmd_parser.c @@ -25,6 +25,7 @@ extern __xdata uint8_t nSFPPorts; extern __xdata uint8_t isRTL8373; extern __xdata uint16_t mpos; extern __xdata uint8_t stpEnabled; +extern __code uint8_t log_to_phys_port[9]; extern volatile __xdata uint32_t ticks; extern volatile __xdata uint8_t sfr_data[4]; @@ -632,6 +633,27 @@ void cmd_parser(void) __banked if (cmd_compare(0, "regset")) { parse_regset(); } + if (cmd_compare(0, "eee")) { + int8_t port = -1; + if (cmd_words_b[2] > 0) { + port = cmd_buffer[cmd_words_b[2]] - '1'; + if (!isRTL8373) + port = phys_to_log_port[port]; + } + if (cmd_words_b[1] > 0 && cmd_compare(1, "on")) { + print_string("EEE enabled\n"); + if (port >= 0) + port_eee_enable(port); + else + port_eee_enable_all(); + } else if (cmd_words_b[1] > 0 && cmd_compare(1, "off")) { + print_string("EEE disabled\n"); + if (port >= 0) + port_eee_disable(port); + else + port_eee_disable_all(); + } + } } } diff --git a/rtl837x_port.c b/rtl837x_port.c index 4383bf0..c603c75 100644 --- a/rtl837x_port.c +++ b/rtl837x_port.c @@ -11,6 +11,8 @@ #include "rtl837x_sfr.h" #include "rtl837x_regs.h" #include "rtl837x_port.h" +#include "rtl837x_phy.h" +#include "phy.h" #pragma codeseg BANK1 @@ -477,6 +479,52 @@ uint16_t port_isolation_get(register uint8_t port) } +void port_eee_enable(uint8_t port) __banked +{ + if (is_sfp[port]) + return; + + print_string("EEE on for "); print_byte(port); write_char('\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, 6); // Bit 1: 100BASE-T, Bit 2: 1000BASE-T + // Enable EEE advertisement for 2.5GBASE-T via EEE Advertisement Reg 2 + phy_write(port, PHY_MMD_AN, PHY_EEE_ADV2, 1); + phy_reset(port); +} + + +void port_eee_disable(uint8_t port) __banked +{ + if (is_sfp[port]) + return; + + print_string("EEE off for "); print_byte(port); write_char('\n'); + REG_SET(RTL8373_EEE_CTRL_BASE + (port << 2), 0); + // Enable EEE advertisement for 100/1000BASE-T via EEE Advertisement Reg + phy_write(port, PHY_MMD_AN, PHY_EEE_ADV, 0); + // Enable EEE advertisement for 2.5GBASE-T via EEE Advertisement Reg 2 + phy_write(port, PHY_MMD_AN, PHY_EEE_ADV2, 0); + phy_reset(port); +} + + +void port_eee_enable_all(void) __banked +{ + for (uint8_t i = minPort; i <= maxPort; i++) { + port_eee_enable(i); + } +} + + +void port_eee_disable_all(void) __banked +{ + for (uint8_t i = minPort; i <= maxPort; i++) { + port_eee_disable(i); + } +} + + /* * Enable RLDP, Realtek's version of LLDP */ diff --git a/rtl837x_port.h b/rtl837x_port.h index 22bcf61..81eec4c 100644 --- a/rtl837x_port.h +++ b/rtl837x_port.h @@ -27,4 +27,8 @@ void port_mirror_del(void) __banked; void port_ingress_filter(register uint8_t port, uint8_t type) __banked; void port_l2_setup(void) __banked; void trunk_set(uint8_t group, uint16_t mask) __banked; +void port_eee_enable_all(void) __banked; +void port_eee_disable_all(void) __banked; +void port_eee_enable(uint8_t port) __banked; +void port_eee_disable(uint8_t port) __banked; #endif diff --git a/rtl837x_regs.h b/rtl837x_regs.h index 2ab37db..b0e82bb 100644 --- a/rtl837x_regs.h +++ b/rtl837x_regs.h @@ -150,12 +150,20 @@ /* * Loop detection / STP */ - #define RTL8373_RLDP_TIMER 0x1074 #define RTL837X_RMA0_CONF 0x4ecc #define RTL837X_RMA_CONF 0x4f1c #define RTL837X_MSTP_STATES 0x5310 +/* + * EEE + */ +#define RTL8373_EEE_CTRL_BASE 0x606c +#define EEE_100 0x01 +#define EEE_1000 0x04 +#define EEE_2G5 0x10 + + #ifdef REGDBG #define REG_SET(r, v) SFR_DATA_24 = (((uint32_t)v) >> 24) & 0xff; \