net: enetc: move phylink_start/stop out of enetc_start/stop
authorVladimir Oltean <vladimir.oltean@nxp.com>
Tue, 17 Jan 2023 23:02:30 +0000 (01:02 +0200)
committerJakub Kicinski <kuba@kernel.org>
Thu, 19 Jan 2023 04:52:25 +0000 (20:52 -0800)
We want to introduce a fast interface reconfiguration procedure, which
involves temporarily stopping the rings.

But we want enetc_start() and enetc_stop() to not restart PHY autoneg,
because that can take a few seconds until it completes again.

So we need part of enetc_start() and enetc_stop(), but not all of them.
Move phylink_start() right next to phylink_of_phy_connect(), and
phylink_stop() right next to phylink_disconnect_phy(), both still in
ndo_open() and ndo_stop().

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/freescale/enetc/enetc.c

index 543ae8875bc9f391822145c19c861ad208e1ee5e..014de5425b811280d1ad70d65fb01e4b1aa7dc5e 100644 (file)
@@ -2322,8 +2322,11 @@ static int enetc_phylink_connect(struct net_device *ndev)
        struct ethtool_eee edata;
        int err;
 
-       if (!priv->phylink)
-               return 0; /* phy-less mode */
+       if (!priv->phylink) {
+               /* phy-less mode */
+               netif_carrier_on(ndev);
+               return 0;
+       }
 
        err = phylink_of_phy_connect(priv->phylink, priv->dev->of_node, 0);
        if (err) {
@@ -2335,6 +2338,8 @@ static int enetc_phylink_connect(struct net_device *ndev)
        memset(&edata, 0, sizeof(struct ethtool_eee));
        phylink_ethtool_set_eee(priv->phylink, &edata);
 
+       phylink_start(priv->phylink);
+
        return 0;
 }
 
@@ -2376,11 +2381,6 @@ void enetc_start(struct net_device *ndev)
                enable_irq(irq);
        }
 
-       if (priv->phylink)
-               phylink_start(priv->phylink);
-       else
-               netif_carrier_on(ndev);
-
        netif_tx_start_all_queues(ndev);
 }
 
@@ -2461,11 +2461,6 @@ void enetc_stop(struct net_device *ndev)
                napi_disable(&priv->int_vector[i]->napi);
        }
 
-       if (priv->phylink)
-               phylink_stop(priv->phylink);
-       else
-               netif_carrier_off(ndev);
-
        enetc_clear_interrupts(priv);
 }
 
@@ -2476,8 +2471,13 @@ int enetc_close(struct net_device *ndev)
        enetc_stop(ndev);
        enetc_clear_bdrs(priv);
 
-       if (priv->phylink)
+       if (priv->phylink) {
+               phylink_stop(priv->phylink);
                phylink_disconnect_phy(priv->phylink);
+       } else {
+               netif_carrier_off(ndev);
+       }
+
        enetc_free_rxtx_rings(priv);
 
        /* Avoids dangling pointers and also frees old resources */