]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
bootstd: Keep track of use of usb stop
authorSimon Glass <sjg@chromium.org>
Wed, 20 Sep 2023 13:29:49 +0000 (07:29 -0600)
committerBin Meng <bmeng@tinylab.org>
Thu, 21 Sep 2023 22:05:40 +0000 (06:05 +0800)
When 'usb stop' is run, doing 'bootflow scan' does not run the USB hunter
again so does not see any devices. Fix this by telling bootstd about the
state of USB.

Signed-off-by: Simon Glass <sjg@chromium.org>
boot/bootdev-uclass.c
drivers/usb/host/usb-uclass.c
include/bootdev.h

index 69506e3865fc04ec4717a1e8c7badb2830c39a4a..974ddee5d2faa05af687dab16f99ab4065a31f08 100644 (file)
@@ -830,6 +830,33 @@ int bootdev_hunt(const char *spec, bool show)
        return result;
 }
 
+int bootdev_unhunt(enum uclass_id id)
+{
+       struct bootdev_hunter *start;
+       int n_ent, i;
+
+       start = ll_entry_start(struct bootdev_hunter, bootdev_hunter);
+       n_ent = ll_entry_count(struct bootdev_hunter, bootdev_hunter);
+       for (i = 0; i < n_ent; i++) {
+               struct bootdev_hunter *info = start + i;
+
+               if (info->uclass == id) {
+                       struct bootstd_priv *std;
+                       int ret;
+
+                       ret = bootstd_get_priv(&std);
+                       if (ret)
+                               return log_msg_ret("std", ret);
+                       if (!(std->hunters_used & BIT(i)))
+                               return -EALREADY;
+                       std->hunters_used &= ~BIT(i);
+                       return 0;
+               }
+       }
+
+       return -ENOENT;
+}
+
 int bootdev_hunt_prio(enum bootdev_prio_t prio, bool show)
 {
        struct bootdev_hunter *start;
index e5fe949f254c381fc1f1cd3cc5d1db43f7cff411..a1cd0ad2d669b7c2fa04148cec104fcbe8aa99ea 100644 (file)
@@ -9,6 +9,7 @@
 #define LOG_CATEGORY UCLASS_USB
 
 #include <common.h>
+#include <bootdev.h>
 #include <dm.h>
 #include <errno.h>
 #include <log.h>
@@ -208,6 +209,13 @@ int usb_stop(void)
 #ifdef CONFIG_USB_STORAGE
        usb_stor_reset();
 #endif
+       if (CONFIG_IS_ENABLED(BOOTSTD)) {
+               int ret;
+
+               ret = bootdev_unhunt(UCLASS_USB);
+               if (IS_ENABLED(CONFIG_BOOTSTD_FULL) && ret && ret != -EALREADY)
+                       printf("failed to unhunt USB (err=%dE)\n", ret);
+       }
        uc_priv->companion_device_count = 0;
        usb_started = 0;
 
index 848233187f87af7208811b54507f5e419e2b9fbf..b079a91b5b7f337e03211ad4369b8341933e944f 100644 (file)
@@ -320,6 +320,15 @@ int bootdev_hunt(const char *spec, bool show);
  */
 int bootdev_hunt_prio(enum bootdev_prio_t prio, bool show);
 
+/**
+ * bootdev_unhunt() - Mark a device as needing to be hunted again
+ *
+ * @id: uclass ID to update
+ * Return: 0 if done, -EALREADY if already in this state, -ENOENT if no hunter
+ * found for that uclass
+ */
+int bootdev_unhunt(enum uclass_id id);
+
 /**
  * bootdev_hunt_and_find_by_label() - Hunt for bootdevs by label
  *