Skip to content

Commit

Permalink
net: phy: improve genphy_read_status
Browse files Browse the repository at this point in the history
This patch improves few aspects of genphy_read_status():

- Don't initialize lpagb, it's not needed.

- Move initializing phydev->speed et al before the if clause.

- In auto-neg case, skip populating lp_advertising if we
  don't have a link. This avoids quite some unnecessary
  MDIO reads in case of phylib polling mode.

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Heiner Kallweit authored and David S. Miller committed Apr 2, 2019
1 parent 9dfe6aa commit b6163f1
Showing 1 changed file with 8 additions and 15 deletions.
23 changes: 8 additions & 15 deletions drivers/net/phy/phy_device.c
Original file line number Diff line number Diff line change
Expand Up @@ -1743,19 +1743,21 @@ EXPORT_SYMBOL(genphy_update_link);
*/
int genphy_read_status(struct phy_device *phydev)
{
int adv;
int err;
int lpa;
int lpagb = 0;
int adv, lpa, lpagb, err;

/* Update the link, but return if there was an error */
err = genphy_update_link(phydev);
if (err)
return err;

phydev->speed = SPEED_UNKNOWN;
phydev->duplex = DUPLEX_UNKNOWN;
phydev->pause = 0;
phydev->asym_pause = 0;

linkmode_zero(phydev->lp_advertising);

if (AUTONEG_ENABLE == phydev->autoneg) {
if (phydev->autoneg == AUTONEG_ENABLE && phydev->link) {
if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
phydev->supported) ||
linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
Expand Down Expand Up @@ -1785,14 +1787,8 @@ int genphy_read_status(struct phy_device *phydev)
return lpa;

mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, lpa);

phydev->speed = SPEED_UNKNOWN;
phydev->duplex = DUPLEX_UNKNOWN;
phydev->pause = 0;
phydev->asym_pause = 0;

phy_resolve_aneg_linkmode(phydev);
} else {
} else if (phydev->autoneg == AUTONEG_DISABLE) {
int bmcr = phy_read(phydev, MII_BMCR);

if (bmcr < 0)
Expand All @@ -1809,9 +1805,6 @@ int genphy_read_status(struct phy_device *phydev)
phydev->speed = SPEED_100;
else
phydev->speed = SPEED_10;

phydev->pause = 0;
phydev->asym_pause = 0;
}

return 0;
Expand Down

0 comments on commit b6163f1

Please sign in to comment.