On Wed, Jun 21, 2017 at 6:23 AM, Peter Robinson <pbrobin...@gmail.com> wrote: > On Tue, Jun 20, 2017 at 10:49 PM, Rob Clark <robdcl...@gmail.com> wrote: >> efi_disk_register() would try to iterate all the blk devices. But if >> the first one in the list failed to probe, uclass_first_device() would >> return NULL and no attempt would be made to register the remaining >> devices. Also uclass_next_device() needs the same fix. > > This looks related/similar to the "efi_loader: disk: iterate only over > valid block devices" patch [1] >
hmm, I don't see uclass_first_device_check() which I guess must be part of another in-flight patch? I don't mind too much *how* we fix it, as long as it works. (Although it seems more sensible to just make uclass_first_device()/etc dtrt rather than introducing another function that actually works properly.. but that is only my $0.02) BR, -R > Peter > > [1] https://lists.denx.de/pipermail/u-boot/2017-June/296015.html > > >> Signed-off-by: Rob Clark <robdcl...@gmail.com> >> --- >> drivers/core/uclass.c | 24 +++++++++++++++++++++--- >> 1 file changed, 21 insertions(+), 3 deletions(-) >> >> diff --git a/drivers/core/uclass.c b/drivers/core/uclass.c >> index 21dc696..c47ff56 100644 >> --- a/drivers/core/uclass.c >> +++ b/drivers/core/uclass.c >> @@ -458,14 +458,23 @@ int uclass_get_device_by_phandle(enum uclass_id id, >> struct udevice *parent, >> >> int uclass_first_device(enum uclass_id id, struct udevice **devp) >> { >> - struct udevice *dev; >> + struct udevice *dev = NULL; >> int ret; >> >> *devp = NULL; >> ret = uclass_find_first_device(id, &dev); >> if (!dev) >> return 0; >> - return uclass_get_device_tail(dev, ret, devp); >> + ret = uclass_get_device_tail(dev, ret, devp); >> + if (ret && dev) { >> + /* we have a device, but it failed to probe, move on and >> + * try the next one. >> + */ >> + ret = uclass_next_device(&dev); >> + if (!ret) >> + *devp = dev; >> + } >> + return ret; >> } >> >> int uclass_first_device_err(enum uclass_id id, struct udevice **devp) >> @@ -490,7 +499,16 @@ int uclass_next_device(struct udevice **devp) >> ret = uclass_find_next_device(&dev); >> if (!dev) >> return 0; >> - return uclass_get_device_tail(dev, ret, devp); >> + ret = uclass_get_device_tail(dev, ret, devp); >> + if (ret && (dev != *devp)) { >> + /* we have a device, but it failed to probe, move on and >> + * try the next one. >> + */ >> + ret = uclass_next_device(&dev); >> + if (!ret) >> + *devp = dev; >> + } >> + return ret; >> } >> >> int uclass_bind_device(struct udevice *dev) >> -- >> 2.9.4 >> >> _______________________________________________ >> U-Boot mailing list >> U-Boot@lists.denx.de >> https://lists.denx.de/listinfo/u-boot _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot