[PATCH v2 4/6] net: eth_bootdev_hunt() should not run DHCP

Simon Glass sjg at chromium.org
Wed Nov 27 15:14:53 CET 2024


Hi Heinrich,

On Wed, 27 Nov 2024 at 07:00, Heinrich Schuchardt
<heinrich.schuchardt at canonical.com> wrote:
>
> On 27.11.24 14:07, Simon Glass wrote:
> > Hi Heinrich,
> >
> > On Wed, 27 Nov 2024 at 00:07, Heinrich Schuchardt
> > <heinrich.schuchardt at canonical.com> wrote:
> >>
> >> Currently when booting dhcp_run() may be executed multiple times:
> >> once in eth_bootdev_hunt() and once in the network booting bootmeth.
> >>
> >> We need to call eth_bootdev_hunt() when setting up the EFI sub-system to
> >> supply the simple network protocol. We don't need an IP address set up.
> >>
> >> We can reduce the bootime by not executing dhcp_run() in
> >> eth_bootdev_hunt().
> >>
> >> Furthermore eth_bootdev_hunt() with autostart=yes leads on the legacy
> >> network statck leads to downloading a file via TFTP and to booting the
> >
> > spelling
> >
> >> downloaded file.
> >
> > I have now found the feature you're referring to - the calls to
> > env_get_autostart(). Perhaps we can remove this feature? It seems
> > pretty old and I don't see boards using it.
> >
> > That feature stops bootstd working properly.
> >
> > But if we don't remove it, we need to disable autostart in dhcp_run(),
> > since in that case it does not behave correctly. I can do a patch for
> > that if needed.
> >
> >>
> >> Instead of running dchp_run() just check that there is a network device
> >> in eth_bootdev_hunt().
> >>
> >> Reviewed-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>
> >> Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt at canonical.com>
> >> ---
> >> v2:
> >>          reword the commit message
> >> ---
> >>   net/eth_bootdev.c | 30 ++++++++++++++++++------------
> >>   1 file changed, 18 insertions(+), 12 deletions(-)
> >>
> >> diff --git a/net/eth_bootdev.c b/net/eth_bootdev.c
> >> index 6ee54e3c790..b0fca6e8313 100644
> >> --- a/net/eth_bootdev.c
> >> +++ b/net/eth_bootdev.c
> >> @@ -64,9 +64,23 @@ static int eth_bootdev_bind(struct udevice *dev)
> >>          return 0;
> >>   }
> >>
> >> +/**
> >> + * eth_bootdev_hunt() - probe all network devices
> >> + *
> >> + * Network devices can also come from USB, but that is a higher
> >> + * priority (BOOTDEVP_5_SCAN_SLOW) than network, so it should have been
> >> + * enumerated already. If something like 'bootflow scan dhcp' is used,
> >> + * then the user will need to run 'usb start' first.
> >> + *
> >> + * @info:      info structure describing this hunter
> >> + * @show:      true to show information from the hunter
> >> + *
> >> + * Return:     0 if device found, -EINVAL otherwise
> >> + */
> >>   static int eth_bootdev_hunt(struct bootdev_hunter *info, bool show)
> >>   {
> >>          int ret;
> >> +       struct udevice *dev = NULL;
> >>
> >>          if (!test_eth_enabled())
> >>                  return 0;
> >> @@ -78,19 +92,11 @@ static int eth_bootdev_hunt(struct bootdev_hunter *info, bool show)
> >>                          log_warning("Failed to init PCI (%dE)\n", ret);
> >>          }
> >>
> >> -       /*
> >> -        * Ethernet devices can also come from USB, but that is a higher
> >> -        * priority (BOOTDEVP_5_SCAN_SLOW) than ethernet, so it should have been
> >> -        * enumerated already. If something like 'bootflow scan dhcp' is used
> >> -        * then the user will need to run 'usb start' first.
> >> -        */
> >
> > Please keep this comment
>
> I have moved the comment to the function description. See above. I think
> that is the adequate place.
>
> >
> >> -       if (IS_ENABLED(CONFIG_CMD_DHCP)) {
> >> -               ret = dhcp_run(0, NULL, false);
> >> -               if (ret)
> >> -                       return -EINVAL;
> >> -       }
> >> +       ret = -EINVAL;
> >> +       uclass_foreach_dev_probe(UCLASS_ETH, dev)
> >> +               ret = 0;
> >
> > There is a uclass_probe_all() function.
> >
> > My suggestion from the original series was to just do the dhcp once.
> >
> > How does probing the ethernet devices actually help EFI? It is not
> > needed for bootstd, since it probes any devices it uses.
>
> bootstd is not the only way to start an EFI application, you could use
> bootefi or bootm.

That's fine, but I'm just trying to understand what probing does, in
this particular case. Doesn't EFI probe a device before it uses it? I
think I am just missing some context.

Regards,
Simon


More information about the U-Boot mailing list