net: phy: marvell10g: clean up interface mode switching
authorRussell King <rmk+kernel@armlinux.org.uk>
Fri, 29 Dec 2017 12:46:32 +0000 (12:46 +0000)
committerDavid S. Miller <davem@davemloft.net>
Tue, 2 Jan 2018 20:00:49 +0000 (15:00 -0500)
Centralise the PHY interface mode switching, rather than having it in
two places.

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

index bf1a218..fa7245a 100644 (file)
@@ -246,6 +246,24 @@ static int mv3310_aneg_done(struct phy_device *phydev)
        return genphy_c45_aneg_done(phydev);
 }
 
+static void mv3310_update_interface(struct phy_device *phydev)
+{
+       if ((phydev->interface == PHY_INTERFACE_MODE_SGMII ||
+            phydev->interface == PHY_INTERFACE_MODE_10GKR) && phydev->link) {
+               /* The PHY automatically switches its serdes interface (and
+                * active PHYXS instance) between Cisco SGMII and 10GBase-KR
+                * modes according to the speed.  Florian suggests setting
+                * phydev->interface to communicate this to the MAC. Only do
+                * this if we are already in either SGMII or 10GBase-KR mode.
+                */
+               if (phydev->speed == SPEED_10000)
+                       phydev->interface = PHY_INTERFACE_MODE_10GKR;
+               else if (phydev->speed >= SPEED_10 &&
+                        phydev->speed < SPEED_10000)
+                       phydev->interface = PHY_INTERFACE_MODE_SGMII;
+       }
+}
+
 /* 10GBASE-ER,LR,LRM,SR do not support autonegotiation. */
 static int mv3310_read_10gbr_status(struct phy_device *phydev)
 {
@@ -253,8 +271,7 @@ static int mv3310_read_10gbr_status(struct phy_device *phydev)
        phydev->speed = SPEED_10000;
        phydev->duplex = DUPLEX_FULL;
 
-       if (phydev->interface == PHY_INTERFACE_MODE_SGMII)
-               phydev->interface = PHY_INTERFACE_MODE_10GKR;
+       mv3310_update_interface(phydev);
 
        return 0;
 }
@@ -354,20 +371,7 @@ static int mv3310_read_status(struct phy_device *phydev)
                }
        }
 
-       if ((phydev->interface == PHY_INTERFACE_MODE_SGMII ||
-            phydev->interface == PHY_INTERFACE_MODE_10GKR) && phydev->link) {
-               /* The PHY automatically switches its serdes interface (and
-                * active PHYXS instance) between Cisco SGMII and 10GBase-KR
-                * modes according to the speed.  Florian suggests setting
-                * phydev->interface to communicate this to the MAC. Only do
-                * this if we are already in either SGMII or 10GBase-KR mode.
-                */
-               if (phydev->speed == SPEED_10000)
-                       phydev->interface = PHY_INTERFACE_MODE_10GKR;
-               else if (phydev->speed >= SPEED_10 &&
-                        phydev->speed < SPEED_10000)
-                       phydev->interface = PHY_INTERFACE_MODE_SGMII;
-       }
+       mv3310_update_interface(phydev);
 
        return 0;
 }