* [PATCH 1/3] usb: gadget: dfu: Use func_to_dfu @ 2021-02-08 16:34 Jules Maselbas 2021-02-08 16:34 ` [PATCH 2/3] usb: gadget: dfu: Wrap fs operation in workqueue Jules Maselbas ` (2 more replies) 0 siblings, 3 replies; 15+ messages in thread From: Jules Maselbas @ 2021-02-08 16:34 UTC (permalink / raw) To: barebox; +Cc: Jules Maselbas, Ahmad Fatoum Replace the uses of container_of with func_to_dfu when available. Signed-off-by: Jules Maselbas <jmaselbas@kalray.eu> --- drivers/usb/gadget/dfu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/usb/gadget/dfu.c b/drivers/usb/gadget/dfu.c index 7e23fa315..9d6a9d252 100644 --- a/drivers/usb/gadget/dfu.c +++ b/drivers/usb/gadget/dfu.c @@ -181,7 +181,7 @@ dfu_bind(struct usb_configuration *c, struct usb_function *f) struct usb_descriptor_header **header; struct usb_interface_descriptor *desc; struct file_list_entry *fentry; - struct f_dfu *dfu = container_of(f, struct f_dfu, func); + struct f_dfu *dfu = func_to_dfu(f); int i; int status; struct usb_string *us; @@ -863,7 +863,7 @@ out: static void dfu_free_func(struct usb_function *f) { - struct f_dfu *dfu = container_of(f, struct f_dfu, func); + struct f_dfu *dfu = func_to_dfu(f); free(dfu); } -- 2.17.1 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 2/3] usb: gadget: dfu: Wrap fs operation in workqueue 2021-02-08 16:34 [PATCH 1/3] usb: gadget: dfu: Use func_to_dfu Jules Maselbas @ 2021-02-08 16:34 ` Jules Maselbas 2021-02-15 14:18 ` [PATCH v2 1/2] usb: gadget: dfu: Rework print messages Jules Maselbas 2021-02-08 16:34 ` [PATCH 3/3] usb: gadget: dfu: Replace printf with pr_err Jules Maselbas 2021-02-10 9:44 ` [PATCH 1/3] usb: gadget: dfu: Use func_to_dfu Sascha Hauer 2 siblings, 1 reply; 15+ messages in thread From: Jules Maselbas @ 2021-02-08 16:34 UTC (permalink / raw) To: barebox; +Cc: Jules Maselbas, Ahmad Fatoum File system operation shouldn't be executed in a poller. Use a workqueue to delay filesystem operation to command context. --- change RFC -> v1: - Rework manifestation phase, copy work is directly triggered when entering the manifestation state - Rework cleanup, it is now done when either exiting the ERROR state or when calling dfu_abort or dfu_disable. - Rework error handling when reading from file Signed-off-by: Jules Maselbas <jmaselbas@kalray.eu> --- drivers/usb/gadget/dfu.c | 375 +++++++++++++++++++++++++-------------- 1 file changed, 246 insertions(+), 129 deletions(-) diff --git a/drivers/usb/gadget/dfu.c b/drivers/usb/gadget/dfu.c index 9d6a9d252..95e8da82e 100644 --- a/drivers/usb/gadget/dfu.c +++ b/drivers/usb/gadget/dfu.c @@ -54,6 +54,7 @@ #include <fs.h> #include <ioctl.h> #include <linux/mtd/mtd-abi.h> +#include <work.h> #define USB_DT_DFU 0x21 @@ -153,6 +154,7 @@ struct f_dfu { u8 dfu_state; u8 dfu_status; struct usb_request *dnreq; + struct work_queue wq; }; static inline struct f_dfu *func_to_dfu(struct usb_function *f) @@ -173,6 +175,191 @@ static struct usb_gadget_strings *dfu_strings[] = { }; static void dn_complete(struct usb_ep *ep, struct usb_request *req); +static void up_complete(struct usb_ep *ep, struct usb_request *req); +static void dfu_cleanup(struct f_dfu *dfu); + +struct dfu_work { + struct work_struct work; + struct f_dfu *dfu; + void (*task)(struct dfu_work *dw); + size_t len; + uint8_t *rbuf; + uint8_t wbuf[CONFIG_USBD_DFU_XFER_SIZE]; +}; + +static void dfu_do_work(struct work_struct *w) +{ + struct dfu_work *dw = container_of(w, struct dfu_work, work); + struct f_dfu *dfu = dw->dfu; + + if (dfu->dfu_state != DFU_STATE_dfuERROR && dfu->dfu_status == DFU_STATUS_OK) + dw->task(dw); + else + debug("skip work\n"); + + free(dw); +} + +static void dfu_work_cancel(struct work_struct *w) +{ + struct dfu_work *dw = container_of(w, struct dfu_work, work); + + free(dw); +} + +static void dfu_do_write(struct dfu_work *dw) +{ + struct f_dfu *dfu = dw->dfu; + ssize_t size, wlen = dw->len; + ssize_t ret; + + debug("do write\n"); + + if (prog_erase && (dfu_written + wlen) > dfu_erased) { + size = roundup(wlen, dfu_mtdinfo.erasesize); + ret = erase(dfufd, size, dfu_erased); + dfu_erased += size; + if (ret && ret != -ENOSYS) { + perror("erase"); + dfu->dfu_state = DFU_STATE_dfuERROR; + dfu->dfu_status = DFU_STATUS_errERASE; + return; + } + } + + dfu_written += wlen; + ret = write(dfufd, dw->wbuf, wlen); + if (ret < wlen) { + perror("write"); + dfu->dfu_state = DFU_STATE_dfuERROR; + dfu->dfu_status = DFU_STATUS_errWRITE; + } +} + +static void dfu_do_read(struct dfu_work *dw) +{ + struct f_dfu *dfu = dw->dfu; + struct usb_composite_dev *cdev = dfu->func.config->cdev; + ssize_t size, rlen = dw->len; + + debug("do read\n"); + + size = read(dfufd, dfu->dnreq->buf, rlen); + dfu->dnreq->length = size; + if (size < 0) { + perror("read"); + dfu->dnreq->length = 0; + dfu->dfu_state = DFU_STATE_dfuERROR; + dfu->dfu_status = DFU_STATUS_errFILE; + } else if (size < rlen) { + /* this is the last chunk, go to IDLE and close file */ + dfu_cleanup(dfu); + } + + dfu->dnreq->complete = up_complete; + usb_ep_queue(cdev->gadget->ep0, dfu->dnreq); +} + +static void dfu_do_open_dnload(struct dfu_work *dw) +{ + struct f_dfu *dfu = dw->dfu; + int ret; + + debug("do open dnload\n"); + + if (dfu_file_entry->flags & FILE_LIST_FLAG_SAFE) { + dfufd = open(DFU_TEMPFILE, O_WRONLY | O_CREAT); + } else { + unsigned flags = O_WRONLY; + + if (dfu_file_entry->flags & FILE_LIST_FLAG_CREATE) + flags |= O_CREAT | O_TRUNC; + + dfufd = open(dfu_file_entry->filename, flags); + } + + if (dfufd < 0) { + perror("open"); + dfu->dfu_state = DFU_STATE_dfuERROR; + dfu->dfu_status = DFU_STATUS_errFILE; + return; + } + + if (!(dfu_file_entry->flags & FILE_LIST_FLAG_SAFE)) { + ret = ioctl(dfufd, MEMGETINFO, &dfu_mtdinfo); + if (!ret) /* file is on a mtd device */ + prog_erase = 1; + } +} + +static void dfu_do_open_upload(struct dfu_work *dw) +{ + struct f_dfu *dfu = dw->dfu; + + debug("do open upload\n"); + + dfufd = open(dfu_file_entry->filename, O_RDONLY); + if (dfufd < 0) { + perror("open"); + dfu->dfu_state = DFU_STATE_dfuERROR; + dfu->dfu_status = DFU_STATUS_errFILE; + } +} + +static void dfu_do_close(struct dfu_work *dw) +{ + struct stat s; + + debug("do close\n"); + + if (dfufd > 0) { + close(dfufd); + dfufd = -EINVAL; + } + + if (!stat(DFU_TEMPFILE, &s)) + unlink(DFU_TEMPFILE); +} + +static void dfu_do_copy(struct dfu_work *dw) +{ + struct f_dfu *dfu = dw->dfu; + unsigned flags = O_WRONLY; + int ret, fd; + + debug("do copy\n"); + + if (dfu_file_entry->flags & FILE_LIST_FLAG_CREATE) + flags |= O_CREAT | O_TRUNC; + + fd = open(dfu_file_entry->filename, flags); + if (fd < 0) { + perror("open"); + dfu->dfu_state = DFU_STATE_dfuERROR; + dfu->dfu_status = DFU_STATUS_errERASE; + return; + } + + ret = erase(fd, ERASE_SIZE_ALL, 0); + close(fd); + if (ret && ret != -ENOSYS) { + perror("erase"); + dfu->dfu_state = DFU_STATE_dfuERROR; + dfu->dfu_status = DFU_STATUS_errERASE; + return; + } + + ret = copy_file(DFU_TEMPFILE, dfu_file_entry->filename, 0); + if (ret) { + printf("copy file failed\n"); + dfu->dfu_state = DFU_STATE_dfuERROR; + dfu->dfu_status = DFU_STATUS_errWRITE; + return; + } + + dfu->dfu_state = DFU_STATE_dfuIDLE; + dfu_do_close(dw); +} static int dfu_bind(struct usb_configuration *c, struct usb_function *f) @@ -223,6 +410,10 @@ dfu_bind(struct usb_configuration *c, struct usb_function *f) goto out; } + dfu->wq.fn = dfu_do_work; + dfu->wq.cancel = dfu_work_cancel; + wq_register(&dfu->wq); + /* allocate instance-specific interface IDs, and patch descriptors */ status = usb_interface_id(c, f); if (status < 0) @@ -278,6 +469,8 @@ dfu_unbind(struct usb_configuration *c, struct usb_function *f) dfu_file_entry = NULL; dfudetach = 0; + wq_unregister(&dfu->wq); + usb_free_all_descriptors(f); dma_free(dfu->dnreq->buf); @@ -320,47 +513,50 @@ static int dfu_status(struct usb_function *f, const struct usb_ctrlrequest *ctrl static void dfu_cleanup(struct f_dfu *dfu) { - struct stat s; + struct dfu_work *dw; + + debug("dfu cleanup\n"); memset(&dfu_mtdinfo, 0, sizeof(dfu_mtdinfo)); dfu_written = 0; dfu_erased = 0; prog_erase = 0; - if (dfufd > 0) { - close(dfufd); - dfufd = -EINVAL; - } + dfu->dfu_state = DFU_STATE_dfuIDLE; + dfu->dfu_status = DFU_STATUS_OK; - if (!stat(DFU_TEMPFILE, &s)) - unlink(DFU_TEMPFILE); + dw = xzalloc(sizeof(*dw)); + dw->dfu = dfu; + dw->task = dfu_do_close; + wq_queue_work(&dfu->wq, &dw->work); } static void dn_complete(struct usb_ep *ep, struct usb_request *req) { struct f_dfu *dfu = req->context; - loff_t size; - int ret; + struct dfu_work *dw; + + dw = xzalloc(sizeof(*dw)); + dw->dfu = dfu; + dw->task = dfu_do_write; + dw->len = min_t(unsigned int, req->length, CONFIG_USBD_DFU_XFER_SIZE); + memcpy(dw->wbuf, req->buf, dw->len); + wq_queue_work(&dfu->wq, &dw->work); +} - if (prog_erase && (dfu_written + req->length) > dfu_erased) { - size = roundup(req->length, dfu_mtdinfo.erasesize); - ret = erase(dfufd, size, dfu_erased); - dfu_erased += size; - if (ret && ret != -ENOSYS) { - perror("erase"); - dfu->dfu_status = DFU_STATUS_errERASE; - dfu_cleanup(dfu); - return; - } - } +static int handle_manifest(struct usb_function *f, const struct usb_ctrlrequest *ctrl) +{ + struct f_dfu *dfu = func_to_dfu(f); + struct dfu_work *dw; - dfu_written += req->length; - ret = write(dfufd, req->buf, req->length); - if (ret < (int)req->length) { - perror("write"); - dfu->dfu_status = DFU_STATUS_errWRITE; - dfu_cleanup(dfu); + if (dfu_file_entry->flags & FILE_LIST_FLAG_SAFE) { + dw = xzalloc(sizeof(*dw)); + dw->dfu = dfu; + dw->task = dfu_do_copy; + wq_queue_work(&dfu->wq, &dw->work); } + + return 0; } static int handle_dnload(struct usb_function *f, const struct usb_ctrlrequest *ctrl) @@ -370,12 +566,8 @@ static int handle_dnload(struct usb_function *f, const struct usb_ctrlrequest *c u16 w_length = le16_to_cpu(ctrl->wLength); if (w_length == 0) { - if (dfu_file_entry->flags & FILE_LIST_FLAG_SAFE) { - dfu->dfu_state = DFU_STATE_dfuMANIFEST; - } else { - dfu->dfu_state = DFU_STATE_dfuIDLE; - dfu_cleanup(dfu); - } + handle_manifest(f, ctrl); + dfu->dfu_state = DFU_STATE_dfuMANIFEST; return 0; } @@ -386,53 +578,6 @@ static int handle_dnload(struct usb_function *f, const struct usb_ctrlrequest *c return 0; } -static int handle_manifest(struct usb_function *f, const struct usb_ctrlrequest *ctrl) -{ - struct f_dfu *dfu = func_to_dfu(f); - int ret; - - dfu->dfu_state = DFU_STATE_dfuIDLE; - - if (dfu_file_entry->flags & FILE_LIST_FLAG_SAFE) { - int fd; - unsigned flags = O_WRONLY; - - if (dfu_file_entry->flags & FILE_LIST_FLAG_CREATE) - flags |= O_CREAT | O_TRUNC; - - fd = open(dfu_file_entry->filename, flags); - if (fd < 0) { - perror("open"); - dfu->dfu_status = DFU_STATUS_errERASE; - ret = -EINVAL; - goto out; - } - - ret = erase(fd, ERASE_SIZE_ALL, 0); - close(fd); - if (ret && ret != -ENOSYS) { - dfu->dfu_status = DFU_STATUS_errERASE; - perror("erase"); - goto out; - } - - ret = copy_file(DFU_TEMPFILE, dfu_file_entry->filename, 0); - if (ret) { - printf("copy file failed\n"); - ret = -EINVAL; - goto out; - } - } - - return 0; - -out: - dfu->dfu_status = DFU_STATUS_errWRITE; - dfu->dfu_state = DFU_STATE_dfuERROR; - dfu_cleanup(dfu); - return ret; -} - static void up_complete(struct usb_ep *ep, struct usb_request *req) { } @@ -440,28 +585,22 @@ static void up_complete(struct usb_ep *ep, struct usb_request *req) static int handle_upload(struct usb_function *f, const struct usb_ctrlrequest *ctrl) { struct f_dfu *dfu = func_to_dfu(f); - struct usb_composite_dev *cdev = f->config->cdev; + struct dfu_work *dw; u16 w_length = le16_to_cpu(ctrl->wLength); - int len; - - len = read(dfufd, dfu->dnreq->buf, w_length); - dfu->dnreq->length = len; - if (len < w_length) { - dfu_cleanup(dfu); - dfu->dfu_state = DFU_STATE_dfuIDLE; - } - - dfu->dnreq->complete = up_complete; - usb_ep_queue(cdev->gadget->ep0, dfu->dnreq); + dw = xzalloc(sizeof(*dw)); + dw->dfu = dfu; + dw->task = dfu_do_read; + dw->len = w_length; + dw->rbuf = dfu->dnreq->buf; + wq_queue_work(&dfu->wq, &dw->work); return 0; } static void dfu_abort(struct f_dfu *dfu) { - dfu->dfu_state = DFU_STATE_dfuIDLE; - dfu->dfu_status = DFU_STATUS_OK; + wq_cancel_work(&dfu->wq); dfu_cleanup(dfu); } @@ -474,7 +613,7 @@ static int dfu_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl) int value = -EOPNOTSUPP; int w_length = le16_to_cpu(ctrl->wLength); int w_value = le16_to_cpu(ctrl->wValue); - int ret; + struct dfu_work *dw; if (ctrl->bRequestType == USB_DIR_IN && ctrl->bRequest == USB_REQ_GET_DESCRIPTOR && (w_value >> 8) == 0x21) { @@ -501,28 +640,10 @@ static int dfu_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl) goto out; } debug("dfu: starting download to %s\n", dfu_file_entry->filename); - if (dfu_file_entry->flags & FILE_LIST_FLAG_SAFE) { - dfufd = open(DFU_TEMPFILE, O_WRONLY | O_CREAT); - } else { - unsigned flags = O_WRONLY; - - if (dfu_file_entry->flags & FILE_LIST_FLAG_CREATE) - flags |= O_CREAT | O_TRUNC; - - dfufd = open(dfu_file_entry->filename, flags); - } - - if (dfufd < 0) { - dfu->dfu_state = DFU_STATE_dfuERROR; - perror("open"); - goto out; - } - - if (!(dfu_file_entry->flags & FILE_LIST_FLAG_SAFE)) { - ret = ioctl(dfufd, MEMGETINFO, &dfu_mtdinfo); - if (!ret) /* file is on a mtd device */ - prog_erase = 1; - } + dw = xzalloc(sizeof(*dw)); + dw->dfu = dfu; + dw->task = dfu_do_open_dnload; + wq_queue_work(&dfu->wq, &dw->work); value = handle_dnload(f, ctrl); dfu->dfu_state = DFU_STATE_dfuDNLOAD_IDLE; @@ -534,12 +655,12 @@ static int dfu_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl) dfu->dfu_state = DFU_STATE_dfuERROR; goto out; } - dfufd = open(dfu_file_entry->filename, O_RDONLY); - if (dfufd < 0) { - dfu->dfu_state = DFU_STATE_dfuERROR; - perror("open"); - goto out; - } + + dw = xzalloc(sizeof(*dw)); + dw->dfu = dfu; + dw->task = dfu_do_open_upload; + wq_queue_work(&dfu->wq, &dw->work); + handle_upload(f, ctrl); return 0; case USB_REQ_DFU_ABORT: @@ -606,6 +727,7 @@ static int dfu_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl) } break; case DFU_STATE_dfuERROR: + wq_cancel_work(&dfu->wq); switch (ctrl->bRequest) { case USB_REQ_DFU_GETSTATUS: value = dfu_status(f, ctrl); @@ -647,10 +769,7 @@ static int dfu_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl) } break; case DFU_STATE_dfuMANIFEST: - value = handle_manifest(f, ctrl); - if (dfu->dfu_state != DFU_STATE_dfuIDLE) { - return 0; - } + dfu->dfu_state = DFU_STATE_dfuMANIFEST_SYNC; switch (ctrl->bRequest) { case USB_REQ_DFU_GETSTATUS: value = dfu_status(f, ctrl); @@ -692,9 +811,7 @@ static void dfu_disable(struct usb_function *f) { struct f_dfu *dfu = func_to_dfu(f); - dfu->dfu_state = DFU_STATE_dfuIDLE; - - dfu_cleanup(dfu); + dfu_abort(dfu); } #define STRING_MANUFACTURER_IDX 0 -- 2.17.1 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v2 1/2] usb: gadget: dfu: Rework print messages 2021-02-08 16:34 ` [PATCH 2/3] usb: gadget: dfu: Wrap fs operation in workqueue Jules Maselbas @ 2021-02-15 14:18 ` Jules Maselbas 2021-02-15 14:18 ` [PATCH v2 2/2] usb: gadget: dfu: Wrap fs operation in workqueue Jules Maselbas 2021-02-16 9:19 ` [PATCH v2 1/2] usb: gadget: dfu: Rework print messages Bartosz Bilas 0 siblings, 2 replies; 15+ messages in thread From: Jules Maselbas @ 2021-02-15 14:18 UTC (permalink / raw) To: barebox; +Cc: Jules Maselbas, Ahmad Fatoum Replace printf with pr_err and debug with pr_debug. Defines "dfu :" as a prefix for formatted prints. --- v1 -> v2: - add `pr_fmt(fmt) "dfu: " fmt` - change debug call to pr_debug - remove "dfu: " in print messages Signed-off-by: Jules Maselbas <jmaselbas@kalray.eu> --- drivers/usb/gadget/dfu.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/drivers/usb/gadget/dfu.c b/drivers/usb/gadget/dfu.c index 9d6a9d252..fba4ad782 100644 --- a/drivers/usb/gadget/dfu.c +++ b/drivers/usb/gadget/dfu.c @@ -32,6 +32,7 @@ * checking? * - make 'dnstate' attached to 'struct usb_device_instance' */ +#define pr_fmt(fmt) "dfu: " fmt #include <dma.h> #include <asm/byteorder.h> @@ -209,7 +210,7 @@ dfu_bind(struct usb_configuration *c, struct usb_function *f) dfu->dnreq = usb_ep_alloc_request(c->cdev->gadget->ep0); if (!dfu->dnreq) { - printf("usb_ep_alloc_request failed\n"); + pr_err("dfu: usb_ep_alloc_request failed\n"); status = -ENOMEM; goto out; } @@ -254,7 +255,7 @@ dfu_bind(struct usb_configuration *c, struct usb_function *f) i = 0; file_list_for_each_entry(dfu_files, fentry) { - printf("dfu: register alt%d(%s) with device %s\n", + pr_err("register alt%d(%s) with device %s\n", i, fentry->name, fentry->filename); i++; } @@ -418,7 +419,7 @@ static int handle_manifest(struct usb_function *f, const struct usb_ctrlrequest ret = copy_file(DFU_TEMPFILE, dfu_file_entry->filename, 0); if (ret) { - printf("copy file failed\n"); + pr_err("copy file failed\n"); ret = -EINVAL; goto out; } @@ -500,7 +501,7 @@ static int dfu_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl) value = -EINVAL; goto out; } - debug("dfu: starting download to %s\n", dfu_file_entry->filename); + pr_debug("starting download to %s\n", dfu_file_entry->filename); if (dfu_file_entry->flags & FILE_LIST_FLAG_SAFE) { dfufd = open(DFU_TEMPFILE, O_WRONLY | O_CREAT); } else { @@ -529,7 +530,7 @@ static int dfu_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl) return 0; case USB_REQ_DFU_UPLOAD: dfu->dfu_state = DFU_STATE_dfuUPLOAD_IDLE; - debug("dfu: starting upload from %s\n", dfu_file_entry->filename); + pr_debug("starting upload from %s\n", dfu_file_entry->filename); if (!(dfu_file_entry->flags & FILE_LIST_FLAG_READBACK)) { dfu->dfu_state = DFU_STATE_dfuERROR; goto out; -- 2.17.1 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v2 2/2] usb: gadget: dfu: Wrap fs operation in workqueue 2021-02-15 14:18 ` [PATCH v2 1/2] usb: gadget: dfu: Rework print messages Jules Maselbas @ 2021-02-15 14:18 ` Jules Maselbas 2021-03-01 9:30 ` [PATCH 1/2] fixup! " Jules Maselbas 2021-02-16 9:19 ` [PATCH v2 1/2] usb: gadget: dfu: Rework print messages Bartosz Bilas 1 sibling, 1 reply; 15+ messages in thread From: Jules Maselbas @ 2021-02-15 14:18 UTC (permalink / raw) To: barebox; +Cc: Jules Maselbas, Ahmad Fatoum File system operation shouldn't be executed in a poller. Use a workqueue to delay filesystem operation to command context. --- change RFC -> v1: - Rework manifestation phase, copy work is directly triggered when entering the manifestation state - Rework cleanup, it is now done when either exiting the ERROR state or when calling dfu_abort or dfu_disable. - Rework error handling when reading from file change v1 -> v2: - use pr_debug instead of debug Signed-off-by: Jules Maselbas <jmaselbas@kalray.eu> --- drivers/usb/gadget/dfu.c | 375 +++++++++++++++++++++++++-------------- 1 file changed, 246 insertions(+), 129 deletions(-) diff --git a/drivers/usb/gadget/dfu.c b/drivers/usb/gadget/dfu.c index fba4ad782..82c9dc030 100644 --- a/drivers/usb/gadget/dfu.c +++ b/drivers/usb/gadget/dfu.c @@ -55,6 +55,7 @@ #include <fs.h> #include <ioctl.h> #include <linux/mtd/mtd-abi.h> +#include <work.h> #define USB_DT_DFU 0x21 @@ -154,6 +155,7 @@ struct f_dfu { u8 dfu_state; u8 dfu_status; struct usb_request *dnreq; + struct work_queue wq; }; static inline struct f_dfu *func_to_dfu(struct usb_function *f) @@ -174,6 +176,191 @@ static struct usb_gadget_strings *dfu_strings[] = { }; static void dn_complete(struct usb_ep *ep, struct usb_request *req); +static void up_complete(struct usb_ep *ep, struct usb_request *req); +static void dfu_cleanup(struct f_dfu *dfu); + +struct dfu_work { + struct work_struct work; + struct f_dfu *dfu; + void (*task)(struct dfu_work *dw); + size_t len; + uint8_t *rbuf; + uint8_t wbuf[CONFIG_USBD_DFU_XFER_SIZE]; +}; + +static void dfu_do_work(struct work_struct *w) +{ + struct dfu_work *dw = container_of(w, struct dfu_work, work); + struct f_dfu *dfu = dw->dfu; + + if (dfu->dfu_state != DFU_STATE_dfuERROR && dfu->dfu_status == DFU_STATUS_OK) + dw->task(dw); + else + pr_debug("skip work\n"); + + free(dw); +} + +static void dfu_work_cancel(struct work_struct *w) +{ + struct dfu_work *dw = container_of(w, struct dfu_work, work); + + free(dw); +} + +static void dfu_do_write(struct dfu_work *dw) +{ + struct f_dfu *dfu = dw->dfu; + ssize_t size, wlen = dw->len; + ssize_t ret; + + pr_debug("do write\n"); + + if (prog_erase && (dfu_written + wlen) > dfu_erased) { + size = roundup(wlen, dfu_mtdinfo.erasesize); + ret = erase(dfufd, size, dfu_erased); + dfu_erased += size; + if (ret && ret != -ENOSYS) { + perror("erase"); + dfu->dfu_state = DFU_STATE_dfuERROR; + dfu->dfu_status = DFU_STATUS_errERASE; + return; + } + } + + dfu_written += wlen; + ret = write(dfufd, dw->wbuf, wlen); + if (ret < wlen) { + perror("write"); + dfu->dfu_state = DFU_STATE_dfuERROR; + dfu->dfu_status = DFU_STATUS_errWRITE; + } +} + +static void dfu_do_read(struct dfu_work *dw) +{ + struct f_dfu *dfu = dw->dfu; + struct usb_composite_dev *cdev = dfu->func.config->cdev; + ssize_t size, rlen = dw->len; + + pr_debug("do read\n"); + + size = read(dfufd, dfu->dnreq->buf, rlen); + dfu->dnreq->length = size; + if (size < 0) { + perror("read"); + dfu->dnreq->length = 0; + dfu->dfu_state = DFU_STATE_dfuERROR; + dfu->dfu_status = DFU_STATUS_errFILE; + } else if (size < rlen) { + /* this is the last chunk, go to IDLE and close file */ + dfu_cleanup(dfu); + } + + dfu->dnreq->complete = up_complete; + usb_ep_queue(cdev->gadget->ep0, dfu->dnreq); +} + +static void dfu_do_open_dnload(struct dfu_work *dw) +{ + struct f_dfu *dfu = dw->dfu; + int ret; + + pr_debug("do open dnload\n"); + + if (dfu_file_entry->flags & FILE_LIST_FLAG_SAFE) { + dfufd = open(DFU_TEMPFILE, O_WRONLY | O_CREAT); + } else { + unsigned flags = O_WRONLY; + + if (dfu_file_entry->flags & FILE_LIST_FLAG_CREATE) + flags |= O_CREAT | O_TRUNC; + + dfufd = open(dfu_file_entry->filename, flags); + } + + if (dfufd < 0) { + perror("open"); + dfu->dfu_state = DFU_STATE_dfuERROR; + dfu->dfu_status = DFU_STATUS_errFILE; + return; + } + + if (!(dfu_file_entry->flags & FILE_LIST_FLAG_SAFE)) { + ret = ioctl(dfufd, MEMGETINFO, &dfu_mtdinfo); + if (!ret) /* file is on a mtd device */ + prog_erase = 1; + } +} + +static void dfu_do_open_upload(struct dfu_work *dw) +{ + struct f_dfu *dfu = dw->dfu; + + pr_debug("do open upload\n"); + + dfufd = open(dfu_file_entry->filename, O_RDONLY); + if (dfufd < 0) { + perror("open"); + dfu->dfu_state = DFU_STATE_dfuERROR; + dfu->dfu_status = DFU_STATUS_errFILE; + } +} + +static void dfu_do_close(struct dfu_work *dw) +{ + struct stat s; + + pr_debug("do close\n"); + + if (dfufd > 0) { + close(dfufd); + dfufd = -EINVAL; + } + + if (!stat(DFU_TEMPFILE, &s)) + unlink(DFU_TEMPFILE); +} + +static void dfu_do_copy(struct dfu_work *dw) +{ + struct f_dfu *dfu = dw->dfu; + unsigned flags = O_WRONLY; + int ret, fd; + + pr_debug("do copy\n"); + + if (dfu_file_entry->flags & FILE_LIST_FLAG_CREATE) + flags |= O_CREAT | O_TRUNC; + + fd = open(dfu_file_entry->filename, flags); + if (fd < 0) { + perror("open"); + dfu->dfu_state = DFU_STATE_dfuERROR; + dfu->dfu_status = DFU_STATUS_errERASE; + return; + } + + ret = erase(fd, ERASE_SIZE_ALL, 0); + close(fd); + if (ret && ret != -ENOSYS) { + perror("erase"); + dfu->dfu_state = DFU_STATE_dfuERROR; + dfu->dfu_status = DFU_STATUS_errERASE; + return; + } + + ret = copy_file(DFU_TEMPFILE, dfu_file_entry->filename, 0); + if (ret) { + pr_err("copy file failed\n"); + dfu->dfu_state = DFU_STATE_dfuERROR; + dfu->dfu_status = DFU_STATUS_errWRITE; + return; + } + + dfu->dfu_state = DFU_STATE_dfuIDLE; + dfu_do_close(dw); +} static int dfu_bind(struct usb_configuration *c, struct usb_function *f) @@ -224,6 +411,10 @@ dfu_bind(struct usb_configuration *c, struct usb_function *f) goto out; } + dfu->wq.fn = dfu_do_work; + dfu->wq.cancel = dfu_work_cancel; + wq_register(&dfu->wq); + /* allocate instance-specific interface IDs, and patch descriptors */ status = usb_interface_id(c, f); if (status < 0) @@ -279,6 +470,8 @@ dfu_unbind(struct usb_configuration *c, struct usb_function *f) dfu_file_entry = NULL; dfudetach = 0; + wq_unregister(&dfu->wq); + usb_free_all_descriptors(f); dma_free(dfu->dnreq->buf); @@ -321,47 +514,50 @@ static int dfu_status(struct usb_function *f, const struct usb_ctrlrequest *ctrl static void dfu_cleanup(struct f_dfu *dfu) { - struct stat s; + struct dfu_work *dw; + + pr_debug("dfu cleanup\n"); memset(&dfu_mtdinfo, 0, sizeof(dfu_mtdinfo)); dfu_written = 0; dfu_erased = 0; prog_erase = 0; - if (dfufd > 0) { - close(dfufd); - dfufd = -EINVAL; - } + dfu->dfu_state = DFU_STATE_dfuIDLE; + dfu->dfu_status = DFU_STATUS_OK; - if (!stat(DFU_TEMPFILE, &s)) - unlink(DFU_TEMPFILE); + dw = xzalloc(sizeof(*dw)); + dw->dfu = dfu; + dw->task = dfu_do_close; + wq_queue_work(&dfu->wq, &dw->work); } static void dn_complete(struct usb_ep *ep, struct usb_request *req) { struct f_dfu *dfu = req->context; - loff_t size; - int ret; + struct dfu_work *dw; + + dw = xzalloc(sizeof(*dw)); + dw->dfu = dfu; + dw->task = dfu_do_write; + dw->len = min_t(unsigned int, req->length, CONFIG_USBD_DFU_XFER_SIZE); + memcpy(dw->wbuf, req->buf, dw->len); + wq_queue_work(&dfu->wq, &dw->work); +} - if (prog_erase && (dfu_written + req->length) > dfu_erased) { - size = roundup(req->length, dfu_mtdinfo.erasesize); - ret = erase(dfufd, size, dfu_erased); - dfu_erased += size; - if (ret && ret != -ENOSYS) { - perror("erase"); - dfu->dfu_status = DFU_STATUS_errERASE; - dfu_cleanup(dfu); - return; - } - } +static int handle_manifest(struct usb_function *f, const struct usb_ctrlrequest *ctrl) +{ + struct f_dfu *dfu = func_to_dfu(f); + struct dfu_work *dw; - dfu_written += req->length; - ret = write(dfufd, req->buf, req->length); - if (ret < (int)req->length) { - perror("write"); - dfu->dfu_status = DFU_STATUS_errWRITE; - dfu_cleanup(dfu); + if (dfu_file_entry->flags & FILE_LIST_FLAG_SAFE) { + dw = xzalloc(sizeof(*dw)); + dw->dfu = dfu; + dw->task = dfu_do_copy; + wq_queue_work(&dfu->wq, &dw->work); } + + return 0; } static int handle_dnload(struct usb_function *f, const struct usb_ctrlrequest *ctrl) @@ -371,12 +567,8 @@ static int handle_dnload(struct usb_function *f, const struct usb_ctrlrequest *c u16 w_length = le16_to_cpu(ctrl->wLength); if (w_length == 0) { - if (dfu_file_entry->flags & FILE_LIST_FLAG_SAFE) { - dfu->dfu_state = DFU_STATE_dfuMANIFEST; - } else { - dfu->dfu_state = DFU_STATE_dfuIDLE; - dfu_cleanup(dfu); - } + handle_manifest(f, ctrl); + dfu->dfu_state = DFU_STATE_dfuMANIFEST; return 0; } @@ -387,53 +579,6 @@ static int handle_dnload(struct usb_function *f, const struct usb_ctrlrequest *c return 0; } -static int handle_manifest(struct usb_function *f, const struct usb_ctrlrequest *ctrl) -{ - struct f_dfu *dfu = func_to_dfu(f); - int ret; - - dfu->dfu_state = DFU_STATE_dfuIDLE; - - if (dfu_file_entry->flags & FILE_LIST_FLAG_SAFE) { - int fd; - unsigned flags = O_WRONLY; - - if (dfu_file_entry->flags & FILE_LIST_FLAG_CREATE) - flags |= O_CREAT | O_TRUNC; - - fd = open(dfu_file_entry->filename, flags); - if (fd < 0) { - perror("open"); - dfu->dfu_status = DFU_STATUS_errERASE; - ret = -EINVAL; - goto out; - } - - ret = erase(fd, ERASE_SIZE_ALL, 0); - close(fd); - if (ret && ret != -ENOSYS) { - dfu->dfu_status = DFU_STATUS_errERASE; - perror("erase"); - goto out; - } - - ret = copy_file(DFU_TEMPFILE, dfu_file_entry->filename, 0); - if (ret) { - pr_err("copy file failed\n"); - ret = -EINVAL; - goto out; - } - } - - return 0; - -out: - dfu->dfu_status = DFU_STATUS_errWRITE; - dfu->dfu_state = DFU_STATE_dfuERROR; - dfu_cleanup(dfu); - return ret; -} - static void up_complete(struct usb_ep *ep, struct usb_request *req) { } @@ -441,28 +586,22 @@ static void up_complete(struct usb_ep *ep, struct usb_request *req) static int handle_upload(struct usb_function *f, const struct usb_ctrlrequest *ctrl) { struct f_dfu *dfu = func_to_dfu(f); - struct usb_composite_dev *cdev = f->config->cdev; + struct dfu_work *dw; u16 w_length = le16_to_cpu(ctrl->wLength); - int len; - - len = read(dfufd, dfu->dnreq->buf, w_length); - dfu->dnreq->length = len; - if (len < w_length) { - dfu_cleanup(dfu); - dfu->dfu_state = DFU_STATE_dfuIDLE; - } - - dfu->dnreq->complete = up_complete; - usb_ep_queue(cdev->gadget->ep0, dfu->dnreq); + dw = xzalloc(sizeof(*dw)); + dw->dfu = dfu; + dw->task = dfu_do_read; + dw->len = w_length; + dw->rbuf = dfu->dnreq->buf; + wq_queue_work(&dfu->wq, &dw->work); return 0; } static void dfu_abort(struct f_dfu *dfu) { - dfu->dfu_state = DFU_STATE_dfuIDLE; - dfu->dfu_status = DFU_STATUS_OK; + wq_cancel_work(&dfu->wq); dfu_cleanup(dfu); } @@ -475,7 +614,7 @@ static int dfu_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl) int value = -EOPNOTSUPP; int w_length = le16_to_cpu(ctrl->wLength); int w_value = le16_to_cpu(ctrl->wValue); - int ret; + struct dfu_work *dw; if (ctrl->bRequestType == USB_DIR_IN && ctrl->bRequest == USB_REQ_GET_DESCRIPTOR && (w_value >> 8) == 0x21) { @@ -502,28 +641,10 @@ static int dfu_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl) goto out; } pr_debug("starting download to %s\n", dfu_file_entry->filename); - if (dfu_file_entry->flags & FILE_LIST_FLAG_SAFE) { - dfufd = open(DFU_TEMPFILE, O_WRONLY | O_CREAT); - } else { - unsigned flags = O_WRONLY; - - if (dfu_file_entry->flags & FILE_LIST_FLAG_CREATE) - flags |= O_CREAT | O_TRUNC; - - dfufd = open(dfu_file_entry->filename, flags); - } - - if (dfufd < 0) { - dfu->dfu_state = DFU_STATE_dfuERROR; - perror("open"); - goto out; - } - - if (!(dfu_file_entry->flags & FILE_LIST_FLAG_SAFE)) { - ret = ioctl(dfufd, MEMGETINFO, &dfu_mtdinfo); - if (!ret) /* file is on a mtd device */ - prog_erase = 1; - } + dw = xzalloc(sizeof(*dw)); + dw->dfu = dfu; + dw->task = dfu_do_open_dnload; + wq_queue_work(&dfu->wq, &dw->work); value = handle_dnload(f, ctrl); dfu->dfu_state = DFU_STATE_dfuDNLOAD_IDLE; @@ -535,12 +656,12 @@ static int dfu_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl) dfu->dfu_state = DFU_STATE_dfuERROR; goto out; } - dfufd = open(dfu_file_entry->filename, O_RDONLY); - if (dfufd < 0) { - dfu->dfu_state = DFU_STATE_dfuERROR; - perror("open"); - goto out; - } + + dw = xzalloc(sizeof(*dw)); + dw->dfu = dfu; + dw->task = dfu_do_open_upload; + wq_queue_work(&dfu->wq, &dw->work); + handle_upload(f, ctrl); return 0; case USB_REQ_DFU_ABORT: @@ -607,6 +728,7 @@ static int dfu_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl) } break; case DFU_STATE_dfuERROR: + wq_cancel_work(&dfu->wq); switch (ctrl->bRequest) { case USB_REQ_DFU_GETSTATUS: value = dfu_status(f, ctrl); @@ -648,10 +770,7 @@ static int dfu_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl) } break; case DFU_STATE_dfuMANIFEST: - value = handle_manifest(f, ctrl); - if (dfu->dfu_state != DFU_STATE_dfuIDLE) { - return 0; - } + dfu->dfu_state = DFU_STATE_dfuMANIFEST_SYNC; switch (ctrl->bRequest) { case USB_REQ_DFU_GETSTATUS: value = dfu_status(f, ctrl); @@ -693,9 +812,7 @@ static void dfu_disable(struct usb_function *f) { struct f_dfu *dfu = func_to_dfu(f); - dfu->dfu_state = DFU_STATE_dfuIDLE; - - dfu_cleanup(dfu); + dfu_abort(dfu); } #define STRING_MANUFACTURER_IDX 0 -- 2.17.1 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 1/2] fixup! usb: gadget: dfu: Wrap fs operation in workqueue 2021-02-15 14:18 ` [PATCH v2 2/2] usb: gadget: dfu: Wrap fs operation in workqueue Jules Maselbas @ 2021-03-01 9:30 ` Jules Maselbas 2021-03-01 9:30 ` [PATCH 2/2] " Jules Maselbas 2021-03-01 16:03 ` [PATCH 1/2] " Sascha Hauer 0 siblings, 2 replies; 15+ messages in thread From: Jules Maselbas @ 2021-03-01 9:30 UTC (permalink / raw) To: barebox; +Cc: Jules Maselbas, Ahmad Fatoum When not in mode "safe", do_close was never called. Signed-off-by: Jules Maselbas <jmaselbas@kalray.eu> --- drivers/usb/gadget/dfu.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/usb/gadget/dfu.c b/drivers/usb/gadget/dfu.c index 82c9dc030..3234f25b3 100644 --- a/drivers/usb/gadget/dfu.c +++ b/drivers/usb/gadget/dfu.c @@ -359,7 +359,6 @@ static void dfu_do_copy(struct dfu_work *dw) } dfu->dfu_state = DFU_STATE_dfuIDLE; - dfu_do_close(dw); } static int @@ -557,6 +556,11 @@ static int handle_manifest(struct usb_function *f, const struct usb_ctrlrequest wq_queue_work(&dfu->wq, &dw->work); } + dw = xzalloc(sizeof(*dw)); + dw->dfu = dfu; + dw->task = dfu_do_close; + wq_queue_work(&dfu->wq, &dw->work); + return 0; } -- 2.17.1 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 2/2] fixup! usb: gadget: dfu: Wrap fs operation in workqueue 2021-03-01 9:30 ` [PATCH 1/2] fixup! " Jules Maselbas @ 2021-03-01 9:30 ` Jules Maselbas 2021-03-01 16:03 ` [PATCH 1/2] " Sascha Hauer 1 sibling, 0 replies; 15+ messages in thread From: Jules Maselbas @ 2021-03-01 9:30 UTC (permalink / raw) To: barebox; +Cc: Jules Maselbas, Ahmad Fatoum Simplify the state handle, the idle state will only be entered from do_close. Signed-off-by: Jules Maselbas <jmaselbas@kalray.eu> --- drivers/usb/gadget/dfu.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/drivers/usb/gadget/dfu.c b/drivers/usb/gadget/dfu.c index 3234f25b3..1dc659953 100644 --- a/drivers/usb/gadget/dfu.c +++ b/drivers/usb/gadget/dfu.c @@ -320,6 +320,8 @@ static void dfu_do_close(struct dfu_work *dw) if (!stat(DFU_TEMPFILE, &s)) unlink(DFU_TEMPFILE); + + dw->dfu->dfu_state = DFU_STATE_dfuIDLE; } static void dfu_do_copy(struct dfu_work *dw) @@ -756,11 +758,8 @@ static int dfu_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl) case DFU_STATE_dfuMANIFEST_SYNC: switch (ctrl->bRequest) { case USB_REQ_DFU_GETSTATUS: + dfu->dfu_state = DFU_STATE_dfuMANIFEST; value = dfu_status(f, ctrl); - if (dfu_file_entry->flags & FILE_LIST_FLAG_SAFE) - dfu->dfu_state = DFU_STATE_dfuMANIFEST; - else - dfu->dfu_state = DFU_STATE_dfuIDLE; value = min(value, w_length); break; case USB_REQ_DFU_GETSTATE: -- 2.17.1 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/2] fixup! usb: gadget: dfu: Wrap fs operation in workqueue 2021-03-01 9:30 ` [PATCH 1/2] fixup! " Jules Maselbas 2021-03-01 9:30 ` [PATCH 2/2] " Jules Maselbas @ 2021-03-01 16:03 ` Sascha Hauer 2021-03-01 16:06 ` Jules Maselbas 1 sibling, 1 reply; 15+ messages in thread From: Sascha Hauer @ 2021-03-01 16:03 UTC (permalink / raw) To: Jules Maselbas; +Cc: barebox, Ahmad Fatoum On Mon, Mar 01, 2021 at 10:30:39AM +0100, Jules Maselbas wrote: > When not in mode "safe", do_close was never called. > > Signed-off-by: Jules Maselbas <jmaselbas@kalray.eu> > --- > drivers/usb/gadget/dfu.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) I have rewritten the commit messages while applying. fixup! is no longer possible because the patch is already in master. Applied, thanks Sascha > > diff --git a/drivers/usb/gadget/dfu.c b/drivers/usb/gadget/dfu.c > index 82c9dc030..3234f25b3 100644 > --- a/drivers/usb/gadget/dfu.c > +++ b/drivers/usb/gadget/dfu.c > @@ -359,7 +359,6 @@ static void dfu_do_copy(struct dfu_work *dw) > } > > dfu->dfu_state = DFU_STATE_dfuIDLE; > - dfu_do_close(dw); > } > > static int > @@ -557,6 +556,11 @@ static int handle_manifest(struct usb_function *f, const struct usb_ctrlrequest > wq_queue_work(&dfu->wq, &dw->work); > } > > + dw = xzalloc(sizeof(*dw)); > + dw->dfu = dfu; > + dw->task = dfu_do_close; > + wq_queue_work(&dfu->wq, &dw->work); > + > return 0; > } > > -- > 2.17.1 > > > -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/2] fixup! usb: gadget: dfu: Wrap fs operation in workqueue 2021-03-01 16:03 ` [PATCH 1/2] " Sascha Hauer @ 2021-03-01 16:06 ` Jules Maselbas 0 siblings, 0 replies; 15+ messages in thread From: Jules Maselbas @ 2021-03-01 16:06 UTC (permalink / raw) To: Sascha Hauer; +Cc: barebox, Ahmad Fatoum On Mon, Mar 01, 2021 at 05:03:31PM +0100, Sascha Hauer wrote: > On Mon, Mar 01, 2021 at 10:30:39AM +0100, Jules Maselbas wrote: > > When not in mode "safe", do_close was never called. > > > > Signed-off-by: Jules Maselbas <jmaselbas@kalray.eu> > > --- > > drivers/usb/gadget/dfu.c | 6 +++++- > > 1 file changed, 5 insertions(+), 1 deletion(-) > > I have rewritten the commit messages while applying. fixup! is no longer > possible because the patch is already in master. Ok thanks, I wasn't sure to send this as fixup or not. I'll take a look at master next time. > Applied, thanks > > Sascha > > > > > > diff --git a/drivers/usb/gadget/dfu.c b/drivers/usb/gadget/dfu.c > > index 82c9dc030..3234f25b3 100644 > > --- a/drivers/usb/gadget/dfu.c > > +++ b/drivers/usb/gadget/dfu.c > > @@ -359,7 +359,6 @@ static void dfu_do_copy(struct dfu_work *dw) > > } > > > > dfu->dfu_state = DFU_STATE_dfuIDLE; > > - dfu_do_close(dw); > > } > > > > static int > > @@ -557,6 +556,11 @@ static int handle_manifest(struct usb_function *f, const struct usb_ctrlrequest > > wq_queue_work(&dfu->wq, &dw->work); > > } > > > > + dw = xzalloc(sizeof(*dw)); > > + dw->dfu = dfu; > > + dw->task = dfu_do_close; > > + wq_queue_work(&dfu->wq, &dw->work); > > + > > return 0; > > } > > > > -- > > 2.17.1 > > > > > > > > -- > Pengutronix e.K. | | > Steuerwalder Str. 21 | http://www.pengutronix.de/ | > 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | > Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | > _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 1/2] usb: gadget: dfu: Rework print messages 2021-02-15 14:18 ` [PATCH v2 1/2] usb: gadget: dfu: Rework print messages Jules Maselbas 2021-02-15 14:18 ` [PATCH v2 2/2] usb: gadget: dfu: Wrap fs operation in workqueue Jules Maselbas @ 2021-02-16 9:19 ` Bartosz Bilas 2021-02-16 9:27 ` Sascha Hauer 2021-02-16 9:49 ` Jules Maselbas 1 sibling, 2 replies; 15+ messages in thread From: Bartosz Bilas @ 2021-02-16 9:19 UTC (permalink / raw) To: Jules Maselbas, barebox; +Cc: Ahmad Fatoum Hello Jules, On 15.02.2021 15:18, Jules Maselbas wrote: > Replace printf with pr_err and debug with pr_debug. > Defines "dfu :" as a prefix for formatted prints. > > --- > v1 -> v2: > - add `pr_fmt(fmt) "dfu: " fmt` > - change debug call to pr_debug > - remove "dfu: " in print messages > > Signed-off-by: Jules Maselbas <jmaselbas@kalray.eu> > --- > drivers/usb/gadget/dfu.c | 11 ++++++----- > 1 file changed, 6 insertions(+), 5 deletions(-) > > diff --git a/drivers/usb/gadget/dfu.c b/drivers/usb/gadget/dfu.c > index 9d6a9d252..fba4ad782 100644 > --- a/drivers/usb/gadget/dfu.c > +++ b/drivers/usb/gadget/dfu.c > @@ -32,6 +32,7 @@ > * checking? > * - make 'dnstate' attached to 'struct usb_device_instance' > */ > +#define pr_fmt(fmt) "dfu: " fmt > > #include <dma.h> > #include <asm/byteorder.h> > @@ -209,7 +210,7 @@ dfu_bind(struct usb_configuration *c, struct usb_function *f) > > dfu->dnreq = usb_ep_alloc_request(c->cdev->gadget->ep0); > if (!dfu->dnreq) { > - printf("usb_ep_alloc_request failed\n"); > + pr_err("dfu: usb_ep_alloc_request failed\n"); you have missed this one ^^^^^ Best Bartek > status = -ENOMEM; > goto out; > } > @@ -254,7 +255,7 @@ dfu_bind(struct usb_configuration *c, struct usb_function *f) > > i = 0; > file_list_for_each_entry(dfu_files, fentry) { > - printf("dfu: register alt%d(%s) with device %s\n", > + pr_err("register alt%d(%s) with device %s\n", > i, fentry->name, fentry->filename); > i++; > } > @@ -418,7 +419,7 @@ static int handle_manifest(struct usb_function *f, const struct usb_ctrlrequest > > ret = copy_file(DFU_TEMPFILE, dfu_file_entry->filename, 0); > if (ret) { > - printf("copy file failed\n"); > + pr_err("copy file failed\n"); > ret = -EINVAL; > goto out; > } > @@ -500,7 +501,7 @@ static int dfu_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl) > value = -EINVAL; > goto out; > } > - debug("dfu: starting download to %s\n", dfu_file_entry->filename); > + pr_debug("starting download to %s\n", dfu_file_entry->filename); > if (dfu_file_entry->flags & FILE_LIST_FLAG_SAFE) { > dfufd = open(DFU_TEMPFILE, O_WRONLY | O_CREAT); > } else { > @@ -529,7 +530,7 @@ static int dfu_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl) > return 0; > case USB_REQ_DFU_UPLOAD: > dfu->dfu_state = DFU_STATE_dfuUPLOAD_IDLE; > - debug("dfu: starting upload from %s\n", dfu_file_entry->filename); > + pr_debug("starting upload from %s\n", dfu_file_entry->filename); > if (!(dfu_file_entry->flags & FILE_LIST_FLAG_READBACK)) { > dfu->dfu_state = DFU_STATE_dfuERROR; > goto out; _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 1/2] usb: gadget: dfu: Rework print messages 2021-02-16 9:19 ` [PATCH v2 1/2] usb: gadget: dfu: Rework print messages Bartosz Bilas @ 2021-02-16 9:27 ` Sascha Hauer 2021-02-16 9:51 ` Jules Maselbas 2021-02-16 9:49 ` Jules Maselbas 1 sibling, 1 reply; 15+ messages in thread From: Sascha Hauer @ 2021-02-16 9:27 UTC (permalink / raw) To: Bartosz Bilas; +Cc: Jules Maselbas, Ahmad Fatoum, barebox On Tue, Feb 16, 2021 at 10:19:00AM +0100, Bartosz Bilas wrote: > Hello Jules, > > On 15.02.2021 15:18, Jules Maselbas wrote: > > Replace printf with pr_err and debug with pr_debug. > > Defines "dfu :" as a prefix for formatted prints. > > > > --- > > v1 -> v2: > > - add `pr_fmt(fmt) "dfu: " fmt` > > - change debug call to pr_debug > > - remove "dfu: " in print messages > > > > Signed-off-by: Jules Maselbas <jmaselbas@kalray.eu> > > --- > > drivers/usb/gadget/dfu.c | 11 ++++++----- > > 1 file changed, 6 insertions(+), 5 deletions(-) > > > > diff --git a/drivers/usb/gadget/dfu.c b/drivers/usb/gadget/dfu.c > > index 9d6a9d252..fba4ad782 100644 > > --- a/drivers/usb/gadget/dfu.c > > +++ b/drivers/usb/gadget/dfu.c > > @@ -32,6 +32,7 @@ > > * checking? > > * - make 'dnstate' attached to 'struct usb_device_instance' > > */ > > +#define pr_fmt(fmt) "dfu: " fmt > > #include <dma.h> > > #include <asm/byteorder.h> > > @@ -209,7 +210,7 @@ dfu_bind(struct usb_configuration *c, struct usb_function *f) > > dfu->dnreq = usb_ep_alloc_request(c->cdev->gadget->ep0); > > if (!dfu->dnreq) { > > - printf("usb_ep_alloc_request failed\n"); > > + pr_err("dfu: usb_ep_alloc_request failed\n"); > > you have missed this one ^^^^^ Fixed while applying, thanks Sascha -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 1/2] usb: gadget: dfu: Rework print messages 2021-02-16 9:27 ` Sascha Hauer @ 2021-02-16 9:51 ` Jules Maselbas 0 siblings, 0 replies; 15+ messages in thread From: Jules Maselbas @ 2021-02-16 9:51 UTC (permalink / raw) To: Sascha Hauer; +Cc: barebox, Bartosz Bilas, Ahmad Fatoum Hi Sascha, On Tue, Feb 16, 2021 at 10:27:29AM +0100, Sascha Hauer wrote: > > > @@ -209,7 +210,7 @@ dfu_bind(struct usb_configuration *c, struct usb_function *f) > > > dfu->dnreq = usb_ep_alloc_request(c->cdev->gadget->ep0); > > > if (!dfu->dnreq) { > > > - printf("usb_ep_alloc_request failed\n"); > > > + pr_err("dfu: usb_ep_alloc_request failed\n"); > > > > you have missed this one ^^^^^ > > Fixed while applying, thanks Thanks ! _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 1/2] usb: gadget: dfu: Rework print messages 2021-02-16 9:19 ` [PATCH v2 1/2] usb: gadget: dfu: Rework print messages Bartosz Bilas 2021-02-16 9:27 ` Sascha Hauer @ 2021-02-16 9:49 ` Jules Maselbas 1 sibling, 0 replies; 15+ messages in thread From: Jules Maselbas @ 2021-02-16 9:49 UTC (permalink / raw) To: Bartosz Bilas; +Cc: barebox, Ahmad Fatoum Hi Bartek, On Tue, Feb 16, 2021 at 10:19:00AM +0100, Bartosz Bilas wrote: > > @@ -209,7 +210,7 @@ dfu_bind(struct usb_configuration *c, struct usb_function *f) > > dfu->dnreq = usb_ep_alloc_request(c->cdev->gadget->ep0); > > if (!dfu->dnreq) { > > - printf("usb_ep_alloc_request failed\n"); > > + pr_err("dfu: usb_ep_alloc_request failed\n"); > > you have missed this one ^^^^^ > Thank you for catching this :] Best _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 3/3] usb: gadget: dfu: Replace printf with pr_err 2021-02-08 16:34 [PATCH 1/3] usb: gadget: dfu: Use func_to_dfu Jules Maselbas 2021-02-08 16:34 ` [PATCH 2/3] usb: gadget: dfu: Wrap fs operation in workqueue Jules Maselbas @ 2021-02-08 16:34 ` Jules Maselbas 2021-02-10 9:51 ` Ahmad Fatoum 2021-02-10 9:44 ` [PATCH 1/3] usb: gadget: dfu: Use func_to_dfu Sascha Hauer 2 siblings, 1 reply; 15+ messages in thread From: Jules Maselbas @ 2021-02-08 16:34 UTC (permalink / raw) To: barebox; +Cc: Jules Maselbas, Ahmad Fatoum Signed-off-by: Jules Maselbas <jmaselbas@kalray.eu> --- drivers/usb/gadget/dfu.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/usb/gadget/dfu.c b/drivers/usb/gadget/dfu.c index 95e8da82e..a28e7c9e8 100644 --- a/drivers/usb/gadget/dfu.c +++ b/drivers/usb/gadget/dfu.c @@ -351,7 +351,7 @@ static void dfu_do_copy(struct dfu_work *dw) ret = copy_file(DFU_TEMPFILE, dfu_file_entry->filename, 0); if (ret) { - printf("copy file failed\n"); + pr_err("dfu: copy file failed\n"); dfu->dfu_state = DFU_STATE_dfuERROR; dfu->dfu_status = DFU_STATUS_errWRITE; return; @@ -396,7 +396,7 @@ dfu_bind(struct usb_configuration *c, struct usb_function *f) dfu->dnreq = usb_ep_alloc_request(c->cdev->gadget->ep0); if (!dfu->dnreq) { - printf("usb_ep_alloc_request failed\n"); + pr_err("dfu: usb_ep_alloc_request failed\n"); status = -ENOMEM; goto out; } @@ -445,7 +445,7 @@ dfu_bind(struct usb_configuration *c, struct usb_function *f) i = 0; file_list_for_each_entry(dfu_files, fentry) { - printf("dfu: register alt%d(%s) with device %s\n", + pr_err("dfu: register alt%d(%s) with device %s\n", i, fentry->name, fentry->filename); i++; } -- 2.17.1 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 3/3] usb: gadget: dfu: Replace printf with pr_err 2021-02-08 16:34 ` [PATCH 3/3] usb: gadget: dfu: Replace printf with pr_err Jules Maselbas @ 2021-02-10 9:51 ` Ahmad Fatoum 0 siblings, 0 replies; 15+ messages in thread From: Ahmad Fatoum @ 2021-02-10 9:51 UTC (permalink / raw) To: Jules Maselbas, barebox Hello Jules, On 08.02.21 17:34, Jules Maselbas wrote: > Signed-off-by: Jules Maselbas <jmaselbas@kalray.eu> > --- > drivers/usb/gadget/dfu.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/drivers/usb/gadget/dfu.c b/drivers/usb/gadget/dfu.c > index 95e8da82e..a28e7c9e8 100644 > --- a/drivers/usb/gadget/dfu.c > +++ b/drivers/usb/gadget/dfu.c > @@ -351,7 +351,7 @@ static void dfu_do_copy(struct dfu_work *dw) > > ret = copy_file(DFU_TEMPFILE, dfu_file_entry->filename, 0); > if (ret) { > - printf("copy file failed\n"); > + pr_err("dfu: copy file failed\n"); Like with Linux, you could define pr_fmt(fmt) "dfu: " fmt before including any headers and that prefix will be applied for all pr_ in that file. > dfu->dfu_state = DFU_STATE_dfuERROR; > dfu->dfu_status = DFU_STATUS_errWRITE; > return; > @@ -396,7 +396,7 @@ dfu_bind(struct usb_configuration *c, struct usb_function *f) > > dfu->dnreq = usb_ep_alloc_request(c->cdev->gadget->ep0); > if (!dfu->dnreq) { > - printf("usb_ep_alloc_request failed\n"); > + pr_err("dfu: usb_ep_alloc_request failed\n"); > status = -ENOMEM; > goto out; > } > @@ -445,7 +445,7 @@ dfu_bind(struct usb_configuration *c, struct usb_function *f) > > i = 0; > file_list_for_each_entry(dfu_files, fentry) { > - printf("dfu: register alt%d(%s) with device %s\n", > + pr_err("dfu: register alt%d(%s) with device %s\n", > i, fentry->name, fentry->filename); > i++; > } > -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/3] usb: gadget: dfu: Use func_to_dfu 2021-02-08 16:34 [PATCH 1/3] usb: gadget: dfu: Use func_to_dfu Jules Maselbas 2021-02-08 16:34 ` [PATCH 2/3] usb: gadget: dfu: Wrap fs operation in workqueue Jules Maselbas 2021-02-08 16:34 ` [PATCH 3/3] usb: gadget: dfu: Replace printf with pr_err Jules Maselbas @ 2021-02-10 9:44 ` Sascha Hauer 2 siblings, 0 replies; 15+ messages in thread From: Sascha Hauer @ 2021-02-10 9:44 UTC (permalink / raw) To: Jules Maselbas; +Cc: barebox, Ahmad Fatoum On Mon, Feb 08, 2021 at 05:34:56PM +0100, Jules Maselbas wrote: > Replace the uses of container_of with func_to_dfu when available. > > Signed-off-by: Jules Maselbas <jmaselbas@kalray.eu> > --- > drivers/usb/gadget/dfu.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) Applied, thanks Sascha > > diff --git a/drivers/usb/gadget/dfu.c b/drivers/usb/gadget/dfu.c > index 7e23fa315..9d6a9d252 100644 > --- a/drivers/usb/gadget/dfu.c > +++ b/drivers/usb/gadget/dfu.c > @@ -181,7 +181,7 @@ dfu_bind(struct usb_configuration *c, struct usb_function *f) > struct usb_descriptor_header **header; > struct usb_interface_descriptor *desc; > struct file_list_entry *fentry; > - struct f_dfu *dfu = container_of(f, struct f_dfu, func); > + struct f_dfu *dfu = func_to_dfu(f); > int i; > int status; > struct usb_string *us; > @@ -863,7 +863,7 @@ out: > > static void dfu_free_func(struct usb_function *f) > { > - struct f_dfu *dfu = container_of(f, struct f_dfu, func); > + struct f_dfu *dfu = func_to_dfu(f); > > free(dfu); > } > -- > 2.17.1 > > > -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2021-03-01 16:07 UTC | newest] Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2021-02-08 16:34 [PATCH 1/3] usb: gadget: dfu: Use func_to_dfu Jules Maselbas 2021-02-08 16:34 ` [PATCH 2/3] usb: gadget: dfu: Wrap fs operation in workqueue Jules Maselbas 2021-02-15 14:18 ` [PATCH v2 1/2] usb: gadget: dfu: Rework print messages Jules Maselbas 2021-02-15 14:18 ` [PATCH v2 2/2] usb: gadget: dfu: Wrap fs operation in workqueue Jules Maselbas 2021-03-01 9:30 ` [PATCH 1/2] fixup! " Jules Maselbas 2021-03-01 9:30 ` [PATCH 2/2] " Jules Maselbas 2021-03-01 16:03 ` [PATCH 1/2] " Sascha Hauer 2021-03-01 16:06 ` Jules Maselbas 2021-02-16 9:19 ` [PATCH v2 1/2] usb: gadget: dfu: Rework print messages Bartosz Bilas 2021-02-16 9:27 ` Sascha Hauer 2021-02-16 9:51 ` Jules Maselbas 2021-02-16 9:49 ` Jules Maselbas 2021-02-08 16:34 ` [PATCH 3/3] usb: gadget: dfu: Replace printf with pr_err Jules Maselbas 2021-02-10 9:51 ` Ahmad Fatoum 2021-02-10 9:44 ` [PATCH 1/3] usb: gadget: dfu: Use func_to_dfu Sascha Hauer
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox