From d7f51c1917b549a2dfc067577fc8b46a8bac868a Mon Sep 17 00:00:00 2001 From: Markus Stockhausen Date: Thu, 29 May 2025 03:34:59 -0400 Subject: [PATCH] realtek: 6.12: refactor get_mac_eee Upstream will get rid of the get_mac_eee() function in the DSA driver and replace it by a boolean alternative. While we fill a lot of data here (because of EEE bugs in the Realtek phy layer) other DSA drivers only return if EEE is available or not for a port. To make the next kernel upgrade easier follow that design. Signed-off-by: Markus Stockhausen Link: https://github.com/openwrt/openwrt/pull/18935 Signed-off-by: Robert Marko --- .../files-6.12/drivers/net/dsa/rtl83xx/dsa.c | 40 ++++----------- .../drivers/net/dsa/rtl83xx/rtl838x.c | 30 ----------- .../drivers/net/dsa/rtl83xx/rtl838x.h | 4 +- .../drivers/net/dsa/rtl83xx/rtl839x.c | 30 ----------- .../drivers/net/dsa/rtl83xx/rtl930x.c | 50 ------------------- 5 files changed, 13 insertions(+), 141 deletions(-) diff --git a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/dsa.c b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/dsa.c index 361c2b26ba2..d501b7d2c48 100644 --- a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/dsa.c +++ b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/dsa.c @@ -1134,34 +1134,16 @@ static int rtl83xx_set_mac_eee(struct dsa_switch *ds, int port, struct ethtool_k return 0; } -static int rtl83xx_get_mac_eee(struct dsa_switch *ds, int port, struct ethtool_keee *e) +static int rtldsa_get_mac_eee(struct dsa_switch *ds, int port, struct ethtool_keee *eee) { - struct rtl838x_switch_priv *priv = ds->priv; - - e->supported = SUPPORTED_100baseT_Full | SUPPORTED_1000baseT_Full; - - priv->r->eee_port_ability(priv, e, port); - - e->eee_enabled = priv->ports[port].eee_enabled; - - e->eee_active = !!(e->advertised & e->lp_advertised); - - return 0; -} - -static int rtl93xx_get_mac_eee(struct dsa_switch *ds, int port, struct ethtool_keee *e) -{ - struct rtl838x_switch_priv *priv = ds->priv; - - e->supported = SUPPORTED_100baseT_Full | - SUPPORTED_1000baseT_Full | - SUPPORTED_2500baseX_Full; - - priv->r->eee_port_ability(priv, e, port); - - e->eee_enabled = priv->ports[port].eee_enabled; - - e->eee_active = !!(e->advertised & e->lp_advertised); + /* + * Until kernel 6.6 the Realtek device specific get_mac_eee() functions filled many + * fields of the eee structure manually. That came from the fact, that the phy + * driver could not report EEE capabilities on its own. Upstream will replace this + * function with a simple boolean support_eee() getter starting from 6.14. That only + * checks if a port can provide EEE or not. In the best case it can be replaced with + * dsa_supports_eee() in the future. For now align to other upstream DSA drivers. + */ return 0; } @@ -2234,7 +2216,7 @@ const struct dsa_switch_ops rtl83xx_switch_ops = { .port_enable = rtl83xx_port_enable, .port_disable = rtl83xx_port_disable, - .get_mac_eee = rtl83xx_get_mac_eee, + .get_mac_eee = rtldsa_get_mac_eee, .set_mac_eee = rtl83xx_set_mac_eee, .set_ageing_time = rtl83xx_set_ageing_time, @@ -2292,7 +2274,7 @@ const struct dsa_switch_ops rtl930x_switch_ops = { .port_enable = rtl83xx_port_enable, .port_disable = rtl83xx_port_disable, - .get_mac_eee = rtl93xx_get_mac_eee, + .get_mac_eee = rtldsa_get_mac_eee, .set_mac_eee = rtl83xx_set_mac_eee, .set_ageing_time = rtl83xx_set_ageing_time, diff --git a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.c b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.c index 7d44d610305..3c21ac60b2b 100644 --- a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.c +++ b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.c @@ -623,35 +623,6 @@ static void rtl838x_port_eee_set(struct rtl838x_switch_priv *priv, int port, boo priv->ports[port].eee_enabled = enable; } - -/* Get EEE own capabilities and negotiation result */ -static int rtl838x_eee_port_ability(struct rtl838x_switch_priv *priv, - struct ethtool_eee *e, int port) -{ - u64 link; - - if (port >= 24) - return 0; - - link = rtl839x_get_port_reg_le(RTL838X_MAC_LINK_STS); - if (!(link & BIT(port))) - return 0; - - if (sw_r32(rtl838x_mac_force_mode_ctrl(port)) & BIT(9)) - e->advertised |= ADVERTISED_100baseT_Full; - - if (sw_r32(rtl838x_mac_force_mode_ctrl(port)) & BIT(10)) - e->advertised |= ADVERTISED_1000baseT_Full; - - if (sw_r32(RTL838X_MAC_EEE_ABLTY) & BIT(port)) { - e->lp_advertised = ADVERTISED_100baseT_Full; - e->lp_advertised |= ADVERTISED_1000baseT_Full; - return 1; - } - - return 0; -} - static void rtl838x_init_eee(struct rtl838x_switch_priv *priv, bool enable) { pr_debug("Setting up EEE, state: %d\n", enable); @@ -1754,7 +1725,6 @@ const struct rtl838x_reg rtl838x_reg = { .spcl_trap_eapol_ctrl = RTL838X_SPCL_TRAP_EAPOL_CTRL, .init_eee = rtl838x_init_eee, .port_eee_set = rtl838x_port_eee_set, - .eee_port_ability = rtl838x_eee_port_ability, .l2_hash_seed = rtl838x_l2_hash_seed, .l2_hash_key = rtl838x_l2_hash_key, .read_mcast_pmask = rtl838x_read_mcast_pmask, diff --git a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.h b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.h index c721b4d0705..0b9be3b442d 100644 --- a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.h +++ b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.h @@ -203,6 +203,8 @@ #define RTL930X_EEE_CTRL(p) (0x3274 + ((p) << 6)) #define RTL930X_EEEP_PORT_CTRL(p) (0x3278 + ((p) << 6)) +#define RTL931X_MAC_EEE_ABLTY (0x0f08) + /* L2 functionality */ #define RTL838X_L2_CTRL_0 (0x3200) #define RTL839X_L2_CTRL_0 (0x3800) @@ -1035,8 +1037,6 @@ struct rtl838x_reg { int spcl_trap_eapol_ctrl; void (*init_eee)(struct rtl838x_switch_priv *priv, bool enable); void (*port_eee_set)(struct rtl838x_switch_priv *priv, int port, bool enable); - int (*eee_port_ability)(struct rtl838x_switch_priv *priv, - struct ethtool_eee *e, int port); u64 (*l2_hash_seed)(u64 mac, u32 vid); u32 (*l2_hash_key)(struct rtl838x_switch_priv *priv, u64 seed); u64 (*read_mcast_pmask)(int idx); diff --git a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl839x.c b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl839x.c index f2fe0868212..edafbf71b83 100644 --- a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl839x.c +++ b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl839x.c @@ -880,35 +880,6 @@ static void rtl839x_port_eee_set(struct rtl838x_switch_priv *priv, int port, boo priv->ports[port].eee_enabled = enable; } -/* Get EEE own capabilities and negotiation result */ -static int rtl839x_eee_port_ability(struct rtl838x_switch_priv *priv, struct ethtool_eee *e, int port) -{ - u64 link, a; - - if (port >= 48) - return 0; - - link = rtl839x_get_port_reg_le(RTL839X_MAC_LINK_STS); - if (!(link & BIT_ULL(port))) - return 0; - - if (sw_r32(rtl839x_mac_force_mode_ctrl(port)) & BIT(8)) - e->advertised |= ADVERTISED_100baseT_Full; - - if (sw_r32(rtl839x_mac_force_mode_ctrl(port)) & BIT(10)) - e->advertised |= ADVERTISED_1000baseT_Full; - - a = rtl839x_get_port_reg_le(RTL839X_MAC_EEE_ABLTY); - pr_debug("Link partner: %016llx\n", a); - if (rtl839x_get_port_reg_le(RTL839X_MAC_EEE_ABLTY) & BIT_ULL(port)) { - e->lp_advertised = ADVERTISED_100baseT_Full; - e->lp_advertised |= ADVERTISED_1000baseT_Full; - return 1; - } - - return 0; -} - static void rtl839x_init_eee(struct rtl838x_switch_priv *priv, bool enable) { pr_debug("Setting up EEE, state: %d\n", enable); @@ -1890,7 +1861,6 @@ const struct rtl838x_reg rtl839x_reg = { .spcl_trap_eapol_ctrl = RTL839X_SPCL_TRAP_EAPOL_CTRL, .init_eee = rtl839x_init_eee, .port_eee_set = rtl839x_port_eee_set, - .eee_port_ability = rtl839x_eee_port_ability, .l2_hash_seed = rtl839x_l2_hash_seed, .l2_hash_key = rtl839x_l2_hash_key, .read_mcast_pmask = rtl839x_read_mcast_pmask, diff --git a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl930x.c b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl930x.c index f278445b11e..cb6460dec4a 100644 --- a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl930x.c +++ b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl930x.c @@ -913,55 +913,6 @@ static void rtl930x_port_eee_set(struct rtl838x_switch_priv *priv, int port, boo priv->ports[port].eee_enabled = enable; } -/* Get EEE own capabilities and negotiation result */ -static int rtl930x_eee_port_ability(struct rtl838x_switch_priv *priv, struct ethtool_eee *e, int port) -{ - u32 link, a; - - if (port >= 26) - return -ENOTSUPP; - - pr_debug("In %s, port %d\n", __func__, port); - link = sw_r32(RTL930X_MAC_LINK_STS); - link = sw_r32(RTL930X_MAC_LINK_STS); - if (!(link & BIT(port))) - return 0; - - pr_debug("Setting advertised\n"); - if (sw_r32(rtl930x_mac_force_mode_ctrl(port)) & BIT(10)) - e->advertised |= ADVERTISED_100baseT_Full; - - if (sw_r32(rtl930x_mac_force_mode_ctrl(port)) & BIT(12)) - e->advertised |= ADVERTISED_1000baseT_Full; - - if (priv->ports[port].is2G5 && sw_r32(rtl930x_mac_force_mode_ctrl(port)) & BIT(13)) { - pr_debug("ADVERTISING 2.5G EEE\n"); - e->advertised |= ADVERTISED_2500baseX_Full; - } - - if (priv->ports[port].is10G && sw_r32(rtl930x_mac_force_mode_ctrl(port)) & BIT(15)) - e->advertised |= ADVERTISED_10000baseT_Full; - - a = sw_r32(RTL930X_MAC_EEE_ABLTY); - a = sw_r32(RTL930X_MAC_EEE_ABLTY); - pr_debug("Link partner: %08x\n", a); - if (a & BIT(port)) { - e->lp_advertised = ADVERTISED_100baseT_Full; - e->lp_advertised |= ADVERTISED_1000baseT_Full; - if (priv->ports[port].is2G5) - e->lp_advertised |= ADVERTISED_2500baseX_Full; - if (priv->ports[port].is10G) - e->lp_advertised |= ADVERTISED_10000baseT_Full; - } - - /* Read 2x to clear latched state */ - a = sw_r32(RTL930X_EEEP_PORT_CTRL(port)); - a = sw_r32(RTL930X_EEEP_PORT_CTRL(port)); - pr_debug("%s RTL930X_EEEP_PORT_CTRL: %08x\n", __func__, a); - - return 0; -} - static void rtl930x_init_eee(struct rtl838x_switch_priv *priv, bool enable) { pr_debug("Setting up EEE, state: %d\n", enable); @@ -2538,7 +2489,6 @@ const struct rtl838x_reg rtl930x_reg = { .rma_bpdu_fld_pmask = RTL930X_RMA_BPDU_FLD_PMSK, .init_eee = rtl930x_init_eee, .port_eee_set = rtl930x_port_eee_set, - .eee_port_ability = rtl930x_eee_port_ability, .l2_hash_seed = rtl930x_l2_hash_seed, .l2_hash_key = rtl930x_l2_hash_key, .read_mcast_pmask = rtl930x_read_mcast_pmask,