summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorMichael Walle <michael@walle.cc>2021-02-24 19:30:44 +0300
committerRamon Fried <rfried.dev@gmail.com>2021-06-18 11:29:17 +0300
commit6e424b4acac0dba486a97ecd80a78aa0fea43683 (patch)
tree9afb8167e9fcfab2daefe9ae048cdf0c70fba3b4 /net
parent02036d90ec10510c8218aad463a332a50c3528c4 (diff)
downloadu-boot-6e424b4acac0dba486a97ecd80a78aa0fea43683.tar.xz
net: use a more deterministic approach to get the active ethernet device
If the environment variable "ethact" is not set, the first device in the uclass is returned. This depends on the probing order of the ethernet devices. Moreover it is not not configurable at all. Try to return the ethernet device with sequence id 0 first which then can be configured by the aliases in a device tree. Fall back to the old mechanism in case of an error. Signed-off-by: Michael Walle <michael@walle.cc> Reviewed-by: Ramon Fried <rfried.dev@gmail.com>
Diffstat (limited to 'net')
-rw-r--r--net/eth-uclass.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/net/eth-uclass.c b/net/eth-uclass.c
index 34ca731d1e..0b4260dc5b 100644
--- a/net/eth-uclass.c
+++ b/net/eth-uclass.c
@@ -69,8 +69,11 @@ void eth_set_current_to_next(void)
/*
* Typically this will simply return the active device.
* In the case where the most recent active device was unset, this will attempt
- * to return the first device. If that device doesn't exist or fails to probe,
- * this function will return NULL.
+ * to return the device with sequence id 0 (which can be configured by the
+ * device tree). If this fails, fall back to just getting the first device.
+ * The latter is non-deterministic and depends on the order of the probing.
+ * If that device doesn't exist or fails to probe, this function will return
+ * NULL.
*/
struct udevice *eth_get_dev(void)
{
@@ -80,9 +83,13 @@ struct udevice *eth_get_dev(void)
if (!uc_priv)
return NULL;
- if (!uc_priv->current)
- eth_errno = uclass_first_device(UCLASS_ETH,
- &uc_priv->current);
+ if (!uc_priv->current) {
+ eth_errno = uclass_get_device_by_seq(UCLASS_ETH, 0,
+ &uc_priv->current);
+ if (eth_errno)
+ eth_errno = uclass_first_device(UCLASS_ETH,
+ &uc_priv->current);
+ }
return uc_priv->current;
}