Commit 860fe1f8 authored by Vladimir Oltean's avatar Vladimir Oltean Committed by David S. Miller

net: dpaa2-switch: call dpaa2_switch_port_disconnect_mac on probe error path

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: 84cba729 ("dpaa2-switch: integrate the MAC endpoint support")
Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: default avatarIoana Ciornei <ioana.ciornei@nxp.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d52ef12f
...@@ -2925,6 +2925,18 @@ static int dpaa2_switch_ctrl_if_setup(struct ethsw_core *ethsw) ...@@ -2925,6 +2925,18 @@ static int dpaa2_switch_ctrl_if_setup(struct ethsw_core *ethsw)
return err; 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) static int dpaa2_switch_init(struct fsl_mc_device *sw_dev)
{ {
struct device *dev = &sw_dev->dev; struct device *dev = &sw_dev->dev;
...@@ -3203,10 +3215,7 @@ static int dpaa2_switch_remove(struct fsl_mc_device *sw_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++) { for (i = 0; i < ethsw->sw_attr.num_ifs; i++) {
port_priv = ethsw->ports[i]; port_priv = ethsw->ports[i];
unregister_netdev(port_priv->netdev); unregister_netdev(port_priv->netdev);
rtnl_lock(); dpaa2_switch_remove_port(ethsw, i);
dpaa2_switch_port_disconnect_mac(port_priv);
rtnl_unlock();
free_netdev(port_priv->netdev);
} }
kfree(ethsw->fdbs); kfree(ethsw->fdbs);
...@@ -3394,7 +3403,7 @@ static int dpaa2_switch_probe(struct fsl_mc_device *sw_dev) ...@@ -3394,7 +3403,7 @@ static int dpaa2_switch_probe(struct fsl_mc_device *sw_dev)
dpsw_disable(ethsw->mc_io, 0, ethsw->dpsw_handle); dpsw_disable(ethsw->mc_io, 0, ethsw->dpsw_handle);
err_free_netdev: err_free_netdev:
for (i--; i >= 0; i--) for (i--; i >= 0; i--)
free_netdev(ethsw->ports[i]->netdev); dpaa2_switch_remove_port(ethsw, i);
kfree(ethsw->filter_blocks); kfree(ethsw->filter_blocks);
err_free_fdbs: err_free_fdbs:
kfree(ethsw->fdbs); kfree(ethsw->fdbs);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment