From 76c57235435cd309130667f8fa400728ce4bb4e0 Mon Sep 17 00:00:00 2001 From: Johannes Zink Date: Thu, 22 Sep 2022 15:24:10 +0200 Subject: USB: gadget: fastboot: introduce optional flag for fastboot partitions On some boards, some partitions exposed to fastboot may become unavailable under certain circumstances, e.g. if an SD-Card exposed to fastboot is removed. Previously, this lead to an error and the fastboot gadget did not initialize the remaining partitions exposed via fastboot, e.g. an eMMC which usually is permanently soldered on the board. This patch allows to append an optional flag 'o' to the description of a fastboot partition. If this partition is unavailable at the initialization of the fastboot gadget, said partition is skipped, while the remaining available partitions are still exposed. Signed-off-by: Johannes Zink Link: https://lore.barebox.org/20220922132410.2653284-1-j.zink@pengutronix.de Signed-off-by: Sascha Hauer --- Documentation/user/usb.rst | 1 + common/fastboot.c | 8 ++++++++ common/file-list.c | 7 ++++++- include/file-list.h | 1 + 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/Documentation/user/usb.rst b/Documentation/user/usb.rst index 2479efe9d6..f2f57ead98 100644 --- a/Documentation/user/usb.rst +++ b/Documentation/user/usb.rst @@ -65,6 +65,7 @@ Several **flags** are supported, each denoted by a single character: * ``r`` Readback. The partition is allowed to be read back (DFU specific) * ``c`` The file shall be created if it doesn't exist. Needed when a regular file is exported. * ``u`` The partition is a MTD device and shall be flashed with a UBI image. +* ``o`` The partition is optional, i.e. if it is not available at initialization time, it is skipped instead of aborting the initialization Example: diff --git a/common/fastboot.c b/common/fastboot.c index 72e6ba3c40..ae7f132444 100644 --- a/common/fastboot.c +++ b/common/fastboot.c @@ -95,6 +95,14 @@ static int fastboot_add_partition_variables(struct fastboot *fb, } if (ret) { + if (fentry->flags & FILE_LIST_FLAG_OPTIONAL) { + pr_info("skipping unavailable optional partition %s for fastboot gadget\n", + fentry->filename); + ret = 0; + type = "unavailable"; + goto out; + } + if (fentry->flags & FILE_LIST_FLAG_CREATE) { ret = 0; type = "file"; diff --git a/common/file-list.c b/common/file-list.c index 11db7c6e44..1dc7cd8266 100644 --- a/common/file-list.c +++ b/common/file-list.c @@ -88,6 +88,9 @@ static int file_list_parse_one(struct file_list *files, const char *partstr, con case 'u': flags |= FILE_LIST_FLAG_UBI; break; + case 'o': + flags |= FILE_LIST_FLAG_OPTIONAL; + break; default: pr_err("Unknown flag '%c'\n", *partstr); return -EINVAL; @@ -113,7 +116,7 @@ static int file_list_parse_one(struct file_list *files, const char *partstr, con static const char *flags_to_str(int flags) { - static char str[sizeof "srcu"]; + static char str[sizeof "srcuo"]; char *s = str;; if (flags & FILE_LIST_FLAG_SAFE) @@ -124,6 +127,8 @@ static const char *flags_to_str(int flags) *s++ = 'c'; if (flags & FILE_LIST_FLAG_UBI) *s++ = 'u'; + if (flags & FILE_LIST_FLAG_OPTIONAL) + *s++ = 'o'; *s = '\0'; diff --git a/include/file-list.h b/include/file-list.h index af0dd7bbf1..2b2003971f 100644 --- a/include/file-list.h +++ b/include/file-list.h @@ -8,6 +8,7 @@ #define FILE_LIST_FLAG_READBACK (1 << 1) #define FILE_LIST_FLAG_CREATE (1 << 2) #define FILE_LIST_FLAG_UBI (1 << 3) +#define FILE_LIST_FLAG_OPTIONAL (1 << 4) struct file_list_entry { char *name; -- cgit v1.2.3