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 <jelonek.jonas@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/21181
Signed-off-by: Robert Marko <robimarko@gmail.com>
This commit is contained in:
Jonas Jelonek 2025-11-30 12:34:33 +00:00 committed by Robert Marko
parent af50e4d6c8
commit 19478cf334
3 changed files with 61 additions and 45 deletions

View File

@ -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;

View File

@ -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,

View File

@ -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;