net: phy: marvell: consolidate phy status reading
authorRussell King <rmk+kernel@armlinux.org.uk>
Tue, 17 Dec 2019 13:39:36 +0000 (13:39 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 19 Dec 2019 20:52:34 +0000 (12:52 -0800)
marvell_read_status_page_an() always reads the PHY status register, but
marvell_update_link() has already done this.  Rather than wastefully
reading the register twice in quick succession, read it once in
marvell_read_status_page() and use the result for both.

This makes marvell_update_link() rather pointless, so move it into
marvell_read_status_page().

Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/phy/marvell.c

index 5900281..9c26e8e 100644 (file)
@@ -1307,47 +1307,12 @@ static void fiber_lpa_mod_linkmode_lpa_t(unsigned long *advertising, u32 lpa)
                         advertising, lpa & LPA_FIBER_1000FULL);
 }
 
-/**
- * marvell_update_link - update link status in real time in @phydev
- * @phydev: target phy_device struct
- *
- * Description: Update the value in phydev->link to reflect the
- *   current link value.
- */
-static int marvell_update_link(struct phy_device *phydev, int fiber)
-{
-       int status;
-
-       /* Use the generic register for copper link, or specific
-        * register for fiber case
-        */
-       if (fiber) {
-               status = phy_read(phydev, MII_M1011_PHY_STATUS);
-               if (status < 0)
-                       return status;
-
-               if (status & MII_M1011_PHY_STATUS_LINK)
-                       phydev->link = 1;
-               else
-                       phydev->link = 0;
-       } else {
-               return genphy_update_link(phydev);
-       }
-
-       return 0;
-}
-
 static int marvell_read_status_page_an(struct phy_device *phydev,
-                                      int fiber)
+                                      int fiber, int status)
 {
-       int status;
        int lpa;
        int err;
 
-       status = phy_read(phydev, MII_M1011_PHY_STATUS);
-       if (status < 0)
-               return status;
-
        if (!fiber) {
                err = genphy_read_lpa(phydev);
                if (err < 0)
@@ -1408,27 +1373,36 @@ static int marvell_read_status_page_an(struct phy_device *phydev,
  */
 static int marvell_read_status_page(struct phy_device *phydev, int page)
 {
+       int status;
        int fiber;
        int err;
 
-       /* Detect and update the link, but return if there
-        * was an error
+       status = phy_read(phydev, MII_M1011_PHY_STATUS);
+       if (status < 0)
+               return status;
+
+       /* Use the generic register for copper link status,
+        * and the PHY status register for fiber link status.
         */
+       if (page == MII_MARVELL_FIBER_PAGE) {
+               phydev->link = !!(status & MII_M1011_PHY_STATUS_LINK);
+       } else {
+               err = genphy_update_link(phydev);
+               if (err)
+                       return err;
+       }
+
        if (page == MII_MARVELL_FIBER_PAGE)
                fiber = 1;
        else
                fiber = 0;
 
-       err = marvell_update_link(phydev, fiber);
-       if (err)
-               return err;
-
        linkmode_zero(phydev->lp_advertising);
        phydev->pause = 0;
        phydev->asym_pause = 0;
 
        if (phydev->autoneg == AUTONEG_ENABLE)
-               err = marvell_read_status_page_an(phydev, fiber);
+               err = marvell_read_status_page_an(phydev, fiber, status);
        else
                err = genphy_read_status_fixed(phydev);