Call dsa_port_enable for CPU/DSA ports in dsa_port_setup, and dsa_port_disable for CPU/DSA ports in dsa_port_teardown. This requires changing all DSA drivers, since they expect the port_enable/port_disable methods to be called only for user ports.
Signed-off-by: Marek Behún <marek.be...@nic.cz> Cc: Andrew Lunn <and...@lunn.ch> Cc: Florian Fainelli <f.faine...@gmail.com> Cc: Vladimir Oltean <olte...@gmail.com> Cc: Vivien Didelot <vivien.dide...@gmail.com> --- net/dsa/dsa2.c | 21 ++++++++++++++++++++- net/dsa/port.c | 4 ++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/net/dsa/dsa2.c b/net/dsa/dsa2.c index 3abd173ebacb..98ea5c158ee3 100644 --- a/net/dsa/dsa2.c +++ b/net/dsa/dsa2.c @@ -315,6 +315,16 @@ static int dsa_port_setup(struct dsa_port *dp) break; } + switch (dp->type) { + case DSA_PORT_TYPE_CPU: + case DSA_PORT_TYPE_DSA: + if (!err) + err = dsa_port_enable(dp, NULL); + break; + default: + break; + } + if (err) devlink_port_unregister(&dp->devlink_port); @@ -323,8 +333,17 @@ static int dsa_port_setup(struct dsa_port *dp) static void dsa_port_teardown(struct dsa_port *dp) { - if (dp->type != DSA_PORT_TYPE_UNUSED) + switch (dp->type) { + case DSA_PORT_TYPE_UNUSED: + break; + case DSA_PORT_TYPE_CPU: + case DSA_PORT_TYPE_DSA: + dsa_port_disable(dp); + /* fall-through */ + case DSA_PORT_TYPE_USER: devlink_port_unregister(&dp->devlink_port); + break; + } switch (dp->type) { case DSA_PORT_TYPE_UNUSED: diff --git a/net/dsa/port.c b/net/dsa/port.c index f071acf2842b..0cadda57df1f 100644 --- a/net/dsa/port.c +++ b/net/dsa/port.c @@ -75,7 +75,7 @@ int dsa_port_enable(struct dsa_port *dp, struct phy_device *phy) return err; } - if (!dp->bridge_dev) + if (dp->type == DSA_PORT_TYPE_USER && !dp->bridge_dev) dsa_port_set_state_now(dp, BR_STATE_FORWARDING); return 0; @@ -86,7 +86,7 @@ void dsa_port_disable(struct dsa_port *dp) struct dsa_switch *ds = dp->ds; int port = dp->index; - if (!dp->bridge_dev) + if (dp->type == DSA_PORT_TYPE_USER && !dp->bridge_dev) dsa_port_set_state_now(dp, BR_STATE_DISABLED); if (ds->ops->port_disable) -- 2.21.0