summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2023-05-05 20:03:04 -0600
committerTom Rini <trini@konsulko.com>2023-05-13 09:52:32 -0400
commit8c29b73278d66c029b98caecba81831ef6dc472a (patch)
treee6aabd26acd9f7bd57733251c26137a248d57749
parent9fea3a799dde140f2d75eeb4560a5c3237ca991d (diff)
downloadu-boot-8c29b73278d66c029b98caecba81831ef6dc472a.tar.gz
bootstd: usb: Avoid initing USB twice
This causes crashes on some boards, e.g. rockpro64. In any case, we should not do it. Check the usb_started flag to avoid this. Signed-off-by: Simon Glass <sjg@chromium.org> Tested-by: Jonas Karlman <jonas@kwiboo.se> Tested-by: Tom Rini <trini@konsulko.com>
-rw-r--r--drivers/usb/host/usb_bootdev.c3
-rw-r--r--test/boot/bootdev.c5
2 files changed, 8 insertions, 0 deletions
diff --git a/drivers/usb/host/usb_bootdev.c b/drivers/usb/host/usb_bootdev.c
index 32919f9928..06e8f61aa1 100644
--- a/drivers/usb/host/usb_bootdev.c
+++ b/drivers/usb/host/usb_bootdev.c
@@ -22,6 +22,9 @@ static int usb_bootdev_bind(struct udevice *dev)
static int usb_bootdev_hunt(struct bootdev_hunter *info, bool show)
{
+ if (usb_started)
+ return 0;
+
return usb_init();
}
diff --git a/test/boot/bootdev.c b/test/boot/bootdev.c
index 606bf4fcc1..6b29213416 100644
--- a/test/boot/bootdev.c
+++ b/test/boot/bootdev.c
@@ -306,6 +306,7 @@ static int bootdev_test_hunter(struct unit_test_state *uts)
{
struct bootstd_priv *std;
+ usb_started = false;
test_set_skip_delays(true);
/* get access to the used hunters */
@@ -346,6 +347,7 @@ static int bootdev_test_cmd_hunt(struct unit_test_state *uts)
struct bootstd_priv *std;
test_set_skip_delays(true);
+ usb_started = false;
/* get access to the used hunters */
ut_assertok(bootstd_get_priv(&std));
@@ -474,6 +476,7 @@ BOOTSTD_TEST(bootdev_test_bootable, UT_TESTF_DM | UT_TESTF_SCAN_FDT);
/* Check hunting for bootdev of a particular priority */
static int bootdev_test_hunt_prio(struct unit_test_state *uts)
{
+ usb_started = false;
test_set_skip_delays(true);
console_record_reset_enable();
@@ -502,6 +505,8 @@ static int bootdev_test_hunt_label(struct unit_test_state *uts)
struct bootstd_priv *std;
int mflags;
+ usb_started = false;
+
/* get access to the used hunters */
ut_assertok(bootstd_get_priv(&std));