[PATCH 1/2] common: bbu: only add available handlers

Rouven Czerwinski r.czerwinski at pengutronix.de
Fri Jun 18 05:05:57 PDT 2021


A board may have multiple handlers registered:

  registered update handlers:
    SD          -> /dev/mmc0.barebox
  * eMMC        -> /dev/mmc1

However when using the usbgadget with the -b command line argument,
fastboot will stat all devicefiles listed in the handlers and will fail
if i.e. the SD card is not available:

  usbgadget -A /dev/mmc1(root) -b
  udc0: registering UDC driver [g_multi]
  multi_bind: creating Fastboot function
  ERROR: g_multi udc0: failed to start g_multi: -2
  usbgadget: No such file or directory

To fix this, check the availability of handlers before adding them to
the list and skip those that are not available with an info level message.

Signed-off-by: Rouven Czerwinski <r.czerwinski at pengutronix.de>
---
 common/bbu.c | 23 +++++++++++++++++++++--
 1 file changed, 21 insertions(+), 2 deletions(-)

diff --git a/common/bbu.c b/common/bbu.c
index 1a1edda96b..a66be553e9 100644
--- a/common/bbu.c
+++ b/common/bbu.c
@@ -32,12 +32,31 @@ static void append_bbu_entry(struct bbu_handler *handler, struct file_list *file
 	free(name);
 }
 
+static bool bbu_handler_is_available(struct bbu_handler *handler)
+{
+	struct stat s;
+	int ret;
+
+	device_detect_by_name(devpath_to_name(handler->devicefile));
+	ret = stat(handler->devicefile, &s);
+
+	if(ret)
+		return false;
+	return true;
+}
+
 void bbu_append_handlers_to_file_list(struct file_list *files)
 {
 	struct bbu_handler *handler;
 
-	list_for_each_entry(handler, &bbu_image_handlers, list)
-		append_bbu_entry(handler, files);
+	list_for_each_entry(handler, &bbu_image_handlers, list) {
+		if(bbu_handler_is_available(handler)) {
+			append_bbu_entry(handler, files);
+		} else {
+			pr_info("Skipping unavailable handler bbu-%s\n",
+				handler->name);
+		}
+	}
 }
 
 int bbu_force(struct bbu_data *data, const char *fmt, ...)
-- 
2.31.1




More information about the barebox mailing list