diff mbox series

[net-next] net: phy: improve genphy_read_status

Message ID 36da82de-6dad-939e-7604-d3c0b93f54c8@gmail.com
State Accepted
Delegated to: David Miller
Headers show
Series [net-next] net: phy: improve genphy_read_status | expand

Commit Message

Heiner Kallweit March 30, 2019, 9:22 a.m. UTC
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>
---
 drivers/net/phy/phy_device.c | 23 ++++++++---------------
 1 file changed, 8 insertions(+), 15 deletions(-)

Comments

Andrew Lunn March 31, 2019, 2:52 p.m. UTC | #1
> -	if (AUTONEG_ENABLE == phydev->autoneg) {
> +	if (phydev->autoneg == AUTONEG_ENABLE && phydev->link) {

Hi Heiner

I don't necessary agree with placing the constant first in the
comparison, but it is best practice not to change it when making
additions. It makes it a little bit harder to see what the actual
change was.

       Andrew
Andrew Lunn March 31, 2019, 2:58 p.m. UTC | #2
> - 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.

Hi Heiner

Could it be that we don't have a link because what the partner is
advertising does not intersect with what we are advertising?

Hence knowing what it is adverting is actually useful in this case?

      Andrew
Heiner Kallweit March 31, 2019, 2:59 p.m. UTC | #3
On 31.03.2019 16:52, Andrew Lunn wrote:
>> -	if (AUTONEG_ENABLE == phydev->autoneg) {
>> +	if (phydev->autoneg == AUTONEG_ENABLE && phydev->link) {
> 
> Hi Heiner
> 
> I don't necessary agree with placing the constant first in the
> comparison, but it is best practice not to change it when making
> additions. It makes it a little bit harder to see what the actual
> change was.
> 
I understand the point. However a patch to only change the order
of the operands most likely would also be rejected as not being
worth it. As a consequence we would have to live with it forever.
So I think it needs some "if we touch the code anyway" situation.
Or what would be the preferred way to change something like that
that is in general ok and can be just a little bit improved?

>        Andrew
> 
Heiner
Heiner Kallweit March 31, 2019, 3:05 p.m. UTC | #4
On 31.03.2019 16:58, Andrew Lunn wrote:
>> - 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.
> 
> Hi Heiner
> 
> Could it be that we don't have a link because what the partner is
> advertising does not intersect with what we are advertising?
> 
Interesting point. Yes, I think I missed that scenario.

> Hence knowing what it is adverting is actually useful in this case?
> 
>       Andrew
> 
Heiner
Andrew Lunn March 31, 2019, 3:33 p.m. UTC | #5
On Sun, Mar 31, 2019 at 04:59:13PM +0200, Heiner Kallweit wrote:
> On 31.03.2019 16:52, Andrew Lunn wrote:
> >> -	if (AUTONEG_ENABLE == phydev->autoneg) {
> >> +	if (phydev->autoneg == AUTONEG_ENABLE && phydev->link) {
> > 
> > Hi Heiner
> > 
> > I don't necessary agree with placing the constant first in the
> > comparison, but it is best practice not to change it when making
> > additions. It makes it a little bit harder to see what the actual
> > change was.
> > 
> I understand the point. However a patch to only change the order
> of the operands most likely would also be rejected as not being
> worth it.

As i said, i don't necessarily agree with the ordering, but i don't
object to it. There are reasonable arguments which it is better. So i
would just leave it alone.

       Andrew
David Miller April 2, 2019, 1:07 a.m. UTC | #6
From: Heiner Kallweit <hkallweit1@gmail.com>
Date: Sat, 30 Mar 2019 10:22:45 +0100

> 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>

I decided that I'm not going to push back on this patch purely on the
issue of not touching the conditional ordering.

Applied, thanks Heiner.
Heiner Kallweit April 2, 2019, 5:39 p.m. UTC | #7
On 31.03.2019 17:05, Heiner Kallweit wrote:
> On 31.03.2019 16:58, Andrew Lunn wrote:
>>> - 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.
>>
>> Hi Heiner
>>
>> Could it be that we don't have a link because what the partner is
>> advertising does not intersect with what we are advertising?
>>
> Interesting point. Yes, I think I missed that scenario.
> 
Just saw that Dave applied this patch. So I will send a fix to deal
with this scenario properly.

>> Hence knowing what it is adverting is actually useful in this case?
>>
>>       Andrew
>>
> Heiner
>
diff mbox series

Patch

diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
index 0c4cc9b54..67fc581e3 100644
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
@@ -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;