diff mbox series

bootstd: Skip over bad device during bootflows scanning

Message ID 20231030194650.11594-1-mibodhi@gmail.com
State Changes Requested
Delegated to: Simon Glass
Headers show
Series bootstd: Skip over bad device during bootflows scanning | expand

Commit Message

Tony Dinh Oct. 30, 2023, 7:46 p.m. UTC
During scanning for the next bootdev, if bootdev_next_prio() encounters
a device error (e.g. ENOSYS), let it 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>
---

 boot/bootdev-uclass.c | 2 --
 1 file changed, 2 deletions(-)

Comments

Tony Dinh Oct. 31, 2023, 7:26 p.m. UTC | #1
Hi Simon,

On Mon, Oct 30, 2023 at 12:47 PM Tony Dinh <mibodhi@gmail.com> wrote:
>
> During scanning for the next bootdev, if bootdev_next_prio() encounters
> a device error (e.g. ENOSYS), let it 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>
> ---
>
>  boot/bootdev-uclass.c | 2 --
>  1 file changed, 2 deletions(-)
>
> diff --git a/boot/bootdev-uclass.c b/boot/bootdev-uclass.c
> index 44ae98a926..b1d48e5b69 100644
> --- a/boot/bootdev-uclass.c
> +++ b/boot/bootdev-uclass.c
> @@ -677,8 +677,6 @@ int bootdev_next_prio(struct bootflow_iter *iter, struct udevice **devp)
>                                                         BOOTFLOWIF_SHOW);
>                                 log_debug("- bootdev_hunt_prio() ret %d\n",
>                                           ret);
> -                               if (ret)
> -                                       return log_msg_ret("hun", ret);
>                         }
>                 } else {
>                         ret = device_probe(dev);
> --
> 2.39.2
>

Per your request, here is the console trace log when the device error
occurs. Perhaps we could improve bootdev_next_prio() to make the error
status more visible in the console with printf? I've briefly looked at
other device bootdev hunt drivers and did not see enough console
output for this type of error, so it might be better that we have this
output either in bootdev_next_prio() or bootdev_hunt_drv().

<BEGIN LOG>
U-Boot 2024.01-rc1-tld-1-00003-gd697d7b93a-dirty (Oct 26 2023 - 16:17:16 -0700)
Marvell-Sheevaplug

SoC:   Kirkwood 88F6281_A0
DRAM:  512 MiB
Core:  17 devices, 12 uclasses, devicetree: separate
NAND:  512 MiB
MMC:   338-uclass_find_device_by_seq() 0
346-uclass_find_device_by_seq()    - 0 'mvsdio@90000'
349-uclass_find_device_by_seq()    - found
252-  mvebu_mmc_power_up() mvebu_mmc mvsdio@90000: power up
399-mvebu_mmc_initialize() mvebu_mmc mvsdio@90000: mvebu_mmc_initialize
338-uclass_find_device_by_seq() 1
346-uclass_find_device_by_seq()    - 0 'mvsdio@90000'
353-uclass_find_device_by_seq()    - not found
mvsdio@90000: 0
Loading Environment from NAND... 338-uclass_find_device_by_seq() 0
346-uclass_find_device_by_seq()    - 0 'ethernet-controller@72000'
349-uclass_find_device_by_seq()    - found
OK
In:    serial
Out:   serial
Err:   serial
Net:   eth0: ethernet-controller@72000
Hit any key to stop autoboot:  0

=> env def -a
## Resetting to default environment

=> bootflow scan -l
Scanning for bootflows in all bootdevs
Seq  Method       State   Uclass    Part  Name                      Filename
---  -----------  ------  --------  ----  ------------------------
----------------
338-uclass_find_device_by_seq() 0
346-uclass_find_device_by_seq()    - 0 'extlinux'
349-uclass_find_device_by_seq()    - found
338-uclass_find_device_by_seq() 1
346-uclass_find_device_by_seq()    - 0 'extlinux'
346-uclass_find_device_by_seq()    - 1 'script'
349-uclass_find_device_by_seq()    - found
338-uclass_find_device_by_seq() 2
346-uclass_find_device_by_seq()    - 0 'extlinux'
346-uclass_find_device_by_seq()    - 1 'script'
346-uclass_find_device_by_seq()    - 2 'pxe'
349-uclass_find_device_by_seq()    - found
871-   bootdev_hunt_prio() Hunting for priority 1
883-   bootdev_hunt_prio() exit 0
715-  bootdev_setup_iter() - bootdev_hunt_prio() ret 0
83-bootstd_get_bootdev_order() - targets <NULL> 00000000
746-  bootdev_setup_iter() setup labels 00000000
641-   bootdev_next_prio() next prio 0: dev=00000000/none
659-   bootdev_next_prio() - ethernet-controller@72000.boo: 6, want 0
659-   bootdev_next_prio() - mvsdio@90000.bootdev: 2, want 0
668-   bootdev_next_prio() None found at prio 0, moving to 1
871-   bootdev_hunt_prio() Hunting for priority 1
883-   bootdev_hunt_prio() exit 0
678-   bootdev_next_prio() - bootdev_hunt_prio() ret 0
659-   bootdev_next_prio() - ethernet-controller@72000.boo: 6, want 1
659-   bootdev_next_prio() - mvsdio@90000.bootdev: 2, want 1
668-   bootdev_next_prio() None found at prio 1, moving to 2
871-   bootdev_hunt_prio() Hunting for priority 2
Hunting with: mmc
783-    bootdev_hunt_drv() Hunting with: mmc
879-   bootdev_hunt_prio() bootdev_hunt_drv() return 0
883-   bootdev_hunt_prio() exit 0
678-   bootdev_next_prio() - bootdev_hunt_prio() ret 0
659-   bootdev_next_prio() - ethernet-controller@72000.boo: 6, want 2
659-   bootdev_next_prio() - mvsdio@90000.bootdev: 2, want 2
756-  bootdev_setup_iter() Selected bootdev: mvsdio@90000.bootdev
134-bootflow_iter_set_dev() iter: Setting dev to mvsdio@90000.bootdev, flags 0
Scanning bootdev 'mvsdio@90000.bootdev':
573-bootdev_get_bootflow() ->get_bootflow mvsdio@90000.bootdev,0=00000000
337-   mvebu_mmc_set_ios() mvebu_mmc mvsdio@90000: bus[0] clock[0]
321-   mvebu_mmc_set_bus() mvebu_mmc mvsdio@90000: ctrl 0xf809:
push-pull 1bit-width
279-   mvebu_mmc_set_clk() mvebu_mmc mvsdio@90000: clock off
337-   mvebu_mmc_set_ios() mvebu_mmc mvsdio@90000: bus[1] clock[0]
321-   mvebu_mmc_set_bus() mvebu_mmc mvsdio@90000: ctrl 0xf809:
push-pull 1bit-width
279-   mvebu_mmc_set_clk() mvebu_mmc mvsdio@90000: clock off
337-   mvebu_mmc_set_ios() mvebu_mmc mvsdio@90000: bus[1] clock[97703]
321-   mvebu_mmc_set_bus() mvebu_mmc mvsdio@90000: ctrl 0xf809:
push-pull 1bit-width
287-   mvebu_mmc_set_clk() mvebu_mmc mvsdio@90000: clock (97703) div : 1022
85-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: cmdidx [0x0]
resp_type[0x0] cmdarg[0x0]
88-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: cmd 0 (hw state 0x20f8)
233-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: resp[0x0] mvebu_mmc
mvsdio@90000: cmdidx [0x8] resp_type[0x15] cmdarg[0x1aa]
88-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: cmd 8 (hw state 0x20f8)
233-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: resp[0x15]
mvebu_mmc mvsdio@90000: cmdidx [0x37] resp_type[0x15] cmdarg[0x0]
88-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: cmd 55 (hw state 0x20f8)
233-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: resp[0x15]
mvebu_mmc mvsdio@90000: cmdidx [0x0] resp_type[0x0] cmdarg[0x0]
88-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: cmd 0 (hw state 0x20f8)
233-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: resp[0x0] mvebu_mmc
mvsdio@90000: cmdidx [0x1] resp_type[0x1] cmdarg[0x0]
88-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: cmd 1 (hw state 0x20f8)
233-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: resp[0x1] Card did
not respond to voltage select! : -110
333-bootdev_get_sibling_blk() act: returning err=-95
550-default_get_bootflow() sibling_blk ret=-95, blk=(none)
559-default_get_bootflow() blk: returning err=-108
375-      bootflow_check() check: returning err=-108
414- bootflow_scan_first() check - ret=-108
191-           iter_incr() entry: err=-108
248-           iter_incr() inc_dev=1
281-           iter_incr() labels 00000000
641-   bootdev_next_prio() next prio 2: dev=1fb4e800/mvsdio@90000.bootdev
668-   bootdev_next_prio() None found at prio 2, moving to 3
871-   bootdev_hunt_prio() Hunting for priority 3
883-   bootdev_hunt_prio() exit 0
678-   bootdev_next_prio() - bootdev_hunt_prio() ret 0
659-   bootdev_next_prio() - ethernet-controller@72000.boo: 6, want 3
659-   bootdev_next_prio() - mvsdio@90000.bootdev: 2, want 3
668-   bootdev_next_prio() None found at prio 3, moving to 4
871-   bootdev_hunt_prio() Hunting for priority 4

Hunting with: ahci
783-    bootdev_hunt_drv() Hunting with: ahci
Removing devices on SATA bus...
Cannot find SATA device (err=0)
786-    bootdev_hunt_drv()   - hunt result -38
879-   bootdev_hunt_prio() bootdev_hunt_drv() return -38
883-   bootdev_hunt_prio() exit -38
678-   bootdev_next_prio() - bootdev_hunt_prio() ret -38
681-   bootdev_next_prio() hun: returning err=-38
308-           iter_incr() ret=-38, dev=00000000 none
134-bootflow_iter_set_dev() iter: Setting dev to (none), flags 0
No more bootdevs
326-           iter_incr() incr: returning err=-19
434-  bootflow_scan_next() iter_incr: ret=-19
436-  bootflow_scan_next() done: returning err=-19
422- bootflow_scan_first() get: returning err=-19
---  -----------  ------  --------  ----  ------------------------
----------------
(0 bootflows, 0 valid)

<END LOG>

All the best,
Tony
Tony Dinh Oct. 31, 2023, 7:45 p.m. UTC | #2
On Tue, Oct 31, 2023 at 12:26 PM Tony Dinh <mibodhi@gmail.com> wrote:
>
> Hi Simon,
>
> On Mon, Oct 30, 2023 at 12:47 PM Tony Dinh <mibodhi@gmail.com> wrote:
> >
> > During scanning for the next bootdev, if bootdev_next_prio() encounters
> > a device error (e.g. ENOSYS), let it 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>
> > ---
> >
> >  boot/bootdev-uclass.c | 2 --
> >  1 file changed, 2 deletions(-)
> >
> > diff --git a/boot/bootdev-uclass.c b/boot/bootdev-uclass.c
> > index 44ae98a926..b1d48e5b69 100644
> > --- a/boot/bootdev-uclass.c
> > +++ b/boot/bootdev-uclass.c
> > @@ -677,8 +677,6 @@ int bootdev_next_prio(struct bootflow_iter *iter, struct udevice **devp)
> >                                                         BOOTFLOWIF_SHOW);
> >                                 log_debug("- bootdev_hunt_prio() ret %d\n",
> >                                           ret);
> > -                               if (ret)
> > -                                       return log_msg_ret("hun", ret);
> >                         }
> >                 } else {
> >                         ret = device_probe(dev);
> > --
> > 2.39.2
> >
>
> Per your request, here is the console trace log when the device error
> occurs. Perhaps we could improve bootdev_next_prio() to make the error
> status more visible in the console with printf? I've briefly looked at
> other device bootdev hunt drivers and did not see enough console
> output for this type of error, so it might be better that we have this
> output either in bootdev_next_prio() or bootdev_hunt_drv().
>
> <BEGIN LOG>
> U-Boot 2024.01-rc1-tld-1-00003-gd697d7b93a-dirty (Oct 26 2023 - 16:17:16 -0700)
> Marvell-Sheevaplug
>
> SoC:   Kirkwood 88F6281_A0
> DRAM:  512 MiB
> Core:  17 devices, 12 uclasses, devicetree: separate
> NAND:  512 MiB
> MMC:   338-uclass_find_device_by_seq() 0
> 346-uclass_find_device_by_seq()    - 0 'mvsdio@90000'
> 349-uclass_find_device_by_seq()    - found
> 252-  mvebu_mmc_power_up() mvebu_mmc mvsdio@90000: power up
> 399-mvebu_mmc_initialize() mvebu_mmc mvsdio@90000: mvebu_mmc_initialize
> 338-uclass_find_device_by_seq() 1
> 346-uclass_find_device_by_seq()    - 0 'mvsdio@90000'
> 353-uclass_find_device_by_seq()    - not found
> mvsdio@90000: 0
> Loading Environment from NAND... 338-uclass_find_device_by_seq() 0
> 346-uclass_find_device_by_seq()    - 0 'ethernet-controller@72000'
> 349-uclass_find_device_by_seq()    - found
> OK
> In:    serial
> Out:   serial
> Err:   serial
> Net:   eth0: ethernet-controller@72000
> Hit any key to stop autoboot:  0
>
> => env def -a
> ## Resetting to default environment
>
> => bootflow scan -l
> Scanning for bootflows in all bootdevs
> Seq  Method       State   Uclass    Part  Name                      Filename
> ---  -----------  ------  --------  ----  ------------------------
> ----------------
> 338-uclass_find_device_by_seq() 0
> 346-uclass_find_device_by_seq()    - 0 'extlinux'
> 349-uclass_find_device_by_seq()    - found
> 338-uclass_find_device_by_seq() 1
> 346-uclass_find_device_by_seq()    - 0 'extlinux'
> 346-uclass_find_device_by_seq()    - 1 'script'
> 349-uclass_find_device_by_seq()    - found
> 338-uclass_find_device_by_seq() 2
> 346-uclass_find_device_by_seq()    - 0 'extlinux'
> 346-uclass_find_device_by_seq()    - 1 'script'
> 346-uclass_find_device_by_seq()    - 2 'pxe'
> 349-uclass_find_device_by_seq()    - found
> 871-   bootdev_hunt_prio() Hunting for priority 1
> 883-   bootdev_hunt_prio() exit 0
> 715-  bootdev_setup_iter() - bootdev_hunt_prio() ret 0
> 83-bootstd_get_bootdev_order() - targets <NULL> 00000000
> 746-  bootdev_setup_iter() setup labels 00000000
> 641-   bootdev_next_prio() next prio 0: dev=00000000/none
> 659-   bootdev_next_prio() - ethernet-controller@72000.boo: 6, want 0
> 659-   bootdev_next_prio() - mvsdio@90000.bootdev: 2, want 0
> 668-   bootdev_next_prio() None found at prio 0, moving to 1
> 871-   bootdev_hunt_prio() Hunting for priority 1
> 883-   bootdev_hunt_prio() exit 0
> 678-   bootdev_next_prio() - bootdev_hunt_prio() ret 0
> 659-   bootdev_next_prio() - ethernet-controller@72000.boo: 6, want 1
> 659-   bootdev_next_prio() - mvsdio@90000.bootdev: 2, want 1
> 668-   bootdev_next_prio() None found at prio 1, moving to 2
> 871-   bootdev_hunt_prio() Hunting for priority 2
> Hunting with: mmc
> 783-    bootdev_hunt_drv() Hunting with: mmc
> 879-   bootdev_hunt_prio() bootdev_hunt_drv() return 0
> 883-   bootdev_hunt_prio() exit 0
> 678-   bootdev_next_prio() - bootdev_hunt_prio() ret 0
> 659-   bootdev_next_prio() - ethernet-controller@72000.boo: 6, want 2
> 659-   bootdev_next_prio() - mvsdio@90000.bootdev: 2, want 2
> 756-  bootdev_setup_iter() Selected bootdev: mvsdio@90000.bootdev
> 134-bootflow_iter_set_dev() iter: Setting dev to mvsdio@90000.bootdev, flags 0
> Scanning bootdev 'mvsdio@90000.bootdev':
> 573-bootdev_get_bootflow() ->get_bootflow mvsdio@90000.bootdev,0=00000000
> 337-   mvebu_mmc_set_ios() mvebu_mmc mvsdio@90000: bus[0] clock[0]
> 321-   mvebu_mmc_set_bus() mvebu_mmc mvsdio@90000: ctrl 0xf809:
> push-pull 1bit-width
> 279-   mvebu_mmc_set_clk() mvebu_mmc mvsdio@90000: clock off
> 337-   mvebu_mmc_set_ios() mvebu_mmc mvsdio@90000: bus[1] clock[0]
> 321-   mvebu_mmc_set_bus() mvebu_mmc mvsdio@90000: ctrl 0xf809:
> push-pull 1bit-width
> 279-   mvebu_mmc_set_clk() mvebu_mmc mvsdio@90000: clock off
> 337-   mvebu_mmc_set_ios() mvebu_mmc mvsdio@90000: bus[1] clock[97703]
> 321-   mvebu_mmc_set_bus() mvebu_mmc mvsdio@90000: ctrl 0xf809:
> push-pull 1bit-width
> 287-   mvebu_mmc_set_clk() mvebu_mmc mvsdio@90000: clock (97703) div : 1022
> 85-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: cmdidx [0x0]
> resp_type[0x0] cmdarg[0x0]
> 88-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: cmd 0 (hw state 0x20f8)
> 233-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: resp[0x0] mvebu_mmc
> mvsdio@90000: cmdidx [0x8] resp_type[0x15] cmdarg[0x1aa]
> 88-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: cmd 8 (hw state 0x20f8)
> 233-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: resp[0x15]
> mvebu_mmc mvsdio@90000: cmdidx [0x37] resp_type[0x15] cmdarg[0x0]
> 88-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: cmd 55 (hw state 0x20f8)
> 233-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: resp[0x15]
> mvebu_mmc mvsdio@90000: cmdidx [0x0] resp_type[0x0] cmdarg[0x0]
> 88-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: cmd 0 (hw state 0x20f8)
> 233-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: resp[0x0] mvebu_mmc
> mvsdio@90000: cmdidx [0x1] resp_type[0x1] cmdarg[0x0]
> 88-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: cmd 1 (hw state 0x20f8)
> 233-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: resp[0x1] Card did
> not respond to voltage select! : -110
> 333-bootdev_get_sibling_blk() act: returning err=-95
> 550-default_get_bootflow() sibling_blk ret=-95, blk=(none)
> 559-default_get_bootflow() blk: returning err=-108
> 375-      bootflow_check() check: returning err=-108
> 414- bootflow_scan_first() check - ret=-108
> 191-           iter_incr() entry: err=-108
> 248-           iter_incr() inc_dev=1
> 281-           iter_incr() labels 00000000
> 641-   bootdev_next_prio() next prio 2: dev=1fb4e800/mvsdio@90000.bootdev
> 668-   bootdev_next_prio() None found at prio 2, moving to 3
> 871-   bootdev_hunt_prio() Hunting for priority 3
> 883-   bootdev_hunt_prio() exit 0
> 678-   bootdev_next_prio() - bootdev_hunt_prio() ret 0
> 659-   bootdev_next_prio() - ethernet-controller@72000.boo: 6, want 3
> 659-   bootdev_next_prio() - mvsdio@90000.bootdev: 2, want 3
> 668-   bootdev_next_prio() None found at prio 3, moving to 4
> 871-   bootdev_hunt_prio() Hunting for priority 4
>
> Hunting with: ahci
> 783-    bootdev_hunt_drv() Hunting with: ahci
> Removing devices on SATA bus...
> Cannot find SATA device (err=0)
> 786-    bootdev_hunt_drv()   - hunt result -38
> 879-   bootdev_hunt_prio() bootdev_hunt_drv() return -38
> 883-   bootdev_hunt_prio() exit -38
> 678-   bootdev_next_prio() - bootdev_hunt_prio() ret -38
> 681-   bootdev_next_prio() hun: returning err=-38
> 308-           iter_incr() ret=-38, dev=00000000 none
> 134-bootflow_iter_set_dev() iter: Setting dev to (none), flags 0
> No more bootdevs
> 326-           iter_incr() incr: returning err=-19
> 434-  bootflow_scan_next() iter_incr: ret=-19
> 436-  bootflow_scan_next() done: returning err=-19
> 422- bootflow_scan_first() get: returning err=-19
> ---  -----------  ------  --------  ----  ------------------------
> ----------------
> (0 bootflows, 0 valid)
>
> <END LOG>

A bit more information:  drivers/ata/sata.c outputs these lines:

Removing devices on SATA bus...
Cannot find SATA device (err=0)

All the best,
Tony
Simon Glass Nov. 1, 2023, 4:10 p.m. UTC | #3
Hi Tony,

On Tue, 31 Oct 2023 at 13:45, Tony Dinh <mibodhi@gmail.com> wrote:
>
> On Tue, Oct 31, 2023 at 12:26 PM Tony Dinh <mibodhi@gmail.com> wrote:
> >
> > Hi Simon,
> >
> > On Mon, Oct 30, 2023 at 12:47 PM Tony Dinh <mibodhi@gmail.com> wrote:
> > >
> > > During scanning for the next bootdev, if bootdev_next_prio() encounters
> > > a device error (e.g. ENOSYS), let it 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>
> > > ---
> > >
> > >  boot/bootdev-uclass.c | 2 --
> > >  1 file changed, 2 deletions(-)
> > >
> > > diff --git a/boot/bootdev-uclass.c b/boot/bootdev-uclass.c
> > > index 44ae98a926..b1d48e5b69 100644
> > > --- a/boot/bootdev-uclass.c
> > > +++ b/boot/bootdev-uclass.c
> > > @@ -677,8 +677,6 @@ int bootdev_next_prio(struct bootflow_iter *iter, struct udevice **devp)
> > >                                                         BOOTFLOWIF_SHOW);
> > >                                 log_debug("- bootdev_hunt_prio() ret %d\n",
> > >                                           ret);
> > > -                               if (ret)
> > > -                                       return log_msg_ret("hun", ret);
> > >                         }
> > >                 } else {
> > >                         ret = device_probe(dev);
> > > --
> > > 2.39.2
> > >
> >
> > Per your request, here is the console trace log when the device error
> > occurs. Perhaps we could improve bootdev_next_prio() to make the error
> > status more visible in the console with printf? I've briefly looked at
> > other device bootdev hunt drivers and did not see enough console
> > output for this type of error, so it might be better that we have this
> > output either in bootdev_next_prio() or bootdev_hunt_drv().
> >
> > <BEGIN LOG>
> > U-Boot 2024.01-rc1-tld-1-00003-gd697d7b93a-dirty (Oct 26 2023 - 16:17:16 -0700)
> > Marvell-Sheevaplug
> >
> > SoC:   Kirkwood 88F6281_A0
> > DRAM:  512 MiB
> > Core:  17 devices, 12 uclasses, devicetree: separate
> > NAND:  512 MiB
> > MMC:   338-uclass_find_device_by_seq() 0
> > 346-uclass_find_device_by_seq()    - 0 'mvsdio@90000'
> > 349-uclass_find_device_by_seq()    - found
> > 252-  mvebu_mmc_power_up() mvebu_mmc mvsdio@90000: power up
> > 399-mvebu_mmc_initialize() mvebu_mmc mvsdio@90000: mvebu_mmc_initialize
> > 338-uclass_find_device_by_seq() 1
> > 346-uclass_find_device_by_seq()    - 0 'mvsdio@90000'
> > 353-uclass_find_device_by_seq()    - not found
> > mvsdio@90000: 0
> > Loading Environment from NAND... 338-uclass_find_device_by_seq() 0
> > 346-uclass_find_device_by_seq()    - 0 'ethernet-controller@72000'
> > 349-uclass_find_device_by_seq()    - found
> > OK
> > In:    serial
> > Out:   serial
> > Err:   serial
> > Net:   eth0: ethernet-controller@72000
> > Hit any key to stop autoboot:  0
> >
> > => env def -a
> > ## Resetting to default environment
> >
> > => bootflow scan -l
> > Scanning for bootflows in all bootdevs
> > Seq  Method       State   Uclass    Part  Name                      Filename
> > ---  -----------  ------  --------  ----  ------------------------
> > ----------------
> > 338-uclass_find_device_by_seq() 0
> > 346-uclass_find_device_by_seq()    - 0 'extlinux'
> > 349-uclass_find_device_by_seq()    - found
> > 338-uclass_find_device_by_seq() 1
> > 346-uclass_find_device_by_seq()    - 0 'extlinux'
> > 346-uclass_find_device_by_seq()    - 1 'script'
> > 349-uclass_find_device_by_seq()    - found
> > 338-uclass_find_device_by_seq() 2
> > 346-uclass_find_device_by_seq()    - 0 'extlinux'
> > 346-uclass_find_device_by_seq()    - 1 'script'
> > 346-uclass_find_device_by_seq()    - 2 'pxe'
> > 349-uclass_find_device_by_seq()    - found
> > 871-   bootdev_hunt_prio() Hunting for priority 1
> > 883-   bootdev_hunt_prio() exit 0
> > 715-  bootdev_setup_iter() - bootdev_hunt_prio() ret 0
> > 83-bootstd_get_bootdev_order() - targets <NULL> 00000000
> > 746-  bootdev_setup_iter() setup labels 00000000
> > 641-   bootdev_next_prio() next prio 0: dev=00000000/none
> > 659-   bootdev_next_prio() - ethernet-controller@72000.boo: 6, want 0
> > 659-   bootdev_next_prio() - mvsdio@90000.bootdev: 2, want 0
> > 668-   bootdev_next_prio() None found at prio 0, moving to 1
> > 871-   bootdev_hunt_prio() Hunting for priority 1
> > 883-   bootdev_hunt_prio() exit 0
> > 678-   bootdev_next_prio() - bootdev_hunt_prio() ret 0
> > 659-   bootdev_next_prio() - ethernet-controller@72000.boo: 6, want 1
> > 659-   bootdev_next_prio() - mvsdio@90000.bootdev: 2, want 1
> > 668-   bootdev_next_prio() None found at prio 1, moving to 2
> > 871-   bootdev_hunt_prio() Hunting for priority 2
> > Hunting with: mmc
> > 783-    bootdev_hunt_drv() Hunting with: mmc
> > 879-   bootdev_hunt_prio() bootdev_hunt_drv() return 0
> > 883-   bootdev_hunt_prio() exit 0
> > 678-   bootdev_next_prio() - bootdev_hunt_prio() ret 0
> > 659-   bootdev_next_prio() - ethernet-controller@72000.boo: 6, want 2
> > 659-   bootdev_next_prio() - mvsdio@90000.bootdev: 2, want 2
> > 756-  bootdev_setup_iter() Selected bootdev: mvsdio@90000.bootdev
> > 134-bootflow_iter_set_dev() iter: Setting dev to mvsdio@90000.bootdev, flags 0
> > Scanning bootdev 'mvsdio@90000.bootdev':
> > 573-bootdev_get_bootflow() ->get_bootflow mvsdio@90000.bootdev,0=00000000
> > 337-   mvebu_mmc_set_ios() mvebu_mmc mvsdio@90000: bus[0] clock[0]
> > 321-   mvebu_mmc_set_bus() mvebu_mmc mvsdio@90000: ctrl 0xf809:
> > push-pull 1bit-width
> > 279-   mvebu_mmc_set_clk() mvebu_mmc mvsdio@90000: clock off
> > 337-   mvebu_mmc_set_ios() mvebu_mmc mvsdio@90000: bus[1] clock[0]
> > 321-   mvebu_mmc_set_bus() mvebu_mmc mvsdio@90000: ctrl 0xf809:
> > push-pull 1bit-width
> > 279-   mvebu_mmc_set_clk() mvebu_mmc mvsdio@90000: clock off
> > 337-   mvebu_mmc_set_ios() mvebu_mmc mvsdio@90000: bus[1] clock[97703]
> > 321-   mvebu_mmc_set_bus() mvebu_mmc mvsdio@90000: ctrl 0xf809:
> > push-pull 1bit-width
> > 287-   mvebu_mmc_set_clk() mvebu_mmc mvsdio@90000: clock (97703) div : 1022
> > 85-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: cmdidx [0x0]
> > resp_type[0x0] cmdarg[0x0]
> > 88-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: cmd 0 (hw state 0x20f8)
> > 233-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: resp[0x0] mvebu_mmc
> > mvsdio@90000: cmdidx [0x8] resp_type[0x15] cmdarg[0x1aa]
> > 88-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: cmd 8 (hw state 0x20f8)
> > 233-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: resp[0x15]
> > mvebu_mmc mvsdio@90000: cmdidx [0x37] resp_type[0x15] cmdarg[0x0]
> > 88-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: cmd 55 (hw state 0x20f8)
> > 233-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: resp[0x15]
> > mvebu_mmc mvsdio@90000: cmdidx [0x0] resp_type[0x0] cmdarg[0x0]
> > 88-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: cmd 0 (hw state 0x20f8)
> > 233-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: resp[0x0] mvebu_mmc
> > mvsdio@90000: cmdidx [0x1] resp_type[0x1] cmdarg[0x0]
> > 88-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: cmd 1 (hw state 0x20f8)
> > 233-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: resp[0x1] Card did
> > not respond to voltage select! : -110
> > 333-bootdev_get_sibling_blk() act: returning err=-95
> > 550-default_get_bootflow() sibling_blk ret=-95, blk=(none)
> > 559-default_get_bootflow() blk: returning err=-108
> > 375-      bootflow_check() check: returning err=-108
> > 414- bootflow_scan_first() check - ret=-108
> > 191-           iter_incr() entry: err=-108
> > 248-           iter_incr() inc_dev=1
> > 281-           iter_incr() labels 00000000
> > 641-   bootdev_next_prio() next prio 2: dev=1fb4e800/mvsdio@90000.bootdev
> > 668-   bootdev_next_prio() None found at prio 2, moving to 3
> > 871-   bootdev_hunt_prio() Hunting for priority 3
> > 883-   bootdev_hunt_prio() exit 0
> > 678-   bootdev_next_prio() - bootdev_hunt_prio() ret 0
> > 659-   bootdev_next_prio() - ethernet-controller@72000.boo: 6, want 3
> > 659-   bootdev_next_prio() - mvsdio@90000.bootdev: 2, want 3
> > 668-   bootdev_next_prio() None found at prio 3, moving to 4
> > 871-   bootdev_hunt_prio() Hunting for priority 4
> >
> > Hunting with: ahci
> > 783-    bootdev_hunt_drv() Hunting with: ahci
> > Removing devices on SATA bus...
> > Cannot find SATA device (err=0)
> > 786-    bootdev_hunt_drv()   - hunt result -38
> > 879-   bootdev_hunt_prio() bootdev_hunt_drv() return -38
> > 883-   bootdev_hunt_prio() exit -38
> > 678-   bootdev_next_prio() - bootdev_hunt_prio() ret -38
> > 681-   bootdev_next_prio() hun: returning err=-38
> > 308-           iter_incr() ret=-38, dev=00000000 none
> > 134-bootflow_iter_set_dev() iter: Setting dev to (none), flags 0
> > No more bootdevs
> > 326-           iter_incr() incr: returning err=-19
> > 434-  bootflow_scan_next() iter_incr: ret=-19
> > 436-  bootflow_scan_next() done: returning err=-19
> > 422- bootflow_scan_first() get: returning err=-19
> > ---  -----------  ------  --------  ----  ------------------------
> > ----------------
> > (0 bootflows, 0 valid)
> >
> > <END LOG>
>
> A bit more information:  drivers/ata/sata.c outputs these lines:
>
> Removing devices on SATA bus...
> Cannot find SATA device (err=0)

Thanks for the trace!

I believe the problem is that sata_rescan() returns -ENOSYS. That
error means that there is a device but it does not implement the
uclass method requested. In this case -ENOENT would be a better error,
since there is nothing there.

Then in bootdev_hunt_drv(), check for -ENOENT from the info->hunt()
call and ignore it.

You should also update bootdev_hunter_func() docs to indicate what
-ENOENT means.

Regards,
Simon
Tony Dinh Nov. 1, 2023, 7:03 p.m. UTC | #4
Hi Simon,

On Wed, Nov 1, 2023 at 9:10 AM Simon Glass <sjg@chromium.org> wrote:
>
> Hi Tony,
>
> On Tue, 31 Oct 2023 at 13:45, Tony Dinh <mibodhi@gmail.com> wrote:
> >
> > On Tue, Oct 31, 2023 at 12:26 PM Tony Dinh <mibodhi@gmail.com> wrote:
> > >
> > > Hi Simon,
> > >
> > > On Mon, Oct 30, 2023 at 12:47 PM Tony Dinh <mibodhi@gmail.com> wrote:
> > > >
> > > > During scanning for the next bootdev, if bootdev_next_prio() encounters
> > > > a device error (e.g. ENOSYS), let it 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>
> > > > ---
> > > >
> > > >  boot/bootdev-uclass.c | 2 --
> > > >  1 file changed, 2 deletions(-)
> > > >
> > > > diff --git a/boot/bootdev-uclass.c b/boot/bootdev-uclass.c
> > > > index 44ae98a926..b1d48e5b69 100644
> > > > --- a/boot/bootdev-uclass.c
> > > > +++ b/boot/bootdev-uclass.c
> > > > @@ -677,8 +677,6 @@ int bootdev_next_prio(struct bootflow_iter *iter, struct udevice **devp)
> > > >                                                         BOOTFLOWIF_SHOW);
> > > >                                 log_debug("- bootdev_hunt_prio() ret %d\n",
> > > >                                           ret);
> > > > -                               if (ret)
> > > > -                                       return log_msg_ret("hun", ret);
> > > >                         }
> > > >                 } else {
> > > >                         ret = device_probe(dev);
> > > > --
> > > > 2.39.2
> > > >
> > >
> > > Per your request, here is the console trace log when the device error
> > > occurs. Perhaps we could improve bootdev_next_prio() to make the error
> > > status more visible in the console with printf? I've briefly looked at
> > > other device bootdev hunt drivers and did not see enough console
> > > output for this type of error, so it might be better that we have this
> > > output either in bootdev_next_prio() or bootdev_hunt_drv().
> > >
> > > <BEGIN LOG>
> > > U-Boot 2024.01-rc1-tld-1-00003-gd697d7b93a-dirty (Oct 26 2023 - 16:17:16 -0700)
> > > Marvell-Sheevaplug
> > >
> > > SoC:   Kirkwood 88F6281_A0
> > > DRAM:  512 MiB
> > > Core:  17 devices, 12 uclasses, devicetree: separate
> > > NAND:  512 MiB
> > > MMC:   338-uclass_find_device_by_seq() 0
> > > 346-uclass_find_device_by_seq()    - 0 'mvsdio@90000'
> > > 349-uclass_find_device_by_seq()    - found
> > > 252-  mvebu_mmc_power_up() mvebu_mmc mvsdio@90000: power up
> > > 399-mvebu_mmc_initialize() mvebu_mmc mvsdio@90000: mvebu_mmc_initialize
> > > 338-uclass_find_device_by_seq() 1
> > > 346-uclass_find_device_by_seq()    - 0 'mvsdio@90000'
> > > 353-uclass_find_device_by_seq()    - not found
> > > mvsdio@90000: 0
> > > Loading Environment from NAND... 338-uclass_find_device_by_seq() 0
> > > 346-uclass_find_device_by_seq()    - 0 'ethernet-controller@72000'
> > > 349-uclass_find_device_by_seq()    - found
> > > OK
> > > In:    serial
> > > Out:   serial
> > > Err:   serial
> > > Net:   eth0: ethernet-controller@72000
> > > Hit any key to stop autoboot:  0
> > >
> > > => env def -a
> > > ## Resetting to default environment
> > >
> > > => bootflow scan -l
> > > Scanning for bootflows in all bootdevs
> > > Seq  Method       State   Uclass    Part  Name                      Filename
> > > ---  -----------  ------  --------  ----  ------------------------
> > > ----------------
> > > 338-uclass_find_device_by_seq() 0
> > > 346-uclass_find_device_by_seq()    - 0 'extlinux'
> > > 349-uclass_find_device_by_seq()    - found
> > > 338-uclass_find_device_by_seq() 1
> > > 346-uclass_find_device_by_seq()    - 0 'extlinux'
> > > 346-uclass_find_device_by_seq()    - 1 'script'
> > > 349-uclass_find_device_by_seq()    - found
> > > 338-uclass_find_device_by_seq() 2
> > > 346-uclass_find_device_by_seq()    - 0 'extlinux'
> > > 346-uclass_find_device_by_seq()    - 1 'script'
> > > 346-uclass_find_device_by_seq()    - 2 'pxe'
> > > 349-uclass_find_device_by_seq()    - found
> > > 871-   bootdev_hunt_prio() Hunting for priority 1
> > > 883-   bootdev_hunt_prio() exit 0
> > > 715-  bootdev_setup_iter() - bootdev_hunt_prio() ret 0
> > > 83-bootstd_get_bootdev_order() - targets <NULL> 00000000
> > > 746-  bootdev_setup_iter() setup labels 00000000
> > > 641-   bootdev_next_prio() next prio 0: dev=00000000/none
> > > 659-   bootdev_next_prio() - ethernet-controller@72000.boo: 6, want 0
> > > 659-   bootdev_next_prio() - mvsdio@90000.bootdev: 2, want 0
> > > 668-   bootdev_next_prio() None found at prio 0, moving to 1
> > > 871-   bootdev_hunt_prio() Hunting for priority 1
> > > 883-   bootdev_hunt_prio() exit 0
> > > 678-   bootdev_next_prio() - bootdev_hunt_prio() ret 0
> > > 659-   bootdev_next_prio() - ethernet-controller@72000.boo: 6, want 1
> > > 659-   bootdev_next_prio() - mvsdio@90000.bootdev: 2, want 1
> > > 668-   bootdev_next_prio() None found at prio 1, moving to 2
> > > 871-   bootdev_hunt_prio() Hunting for priority 2
> > > Hunting with: mmc
> > > 783-    bootdev_hunt_drv() Hunting with: mmc
> > > 879-   bootdev_hunt_prio() bootdev_hunt_drv() return 0
> > > 883-   bootdev_hunt_prio() exit 0
> > > 678-   bootdev_next_prio() - bootdev_hunt_prio() ret 0
> > > 659-   bootdev_next_prio() - ethernet-controller@72000.boo: 6, want 2
> > > 659-   bootdev_next_prio() - mvsdio@90000.bootdev: 2, want 2
> > > 756-  bootdev_setup_iter() Selected bootdev: mvsdio@90000.bootdev
> > > 134-bootflow_iter_set_dev() iter: Setting dev to mvsdio@90000.bootdev, flags 0
> > > Scanning bootdev 'mvsdio@90000.bootdev':
> > > 573-bootdev_get_bootflow() ->get_bootflow mvsdio@90000.bootdev,0=00000000
> > > 337-   mvebu_mmc_set_ios() mvebu_mmc mvsdio@90000: bus[0] clock[0]
> > > 321-   mvebu_mmc_set_bus() mvebu_mmc mvsdio@90000: ctrl 0xf809:
> > > push-pull 1bit-width
> > > 279-   mvebu_mmc_set_clk() mvebu_mmc mvsdio@90000: clock off
> > > 337-   mvebu_mmc_set_ios() mvebu_mmc mvsdio@90000: bus[1] clock[0]
> > > 321-   mvebu_mmc_set_bus() mvebu_mmc mvsdio@90000: ctrl 0xf809:
> > > push-pull 1bit-width
> > > 279-   mvebu_mmc_set_clk() mvebu_mmc mvsdio@90000: clock off
> > > 337-   mvebu_mmc_set_ios() mvebu_mmc mvsdio@90000: bus[1] clock[97703]
> > > 321-   mvebu_mmc_set_bus() mvebu_mmc mvsdio@90000: ctrl 0xf809:
> > > push-pull 1bit-width
> > > 287-   mvebu_mmc_set_clk() mvebu_mmc mvsdio@90000: clock (97703) div : 1022
> > > 85-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: cmdidx [0x0]
> > > resp_type[0x0] cmdarg[0x0]
> > > 88-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: cmd 0 (hw state 0x20f8)
> > > 233-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: resp[0x0] mvebu_mmc
> > > mvsdio@90000: cmdidx [0x8] resp_type[0x15] cmdarg[0x1aa]
> > > 88-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: cmd 8 (hw state 0x20f8)
> > > 233-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: resp[0x15]
> > > mvebu_mmc mvsdio@90000: cmdidx [0x37] resp_type[0x15] cmdarg[0x0]
> > > 88-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: cmd 55 (hw state 0x20f8)
> > > 233-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: resp[0x15]
> > > mvebu_mmc mvsdio@90000: cmdidx [0x0] resp_type[0x0] cmdarg[0x0]
> > > 88-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: cmd 0 (hw state 0x20f8)
> > > 233-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: resp[0x0] mvebu_mmc
> > > mvsdio@90000: cmdidx [0x1] resp_type[0x1] cmdarg[0x0]
> > > 88-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: cmd 1 (hw state 0x20f8)
> > > 233-  mvebu_mmc_send_cmd() mvebu_mmc mvsdio@90000: resp[0x1] Card did
> > > not respond to voltage select! : -110
> > > 333-bootdev_get_sibling_blk() act: returning err=-95
> > > 550-default_get_bootflow() sibling_blk ret=-95, blk=(none)
> > > 559-default_get_bootflow() blk: returning err=-108
> > > 375-      bootflow_check() check: returning err=-108
> > > 414- bootflow_scan_first() check - ret=-108
> > > 191-           iter_incr() entry: err=-108
> > > 248-           iter_incr() inc_dev=1
> > > 281-           iter_incr() labels 00000000
> > > 641-   bootdev_next_prio() next prio 2: dev=1fb4e800/mvsdio@90000.bootdev
> > > 668-   bootdev_next_prio() None found at prio 2, moving to 3
> > > 871-   bootdev_hunt_prio() Hunting for priority 3
> > > 883-   bootdev_hunt_prio() exit 0
> > > 678-   bootdev_next_prio() - bootdev_hunt_prio() ret 0
> > > 659-   bootdev_next_prio() - ethernet-controller@72000.boo: 6, want 3
> > > 659-   bootdev_next_prio() - mvsdio@90000.bootdev: 2, want 3
> > > 668-   bootdev_next_prio() None found at prio 3, moving to 4
> > > 871-   bootdev_hunt_prio() Hunting for priority 4
> > >
> > > Hunting with: ahci
> > > 783-    bootdev_hunt_drv() Hunting with: ahci
> > > Removing devices on SATA bus...
> > > Cannot find SATA device (err=0)
> > > 786-    bootdev_hunt_drv()   - hunt result -38
> > > 879-   bootdev_hunt_prio() bootdev_hunt_drv() return -38
> > > 883-   bootdev_hunt_prio() exit -38
> > > 678-   bootdev_next_prio() - bootdev_hunt_prio() ret -38
> > > 681-   bootdev_next_prio() hun: returning err=-38
> > > 308-           iter_incr() ret=-38, dev=00000000 none
> > > 134-bootflow_iter_set_dev() iter: Setting dev to (none), flags 0
> > > No more bootdevs
> > > 326-           iter_incr() incr: returning err=-19
> > > 434-  bootflow_scan_next() iter_incr: ret=-19
> > > 436-  bootflow_scan_next() done: returning err=-19
> > > 422- bootflow_scan_first() get: returning err=-19
> > > ---  -----------  ------  --------  ----  ------------------------
> > > ----------------
> > > (0 bootflows, 0 valid)
> > >
> > > <END LOG>
> >
> > A bit more information:  drivers/ata/sata.c outputs these lines:
> >
> > Removing devices on SATA bus...
> > Cannot find SATA device (err=0)
>
> Thanks for the trace!
>
> I believe the problem is that sata_rescan() returns -ENOSYS. That
> error means that there is a device but it does not implement the
> uclass method requested. In this case -ENOENT would be a better error,
> since there is nothing there.
>
> Then in bootdev_hunt_drv(), check for -ENOENT from the info->hunt()
> call and ignore it.
>
> You should also update bootdev_hunter_func() docs to indicate what
> -ENOENT means.

Sounds good! I'll send a V2 patch.

All the best,
Tony

>
> Regards,
> Simon
diff mbox series

Patch

diff --git a/boot/bootdev-uclass.c b/boot/bootdev-uclass.c
index 44ae98a926..b1d48e5b69 100644
--- a/boot/bootdev-uclass.c
+++ b/boot/bootdev-uclass.c
@@ -677,8 +677,6 @@  int bootdev_next_prio(struct bootflow_iter *iter, struct udevice **devp)
 							BOOTFLOWIF_SHOW);
 				log_debug("- bootdev_hunt_prio() ret %d\n",
 					  ret);
-				if (ret)
-					return log_msg_ret("hun", ret);
 			}
 		} else {
 			ret = device_probe(dev);