Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b6163f19 authored by Heiner Kallweit's avatar Heiner Kallweit Committed by David S. Miller
Browse files

net: phy: improve genphy_read_status



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: default avatarHeiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 9dfe6aa0
Loading
Loading
Loading
Loading
+8 −15
Original line number Diff line number Diff line
@@ -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,
@@ -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)
@@ -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;