summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorAhmad Fatoum <a.fatoum@pengutronix.de>2021-05-03 13:48:57 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2021-05-12 08:00:00 +0200
commitf1dd6339a8d7d62667ba8a1da863319bc5a1dc57 (patch)
treeb2a9a3a75f1ff22c05a2416fe3e8d3311409afbd /common
parenteecf05d8ced03ab994cd083c7906df434ffd44b7 (diff)
downloadbarebox-f1dd6339a8d7d62667ba8a1da863319bc5a1dc57.tar.gz
barebox-f1dd6339a8d7d62667ba8a1da863319bc5a1dc57.tar.xz
fastboot/dfu: use system partitions as fall back
Use the new system partitions infrastructure to have fastboot and DFU fall back to using the same partitions if the global.usbgadget.dfu_function and global.fastboot_partitions are not set, respectively. No functional change intended for configurations that have SYSTEM_PARTITIONS disabled. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Link: https://lore.barebox.org/20210503114901.13095-13-a.fatoum@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'common')
-rw-r--r--common/fastboot.c9
-rw-r--r--common/usbgadget.c77
2 files changed, 55 insertions, 31 deletions
diff --git a/common/fastboot.c b/common/fastboot.c
index c8576a8d97..dc80b66e67 100644
--- a/common/fastboot.c
+++ b/common/fastboot.c
@@ -41,6 +41,7 @@
#include <linux/stat.h>
#include <linux/mtd/mtd.h>
#include <fastboot.h>
+#include <system-partitions.h>
#define FASTBOOT_VERSION "0.4"
@@ -932,9 +933,13 @@ bool get_fastboot_bbu(void)
return fastboot_bbu;
}
-const char *get_fastboot_partitions(void)
+struct file_list *get_fastboot_partitions(void)
{
- return fastboot_partitions;
+ if (fastboot_partitions && *fastboot_partitions)
+ return file_list_parse(fastboot_partitions);
+ if (!system_partitions_empty())
+ return system_partitions_get();
+ return NULL;
}
static int fastboot_globalvars_init(void)
diff --git a/common/usbgadget.c b/common/usbgadget.c
index 009debd93e..d4437b5169 100644
--- a/common/usbgadget.c
+++ b/common/usbgadget.c
@@ -17,6 +17,7 @@
#include <usb/gadget-multi.h>
#include <globalvar.h>
#include <magicvar.h>
+#include <system-partitions.h>
static int autostart;
static int acm;
@@ -24,14 +25,29 @@ static char *dfu_function;
static struct file_list *parse(const char *files)
{
- struct file_list *list = file_list_parse(files);
+ struct file_list *list;
+
+ if (!files)
+ return NULL;
+
+ list = file_list_parse(files);
if (IS_ERR(list)) {
pr_err("Parsing file list \"%s\" failed: %pe\n", files, list);
return NULL;
}
+
return list;
}
+static inline struct file_list *get_dfu_function(void)
+{
+ if (dfu_function && *dfu_function)
+ return file_list_parse(dfu_function);
+ if (!system_partitions_empty())
+ return system_partitions_get();
+ return NULL;
+}
+
int usbgadget_register(bool dfu, const char *dfu_opts,
bool fastboot, const char *fastboot_opts,
bool acm, bool export_bbu)
@@ -39,45 +55,44 @@ int usbgadget_register(bool dfu, const char *dfu_opts,
int ret;
struct device_d *dev;
struct f_multi_opts *opts;
- const char *fastboot_partitions = get_fastboot_partitions();
-
- if (dfu && !dfu_opts && dfu_function && *dfu_function)
- dfu_opts = dfu_function;
-
- if (IS_ENABLED(CONFIG_FASTBOOT_BASE) && fastboot && !fastboot_opts &&
- fastboot_partitions && *fastboot_partitions)
- fastboot_opts = fastboot_partitions;
-
- if (!dfu_opts && !fastboot_opts && !acm)
- return COMMAND_ERROR_USAGE;
-
- /*
- * Creating a gadget with both DFU and Fastboot may not work.
- * fastboot 1:8.1.0+r23-5 can deal with it, but dfu-util 0.9
- * seems to assume that the device only has a single configuration
- * That's not our fault though. Emit a warning and continue
- */
- if (fastboot_opts && dfu_opts)
- pr_warn("Both DFU and Fastboot enabled. dfu-util may not like this!\n");
opts = xzalloc(sizeof(*opts));
opts->release = usb_multi_opts_release;
- if (fastboot_opts) {
+ if (dfu) {
+ opts->dfu_opts.files = parse(dfu_opts);
+ if (IS_ENABLED(CONFIG_USB_GADGET_DFU) && file_list_empty(opts->dfu_opts.files)) {
+ file_list_free(opts->dfu_opts.files);
+ opts->dfu_opts.files = get_dfu_function();
+ }
+ }
+
+ if (fastboot) {
opts->fastboot_opts.files = parse(fastboot_opts);
+ if (IS_ENABLED(CONFIG_FASTBOOT_BASE) && file_list_empty(opts->fastboot_opts.files)) {
+ file_list_free(opts->fastboot_opts.files);
+ opts->fastboot_opts.files = get_fastboot_partitions();
+ }
+
opts->fastboot_opts.export_bbu = export_bbu;
}
- if (dfu_opts)
- opts->dfu_opts.files = parse(dfu_opts);
+ opts->create_acm = acm;
- if (!opts->dfu_opts.files && !opts->fastboot_opts.files && !acm) {
+ if (usb_multi_count_functions(opts) == 0) {
pr_warn("No functions to register\n");
- free(opts);
- return 0;
+ ret = COMMAND_ERROR_USAGE;
+ goto err;
}
- opts->create_acm = acm;
+ /*
+ * Creating a gadget with both DFU and Fastboot may not work.
+ * fastboot 1:8.1.0+r23-5 can deal with it, but dfu-util 0.9
+ * seems to assume that the device only has a single configuration
+ * That's not our fault though. Emit a warning and continue
+ */
+ if (!file_list_empty(opts->fastboot_opts.files) && !file_list_empty(opts->dfu_opts.files))
+ pr_warn("Both DFU and Fastboot enabled. dfu-util may not like this!\n");
dev = get_device_by_name("otg");
if (dev)
@@ -85,7 +100,11 @@ int usbgadget_register(bool dfu, const char *dfu_opts,
ret = usb_multi_register(opts);
if (ret)
- usb_multi_opts_release(opts);
+ goto err;
+
+ return 0;
+err:
+ usb_multi_opts_release(opts);
return ret;
}