staging: fsl-dpaa2/ethsw: enable switch ports only on dev_open

At probe time, only the DPSW object should be enabled without the
associated ports, which will get enabled on dev_open. Remove the
ethsw_open() and ethsw_stop() functions and replace them only with
dpsw_enable()/_disable().

Reported-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com>
Link: https://lore.kernel.org/r/1565700187-16048-3-git-send-email-ioana.ciornei@nxp.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Ioana Ciornei 2019-08-13 15:42:59 +03:00 committed by Greg Kroah-Hartman
parent 9d8cfa9d53
commit f740eb942b
1 changed files with 6 additions and 53 deletions

View File

@ -1363,48 +1363,6 @@ static int ethsw_register_notifier(struct device *dev)
return err;
}
static int ethsw_open(struct ethsw_core *ethsw)
{
struct ethsw_port_priv *port_priv = NULL;
int i, err;
err = dpsw_enable(ethsw->mc_io, 0, ethsw->dpsw_handle);
if (err) {
dev_err(ethsw->dev, "dpsw_enable err %d\n", err);
return err;
}
for (i = 0; i < ethsw->sw_attr.num_ifs; i++) {
port_priv = ethsw->ports[i];
err = dev_open(port_priv->netdev, NULL);
if (err) {
netdev_err(port_priv->netdev, "dev_open err %d\n", err);
return err;
}
}
return 0;
}
static int ethsw_stop(struct ethsw_core *ethsw)
{
struct ethsw_port_priv *port_priv = NULL;
int i, err;
for (i = 0; i < ethsw->sw_attr.num_ifs; i++) {
port_priv = ethsw->ports[i];
dev_close(port_priv->netdev);
}
err = dpsw_disable(ethsw->mc_io, 0, ethsw->dpsw_handle);
if (err) {
dev_err(ethsw->dev, "dpsw_disable err %d\n", err);
return err;
}
return 0;
}
static int ethsw_init(struct fsl_mc_device *sw_dev)
{
struct device *dev = &sw_dev->dev;
@ -1586,9 +1544,7 @@ static int ethsw_remove(struct fsl_mc_device *sw_dev)
destroy_workqueue(ethsw_owq);
rtnl_lock();
ethsw_stop(ethsw);
rtnl_unlock();
dpsw_disable(ethsw->mc_io, 0, ethsw->dpsw_handle);
for (i = 0; i < ethsw->sw_attr.num_ifs; i++) {
port_priv = ethsw->ports[i];
@ -1708,12 +1664,11 @@ static int ethsw_probe(struct fsl_mc_device *sw_dev)
goto err_free_ports;
}
/* Switch starts up enabled */
rtnl_lock();
err = ethsw_open(ethsw);
rtnl_unlock();
if (err)
err = dpsw_enable(ethsw->mc_io, 0, ethsw->dpsw_handle);
if (err) {
dev_err(ethsw->dev, "dpsw_enable err %d\n", err);
goto err_free_ports;
}
/* Setup IRQs */
err = ethsw_setup_irqs(sw_dev);
@ -1724,9 +1679,7 @@ static int ethsw_probe(struct fsl_mc_device *sw_dev)
return 0;
err_stop:
rtnl_lock();
ethsw_stop(ethsw);
rtnl_unlock();
dpsw_disable(ethsw->mc_io, 0, ethsw->dpsw_handle);
err_free_ports:
/* Cleanup registered ports only */