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 <[email protected]>
Signed-off-by: Ioana Ciornei <[email protected]>
---
Changes in v2:
 - added Reported-by tag
Changes in v3:
 - none

 drivers/staging/fsl-dpaa2/ethsw/ethsw.c | 59 ++++-----------------------------
 1 file changed, 6 insertions(+), 53 deletions(-)

diff --git a/drivers/staging/fsl-dpaa2/ethsw/ethsw.c 
b/drivers/staging/fsl-dpaa2/ethsw/ethsw.c
index 8032314d5cae..302842c3bdfe 100644
--- a/drivers/staging/fsl-dpaa2/ethsw/ethsw.c
+++ b/drivers/staging/fsl-dpaa2/ethsw/ethsw.c
@@ -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 */
-- 
1.9.1

Reply via email to