staging: fsl-dpaa2/ethsw: enable switch ports only on dev_open
authorIoana Ciornei <ioana.ciornei@nxp.com>
Tue, 13 Aug 2019 12:42:59 +0000 (15:42 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 14 Aug 2019 14:46:24 +0000 (16:46 +0200)
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>
drivers/staging/fsl-dpaa2/ethsw/ethsw.c

index 8032314d5cae3d958aa22ebe8dac049c35ee072b..302842c3bdfed7f61de8c535551dbf994fea442f 100644 (file)
@@ -1363,48 +1363,6 @@ err_switchdev_nb:
        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 */