[PATCH] net: use a more deterministic approach to get the active ethernet device

Ramon Fried rfried.dev at gmail.com
Thu Apr 29 22:03:21 CEST 2021


On Wed, Feb 24, 2021 at 6:30 PM Michael Walle <michael at walle.cc> wrote:
>
> 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 at walle.cc>
> ---
>  net/eth-uclass.c | 17 ++++++++++++-----
>  1 file 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;
>  }
>
> --
> 2.20.1
>
Reviewed-by: Ramon Fried <rfried.dev at gmail.com>


More information about the U-Boot mailing list