From: Ahmad Fatoum <a.fatoum@pengutronix.de>
To: barebox@lists.infradead.org
Cc: Ahmad Fatoum <a.fatoum@pengutronix.de>
Subject: [PATCH 11/14] fastboot/dfu: use machine partitions as fall back
Date: Tue, 13 Apr 2021 00:34:59 +0200 [thread overview]
Message-ID: <20210412223502.29691-12-a.fatoum@pengutronix.de> (raw)
In-Reply-To: <20210412223502.29691-1-a.fatoum@pengutronix.de>
Use the new machine 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
MACHINE_PARTITIONS disabled.
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
common/fastboot.c | 9 ++++--
common/usbgadget.c | 64 +++++++++++++++++++++-----------------
drivers/usb/gadget/multi.c | 12 +++++++
include/fastboot.h | 6 ++--
include/file-list.h | 5 +++
include/usb/gadget-multi.h | 1 +
net/fastboot.c | 4 +--
7 files changed, 64 insertions(+), 37 deletions(-)
diff --git a/common/fastboot.c b/common/fastboot.c
index c8576a8d97c3..16eda93b93e4 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 <machine-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 (!machine_partitions_empty())
+ return machine_partitions_get();
+ return NULL;
}
static int fastboot_globalvars_init(void)
diff --git a/common/usbgadget.c b/common/usbgadget.c
index 009debd93efc..7aa9a7b9ef1e 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 <machine-partitions.h>
static int autostart;
static int acm;
@@ -32,6 +33,15 @@ static struct file_list *parse(const char *files)
return list;
}
+static inline struct file_list *get_dfu_function(void)
+{
+ if (dfu_function && *dfu_function)
+ return file_list_parse(dfu_function);
+ if (!machine_partitions_empty())
+ return machine_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 +49,37 @@ 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) {
- opts->fastboot_opts.files = parse(fastboot_opts);
+ if (dfu)
+ opts->dfu_opts.files = dfu_opts ? parse(dfu_opts)
+ : get_dfu_function();
+
+ if (IS_ENABLED(CONFIG_FASTBOOT_BASE) && fastboot) {
+ opts->fastboot_opts.files = fastboot_opts ? parse(fastboot_opts)
+ : 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 +87,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;
}
diff --git a/drivers/usb/gadget/multi.c b/drivers/usb/gadget/multi.c
index 95f5b90c88b5..3fb22486a0e9 100644
--- a/drivers/usb/gadget/multi.c
+++ b/drivers/usb/gadget/multi.c
@@ -266,6 +266,18 @@ void usb_multi_unregister(void)
gadget_multi_opts = NULL;
}
+unsigned usb_multi_count_functions(struct f_multi_opts *opts)
+{
+ unsigned count = 0;
+
+ count += !file_list_empty(opts->fastboot_opts.files) ||
+ opts->fastboot_opts.export_bbu;
+ count += !file_list_empty(opts->dfu_opts.files);
+ count += opts->create_acm;
+
+ return count;
+}
+
void usb_multi_opts_release(struct f_multi_opts *opts)
{
if (opts->fastboot_opts.files)
diff --git a/include/fastboot.h b/include/fastboot.h
index 2eab2dfe6ae8..cf8a177bf12c 100644
--- a/include/fastboot.h
+++ b/include/fastboot.h
@@ -58,16 +58,16 @@ enum fastboot_msg_type {
#ifdef CONFIG_FASTBOOT_BASE
bool get_fastboot_bbu(void);
-const char *get_fastboot_partitions(void);
+struct file_list *get_fastboot_partitions(void);
#else
static inline int get_fastboot_bbu(void)
{
return false;
}
-static inline const char *get_fastboot_partitions(void)
+static inline struct file_list *get_fastboot_partitions(void)
{
- return NULL;
+ return file_list_parse("");
}
#endif
diff --git a/include/file-list.h b/include/file-list.h
index 2538883c3659..be97a49b7a2b 100644
--- a/include/file-list.h
+++ b/include/file-list.h
@@ -35,4 +35,9 @@ struct file_list_entry *file_list_entry_by_name(struct file_list *files, const c
#define file_list_for_each_entry(files, entry) \
list_for_each_entry(entry, &files->list, list)
+static inline bool file_list_empty(struct file_list *files)
+{
+ return !files || !files->num_entries;
+}
+
#endif /* __FILE_LIST */
diff --git a/include/usb/gadget-multi.h b/include/usb/gadget-multi.h
index 9bb6c889f3e9..f30dae5686ae 100644
--- a/include/usb/gadget-multi.h
+++ b/include/usb/gadget-multi.h
@@ -15,6 +15,7 @@ struct f_multi_opts {
int usb_multi_register(struct f_multi_opts *opts);
void usb_multi_unregister(void);
void usb_multi_opts_release(struct f_multi_opts *opts);
+unsigned usb_multi_count_functions(struct f_multi_opts *opts);
int usbgadget_register(bool dfu, const char *dfu_opts,
bool fastboot, const char *fastboot_opts,
diff --git a/net/fastboot.c b/net/fastboot.c
index 9082aa48f6e1..df388adc8995 100644
--- a/net/fastboot.c
+++ b/net/fastboot.c
@@ -499,7 +499,6 @@ void fastboot_net_free(struct fastboot_net *fbn)
struct fastboot_net *fastboot_net_init(struct fastboot_opts *opts)
{
struct fastboot_net *fbn;
- const char *partitions = get_fastboot_partitions();
bool bbu = get_fastboot_bbu();
int ret;
@@ -513,8 +512,7 @@ struct fastboot_net *fastboot_net_init(struct fastboot_opts *opts)
fbn->fastboot.cmd_flash = opts->cmd_flash;
ret = fastboot_generic_init(&fbn->fastboot, opts->export_bbu);
} else {
- fbn->fastboot.files = file_list_parse(partitions ?
- partitions : "");
+ fbn->fastboot.files = get_fastboot_partitions() ?: file_list_parse("");
ret = fastboot_generic_init(&fbn->fastboot, bbu);
}
if (ret)
--
2.29.2
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
next prev parent reply other threads:[~2021-04-12 22:37 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-04-12 22:34 [PATCH 00/14] usb: gadget: refactor to allow easier extension Ahmad Fatoum
2021-04-12 22:34 ` [PATCH 01/14] show_progress: add system wide progress stage notifier Ahmad Fatoum
2021-04-15 7:29 ` Sascha Hauer
2021-04-15 7:39 ` Ahmad Fatoum
2021-04-12 22:34 ` [PATCH 02/14] common: console: add log_dprint to print to file descriptor Ahmad Fatoum
2021-04-15 7:25 ` Sascha Hauer
2021-04-15 7:43 ` Ahmad Fatoum
2021-04-12 22:34 ` [PATCH 03/14] string: implement strstarts along with strends Ahmad Fatoum
2021-04-12 22:34 ` [PATCH 04/14] vsprintf: introduce %m shorthand for "%s", strerror(errno) Ahmad Fatoum
2021-04-12 22:34 ` [PATCH 05/14] param: introduce file-list parameter type Ahmad Fatoum
2021-04-12 22:34 ` [PATCH 06/14] common: add generic machine partitions interface Ahmad Fatoum
2021-04-14 10:08 ` Sascha Hauer
2021-04-14 10:20 ` Ahmad Fatoum
2021-04-12 22:34 ` [PATCH 07/14] fastboot: handle ill-named partitions gracefully Ahmad Fatoum
2021-04-12 22:34 ` [PATCH 08/14] usb: gadget: dfu: change status message to info log level Ahmad Fatoum
2021-04-12 22:34 ` [PATCH 09/14] usbgadget: autostart: fix indeterminism around usbgadget.autostart Ahmad Fatoum
2021-04-12 22:34 ` [PATCH 10/14] usbgadget: allow DFU and Fastboot functions to coexist Ahmad Fatoum
2021-04-12 22:34 ` Ahmad Fatoum [this message]
2021-04-12 22:35 ` [PATCH 12/14] bbu: add function to directly add handlers into file_list Ahmad Fatoum
2021-04-12 22:35 ` [PATCH 13/14] file_list: add file_list_detect_all() Ahmad Fatoum
2021-04-12 22:35 ` [PATCH 14/14] common: make FILE_LIST feature unconditional Ahmad Fatoum
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210412223502.29691-12-a.fatoum@pengutronix.de \
--to=a.fatoum@pengutronix.de \
--cc=barebox@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox