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: Russell King <rmk+kernel@armlinux.org.uk> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
2a10ab043a
commit
0efc286a92
@ -192,22 +192,9 @@ static int lxt973a2_read_status(struct phy_device *phydev)
|
||||
|
||||
phy_resolve_aneg_pause(phydev);
|
||||
} else {
|
||||
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;
|
||||
err = genphy_read_status_fixed(phydev);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
phydev->pause = phydev->asym_pause = 0;
|
||||
linkmode_zero(phydev->lp_advertising);
|
||||
|
@ -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)
|
||||
{
|
||||
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)
|
||||
phydev->speed = SPEED_1000;
|
||||
else if (bmcr & BMCR_SPEED100)
|
||||
phydev->speed = SPEED_100;
|
||||
else
|
||||
phydev->speed = SPEED_10;
|
||||
err = genphy_read_status_fixed(phydev);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
phydev->pause = 0;
|
||||
phydev->asym_pause = 0;
|
||||
|
@ -1992,6 +1992,36 @@ int genphy_read_lpa(struct phy_device *phydev)
|
||||
}
|
||||
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
|
||||
* @phydev: target phy_device struct
|
||||
@ -2026,22 +2056,9 @@ int genphy_read_status(struct phy_device *phydev)
|
||||
if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) {
|
||||
phy_resolve_aneg_linkmode(phydev);
|
||||
} else if (phydev->autoneg == AUTONEG_DISABLE) {
|
||||
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;
|
||||
err = genphy_read_status_fixed(phydev);
|
||||
if (err < 0)
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -1100,6 +1100,7 @@ int __genphy_config_aneg(struct phy_device *phydev, bool changed);
|
||||
int genphy_aneg_done(struct phy_device *phydev);
|
||||
int genphy_update_link(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_suspend(struct phy_device *phydev);
|
||||
int genphy_resume(struct phy_device *phydev);
|
||||
|
Loading…
Reference in New Issue
Block a user