[U-Boot] [PATCH] dm: core: don't fail to iterate if first one fails to probe

Rob Clark robdclark at gmail.com
Wed Jun 21 10:52:59 UTC 2017


On Wed, Jun 21, 2017 at 6:23 AM, Peter Robinson <pbrobinson at gmail.com> wrote:
> On Tue, Jun 20, 2017 at 10:49 PM, Rob Clark <robdclark at 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 <robdclark at 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 at lists.denx.de
>> https://lists.denx.de/listinfo/u-boot


More information about the U-Boot mailing list