diff options
Diffstat (limited to 'common/ratp')
-rw-r--r-- | common/ratp/Kconfig | 3 | ||||
-rw-r--r-- | common/ratp/Makefile | 2 | ||||
-rw-r--r-- | common/ratp/getenv.c | 3 | ||||
-rw-r--r-- | common/ratp/i2c.c | 4 | ||||
-rw-r--r-- | common/ratp/md.c | 4 | ||||
-rw-r--r-- | common/ratp/mw.c | 1 | ||||
-rw-r--r-- | common/ratp/ratp.c | 59 |
7 files changed, 57 insertions, 19 deletions
diff --git a/common/ratp/Kconfig b/common/ratp/Kconfig index 25150addfd..43720e30a0 100644 --- a/common/ratp/Kconfig +++ b/common/ratp/Kconfig @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0-only config CONSOLE_RATP bool @@ -28,4 +29,4 @@ config RATP_CMD_GPIO depends on GENERIC_GPIO prompt "RATP GPIO support" help - This option adds support for GPIO get/set/direction commands via RATP.
\ No newline at end of file + This option adds support for GPIO get/set/direction commands via RATP. diff --git a/common/ratp/Makefile b/common/ratp/Makefile index 71288bcb8c..e37ccca1fa 100644 --- a/common/ratp/Makefile +++ b/common/ratp/Makefile @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: GPL-2.0-only + obj-y += ratp.o obj-y += ping.o obj-y += getenv.o diff --git a/common/ratp/getenv.c b/common/ratp/getenv.c index 7b38d2e363..9617ab1b43 100644 --- a/common/ratp/getenv.c +++ b/common/ratp/getenv.c @@ -32,6 +32,9 @@ static int ratp_cmd_getenv(const struct ratp_bb *req, int req_len, value = getenv(varname); free(varname); + if (!value) + value = ""; + dlen = strlen(value); *rsp_len = sizeof(struct ratp_bb) + dlen; diff --git a/common/ratp/i2c.c b/common/ratp/i2c.c index c14bbbf9b9..404ddd2ece 100644 --- a/common/ratp/i2c.c +++ b/common/ratp/i2c.c @@ -162,7 +162,7 @@ out: *rsp = (struct ratp_bb *)i2c_read_rsp; *rsp_len = i2c_read_rsp_len; - return ret; + return 0; } BAREBOX_RATP_CMD_START(I2C_READ) @@ -271,7 +271,7 @@ out: *rsp = (struct ratp_bb *)i2c_write_rsp; *rsp_len = sizeof(*i2c_write_rsp); - return ret; + return 0; } BAREBOX_RATP_CMD_START(I2C_WRITE) diff --git a/common/ratp/md.c b/common/ratp/md.c index 3e258c59a0..8221afaebc 100644 --- a/common/ratp/md.c +++ b/common/ratp/md.c @@ -68,8 +68,10 @@ static int do_ratp_mem_md(const char *filename, char *buf = NULL; fd = open_and_lseek(filename, O_RWSIZE_1 | O_RDONLY, start); - if (fd < 0) + if (fd < 0) { + printf("Could not open \"%s\": %m\n", filename); return -errno; + } map = memmap(fd, PROT_READ); if (map != MAP_FAILED) { diff --git a/common/ratp/mw.c b/common/ratp/mw.c index 8945799f1d..87dc8cb95c 100644 --- a/common/ratp/mw.c +++ b/common/ratp/mw.c @@ -133,6 +133,7 @@ static int ratp_cmd_mw(const struct ratp_bb *req, int req_len, fd = open_and_lseek(path, O_RWSIZE_1 | O_WRONLY, addr); if (fd < 0) { + printf("Could not open \"%s\": %m\n", path); ret = -errno; goto out; } diff --git a/common/ratp/ratp.c b/common/ratp/ratp.c index 9ca299eef2..fddb286e01 100644 --- a/common/ratp/ratp.c +++ b/common/ratp/ratp.c @@ -22,6 +22,7 @@ #include <environment.h> #include <kfifo.h> #include <poller.h> +#include <work.h> #include <linux/sizes.h> #include <ratp_bb.h> #include <fs.h> @@ -49,9 +50,11 @@ struct ratp_ctx { struct ratp_bb_pkt *fs_rx; struct poller_struct poller; + struct work_queue wq; bool console_registered; bool poller_registered; + bool wq_registered; }; static int compare_ratp_command(struct list_head *a, struct list_head *b) @@ -193,9 +196,14 @@ static int ratp_bb_send_command_return(struct ratp_ctx *ctx, uint32_t errno) return ret; } -static char *ratp_command; static struct ratp_ctx *ratp_ctx; +struct ratp_work { + struct work_struct work; + struct ratp_ctx *ctx; + char *command; +}; + static int ratp_bb_dispatch(struct ratp_ctx *ctx, const void *buf, int len) { const struct ratp_bb *rbb = buf; @@ -204,6 +212,7 @@ static int ratp_bb_dispatch(struct ratp_ctx *ctx, const void *buf, int len) int ret = 0; uint16_t type = be16_to_cpu(rbb->type); struct ratp_command *cmd; + struct ratp_work *rw; /* See if there's a command registered to this type */ cmd = find_ratp_request(type); @@ -221,12 +230,16 @@ static int ratp_bb_dispatch(struct ratp_ctx *ctx, const void *buf, int len) switch (type) { case BB_RATP_TYPE_COMMAND: - if (!IS_ENABLED(CONFIG_CONSOLE_RATP) || ratp_command) + if (!IS_ENABLED(CONFIG_CONSOLE_RATP)) return 0; - ratp_command = xstrndup((const char *)rbb->data, dlen); - ratp_ctx = ctx; - pr_debug("got command: %s\n", ratp_command); + rw = xzalloc(sizeof(*rw)); + rw->ctx = ctx; + rw->command = xstrndup((const char *)rbb->data, dlen); + + wq_queue_work(&ctx->wq, &rw->work); + + pr_debug("got command: %s\n", rw->command); break; @@ -297,21 +310,20 @@ static void ratp_console_putc(struct console_device *cdev, char c) kfifo_putc(ctx->console_transmit_fifo, c); } -void barebox_ratp_command_run(void) +static void ratp_command_run(struct work_struct *w) { + struct ratp_work *rw = container_of(w, struct ratp_work, work); + struct ratp_ctx *ctx = rw->ctx; int ret; - if (!ratp_command) - return; - - pr_debug("running command: %s\n", ratp_command); + pr_debug("running command: %s\n", rw->command); - ret = run_command(ratp_command); + ret = run_command(rw->command); - free(ratp_command); - ratp_command = NULL; + free(rw->command); + free(rw); - ratp_bb_send_command_return(ratp_ctx, ret); + ratp_bb_send_command_return(ctx, ret); } static const char *ratpfs_mount_path; @@ -336,6 +348,9 @@ static void ratp_unregister(struct ratp_ctx *ctx) if (ctx->poller_registered) poller_unregister(&ctx->poller); + if (ctx->wq_registered) + wq_unregister(&ctx->wq); + ratp_close(&ctx->ratp); console_set_active(ctx->cdev, ctx->old_active); @@ -368,6 +383,7 @@ static void ratp_poller(struct poller_struct *poller) ret = ratp_poll(&ctx->ratp); if (ret == -EINTR) goto out; + if (ratp_closed(&ctx->ratp)) goto out; @@ -423,6 +439,14 @@ int barebox_ratp_fs_call(struct ratp_bb_pkt *tx, struct ratp_bb_pkt **rx) return 0; } +static void ratp_work_cancel(struct work_struct *w) +{ + struct ratp_work *rw = container_of(w, struct ratp_work, work); + + free(rw->command); + free(rw); +} + int barebox_ratp(struct console_device *cdev) { int ret; @@ -462,10 +486,15 @@ int barebox_ratp(struct console_device *cdev) ctx->cdev = cdev; ctx->have_synch = 1; - ret = ratp_establish(&ctx->ratp, false, 100); + ret = ratp_establish(&ctx->ratp, false, 1000); if (ret < 0) goto out; + ctx->wq.fn = ratp_command_run; + ctx->wq.cancel = ratp_work_cancel; + wq_register(&ctx->wq); + ctx->wq_registered = true; + ret = poller_register(&ctx->poller, "ratp"); if (ret) goto out; |