Commit f740eb94 authored by Ioana Ciornei's avatar Ioana Ciornei Committed by Greg Kroah-Hartman

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: default avatarAndrew Lunn <andrew@lunn.ch>
Signed-off-by: default avatarIoana Ciornei <ioana.ciornei@nxp.com>
Link: https://lore.kernel.org/r/1565700187-16048-3-git-send-email-ioana.ciornei@nxp.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 9d8cfa9d
...@@ -1363,48 +1363,6 @@ static int ethsw_register_notifier(struct device *dev) ...@@ -1363,48 +1363,6 @@ static int ethsw_register_notifier(struct device *dev)
return err; 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) static int ethsw_init(struct fsl_mc_device *sw_dev)
{ {
struct device *dev = &sw_dev->dev; struct device *dev = &sw_dev->dev;
...@@ -1586,9 +1544,7 @@ static int ethsw_remove(struct fsl_mc_device *sw_dev) ...@@ -1586,9 +1544,7 @@ static int ethsw_remove(struct fsl_mc_device *sw_dev)
destroy_workqueue(ethsw_owq); destroy_workqueue(ethsw_owq);
rtnl_lock(); dpsw_disable(ethsw->mc_io, 0, ethsw->dpsw_handle);
ethsw_stop(ethsw);
rtnl_unlock();
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];
...@@ -1708,12 +1664,11 @@ static int ethsw_probe(struct fsl_mc_device *sw_dev) ...@@ -1708,12 +1664,11 @@ static int ethsw_probe(struct fsl_mc_device *sw_dev)
goto err_free_ports; goto err_free_ports;
} }
/* Switch starts up enabled */ err = dpsw_enable(ethsw->mc_io, 0, ethsw->dpsw_handle);
rtnl_lock(); if (err) {
err = ethsw_open(ethsw); dev_err(ethsw->dev, "dpsw_enable err %d\n", err);
rtnl_unlock();
if (err)
goto err_free_ports; goto err_free_ports;
}
/* Setup IRQs */ /* Setup IRQs */
err = ethsw_setup_irqs(sw_dev); err = ethsw_setup_irqs(sw_dev);
...@@ -1724,9 +1679,7 @@ static int ethsw_probe(struct fsl_mc_device *sw_dev) ...@@ -1724,9 +1679,7 @@ static int ethsw_probe(struct fsl_mc_device *sw_dev)
return 0; return 0;
err_stop: err_stop:
rtnl_lock(); dpsw_disable(ethsw->mc_io, 0, ethsw->dpsw_handle);
ethsw_stop(ethsw);
rtnl_unlock();
err_free_ports: err_free_ports:
/* Cleanup registered ports only */ /* Cleanup registered ports only */
......
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