bootstd: Skip over bad device during bootflows scanning

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>
This commit is contained in:
Tony Dinh 2023-11-02 11:51:15 -07:00 committed by Tom Rini
parent a94a4071d4
commit ee2ce29223
3 changed files with 3 additions and 3 deletions

View file

@ -784,7 +784,7 @@ static int bootdev_hunt_drv(struct bootdev_hunter *info, uint seq, bool show)
if (info->hunt) { if (info->hunt) {
ret = info->hunt(info, show); ret = info->hunt(info, show);
log_debug(" - hunt result %d\n", ret); log_debug(" - hunt result %d\n", ret);
if (ret) if (ret && ret != -ENOENT)
return ret; return ret;
} }
std->hunters_used |= BIT(seq); std->hunters_used |= BIT(seq);

View file

@ -65,7 +65,7 @@ int sata_rescan(bool verbose)
ret = uclass_find_first_device(UCLASS_AHCI, &dev); ret = uclass_find_first_device(UCLASS_AHCI, &dev);
if (ret || !dev) { if (ret || !dev) {
printf("Cannot find SATA device (err=%d)\n", ret); printf("Cannot find SATA device (err=%d)\n", ret);
return -ENOSYS; return -ENOENT;
} }
ret = device_remove(dev, DM_REMOVE_NORMAL); ret = device_remove(dev, DM_REMOVE_NORMAL);

View file

@ -65,7 +65,7 @@ struct bootdev_hunter;
* *
* @info: Info structure describing this hunter * @info: Info structure describing this hunter
* @show: true to show information from the 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); typedef int (*bootdev_hunter_func)(struct bootdev_hunter *info, bool show);