From 19478cf334c33849246bdce1d67c0d0e574d34ad Mon Sep 17 00:00:00 2001 From: Jonas Jelonek Date: Sun, 30 Nov 2025 12:34:33 +0000 Subject: [PATCH] realtek: dsa: 6.18: adjust mac ops and callbacks Between 6.12 and 6.18, several DSA switch ops have changed. phylink_mac_* ops were moved out of dsa_switch_ops into dsa_switch using phylink_mac_ops. Add new definitions for that and adjust the callbacks accordingly to work with the different signatures. get_mac_eee() has been dropped and support_eee() was added. remove_new() has been dropped completely, allowing us to use remove() again. Signed-off-by: Jonas Jelonek Link: https://github.com/openwrt/openwrt/pull/21181 Signed-off-by: Robert Marko --- .../drivers/net/dsa/rtl83xx/common.c | 4 + .../files-6.18/drivers/net/dsa/rtl83xx/dsa.c | 99 ++++++++++--------- .../drivers/net/dsa/rtl83xx/rtl83xx.h | 3 + 3 files changed, 61 insertions(+), 45 deletions(-) diff --git a/target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/common.c b/target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/common.c index b946558513..0c5e9f3f38 100644 --- a/target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/common.c +++ b/target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/common.c @@ -1632,6 +1632,7 @@ static int rtl83xx_sw_probe(struct platform_device *pdev) switch (soc_info.family) { case RTL8380_FAMILY_ID: priv->ds->ops = &rtldsa_83xx_switch_ops; + priv->ds->phylink_mac_ops = &rtldsa_83xx_phylink_mac_ops; priv->cpu_port = RTL838X_CPU_PORT; priv->port_mask = 0x1f; priv->port_width = 1; @@ -1642,6 +1643,7 @@ static int rtl83xx_sw_probe(struct platform_device *pdev) break; case RTL8390_FAMILY_ID: priv->ds->ops = &rtldsa_83xx_switch_ops; + priv->ds->phylink_mac_ops = &rtldsa_83xx_phylink_mac_ops; priv->cpu_port = RTL839X_CPU_PORT; priv->port_mask = 0x3f; priv->port_width = 2; @@ -1652,6 +1654,7 @@ static int rtl83xx_sw_probe(struct platform_device *pdev) break; case RTL9300_FAMILY_ID: priv->ds->ops = &rtldsa_93xx_switch_ops; + priv->ds->phylink_mac_ops = &rtldsa_93xx_phylink_mac_ops; priv->cpu_port = RTL930X_CPU_PORT; priv->port_mask = 0x1f; priv->port_width = 1; @@ -1663,6 +1666,7 @@ static int rtl83xx_sw_probe(struct platform_device *pdev) break; case RTL9310_FAMILY_ID: priv->ds->ops = &rtldsa_93xx_switch_ops; + priv->ds->phylink_mac_ops = &rtldsa_93xx_phylink_mac_ops; priv->cpu_port = RTL931X_CPU_PORT; priv->port_mask = 0x3f; priv->port_width = 2; diff --git a/target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/dsa.c b/target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/dsa.c index ca3252c1ed..86a8fc52be 100644 --- a/target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/dsa.c +++ b/target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/dsa.c @@ -285,13 +285,13 @@ static int rtldsa_93xx_setup(struct dsa_switch *ds) return 0; } -static struct phylink_pcs *rtldsa_phylink_mac_select_pcs(struct dsa_switch *ds, - int port, +static struct phylink_pcs *rtldsa_phylink_mac_select_pcs(struct phylink_config *config, phy_interface_t interface) { - struct rtl838x_switch_priv *priv = ds->priv; + struct dsa_port *dp = dsa_phylink_to_port(config); + struct rtl838x_switch_priv *priv = dp->ds->priv; - return priv->ports[port].pcs; + return priv->ports[dp->index].pcs; } static void rtldsa_83xx_phylink_get_caps(struct dsa_switch *ds, int port, @@ -336,12 +336,13 @@ static void rtldsa_93xx_phylink_get_caps(struct dsa_switch *ds, int port, __set_bit(PHY_INTERFACE_MODE_10G_QXGMII, config->supported_interfaces); } -static void rtldsa_83xx_phylink_mac_config(struct dsa_switch *ds, int port, +static void rtldsa_83xx_phylink_mac_config(struct phylink_config *config, unsigned int mode, const struct phylink_link_state *state) { - struct dsa_port *dp = dsa_to_port(ds, port); - struct rtl838x_switch_priv *priv = ds->priv; + struct dsa_port *dp = dsa_phylink_to_port(config); + struct rtl838x_switch_priv *priv = dp->ds->priv; + int port = dp->index; u32 mcr; pr_debug("%s port %d, mode %x\n", __func__, port, mode); @@ -367,11 +368,13 @@ static void rtldsa_83xx_phylink_mac_config(struct dsa_switch *ds, int port, sw_w32(mcr, priv->r->mac_force_mode_ctrl(port)); } -static void rtldsa_93xx_phylink_mac_config(struct dsa_switch *ds, int port, +static void rtldsa_93xx_phylink_mac_config(struct phylink_config *config, unsigned int mode, const struct phylink_link_state *state) { - struct rtl838x_switch_priv *priv = ds->priv; + struct dsa_port *dp = dsa_phylink_to_port(config); + struct rtl838x_switch_priv *priv = dp->ds->priv; + int port = dp->index; /* Nothing to be done for the CPU-port */ if (port == priv->cpu_port) @@ -381,11 +384,13 @@ static void rtldsa_93xx_phylink_mac_config(struct dsa_switch *ds, int port, sw_w32(0, priv->r->mac_force_mode_ctrl(port)); } -static void rtldsa_83xx_phylink_mac_link_down(struct dsa_switch *ds, int port, +static void rtldsa_83xx_phylink_mac_link_down(struct phylink_config *config, unsigned int mode, phy_interface_t interface) { - struct rtl838x_switch_priv *priv = ds->priv; + struct dsa_port *dp = dsa_phylink_to_port(config); + struct rtl838x_switch_priv *priv = dp->ds->priv; + int port = dp->index; int mask = 0; /* Stop TX/RX to port */ @@ -396,11 +401,13 @@ static void rtldsa_83xx_phylink_mac_link_down(struct dsa_switch *ds, int port, sw_w32_mask(mask, 0, priv->r->mac_force_mode_ctrl(port)); } -static void rtldsa_93xx_phylink_mac_link_down(struct dsa_switch *ds, int port, +static void rtldsa_93xx_phylink_mac_link_down(struct phylink_config *config, unsigned int mode, phy_interface_t interface) { - struct rtl838x_switch_priv *priv = ds->priv; + struct dsa_port *dp = dsa_phylink_to_port(config); + struct rtl838x_switch_priv *priv = dp->ds->priv; + int port = dp->index; u32 v = 0; /* Stop TX/RX to port */ @@ -414,15 +421,16 @@ static void rtldsa_93xx_phylink_mac_link_down(struct dsa_switch *ds, int port, sw_w32_mask(v, 0, priv->r->mac_force_mode_ctrl(port)); } -static void rtldsa_83xx_phylink_mac_link_up(struct dsa_switch *ds, int port, +static void rtldsa_83xx_phylink_mac_link_up(struct phylink_config *config, + struct phy_device *phydev, unsigned int mode, phy_interface_t interface, - struct phy_device *phydev, int speed, int duplex, bool tx_pause, bool rx_pause) { - struct dsa_port *dp = dsa_to_port(ds, port); - struct rtl838x_switch_priv *priv = ds->priv; + struct dsa_port *dp = dsa_phylink_to_port(config); + struct rtl838x_switch_priv *priv = dp->ds->priv; + int port = dp->index; u32 mcr, spdsel; if (speed == SPEED_1000) @@ -477,15 +485,16 @@ static void rtldsa_83xx_phylink_mac_link_up(struct dsa_switch *ds, int port, sw_w32_mask(0, 0x3, priv->r->mac_port_ctrl(port)); } -static void rtldsa_93xx_phylink_mac_link_up(struct dsa_switch *ds, int port, +static void rtldsa_93xx_phylink_mac_link_up(struct phylink_config *config, + struct phy_device *phydev, unsigned int mode, phy_interface_t interface, - struct phy_device *phydev, int speed, int duplex, bool tx_pause, bool rx_pause) { - struct dsa_port *dp = dsa_to_port(ds, port); - struct rtl838x_switch_priv *priv = ds->priv; + struct dsa_port *dp = dsa_phylink_to_port(config); + struct rtl838x_switch_priv *priv = dp->ds->priv; + int port = dp->index; u32 mcr, spdsel; if (speed == SPEED_10000) @@ -1102,6 +1111,14 @@ static void rtldsa_port_disable(struct dsa_switch *ds, int port) priv->ports[port].enable = false; } +static bool rtldsa_support_eee(struct dsa_switch *ds, int port) +{ + struct rtl838x_switch_priv *priv = ds->priv; + + /* TODO: do this better */ + return (priv->ports[port].phy != 0); +} + static int rtldsa_set_mac_eee(struct dsa_switch *ds, int port, struct ethtool_keee *e) { struct rtl838x_switch_priv *priv = ds->priv; @@ -1121,20 +1138,6 @@ static int rtldsa_set_mac_eee(struct dsa_switch *ds, int port, struct ethtool_ke return 0; } -static int rtldsa_get_mac_eee(struct dsa_switch *ds, int port, struct ethtool_keee *eee) -{ - /* - * 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; -} - static int rtldsa_set_ageing_time(struct dsa_switch *ds, unsigned int msec) { struct rtl838x_switch_priv *priv = ds->priv; @@ -2620,6 +2623,13 @@ unlock: return ret; } +const struct phylink_mac_ops rtldsa_83xx_phylink_mac_ops = { + .mac_select_pcs = rtldsa_phylink_mac_select_pcs, + .mac_config = rtldsa_83xx_phylink_mac_config, + .mac_link_down = rtldsa_83xx_phylink_mac_link_down, + .mac_link_up = rtldsa_83xx_phylink_mac_link_up, +}; + const struct dsa_switch_ops rtldsa_83xx_switch_ops = { .get_tag_protocol = rtldsa_get_tag_protocol, .setup = rtldsa_83xx_setup, @@ -2628,10 +2638,6 @@ const struct dsa_switch_ops rtldsa_83xx_switch_ops = { .phy_write = rtldsa_phy_write, .phylink_get_caps = rtldsa_83xx_phylink_get_caps, - .phylink_mac_config = rtldsa_83xx_phylink_mac_config, - .phylink_mac_link_down = rtldsa_83xx_phylink_mac_link_down, - .phylink_mac_link_up = rtldsa_83xx_phylink_mac_link_up, - .phylink_mac_select_pcs = rtldsa_phylink_mac_select_pcs, .get_strings = rtldsa_get_strings, .get_ethtool_stats = rtldsa_get_ethtool_stats, @@ -2646,7 +2652,7 @@ const struct dsa_switch_ops rtldsa_83xx_switch_ops = { .port_enable = rtldsa_port_enable, .port_disable = rtldsa_port_disable, - .get_mac_eee = rtldsa_get_mac_eee, + .support_eee = rtldsa_support_eee, .set_mac_eee = rtldsa_set_mac_eee, .set_ageing_time = rtldsa_set_ageing_time, @@ -2680,6 +2686,13 @@ const struct dsa_switch_ops rtldsa_83xx_switch_ops = { .port_bridge_flags = rtldsa_port_bridge_flags, }; +const struct phylink_mac_ops rtldsa_93xx_phylink_mac_ops = { + .mac_select_pcs = rtldsa_phylink_mac_select_pcs, + .mac_config = rtldsa_93xx_phylink_mac_config, + .mac_link_down = rtldsa_93xx_phylink_mac_link_down, + .mac_link_up = rtldsa_93xx_phylink_mac_link_up, +}; + const struct dsa_switch_ops rtldsa_93xx_switch_ops = { .get_tag_protocol = rtldsa_get_tag_protocol, .setup = rtldsa_93xx_setup, @@ -2688,10 +2701,6 @@ const struct dsa_switch_ops rtldsa_93xx_switch_ops = { .phy_write = rtldsa_phy_write, .phylink_get_caps = rtldsa_93xx_phylink_get_caps, - .phylink_mac_config = rtldsa_93xx_phylink_mac_config, - .phylink_mac_link_down = rtldsa_93xx_phylink_mac_link_down, - .phylink_mac_link_up = rtldsa_93xx_phylink_mac_link_up, - .phylink_mac_select_pcs = rtldsa_phylink_mac_select_pcs, .get_strings = rtldsa_get_strings, .get_ethtool_stats = rtldsa_get_ethtool_stats, @@ -2706,7 +2715,7 @@ const struct dsa_switch_ops rtldsa_93xx_switch_ops = { .port_enable = rtldsa_port_enable, .port_disable = rtldsa_port_disable, - .get_mac_eee = rtldsa_get_mac_eee, + .support_eee = rtldsa_support_eee, .set_mac_eee = rtldsa_set_mac_eee, .set_ageing_time = rtldsa_set_ageing_time, diff --git a/target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl83xx.h b/target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl83xx.h index cf24ecc1be..3a58eecaab 100644 --- a/target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl83xx.h +++ b/target/linux/realtek/files-6.18/drivers/net/dsa/rtl83xx/rtl83xx.h @@ -191,6 +191,9 @@ void rtl930x_pie_rule_dump_raw(u32 r[]); extern const struct dsa_switch_ops rtldsa_83xx_switch_ops; extern const struct dsa_switch_ops rtldsa_93xx_switch_ops; +extern const struct phylink_mac_ops rtldsa_83xx_phylink_mac_ops; +extern const struct phylink_mac_ops rtldsa_93xx_phylink_mac_ops; + extern const struct rtldsa_config rtldsa_838x_cfg; extern const struct rtldsa_config rtldsa_839x_cfg; extern const struct rtldsa_config rtldsa_930x_cfg;