diff mbox

[U-Boot,resend,1/2] config_distro_bootcmd.h: Allow user to indicate that usb is inited in preboot

Message ID 1418406612-3243-2-git-send-email-hdegoede@redhat.com
State Superseded
Delegated to: Hans de Goede
Headers show

Commit Message

Hans de Goede Dec. 12, 2014, 5:50 p.m. UTC
When using usb-keyboard support, typically usb will already get started from
preboot. In this case doing it again in the bootcmd is undesirable.

Allow the user of config_distro_bootcmd to indicate that usb is inited in
preboot through the user setting BOOTENV_PREBOOT_INITS_USB.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 include/config_distro_bootcmd.h | 4 ++++
 1 file changed, 4 insertions(+)

Comments

Stephen Warren Dec. 12, 2014, 6:10 p.m. UTC | #1
On 12/12/2014 10:50 AM, Hans de Goede wrote:
> When using usb-keyboard support, typically usb will already get started from
> preboot. In this case doing it again in the bootcmd is undesirable.
>
> Allow the user of config_distro_bootcmd to indicate that usb is inited in
> preboot through the user setting BOOTENV_PREBOOT_INITS_USB.

Sorry, I don't recall seeing this whenever it was posted before.

Conceptually this seems fine. One issue it has is with the following 
sequence:

PREBOOT inits USB, no USB drive found (not plugged in)
User CTRL-Cs boot sequence
User plugs in USB drive
User runs "boot" or "run bootcmd"
-> USB not re-detected, so system doesn't boot from USB.

Perhaps the best way to solve this is to have a flag controlling whether 
BOOTENV_SET_USB_NEED_INIT sets $usb_need_init?

preboot:
setenv usb_do_set_usb_need_init false

BOOTENV_SET_USB_NEED_INIT:
# Normally unset -> true
# In your case, preboot sets this to false
if ${usb_do_set_usb_need_init}; then
     setenv usb_need_init
else
     # Next time $boot is run, this will be unset -> true
     # so we will re-init USB
     setenv usb_do_set_usb_need_init
     # This time through, we skip USB init
     setenv usb_need_init false
endif

Of course, that doesn't solve the problem of the user aborting auto-boot 
before it's ever run once. Perhaps better would be a flag that 
BOOTENV_SET_USB_NEED_INIT can use to distinguish auto-boot and manual 
invocation, i.e.:

preboot:
setenv usb_do_set_usb_need_init false

BOOTENV_SET_USB_NEED_INIT:
# U-Boot C code sets this appropriatelyL
if ${auto_boot}; then
     # Auto case: Init USB unless preboot set a flag
     if ${usb_do_set_usb_need_init}; then
         setenv usb_need_init
     else
         # Next time $boot is run, this will be unset -> true
         # so we will re-init USB
         setenv usb_do_set_usb_need_init
         # This time through, we skip USB init
         setenv usb_need_init false
     endif
else
     # Manual case: Always init USB
     setenv usb_need_init
endif

Or do we just assume that if the user plugs in a new USB device after 
boot, they must manually run USB initialization? If so, we cam simplify 
the existing $usb_need_init a bit...
Hans de Goede Dec. 18, 2014, 9 a.m. UTC | #2
On 12/12/2014 Stephen Warren wrote:

 > On 12-12-14 10:50 AM, Hans de Goede wrote:
> > When using usb-keyboard support, typically usb will already get started from
> > preboot. In this case doing it again in the bootcmd is undesirable.
> >
> > Allow the user of config_distro_bootcmd to indicate that usb is inited in
> > preboot through the user setting BOOTENV_PREBOOT_INITS_USB.
>
>Sorry, I don't recall seeing this whenever it was posted before.
 >
 > Conceptually this seems fine. One issue it has is with the following
 > sequence:
 >
 > PREBOOT inits USB, no USB drive found (not plugged in)
 > User CTRL-Cs boot sequence
 > User plugs in USB drive
 > User runs "boot" or "run bootcmd"
 > -> USB not re-detected, so system doesn't boot from USB.
 >
 > Perhaps the best way to solve this is to have a flag controlling whether
 > BOOTENV_SET_USB_NEED_INIT sets $usb_need_init?
 >
 > preboot:
 > setenv usb_do_set_usb_need_init false
 >
 > BOOTENV_SET_USB_NEED_INIT:
 > # Normally unset -> true
 > # In your case, preboot sets this to false
 > if ${usb_do_set_usb_need_init}; then
 >      setenv usb_need_init
 > else
 >      # Next time $boot is run, this will be unset -> true
 >      # so we will re-init USB
 >      setenv usb_do_set_usb_need_init
 >      # This time through, we skip USB init
 >      setenv usb_need_init false
 > endif
 >
 > Of course, that doesn't solve the problem of the user aborting auto-boot
 > before it's ever run once. Perhaps better would be a flag that
 > BOOTENV_SET_USB_NEED_INIT can use to distinguish auto-boot and manual
 > invocation, i.e.:
 >
 > preboot:
 > setenv usb_do_set_usb_need_init false
 >
 > BOOTENV_SET_USB_NEED_INIT:
 > # U-Boot C code sets this appropriatelyL
 > if ${auto_boot}; then
 >      # Auto case: Init USB unless preboot set a flag
 >      if ${usb_do_set_usb_need_init}; then
 >          setenv usb_need_init
 >      else
 >          # Next time $boot is run, this will be unset -> true
 >          # so we will re-init USB
 >          setenv usb_do_set_usb_need_init
 >          # This time through, we skip USB init
 >          setenv usb_need_init false
 >      endif
 > else
 >      # Manual case: Always init USB
 >      setenv usb_need_init
 > endif
 >
 > Or do we just assume that if the user plugs in a new USB device after
 > boot, they must manually run USB initialization? If so, we cam simplify
 > the existing $usb_need_init a bit...

Looking at all the extra code (and possible bugs / problems that code may
introduce), I think that it makes sense to just expect the user to run
"usb reset" after plugging in a new device.

Regards,

Hans
diff mbox

Patch

diff --git a/include/config_distro_bootcmd.h b/include/config_distro_bootcmd.h
index be616e8..fd01a34 100644
--- a/include/config_distro_bootcmd.h
+++ b/include/config_distro_bootcmd.h
@@ -91,7 +91,11 @@ 
 
 #ifdef CONFIG_CMD_USB
 #define BOOTENV_RUN_USB_INIT "run usb_init; "
+#ifndef BOOTENV_PREBOOT_INITS_USB
 #define BOOTENV_SET_USB_NEED_INIT "setenv usb_need_init; "
+#else
+#define BOOTENV_SET_USB_NEED_INIT "setenv usb_need_init false; "
+#endif
 #define BOOTENV_SHARED_USB \
 	"usb_init=" \
 		"if ${usb_need_init}; then " \