Add MAC-EEE functionality

This commit is contained in:
logicog
2025-10-11 13:09:47 +02:00
parent 31c61faa60
commit 717247bc0e
4 changed files with 83 additions and 1 deletions
+22
View File
@@ -25,6 +25,7 @@ extern __xdata uint8_t nSFPPorts;
extern __xdata uint8_t isRTL8373; extern __xdata uint8_t isRTL8373;
extern __xdata uint16_t mpos; extern __xdata uint16_t mpos;
extern __xdata uint8_t stpEnabled; extern __xdata uint8_t stpEnabled;
extern __code uint8_t log_to_phys_port[9];
extern volatile __xdata uint32_t ticks; extern volatile __xdata uint32_t ticks;
extern volatile __xdata uint8_t sfr_data[4]; extern volatile __xdata uint8_t sfr_data[4];
@@ -632,6 +633,27 @@ void cmd_parser(void) __banked
if (cmd_compare(0, "regset")) { if (cmd_compare(0, "regset")) {
parse_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();
}
}
} }
} }
+48
View File
@@ -11,6 +11,8 @@
#include "rtl837x_sfr.h" #include "rtl837x_sfr.h"
#include "rtl837x_regs.h" #include "rtl837x_regs.h"
#include "rtl837x_port.h" #include "rtl837x_port.h"
#include "rtl837x_phy.h"
#include "phy.h"
#pragma codeseg BANK1 #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 * Enable RLDP, Realtek's version of LLDP
*/ */
+4
View File
@@ -27,4 +27,8 @@ void port_mirror_del(void) __banked;
void port_ingress_filter(register uint8_t port, uint8_t type) __banked; void port_ingress_filter(register uint8_t port, uint8_t type) __banked;
void port_l2_setup(void) __banked; void port_l2_setup(void) __banked;
void trunk_set(uint8_t group, uint16_t mask) __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 #endif
+9 -1
View File
@@ -150,12 +150,20 @@
/* /*
* Loop detection / STP * Loop detection / STP
*/ */
#define RTL8373_RLDP_TIMER 0x1074 #define RTL8373_RLDP_TIMER 0x1074
#define RTL837X_RMA0_CONF 0x4ecc #define RTL837X_RMA0_CONF 0x4ecc
#define RTL837X_RMA_CONF 0x4f1c #define RTL837X_RMA_CONF 0x4f1c
#define RTL837X_MSTP_STATES 0x5310 #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 #ifdef REGDBG
#define REG_SET(r, v) SFR_DATA_24 = (((uint32_t)v) >> 24) & 0xff; \ #define REG_SET(r, v) SFR_DATA_24 = (((uint32_t)v) >> 24) & 0xff; \