diff mbox series

[net-next] net: phy: avoid unneeded MDIO reads in genphy_read_status

Message ID 92a0d681-33ea-feb7-bdf5-ff6fd9911ce1@gmail.com
State Accepted
Delegated to: David Miller
Headers show
Series [net-next] net: phy: avoid unneeded MDIO reads in genphy_read_status | expand

Commit Message

Heiner Kallweit April 24, 2019, 7:49 p.m. UTC
Considering that in polling mode each link drop will be latched,
settings can't have changed if link was up and is up.

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
---
 drivers/net/phy/phy_device.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

Comments

Andrew Lunn April 24, 2019, 10:41 p.m. UTC | #1
On Wed, Apr 24, 2019 at 09:49:30PM +0200, Heiner Kallweit wrote:
> Considering that in polling mode each link drop will be latched,
> settings can't have changed if link was up and is up.

Hi Heiner

What about the case of the PHY performing a downshift?

Could it be up, then finds a pair fails, so performs a downshift. Does
it always report link down and then up to the new speed? Or could it
just shift down? And so we want to read the new speed?

I suppose it could also perform an upshift? A broken pair comes back
to life, so it returns to the higher speed?

   Andrew
Heiner Kallweit April 25, 2019, 5:02 a.m. UTC | #2
On 25.04.2019 00:41, Andrew Lunn wrote:
> On Wed, Apr 24, 2019 at 09:49:30PM +0200, Heiner Kallweit wrote:
>> Considering that in polling mode each link drop will be latched,
>> settings can't have changed if link was up and is up.
> 
> Hi Heiner
> 
Hi Andrew,

interesting questions.

> What about the case of the PHY performing a downshift?
> 
> Could it be up, then finds a pair fails, so performs a downshift. Does
> it always report link down and then up to the new speed? Or could it
> just shift down? And so we want to read the new speed?
> 
My experience with downshift is that it's part of an extended autoneg
process. The link stays down all the time until both link partners
have agreed on a downshifted speed.

> I suppose it could also perform an upshift? A broken pair comes back
> to life, so it returns to the higher speed?
> 
So far I didn't come across an upshift feature. But also then I'd expect
some autoneg process with the link being down. More likely seems to be
that upshifting requires an explicit autoneg restart.

>    Andrew
> 
Heiner
David Miller April 28, 2019, 11:48 p.m. UTC | #3
From: Heiner Kallweit <hkallweit1@gmail.com>
Date: Wed, 24 Apr 2019 21:49:30 +0200

> Considering that in polling mode each link drop will be latched,
> settings can't have changed if link was up and is up.
> 
> Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>

Applied, let's see what happens. :-)
diff mbox series

Patch

diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
index f794ff3a1..2a2aaa5f3 100644
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
@@ -1739,13 +1739,17 @@  EXPORT_SYMBOL(genphy_update_link);
  */
 int genphy_read_status(struct phy_device *phydev)
 {
-	int adv, lpa, lpagb, err;
+	int adv, lpa, lpagb, err, old_link = phydev->link;
 
 	/* Update the link, but return if there was an error */
 	err = genphy_update_link(phydev);
 	if (err)
 		return err;
 
+	/* why bother the PHY if nothing can have changed */
+	if (phydev->autoneg == AUTONEG_ENABLE && old_link && phydev->link)
+		return 0;
+
 	phydev->speed = SPEED_UNKNOWN;
 	phydev->duplex = DUPLEX_UNKNOWN;
 	phydev->pause = 0;