summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/usage/environment.rst9
-rw-r--r--drivers/net/phy/Kconfig5
-rw-r--r--drivers/net/phy/aquantia.c10
-rw-r--r--drivers/net/phy/phy.c7
-rw-r--r--drivers/net/xilinx_axi_emac.c5
5 files changed, 28 insertions, 8 deletions
diff --git a/doc/usage/environment.rst b/doc/usage/environment.rst
index bb6c351b441..77197d79380 100644
--- a/doc/usage/environment.rst
+++ b/doc/usage/environment.rst
@@ -335,6 +335,15 @@ netretry
Useful on scripts which control the retry operation
themselves.
+phy_aneg_timeout
+ If set, the specified value will override CONFIG_PHY_ANEG_TIMEOUT.
+ This variable has the same base and unit as CONFIG_PHY_ANEG_TIMEOUT
+ which is "decimal" and "millisecond" respectively. 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/Kconfig b/drivers/net/phy/Kconfig
index 8d88c142900..21bf983056a 100644
--- a/drivers/net/phy/Kconfig
+++ b/drivers/net/phy/Kconfig
@@ -23,7 +23,10 @@ config PHY_ANEG_TIMEOUT
int "PHY auto-negotiation timeout"
default 4000
help
- Default PHY auto-negotiation timeout.
+ Value of PHY auto-negotiation timeout with the base being
+ "decimal" and the unit being "millisecond". This can be
+ overridden by the "phy_aneg_timeout" environment variable
+ that has the same base (decimal) and unit (millisecond).
if PHY_ADDR_ENABLE
config PHY_ADDR
diff --git a/drivers/net/phy/aquantia.c b/drivers/net/phy/aquantia.c
index d2db8d9f792..f63a13824ca 100644
--- a/drivers/net/phy/aquantia.c
+++ b/drivers/net/phy/aquantia.c
@@ -7,6 +7,7 @@
*/
#include <config.h>
#include <dm.h>
+#include <env.h>
#include <log.h>
#include <net.h>
#include <phy.h>
@@ -551,14 +552,15 @@ int aquantia_config(struct phy_device *phydev)
int aquantia_startup(struct phy_device *phydev)
{
- u32 speed;
- int i = 0;
+ u32 speed, i = 0;
int reg;
phydev->duplex = DUPLEX_FULL;
/* if the AN is still in progress, wait till timeout. */
if (!aquantia_link_is_up(phydev)) {
+ u32 aneg_timeout = env_get_ulong("phy_aneg_timeout", 10,
+ CONFIG_PHY_ANEG_TIMEOUT);
printf("%s Waiting for PHY auto negotiation to complete",
phydev->dev->name);
do {
@@ -566,9 +568,9 @@ int aquantia_startup(struct phy_device *phydev)
if ((i++ % 500) == 0)
printf(".");
} while (!aquantia_link_is_up(phydev) &&
- i < (4 * CONFIG_PHY_ANEG_TIMEOUT));
+ i < (4 * aneg_timeout));
- if (i > CONFIG_PHY_ANEG_TIMEOUT)
+ if (i > aneg_timeout)
printf(" TIMEOUT !\n");
}
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
index e6fed8c41d7..9702d042296 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>
@@ -242,7 +243,9 @@ int genphy_update_link(struct phy_device *phydev)
if ((phydev->autoneg == AUTONEG_ENABLE) &&
!(mii_reg & BMSR_ANEGCOMPLETE)) {
- int i = 0;
+ u32 i = 0;
+ u32 aneg_timeout = env_get_ulong("phy_aneg_timeout", 10,
+ CONFIG_PHY_ANEG_TIMEOUT);
printf("%s Waiting for PHY auto negotiation to complete",
phydev->dev->name);
@@ -250,7 +253,7 @@ int genphy_update_link(struct phy_device *phydev)
/*
* Timeout reached ?
*/
- if (i > (CONFIG_PHY_ANEG_TIMEOUT / 50)) {
+ if (i > (aneg_timeout / 50)) {
printf(" TIMEOUT !\n");
phydev->link = 0;
return -ETIMEDOUT;
diff --git a/drivers/net/xilinx_axi_emac.c b/drivers/net/xilinx_axi_emac.c
index 4d87e2d1f36..c8038ddef1b 100644
--- a/drivers/net/xilinx_axi_emac.c
+++ b/drivers/net/xilinx_axi_emac.c
@@ -11,6 +11,7 @@
#include <display_options.h>
#include <dm.h>
#include <dm/device_compat.h>
+#include <env.h>
#include <log.h>
#include <net.h>
#include <malloc.h>
@@ -343,6 +344,8 @@ static int axiemac_phy_init(struct udevice *dev)
static int pcs_pma_startup(struct axidma_priv *priv)
{
+ u32 aneg_timeout = env_get_ulong("phy_aneg_timeout", 10,
+ CONFIG_PHY_ANEG_TIMEOUT);
u32 rc, retry_cnt = 0;
u16 mii_reg;
@@ -361,7 +364,7 @@ static int pcs_pma_startup(struct axidma_priv *priv)
* and the external PHY is not obtained.
*/
debug("axiemac: waiting for link status of the PCS/PMA PHY");
- while (retry_cnt * 10 < CONFIG_PHY_ANEG_TIMEOUT) {
+ while (retry_cnt * 10 < aneg_timeout) {
rc = phyread(priv, priv->pcsaddr, MII_BMSR, &mii_reg);
if ((mii_reg & BMSR_LSTATUS) && mii_reg != 0xffff && !rc) {
debug(".Done\n");