]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
bootstd: Skip over bad device during bootflows scanning
authorTony Dinh <mibodhi@gmail.com>
Thu, 2 Nov 2023 18:51:15 +0000 (11:51 -0700)
committerTom Rini <trini@konsulko.com>
Fri, 10 Nov 2023 16:01:50 +0000 (11:01 -0500)
During bootstd scanning for bootdevs, if bootdev_hunt_drv() encounters
a device not found error (e.g. ENOENT), let it return a successful status
so that bootstd will continue scanning the next devices, not stopping
prematurely.

Background:

During scanning for bootflows, it's possible for bootstd to encounter a
faulty device controller. Also when the same u-boot is used for another
variant of the same board, some device controller such as SATA might
not exist.

I've found this issue while converting the Marvell Sheevaplug board to
use bootstd. This board has 2 variants, the original Sheevaplug has MMC and
USB only, but the later variant comes with USB, MMC, and eSATA ports. We
have been using the same u-boot (starting with CONFIG_IDE and later with DM
CONFIG_SATA) for both variants. This worked well with the old
envs-scripting booting scheme.

Signed-off-by: Tony Dinh <mibodhi@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
boot/bootdev-uclass.c
drivers/ata/sata.c
include/bootdev.h

index 44ae98a9269cc65ff5438b3568e8b14f840c97a6..4926a50da85d0740f39e91949790ca535f123b91 100644 (file)
@@ -784,7 +784,7 @@ static int bootdev_hunt_drv(struct bootdev_hunter *info, uint seq, bool show)
                if (info->hunt) {
                        ret = info->hunt(info, show);
                        log_debug("  - hunt result %d\n", ret);
-                       if (ret)
+                       if (ret && ret != -ENOENT)
                                return ret;
                }
                std->hunters_used |= BIT(seq);
index dcb5fcf476b5323be89bce5fe0a1bf0109811011..64fc078bada002bedbcce43676bb15b4ca42c50f 100644 (file)
@@ -65,7 +65,7 @@ int sata_rescan(bool verbose)
        ret = uclass_find_first_device(UCLASS_AHCI, &dev);
        if (ret || !dev) {
                printf("Cannot find SATA device (err=%d)\n", ret);
-               return -ENOSYS;
+               return -ENOENT;
        }
 
        ret = device_remove(dev, DM_REMOVE_NORMAL);
index b079a91b5b7f337e03211ad4369b8341933e944f..35fa25aff1de1b42b8e23d25556b67bf3f77bb3f 100644 (file)
@@ -65,7 +65,7 @@ struct bootdev_hunter;
  *
  * @info: Info structure describing this hunter
  * @show: true to show information from the hunter
- * Returns: 0 if OK, -ve on error
+ * Returns: 0 if OK, -ENOENT on device not found, otherwise -ve on error
  */
 typedef int (*bootdev_hunter_func)(struct bootdev_hunter *info, bool show);