[PATCH] net: phy: Support overriding Auto Negotiation timeout with env variable
Marek Vasut
marek.vasut at mailbox.org
Tue Jul 22 14:57:33 CEST 2025
On 7/22/25 8:05 AM, Siddharth Vadapalli wrote:
> 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");
env_get_ulong("phy_aneg_timeout", 10, CONFIG_PHY_ANEG_TIMEOUT);
More information about the U-Boot
mailing list