[PATCH] net: phy: Support overriding Auto Negotiation timeout with env variable
Siddharth Vadapalli
s-vadapalli at ti.com
Tue Jul 22 08:05:54 CEST 2025
The Auto Negotiation procedure between two Ethernet PHYs consists of
determining the best commonly supported parameters among Speed,
Duplex Mode and Flow Control.
The time taken for this procedure is not only dependent on the local
PHY used, but also on the link-partner PHY.
While a timeout can be specified in the form of a "CONFIG" on the basis
of the local PHY present on the device, since the timeout also depends
on the link-partner PHY, it might be necessary to modify the timeout.
To avoid rebuilding the bootloader for a given device, just because it
may be connected to various link-partner PHYs, each with a different
timeout, introduce an environment variable named "phy_aneg_timeout" and
override "CONFIG_PHY_ANEG_TIMEOUT" with "phy_aneg_timeout".
Signed-off-by: Siddharth Vadapalli <s-vadapalli at ti.com>
---
Hello,
This patch is based on commit
7598b469c16 Merge tag 'u-boot-dfu-next-20250703' of https://source.denx.de/u-boot/custodians/u-boot-dfu into next
of the next branch of Mainline U-Boot.
Patch has been tested on J784S4-EVM validating the following cases:
1. PHY Auto-Negotiation performed with "phy_aneg_timeout" unset.
CONFIG_PHY_TIMEOUT with a value of 4,000 takes effect.
=> Auto Negotiation succeeds
2. PHY Auto-Negotiation performed with "phy_aneg_timeout" set to 10,000.
"phy_aneg_timeout" overrides CONFIG_PHY_TIMEOUT.
[Higher value than default specified by CONFIG_PHY_ANEG_TIMEOUT]
=> Auto Negotiation succeeds
3. PHY Auto-Negotiation performed with "phy_aneg_timeout" set to 2,000.
"phy_aneg_timeout" overrides CONFIG_PHY_TIMEOUT.
[Lower value than default specified by CONFIG_PHY_ANEG_TIMEOUT]
=> Auto Negotiation times out
Test Logs:
https://gist.github.com/Siddharth-Vadapalli-at-TI/697eadcbb26786435df48a834c968375
Regards,
Siddharth.
doc/usage/environment.rst | 8 ++++++++
drivers/net/phy/phy.c | 6 +++++-
2 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/doc/usage/environment.rst b/doc/usage/environment.rst
index bb6c351b441..7447bb85d3e 100644
--- a/doc/usage/environment.rst
+++ b/doc/usage/environment.rst
@@ -335,6 +335,14 @@ netretry
Useful on scripts which control the retry operation
themselves.
+phy_aneg_timeout
+ If set, the specified value will override CONFIG_PHY_ANEG_TIMEOUT
+ which defaults to 4000. The default value of CONFIG_PHY_ANEG_TIMEOUT
+ may be sufficient for most use-cases, but certain link-partners
+ may require a larger timeout due to the Ethernet PHY they use.
+ Alternatively, the timeout can be reduced as well if the use-case
+ demands it.
+
rng_seed_size
Size of random value added to device-tree node /chosen/rng-seed.
This variable is given as a decimal number.
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
index e6fed8c41d7..0f5c9685b59 100644
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
@@ -9,6 +9,7 @@
*/
#include <console.h>
#include <dm.h>
+#include <env.h>
#include <log.h>
#include <malloc.h>
#include <net.h>
@@ -243,6 +244,9 @@ int genphy_update_link(struct phy_device *phydev)
if ((phydev->autoneg == AUTONEG_ENABLE) &&
!(mii_reg & BMSR_ANEGCOMPLETE)) {
int i = 0;
+ char *s = env_get("phy_aneg_timeout");
+ int phy_aneg_timeout = s ? (int)simple_strtol(s, NULL, 10) :
+ CONFIG_PHY_ANEG_TIMEOUT;
printf("%s Waiting for PHY auto negotiation to complete",
phydev->dev->name);
@@ -250,7 +254,7 @@ int genphy_update_link(struct phy_device *phydev)
/*
* Timeout reached ?
*/
- if (i > (CONFIG_PHY_ANEG_TIMEOUT / 50)) {
+ if (i > (phy_aneg_timeout / 50)) {
printf(" TIMEOUT !\n");
phydev->link = 0;
return -ETIMEDOUT;
--
2.34.1
More information about the U-Boot
mailing list