net: dpaa2-switch: call dpaa2_switch_port_disconnect_mac on probe error path
authorVladimir Oltean <vladimir.oltean@nxp.com>
Thu, 19 Aug 2021 14:40:19 +0000 (17:40 +0300)
committerDavid S. Miller <davem@davemloft.net>
Fri, 20 Aug 2021 13:34:49 +0000 (14:34 +0100)
Currently when probing returns an error, the netdev is freed but
phylink_disconnect is not called.

Create a common function between the unbind path and the error path,
call it the opposite of dpaa2_switch_probe_port: dpaa2_switch_remove_port,
and call it from both the unbind and the error path.

Fixes: 84cba72956fd ("dpaa2-switch: integrate the MAC endpoint support")
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: Ioana Ciornei <ioana.ciornei@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c

index 71c8501..175f15c 100644 (file)
@@ -2925,6 +2925,18 @@ err_free_dpbp:
        return err;
 }
 
+static void dpaa2_switch_remove_port(struct ethsw_core *ethsw,
+                                    u16 port_idx)
+{
+       struct ethsw_port_priv *port_priv = ethsw->ports[port_idx];
+
+       rtnl_lock();
+       dpaa2_switch_port_disconnect_mac(port_priv);
+       rtnl_unlock();
+       free_netdev(port_priv->netdev);
+       ethsw->ports[port_idx] = NULL;
+}
+
 static int dpaa2_switch_init(struct fsl_mc_device *sw_dev)
 {
        struct device *dev = &sw_dev->dev;
@@ -3203,10 +3215,7 @@ static int dpaa2_switch_remove(struct fsl_mc_device *sw_dev)
        for (i = 0; i < ethsw->sw_attr.num_ifs; i++) {
                port_priv = ethsw->ports[i];
                unregister_netdev(port_priv->netdev);
-               rtnl_lock();
-               dpaa2_switch_port_disconnect_mac(port_priv);
-               rtnl_unlock();
-               free_netdev(port_priv->netdev);
+               dpaa2_switch_remove_port(ethsw, i);
        }
 
        kfree(ethsw->fdbs);
@@ -3394,7 +3403,7 @@ err_stop:
        dpsw_disable(ethsw->mc_io, 0, ethsw->dpsw_handle);
 err_free_netdev:
        for (i--; i >= 0; i--)
-               free_netdev(ethsw->ports[i]->netdev);
+               dpaa2_switch_remove_port(ethsw, i);
        kfree(ethsw->filter_blocks);
 err_free_fdbs:
        kfree(ethsw->fdbs);