diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2021-07-18 07:13:58 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2021-07-18 07:13:58 +0200 |
commit | 68a34282e9de28a448cbb653277b8020bf945696 (patch) | |
tree | 48822a4d0eebd275f519d3bcfa067b2e5889c088 /commands | |
parent | 8d25e409dd5a30bdd26b89c9409720f47b93b4c7 (diff) | |
parent | 0f621c63d7c3396010001c043e190b628d7b2982 (diff) | |
download | barebox-68a34282e9de28a448cbb653277b8020bf945696.tar.gz barebox-68a34282e9de28a448cbb653277b8020bf945696.tar.xz |
Merge branch 'for-next/usb-gadget'
Diffstat (limited to 'commands')
-rw-r--r-- | commands/bthread.c | 83 | ||||
-rw-r--r-- | commands/usbgadget.c | 29 |
2 files changed, 78 insertions, 34 deletions
diff --git a/commands/bthread.c b/commands/bthread.c index 964a1044c5..aaade46e92 100644 --- a/commands/bthread.c +++ b/commands/bthread.c @@ -10,12 +10,15 @@ #include <command.h> #include <getopt.h> #include <clock.h> +#include <slice.h> static int bthread_time(void) { uint64_t start = get_time_ns(); int i = 0; + slice_release(&command_slice); + /* * How many background tasks can we have in one second? * @@ -25,15 +28,15 @@ static int bthread_time(void) while (!is_timeout(start, SECOND)) i++; + slice_acquire(&command_slice); + return i; } -static int bthread_infinite(void *data) +static void bthread_infinite(void *data) { while (!bthread_should_stop()) ; - - return 0; } static int bthread_isolated_time(void) @@ -57,14 +60,19 @@ static int bthread_isolated_time(void) i += 2; } - bthread_stop(bthread); - bthread_free(bthread); + __bthread_stop(bthread); return i; } -static int bthread_printer(void *arg) +struct arg { + unsigned long in; + long out; +}; + +static void bthread_printer(void *_arg) { + struct arg *arg = _arg; volatile u64 start; volatile unsigned long i = 0; start = get_time_ns(); @@ -73,28 +81,30 @@ static int bthread_printer(void *arg) if (!is_timeout_non_interruptible(start, 225 * MSECOND)) continue; - if ((unsigned long)arg == i++) + if (arg->in == i++) printf("%s yield #%lu\n", bthread_name(current), i); start = get_time_ns(); } - return i; + arg->out = i; } static int yields; -static int bthread_spawner(void *arg) +static void bthread_spawner(void *_spawner_arg) { + struct arg *arg, *spawner_arg = _spawner_arg; struct bthread *bthread[4]; volatile u64 start; volatile unsigned long i = 0; int ret = 0; - int ecode; start = get_time_ns(); for (i = 0; i < ARRAY_SIZE(bthread); i++) { - bthread[i] = bthread_run(bthread_printer, (void *)(long)i, + arg = malloc(sizeof(*arg)); + arg->in = i; + bthread[i] = bthread_run(bthread_printer, arg, "%s-bthread%u", bthread_name(current), i+1); if (!bthread[i]) { ret = -ENOMEM; @@ -107,14 +117,15 @@ static int bthread_spawner(void *arg) cleanup: while (i--) { - ecode = bthread_stop(bthread[i]); - bthread_free(bthread[i]); + arg = bthread_data(bthread[i]); + __bthread_stop(bthread[i]); - if (!ret && (ecode != 4 || yields < ecode)) + if (!ret && (arg->out != 4 || yields < arg->out)) ret = -EIO; + free(arg); } - return ret; + spawner_arg->out = ret; } struct spawn { @@ -124,14 +135,38 @@ struct spawn { static int do_bthread(int argc, char *argv[]) { + static int dummynr; + static LIST_HEAD(dummies); LIST_HEAD(spawners); struct spawn *spawner, *tmp; int ret = 0; - int ecode, opt, i = 0; + int opt, i = 0; bool time = false; + struct arg *arg; - while ((opt = getopt(argc, argv, "itcv")) > 0) { + while ((opt = getopt(argc, argv, "aritcv")) > 0) { switch (opt) { + case 'a': + spawner = xzalloc(sizeof(*spawner)); + spawner->bthread = bthread_run(bthread_infinite, NULL, + "dummy%u", dummynr++); + if (!spawner->bthread) { + free(spawner); + ret = -ENOMEM; + goto cleanup; + } + + list_add(&spawner->list, &dummies); + break; + case 'r': + if (dummynr == 0) + return -EINVAL; + spawner = list_first_entry(&dummies, struct spawn, list); + bthread_cancel(spawner->bthread); + list_del(&spawner->list); + free(spawner); + dummynr--; + break; case 'i': bthread_info(); break; @@ -141,7 +176,8 @@ static int do_bthread(int argc, char *argv[]) break; case 'v': spawner = xzalloc(sizeof(*spawner)); - spawner->bthread = bthread_run(bthread_spawner, NULL, + arg = malloc(sizeof(*arg)); + spawner->bthread = bthread_run(bthread_spawner, arg, "spawner%u", ++i); if (!spawner->bthread) { free(spawner); @@ -167,10 +203,11 @@ static int do_bthread(int argc, char *argv[]) cleanup: list_for_each_entry_safe(spawner, tmp, &spawners, list) { - ecode = bthread_stop(spawner->bthread); - bthread_free(spawner->bthread); - if (!ret && ecode) - ret = ecode; + arg = bthread_data(spawner->bthread); + __bthread_stop(spawner->bthread); + if (!ret && arg->out) + ret = arg->out; + free(arg); free(spawner); } @@ -184,6 +221,8 @@ BAREBOX_CMD_HELP_START(bthread) BAREBOX_CMD_HELP_OPT ("-i", "Print information about registered bthreads") BAREBOX_CMD_HELP_OPT ("-t", "measure how many bthreads we currently run in 1s") BAREBOX_CMD_HELP_OPT ("-c", "count maximum context switches in 1s") + BAREBOX_CMD_HELP_OPT ("-a", "add a dummy bthread") + BAREBOX_CMD_HELP_OPT ("-r", "remove a dummy bthread") BAREBOX_CMD_HELP_OPT ("-v", "verify correct bthread operation") BAREBOX_CMD_HELP_END diff --git a/commands/usbgadget.c b/commands/usbgadget.c index 3b115f147d..290f33eff3 100644 --- a/commands/usbgadget.c +++ b/commands/usbgadget.c @@ -18,26 +18,29 @@ static int do_usbgadget(int argc, char *argv[]) { + struct usbgadget_funcs funcs = {}; int opt; - bool acm = false, dfu = false, fastboot = false, export_bbu = false; - const char *fastboot_opts = NULL, *dfu_opts = NULL; - while ((opt = getopt(argc, argv, "asdA::D::b")) > 0) { + while ((opt = getopt(argc, argv, "asdA::D::S::b")) > 0) { switch (opt) { case 'a': case 's': - acm = true; + funcs.flags |= USBGADGET_ACM; break; case 'D': - dfu = true; - dfu_opts = optarg; + funcs.flags |= USBGADGET_DFU; + funcs.dfu_opts = optarg; break; case 'A': - fastboot = true; - fastboot_opts = optarg; + funcs.flags |= USBGADGET_FASTBOOT; + funcs.fastboot_opts = optarg; + break; + case 'S': + funcs.flags |= USBGADGET_MASS_STORAGE; + funcs.ums_opts = optarg; break; case 'b': - export_bbu = true; + funcs.flags |= USBGADGET_EXPORT_BBU; break; case 'd': usb_multi_unregister(); @@ -47,8 +50,8 @@ static int do_usbgadget(int argc, char *argv[]) } } - return usbgadget_register(dfu, dfu_opts, fastboot, fastboot_opts, acm, - export_bbu); + + return usbgadget_register(&funcs); } BAREBOX_CMD_HELP_START(usbgadget) @@ -61,13 +64,15 @@ BAREBOX_CMD_HELP_OPT ("-A <desc>", "Create Android Fastboot function. If 'desc' BAREBOX_CMD_HELP_OPT ("-b\t", "include registered barebox update handlers (fastboot specific)") BAREBOX_CMD_HELP_OPT ("-D <desc>", "Create DFU function. If 'desc' is not provided, " "try to use 'global.usbgadget.dfu_function' variable.") +BAREBOX_CMD_HELP_OPT ("-S <desc>", "Create USB Mass Storage function. If 'desc' is not provided," + "fallback directly to 'global.system.partitions' variable.") BAREBOX_CMD_HELP_OPT ("-d\t", "Disable the currently running gadget") BAREBOX_CMD_HELP_END BAREBOX_CMD_START(usbgadget) .cmd = do_usbgadget, BAREBOX_CMD_DESC("Create USB Gadget multifunction device") - BAREBOX_CMD_OPTS("[-adAD]") + BAREBOX_CMD_OPTS("[-adADS]") BAREBOX_CMD_GROUP(CMD_GRP_HWMANIP) BAREBOX_CMD_HELP(cmd_usbgadget_help) BAREBOX_CMD_END |