mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH] Improve PHY AutoNeg procedure
@ 2015-10-31 13:07 Anton Bondarenko
  2015-10-31 13:07 ` [PATCH] net: phy: wait for link OK after successfull autonegotiation Anton Bondarenko
  0 siblings, 1 reply; 3+ messages in thread
From: Anton Bondarenko @ 2015-10-31 13:07 UTC (permalink / raw)
  To: s.hauer, barebox

While working with IMX6Q Embedsky E9 I've noticed the problem with
first attempt to run 'ifup eth0'. The root cause of the failure is in PHY
not setting bit '1.2 Link Status' at the same time as setting
bit '1.5 Auto-Negotiation Complete'. The delay between these changes
could be up to 4 ms. PHY is Realtek RTL8211E. The proposed change would
improve handling of similar situations.

Anton Bondarenko (1):
  net: phy: wait for link OK after successfull autonegotiation

 drivers/net/phy/phy.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

-- 
2.6.2


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH] net: phy: wait for link OK after successfull autonegotiation
  2015-10-31 13:07 [PATCH] Improve PHY AutoNeg procedure Anton Bondarenko
@ 2015-10-31 13:07 ` Anton Bondarenko
  2015-11-02  8:00   ` Sascha Hauer
  0 siblings, 1 reply; 3+ messages in thread
From: Anton Bondarenko @ 2015-10-31 13:07 UTC (permalink / raw)
  To: s.hauer, barebox

It may take some time for PHY to indicate link OK status after
autonegotiation completed. This change addresses this case
and prevent network commands fails due to the delay.

Signed-off-by: Anton Bondarenko <anton.bondarenko.sama@gmail.com>
---
 drivers/net/phy/phy.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
index 2b3c5e2..73569f3 100644
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
@@ -502,13 +502,17 @@ int phy_wait_aneg_done(struct phy_device *phydev)
 		return 0;
 
 	while (!is_timeout(start, PHY_AN_TIMEOUT * SECOND)) {
-		if (phy_aneg_done(phydev) > 0) {
-			phydev->link = 1;
+		if (phy_aneg_done(phydev) > 0)
+			break;
+	}
+
+	genphy_update_link(phydev);
+	while (!is_timeout(start, PHY_AN_TIMEOUT * SECOND)) {
+		if (phydev->link == 1)
 			return 0;
-		}
+		genphy_update_link(phydev);
 	}
 
-	phydev->link = 0;
 	return -ETIMEDOUT;
 }
 
-- 
2.6.2


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] net: phy: wait for link OK after successfull autonegotiation
  2015-10-31 13:07 ` [PATCH] net: phy: wait for link OK after successfull autonegotiation Anton Bondarenko
@ 2015-11-02  8:00   ` Sascha Hauer
  0 siblings, 0 replies; 3+ messages in thread
From: Sascha Hauer @ 2015-11-02  8:00 UTC (permalink / raw)
  To: Anton Bondarenko; +Cc: barebox

On Sat, Oct 31, 2015 at 02:07:52PM +0100, Anton Bondarenko wrote:
> It may take some time for PHY to indicate link OK status after
> autonegotiation completed. This change addresses this case
> and prevent network commands fails due to the delay.
> 
> Signed-off-by: Anton Bondarenko <anton.bondarenko.sama@gmail.com>
> ---
>  drivers/net/phy/phy.c | 12 ++++++++----
>  1 file changed, 8 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
> index 2b3c5e2..73569f3 100644
> --- a/drivers/net/phy/phy.c
> +++ b/drivers/net/phy/phy.c
> @@ -502,13 +502,17 @@ int phy_wait_aneg_done(struct phy_device *phydev)
>  		return 0;
>  
>  	while (!is_timeout(start, PHY_AN_TIMEOUT * SECOND)) {
> -		if (phy_aneg_done(phydev) > 0) {
> -			phydev->link = 1;
> +		if (phy_aneg_done(phydev) > 0)
> +			break;
> +	}
> +
> +	genphy_update_link(phydev);
> +	while (!is_timeout(start, PHY_AN_TIMEOUT * SECOND)) {
> +		if (phydev->link == 1)
>  			return 0;
> -		}
> +		genphy_update_link(phydev);
>  	}

The additional call to genphy_update_link() before the loop shouldn't be
necessary, right? Or to be 100% correct you could use a do {} while loop
to make sure to always call genphy_update_link() at least once.

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2015-11-02  8:00 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-10-31 13:07 [PATCH] Improve PHY AutoNeg procedure Anton Bondarenko
2015-10-31 13:07 ` [PATCH] net: phy: wait for link OK after successfull autonegotiation Anton Bondarenko
2015-11-02  8:00   ` Sascha Hauer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox