]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
bootstd: Make bootdev_next_prio() continue after failure
authorSimon Glass <sjg@chromium.org>
Thu, 15 Aug 2024 20:30:22 +0000 (14:30 -0600)
committerTom Rini <trini@konsulko.com>
Tue, 27 Aug 2024 16:09:07 +0000 (10:09 -0600)
When a device fails to probe, the next device should be tried, until
either we find a suitable device or run out of devices. A device
should never be tried twice.

When we run out of devices of a particular priority, the hunter should
be used to generate devices of the next priority. Only if all attempts
fail should this function return an error.

Update the function to use the latent 'found' boolean to determine
whether another loop iteration is warranted, rather than setting 'dev'
to NULL, which creates confusion, suggesting that no devices have been
scanned and the whole process is starting from the beginning.

Note that the upcoming bootflow_efi() test is used to test this
behaviour.

Signed-off-by: Simon Glass <sjg@chromium.org>
Fixes: https://source.denx.de/u-boot/custodians/u-boot-dm/-/issues/17
boot/bootdev-uclass.c

index 15a8a3555c69d3c70961e960fe8498109ba5005c..807f8dfb0649e8f39fc57171597c16ecf25ab0fc 100644 (file)
@@ -640,6 +640,7 @@ int bootdev_next_prio(struct bootflow_iter *iter, struct udevice **devp)
        *devp = NULL;
        log_debug("next prio %d: dev=%p/%s\n", iter->cur_prio, dev,
                  dev ? dev->name : "none");
+       found = false;
        do {
                /*
                 * Don't probe devices here since they may not be of the
@@ -682,13 +683,13 @@ int bootdev_next_prio(struct bootflow_iter *iter, struct udevice **devp)
                        }
                } else {
                        ret = device_probe(dev);
-                       if (ret) {
+                       if (ret)
                                log_debug("Device '%s' failed to probe\n",
                                          dev->name);
-                               dev = NULL;
-                       }
+                       else
+                               found = true;
                }
-       } while (!dev);
+       } while (!found);
 
        *devp = dev;