Commit 0efc286a authored by Russell King's avatar Russell King Committed by David S. Miller

net: phy: provide and use genphy_read_status_fixed()

There are two drivers and generic code which contain exactly the same
code to read the status of a PHY operating without autonegotiation
enabled. Rather than duplicate this code, provide a helper to read
this information.
Signed-off-by: default avatarRussell King <rmk+kernel@armlinux.org.uk>
Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 2a10ab04
...@@ -192,22 +192,9 @@ static int lxt973a2_read_status(struct phy_device *phydev) ...@@ -192,22 +192,9 @@ static int lxt973a2_read_status(struct phy_device *phydev)
phy_resolve_aneg_pause(phydev); phy_resolve_aneg_pause(phydev);
} else { } else {
int bmcr = phy_read(phydev, MII_BMCR); err = genphy_read_status_fixed(phydev);
if (err < 0)
if (bmcr < 0) return err;
return bmcr;
if (bmcr & BMCR_FULLDPLX)
phydev->duplex = DUPLEX_FULL;
else
phydev->duplex = DUPLEX_HALF;
if (bmcr & BMCR_SPEED1000)
phydev->speed = SPEED_1000;
else if (bmcr & BMCR_SPEED100)
phydev->speed = SPEED_100;
else
phydev->speed = SPEED_10;
phydev->pause = phydev->asym_pause = 0; phydev->pause = phydev->asym_pause = 0;
linkmode_zero(phydev->lp_advertising); linkmode_zero(phydev->lp_advertising);
......
...@@ -1407,22 +1407,11 @@ static int marvell_read_status_page_an(struct phy_device *phydev, ...@@ -1407,22 +1407,11 @@ static int marvell_read_status_page_an(struct phy_device *phydev,
static int marvell_read_status_page_fixed(struct phy_device *phydev) static int marvell_read_status_page_fixed(struct phy_device *phydev)
{ {
int bmcr = phy_read(phydev, MII_BMCR); int err;
if (bmcr < 0)
return bmcr;
if (bmcr & BMCR_FULLDPLX)
phydev->duplex = DUPLEX_FULL;
else
phydev->duplex = DUPLEX_HALF;
if (bmcr & BMCR_SPEED1000) err = genphy_read_status_fixed(phydev);
phydev->speed = SPEED_1000; if (err < 0)
else if (bmcr & BMCR_SPEED100) return err;
phydev->speed = SPEED_100;
else
phydev->speed = SPEED_10;
phydev->pause = 0; phydev->pause = 0;
phydev->asym_pause = 0; phydev->asym_pause = 0;
......
...@@ -1992,6 +1992,36 @@ int genphy_read_lpa(struct phy_device *phydev) ...@@ -1992,6 +1992,36 @@ int genphy_read_lpa(struct phy_device *phydev)
} }
EXPORT_SYMBOL(genphy_read_lpa); EXPORT_SYMBOL(genphy_read_lpa);
/**
* genphy_read_status_fixed - read the link parameters for !aneg mode
* @phydev: target phy_device struct
*
* Read the current duplex and speed state for a PHY operating with
* autonegotiation disabled.
*/
int genphy_read_status_fixed(struct phy_device *phydev)
{
int bmcr = phy_read(phydev, MII_BMCR);
if (bmcr < 0)
return bmcr;
if (bmcr & BMCR_FULLDPLX)
phydev->duplex = DUPLEX_FULL;
else
phydev->duplex = DUPLEX_HALF;
if (bmcr & BMCR_SPEED1000)
phydev->speed = SPEED_1000;
else if (bmcr & BMCR_SPEED100)
phydev->speed = SPEED_100;
else
phydev->speed = SPEED_10;
return 0;
}
EXPORT_SYMBOL(genphy_read_status_fixed);
/** /**
* genphy_read_status - check the link status and update current link state * genphy_read_status - check the link status and update current link state
* @phydev: target phy_device struct * @phydev: target phy_device struct
...@@ -2026,22 +2056,9 @@ int genphy_read_status(struct phy_device *phydev) ...@@ -2026,22 +2056,9 @@ int genphy_read_status(struct phy_device *phydev)
if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) { if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) {
phy_resolve_aneg_linkmode(phydev); phy_resolve_aneg_linkmode(phydev);
} else if (phydev->autoneg == AUTONEG_DISABLE) { } else if (phydev->autoneg == AUTONEG_DISABLE) {
int bmcr = phy_read(phydev, MII_BMCR); err = genphy_read_status_fixed(phydev);
if (err < 0)
if (bmcr < 0) return err;
return bmcr;
if (bmcr & BMCR_FULLDPLX)
phydev->duplex = DUPLEX_FULL;
else
phydev->duplex = DUPLEX_HALF;
if (bmcr & BMCR_SPEED1000)
phydev->speed = SPEED_1000;
else if (bmcr & BMCR_SPEED100)
phydev->speed = SPEED_100;
else
phydev->speed = SPEED_10;
} }
return 0; return 0;
......
...@@ -1100,6 +1100,7 @@ int __genphy_config_aneg(struct phy_device *phydev, bool changed); ...@@ -1100,6 +1100,7 @@ int __genphy_config_aneg(struct phy_device *phydev, bool changed);
int genphy_aneg_done(struct phy_device *phydev); int genphy_aneg_done(struct phy_device *phydev);
int genphy_update_link(struct phy_device *phydev); int genphy_update_link(struct phy_device *phydev);
int genphy_read_lpa(struct phy_device *phydev); int genphy_read_lpa(struct phy_device *phydev);
int genphy_read_status_fixed(struct phy_device *phydev);
int genphy_read_status(struct phy_device *phydev); int genphy_read_status(struct phy_device *phydev);
int genphy_suspend(struct phy_device *phydev); int genphy_suspend(struct phy_device *phydev);
int genphy_resume(struct phy_device *phydev); int genphy_resume(struct phy_device *phydev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment