diff options
author | Russell King <rmk+kernel@armlinux.org.uk> | 2019-12-17 14:39:36 +0100 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-12-19 21:52:34 +0100 |
commit | d2004e27eb352a5961cae7cc50563dbdc5386ba7 (patch) | |
tree | acd52e665ac63ab483a98f6b70f2d5f8f4ba4fb5 /drivers/net/phy/marvell.c | |
parent | net: phy: marvell: use positive logic for link state (diff) | |
download | linux-d2004e27eb352a5961cae7cc50563dbdc5386ba7.tar.xz linux-d2004e27eb352a5961cae7cc50563dbdc5386ba7.zip |
net: phy: marvell: consolidate phy status reading
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>
Diffstat (limited to 'drivers/net/phy/marvell.c')
-rw-r--r-- | drivers/net/phy/marvell.c | 60 |
1 files changed, 17 insertions, 43 deletions
diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c index 5900281f4c2c..9c26e8ebd143 100644 --- a/drivers/net/phy/marvell.c +++ b/drivers/net/phy/marvell.c @@ -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); |