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

Ramon Fried rfried.dev at gmail.com
Mon Jun 14 22:55:01 CEST 2021


On Thu, Apr 29, 2021 at 11:03 PM Ramon Fried <rfried.dev at gmail.com> wrote:
>
> 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>
Applied to u-boot-net/master, thanks!

Best regards,
Ramon Fried


More information about the U-Boot mailing list