Add support for changing the master of a port on the MT7530 DSA subdriver.
Tested-by: Arınç ÜNAL <[email protected]>
Signed-off-by: Richard van Schagen <[email protected]>
Signed-off-by: Arınç ÜNAL <[email protected]>
---
drivers/net/dsa/mt7530.c | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c
index b5ad4b4fc00c..2374166c4858 100644
--- a/drivers/net/dsa/mt7530.c
+++ b/drivers/net/dsa/mt7530.c
@@ -1072,6 +1072,35 @@ mt7530_port_disable(struct dsa_switch *ds, int port)
mutex_unlock(&priv->reg_mutex);
}
+static int
+mt7530_port_change_master(struct dsa_switch *ds, int port,
+ struct net_device *master,
+ struct netlink_ext_ack *extack)
+{
+ struct mt7530_priv *priv = ds->priv;
+ struct dsa_port *dp = dsa_to_port(ds, port);
+ struct dsa_port *cpu_dp = master->dsa_ptr;
+
+ if (netif_is_lag_master(master)) {
+ NL_SET_ERR_MSG_MOD(extack,
+ "LAG DSA master not supported");
+ return -EOPNOTSUPP;
+ }
+
+ mutex_lock(&priv->reg_mutex);
+
+ /* Move old to new cpu on User port */
+ priv->ports[port].pm &= ~PCR_MATRIX(BIT(dp->cpu_dp->index));
+ priv->ports[port].pm |= PCR_MATRIX(BIT(cpu_dp->index));
+
+ mt7530_rmw(priv, MT7530_PCR_P(port), PCR_MATRIX_MASK,
+ priv->ports[port].pm);
+
+ mutex_unlock(&priv->reg_mutex);
+
+ return 0;
+}
+
static int
mt7530_port_change_mtu(struct dsa_switch *ds, int port, int new_mtu)
{
@@ -3157,6 +3186,7 @@ static const struct dsa_switch_ops mt7530_switch_ops = {
.set_ageing_time = mt7530_set_ageing_time,
.port_enable = mt7530_port_enable,
.port_disable = mt7530_port_disable,
+ .port_change_master = mt7530_port_change_master,
.port_change_mtu = mt7530_port_change_mtu,
.port_max_mtu = mt7530_port_max_mtu,
.port_stp_state_set = mt7530_stp_state_set,
--
2.30.2
On Sat, Feb 11, 2023 at 07:41:01PM +0100, Richard van Schagen wrote:
> Add support for changing the master of a port on the MT7530 DSA subdriver.
>
>
> Tested-by: Arınç ÜNAL <[email protected]>
> Signed-off-by: Richard van Schagen <[email protected]>
> Signed-off-by: Arınç ÜNAL <[email protected]>
> ---
Currently with this driver, the only way for a frame to reach the CPU is
via flooding. The DSA framework can do better: it can configure the driver
to only accept certain whitelisted MAC addresses, which reduces unwanted
traffic to the CPU. But it needs driver level support for some prerequisites,
namely FDB isolation, se see dsa_switch_supports_uc_filtering() and
dsa_switch_supports_mc_filtering().
If somebody decides to add support for RX filtering later to the mt7530 driver,
he might not have access to a setup with multiple CPU ports. So this
might become a blocking issue for him.
Would it make more sense to unlock RX filtering for the mt7530 driver
now, and to make the FDB entries added on the CPU ports work when
multiple CPU ports exist, too? Now seems like the most logical moment to
do that, not later.