net: sfp: move phy_start()/phy_stop() to phylink
authorRussell King <rmk+kernel@armlinux.org.uk>
Wed, 11 Dec 2019 10:56:14 +0000 (10:56 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 11 Dec 2019 19:53:41 +0000 (11:53 -0800)
Move phy_start() and phy_stop() into the module_start and module_stop
notifications in phylink, rather than having them in the SFP code.
This gives phylink responsibility for controlling the PHY, rather
than having SFP start and stop the PHY state machine.

Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/phy/phylink.c
drivers/net/phy/sfp.c

index b3e4d9bf8113534ad0aaa715b746fb8daf83993a..a89219ac4490ae0892d96128ee53f6d2bbb3cf0a 100644 (file)
@@ -1767,6 +1767,26 @@ static int phylink_sfp_module_insert(void *upstream,
        return ret;
 }
 
+static int phylink_sfp_module_start(void *upstream)
+{
+       struct phylink *pl = upstream;
+
+       /* If this SFP module has a PHY, start the PHY now. */
+       if (pl->phydev)
+               phy_start(pl->phydev);
+
+       return 0;
+}
+
+static void phylink_sfp_module_stop(void *upstream)
+{
+       struct phylink *pl = upstream;
+
+       /* If this SFP module has a PHY, stop it. */
+       if (pl->phydev)
+               phy_stop(pl->phydev);
+}
+
 static void phylink_sfp_link_down(void *upstream)
 {
        struct phylink *pl = upstream;
@@ -1802,6 +1822,8 @@ static const struct sfp_upstream_ops sfp_phylink_ops = {
        .attach = phylink_sfp_attach,
        .detach = phylink_sfp_detach,
        .module_insert = phylink_sfp_module_insert,
+       .module_start = phylink_sfp_module_start,
+       .module_stop = phylink_sfp_module_stop,
        .link_up = phylink_sfp_link_up,
        .link_down = phylink_sfp_link_down,
        .connect_phy = phylink_sfp_connect_phy,
index 23f30dac0f1755753250ed360cebe78caa46857e..d7d2c797c89cd5d992d01545504af9e473a12002 100644 (file)
@@ -1396,7 +1396,6 @@ static void sfp_sm_mod_next(struct sfp *sfp, unsigned int state,
 
 static void sfp_sm_phy_detach(struct sfp *sfp)
 {
-       phy_stop(sfp->mod_phy);
        sfp_remove_phy(sfp->sfp_bus);
        phy_device_remove(sfp->mod_phy);
        phy_device_free(sfp->mod_phy);
@@ -1427,7 +1426,6 @@ static void sfp_sm_probe_phy(struct sfp *sfp)
        }
 
        sfp->mod_phy = phy;
-       phy_start(phy);
 }
 
 static void sfp_sm_link_up(struct sfp *sfp)