[PATCH v3] dm: core: Do not stop uclass iteration on error

Simon Glass sjg at chromium.org
Sun Aug 28 03:52:27 CEST 2022


Hi Michal,

On Fri, 19 Aug 2022 at 14:23, Michal Suchanek <msuchanek at suse.de> wrote:
>
> When probing a device fails NULL pointer is returned, and other devices
> cannot be iterated. Skip to next device on error instead.
>
> Fixes: 6494d708bf ("dm: Add base driver model support")

I think you should drop this as you are doing a change of behaviour,
not fixing a bug!

> Signed-off-by: Michal Suchanek <msuchanek at suse.de>
> ---
> v2: - Fix up tests
> v3: - Fix up API doc
>     - Correctly forward error from uclass_get
>     - Do not return an error when last device fails to probe
>     - Drop redundant initialization
>     - Wrap at 80 columns
> ---
>  drivers/core/uclass.c | 32 ++++++++++++++++++++++++--------
>  include/dm/uclass.h   | 13 ++++++++-----
>  test/dm/test-fdt.c    | 20 ++++++++++++++++----
>  3 files changed, 48 insertions(+), 17 deletions(-)

Unfortunately this still fails one test. Try 'make qcheck' to see it -
it is ethernet.

I actually think you should create new functions for this feature,
e.g.uclass_first_device_ok(), since it makes it impossible to see what
when wrong with a device in the middle.

I have long had all this in my mind. One idea for a future change is
to return the error, but set dev, so that the caller knows there is a
device, which failed. When we are at the end, dev is set to NULL.

Then we could iterate like this:

struct udevice *dev;

for (ret = uclass_first_device(UCLASS_FRED, &dev); dev;
     ret = uclass_next_device(&dev)) {
   if (ret)
      log_warning("%s failed to probe\n", dev->name);
   else
     .... use device
}

Regards,
Simon


More information about the U-Boot mailing list