From: Greg Kroah-Hartman Date: Wed, 26 Oct 2022 14:57:14 +0000 (+0200) Subject: 5.15-stable patches X-Git-Tag: v5.10.151~58 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9ac4433705f120c7b8895a3e3955556b9409c660;p=thirdparty%2Fkernel%2Fstable-queue.git 5.15-stable patches added patches: usb-gadget-uvc-consistently-use-define-for-headerlen.patch usb-gadget-uvc-giveback-vb2-buffer-on-req-complete.patch usb-gadget-uvc-improve-sg-exit-condition.patch usb-gadget-uvc-rework-uvcg_queue_next_buffer-to-uvcg_complete_buffer.patch usb-gadget-uvc-use-on-returned-header-len-in-video_encode_isoc_sg.patch --- diff --git a/queue-5.15/series b/queue-5.15/series index dc4515ead95..b20c09b1393 100644 --- a/queue-5.15/series +++ b/queue-5.15/series @@ -1,2 +1,7 @@ r8152-add-pid-for-the-lenovo-onelink-dock.patch arm64-mm-consolidate-tcr_el1-fields.patch +usb-gadget-uvc-consistently-use-define-for-headerlen.patch +usb-gadget-uvc-use-on-returned-header-len-in-video_encode_isoc_sg.patch +usb-gadget-uvc-rework-uvcg_queue_next_buffer-to-uvcg_complete_buffer.patch +usb-gadget-uvc-giveback-vb2-buffer-on-req-complete.patch +usb-gadget-uvc-improve-sg-exit-condition.patch diff --git a/queue-5.15/usb-gadget-uvc-consistently-use-define-for-headerlen.patch b/queue-5.15/usb-gadget-uvc-consistently-use-define-for-headerlen.patch new file mode 100644 index 00000000000..14284289040 --- /dev/null +++ b/queue-5.15/usb-gadget-uvc-consistently-use-define-for-headerlen.patch @@ -0,0 +1,78 @@ +From 859c675d84d488e2f9b515c713ea890c9f045f0c Mon Sep 17 00:00:00 2001 +From: Michael Grzeschik +Date: Mon, 18 Oct 2021 09:20:59 +0200 +Subject: usb: gadget: uvc: consistently use define for headerlen + +From: Michael Grzeschik + +commit 859c675d84d488e2f9b515c713ea890c9f045f0c upstream. + +The uvc request headerlen of 2 was defined as UVCG_REQUEST_HEADER_LEN +in commit e81e7f9a0eb9 ("usb: gadget: uvc: add scatter gather support"). +We missed to use it consistently. This patch fixes that. + +Reviewed-by: Paul Elder +Signed-off-by: Michael Grzeschik +Link: https://lore.kernel.org/r/20211018072059.11465-1-m.grzeschik@pengutronix.de +Reviewed-by: Laurent Pinchart +Cc: Dan Vacura +Signed-off-by: Greg Kroah-Hartman +--- + drivers/usb/gadget/function/uvc.h | 4 +++- + drivers/usb/gadget/function/uvc_video.c | 6 +++--- + drivers/usb/gadget/function/uvc_video.h | 2 -- + 3 files changed, 6 insertions(+), 6 deletions(-) + +--- a/drivers/usb/gadget/function/uvc.h ++++ b/drivers/usb/gadget/function/uvc.h +@@ -69,6 +69,8 @@ extern unsigned int uvc_gadget_trace_par + #define UVC_MAX_REQUEST_SIZE 64 + #define UVC_MAX_EVENTS 4 + ++#define UVCG_REQUEST_HEADER_LEN 2 ++ + /* ------------------------------------------------------------------------ + * Structures + */ +@@ -77,7 +79,7 @@ struct uvc_request { + u8 *req_buffer; + struct uvc_video *video; + struct sg_table sgt; +- u8 header[2]; ++ u8 header[UVCG_REQUEST_HEADER_LEN]; + }; + + struct uvc_video { +--- a/drivers/usb/gadget/function/uvc_video.c ++++ b/drivers/usb/gadget/function/uvc_video.c +@@ -33,7 +33,7 @@ uvc_video_encode_header(struct uvc_video + if (buf->bytesused - video->queue.buf_used <= len - UVCG_REQUEST_HEADER_LEN) + data[1] |= UVC_STREAM_EOF; + +- return 2; ++ return UVCG_REQUEST_HEADER_LEN; + } + + static int +@@ -302,8 +302,8 @@ uvc_video_alloc_requests(struct uvc_vide + list_add_tail(&video->ureq[i].req->list, &video->req_free); + /* req_size/PAGE_SIZE + 1 for overruns and + 1 for header */ + sg_alloc_table(&video->ureq[i].sgt, +- DIV_ROUND_UP(req_size - 2, PAGE_SIZE) + 2, +- GFP_KERNEL); ++ DIV_ROUND_UP(req_size - UVCG_REQUEST_HEADER_LEN, ++ PAGE_SIZE) + 2, GFP_KERNEL); + } + + video->req_size = req_size; +--- a/drivers/usb/gadget/function/uvc_video.h ++++ b/drivers/usb/gadget/function/uvc_video.h +@@ -12,8 +12,6 @@ + #ifndef __UVC_VIDEO_H__ + #define __UVC_VIDEO_H__ + +-#define UVCG_REQUEST_HEADER_LEN 2 +- + struct uvc_video; + + int uvcg_video_enable(struct uvc_video *video, int enable); diff --git a/queue-5.15/usb-gadget-uvc-giveback-vb2-buffer-on-req-complete.patch b/queue-5.15/usb-gadget-uvc-giveback-vb2-buffer-on-req-complete.patch new file mode 100644 index 00000000000..bb8e7979004 --- /dev/null +++ b/queue-5.15/usb-gadget-uvc-giveback-vb2-buffer-on-req-complete.patch @@ -0,0 +1,93 @@ +From 9b969f93bcef9b3d9e92f1810e22bbd6c344a0e5 Mon Sep 17 00:00:00 2001 +From: Michael Grzeschik +Date: Sun, 3 Apr 2022 01:27:43 +0200 +Subject: usb: gadget: uvc: giveback vb2 buffer on req complete + +From: Michael Grzeschik + +commit 9b969f93bcef9b3d9e92f1810e22bbd6c344a0e5 upstream. + +On uvc_video_encode_isoc_sg the mapped vb2 buffer is returned +to early. Only after the last usb_request worked with the buffer +it is allowed to give it back to vb2. This patch fixes that. + +Signed-off-by: Michael Grzeschik +Link: https://lore.kernel.org/r/20220402232744.3622565-3-m.grzeschik@pengutronix.de +Cc: Dan Vacura +Signed-off-by: Greg Kroah-Hartman +--- + drivers/usb/gadget/function/uvc.h | 1 + + drivers/usb/gadget/function/uvc_queue.c | 2 -- + drivers/usb/gadget/function/uvc_video.c | 11 ++++++++++- + 3 files changed, 11 insertions(+), 3 deletions(-) + +--- a/drivers/usb/gadget/function/uvc.h ++++ b/drivers/usb/gadget/function/uvc.h +@@ -80,6 +80,7 @@ struct uvc_request { + struct uvc_video *video; + struct sg_table sgt; + u8 header[UVCG_REQUEST_HEADER_LEN]; ++ struct uvc_buffer *last_buf; + }; + + struct uvc_video { +--- a/drivers/usb/gadget/function/uvc_queue.c ++++ b/drivers/usb/gadget/function/uvc_queue.c +@@ -345,8 +345,6 @@ void uvcg_complete_buffer(struct uvc_vid + return; + } + +- list_del(&buf->queue); +- + buf->buf.field = V4L2_FIELD_NONE; + buf->buf.sequence = queue->sequence++; + buf->buf.vb2_buf.timestamp = ktime_get_ns(); +--- a/drivers/usb/gadget/function/uvc_video.c ++++ b/drivers/usb/gadget/function/uvc_video.c +@@ -83,6 +83,7 @@ uvc_video_encode_bulk(struct usb_request + if (buf->bytesused == video->queue.buf_used) { + video->queue.buf_used = 0; + buf->state = UVC_BUF_STATE_DONE; ++ list_del(&buf->queue); + uvcg_complete_buffer(&video->queue, buf); + video->fid ^= UVC_STREAM_FID; + +@@ -154,8 +155,9 @@ uvc_video_encode_isoc_sg(struct usb_requ + video->queue.buf_used = 0; + buf->state = UVC_BUF_STATE_DONE; + buf->offset = 0; +- uvcg_complete_buffer(&video->queue, buf); ++ list_del(&buf->queue); + video->fid ^= UVC_STREAM_FID; ++ ureq->last_buf = buf; + } + } + +@@ -181,6 +183,7 @@ uvc_video_encode_isoc(struct usb_request + if (buf->bytesused == video->queue.buf_used) { + video->queue.buf_used = 0; + buf->state = UVC_BUF_STATE_DONE; ++ list_del(&buf->queue); + uvcg_complete_buffer(&video->queue, buf); + video->fid ^= UVC_STREAM_FID; + } +@@ -231,6 +234,11 @@ uvc_video_complete(struct usb_ep *ep, st + uvcg_queue_cancel(queue, 0); + } + ++ if (ureq->last_buf) { ++ uvcg_complete_buffer(&video->queue, ureq->last_buf); ++ ureq->last_buf = NULL; ++ } ++ + spin_lock_irqsave(&video->req_lock, flags); + list_add_tail(&req->list, &video->req_free); + spin_unlock_irqrestore(&video->req_lock, flags); +@@ -298,6 +306,7 @@ uvc_video_alloc_requests(struct uvc_vide + video->ureq[i].req->complete = uvc_video_complete; + video->ureq[i].req->context = &video->ureq[i]; + video->ureq[i].video = video; ++ video->ureq[i].last_buf = NULL; + + list_add_tail(&video->ureq[i].req->list, &video->req_free); + /* req_size/PAGE_SIZE + 1 for overruns and + 1 for header */ diff --git a/queue-5.15/usb-gadget-uvc-improve-sg-exit-condition.patch b/queue-5.15/usb-gadget-uvc-improve-sg-exit-condition.patch new file mode 100644 index 00000000000..d86207e8707 --- /dev/null +++ b/queue-5.15/usb-gadget-uvc-improve-sg-exit-condition.patch @@ -0,0 +1,32 @@ +From aef11279888c00e1841a3533a35d279285af3a51 Mon Sep 17 00:00:00 2001 +From: Michael Grzeschik +Date: Sun, 3 Apr 2022 01:27:44 +0200 +Subject: usb: gadget: uvc: improve sg exit condition + +From: Michael Grzeschik + +commit aef11279888c00e1841a3533a35d279285af3a51 upstream. + +The exit condition to quit iterating over the sg_list, while encoding +the sg entries, has to consider the case that the dma_len of the entry +could be zero. This patch takes this condition to account. + +Signed-off-by: Michael Grzeschik +Link: https://lore.kernel.org/r/20220402232744.3622565-4-m.grzeschik@pengutronix.de +Cc: Dan Vacura +Signed-off-by: Greg Kroah-Hartman +--- + drivers/usb/gadget/function/uvc_video.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/usb/gadget/function/uvc_video.c ++++ b/drivers/usb/gadget/function/uvc_video.c +@@ -126,7 +126,7 @@ uvc_video_encode_isoc_sg(struct usb_requ + sg = sg_next(sg); + + for_each_sg(sg, iter, ureq->sgt.nents - 1, i) { +- if (!len || !buf->sg) ++ if (!len || !buf->sg || !sg_dma_len(buf->sg)) + break; + + sg_left = sg_dma_len(buf->sg) - buf->offset; diff --git a/queue-5.15/usb-gadget-uvc-rework-uvcg_queue_next_buffer-to-uvcg_complete_buffer.patch b/queue-5.15/usb-gadget-uvc-rework-uvcg_queue_next_buffer-to-uvcg_complete_buffer.patch new file mode 100644 index 00000000000..7643e739c05 --- /dev/null +++ b/queue-5.15/usb-gadget-uvc-rework-uvcg_queue_next_buffer-to-uvcg_complete_buffer.patch @@ -0,0 +1,104 @@ +From 61aa709ca58a0dbeeb817bfa9230c1a92979f2c6 Mon Sep 17 00:00:00 2001 +From: Michael Grzeschik +Date: Sun, 3 Apr 2022 01:27:42 +0200 +Subject: usb: gadget: uvc: rework uvcg_queue_next_buffer to uvcg_complete_buffer + +From: Michael Grzeschik + +commit 61aa709ca58a0dbeeb817bfa9230c1a92979f2c6 upstream. + +The function uvcg_queue_next_buffer is used different than its name +suggests. The return value nextbuf is never used by any caller. This +patch reworks the function to its actual purpose, by removing the unused +code and renaming it. The function name uvcg_complete_buffer makes it +more clear that it is actually marking the current video buffer as +complete. + +Signed-off-by: Michael Grzeschik +Link: https://lore.kernel.org/r/20220402232744.3622565-2-m.grzeschik@pengutronix.de +Cc: Dan Vacura +Signed-off-by: Greg Kroah-Hartman +--- + drivers/usb/gadget/function/uvc_queue.c | 13 ++----------- + drivers/usb/gadget/function/uvc_queue.h | 2 +- + drivers/usb/gadget/function/uvc_video.c | 6 +++--- + 3 files changed, 6 insertions(+), 15 deletions(-) + +--- a/drivers/usb/gadget/function/uvc_queue.c ++++ b/drivers/usb/gadget/function/uvc_queue.c +@@ -335,24 +335,17 @@ int uvcg_queue_enable(struct uvc_video_q + } + + /* called with &queue_irqlock held.. */ +-struct uvc_buffer *uvcg_queue_next_buffer(struct uvc_video_queue *queue, ++void uvcg_complete_buffer(struct uvc_video_queue *queue, + struct uvc_buffer *buf) + { +- struct uvc_buffer *nextbuf; +- + if ((queue->flags & UVC_QUEUE_DROP_INCOMPLETE) && + buf->length != buf->bytesused) { + buf->state = UVC_BUF_STATE_QUEUED; + vb2_set_plane_payload(&buf->buf.vb2_buf, 0, 0); +- return buf; ++ return; + } + + list_del(&buf->queue); +- if (!list_empty(&queue->irqqueue)) +- nextbuf = list_first_entry(&queue->irqqueue, struct uvc_buffer, +- queue); +- else +- nextbuf = NULL; + + buf->buf.field = V4L2_FIELD_NONE; + buf->buf.sequence = queue->sequence++; +@@ -360,8 +353,6 @@ struct uvc_buffer *uvcg_queue_next_buffe + + vb2_set_plane_payload(&buf->buf.vb2_buf, 0, buf->bytesused); + vb2_buffer_done(&buf->buf.vb2_buf, VB2_BUF_STATE_DONE); +- +- return nextbuf; + } + + struct uvc_buffer *uvcg_queue_head(struct uvc_video_queue *queue) +--- a/drivers/usb/gadget/function/uvc_queue.h ++++ b/drivers/usb/gadget/function/uvc_queue.h +@@ -93,7 +93,7 @@ void uvcg_queue_cancel(struct uvc_video_ + + int uvcg_queue_enable(struct uvc_video_queue *queue, int enable); + +-struct uvc_buffer *uvcg_queue_next_buffer(struct uvc_video_queue *queue, ++void uvcg_complete_buffer(struct uvc_video_queue *queue, + struct uvc_buffer *buf); + + struct uvc_buffer *uvcg_queue_head(struct uvc_video_queue *queue); +--- a/drivers/usb/gadget/function/uvc_video.c ++++ b/drivers/usb/gadget/function/uvc_video.c +@@ -83,7 +83,7 @@ uvc_video_encode_bulk(struct usb_request + if (buf->bytesused == video->queue.buf_used) { + video->queue.buf_used = 0; + buf->state = UVC_BUF_STATE_DONE; +- uvcg_queue_next_buffer(&video->queue, buf); ++ uvcg_complete_buffer(&video->queue, buf); + video->fid ^= UVC_STREAM_FID; + + video->payload_size = 0; +@@ -154,7 +154,7 @@ uvc_video_encode_isoc_sg(struct usb_requ + video->queue.buf_used = 0; + buf->state = UVC_BUF_STATE_DONE; + buf->offset = 0; +- uvcg_queue_next_buffer(&video->queue, buf); ++ uvcg_complete_buffer(&video->queue, buf); + video->fid ^= UVC_STREAM_FID; + } + } +@@ -181,7 +181,7 @@ uvc_video_encode_isoc(struct usb_request + if (buf->bytesused == video->queue.buf_used) { + video->queue.buf_used = 0; + buf->state = UVC_BUF_STATE_DONE; +- uvcg_queue_next_buffer(&video->queue, buf); ++ uvcg_complete_buffer(&video->queue, buf); + video->fid ^= UVC_STREAM_FID; + } + } diff --git a/queue-5.15/usb-gadget-uvc-use-on-returned-header-len-in-video_encode_isoc_sg.patch b/queue-5.15/usb-gadget-uvc-use-on-returned-header-len-in-video_encode_isoc_sg.patch new file mode 100644 index 00000000000..9cca2b47229 --- /dev/null +++ b/queue-5.15/usb-gadget-uvc-use-on-returned-header-len-in-video_encode_isoc_sg.patch @@ -0,0 +1,61 @@ +From f262ce66d40cc6858d1fcb11e7b7f960448a4f38 Mon Sep 17 00:00:00 2001 +From: Michael Grzeschik +Date: Fri, 22 Oct 2021 11:32:22 +0200 +Subject: usb: gadget: uvc: use on returned header len in video_encode_isoc_sg + +From: Michael Grzeschik + +commit f262ce66d40cc6858d1fcb11e7b7f960448a4f38 upstream. + +The function uvc_video_encode_header function returns the number of +bytes used for the header. We change the video_encode_isoc_sg function +to use the returned header_len rather than UVCG_REQUEST_HEADER_LEN and +make the encode function more flexible. + +Signed-off-by: Michael Grzeschik +Link: https://lore.kernel.org/r/20211022093223.26493-1-m.grzeschik@pengutronix.de +Cc: Dan Vacura +Signed-off-by: Greg Kroah-Hartman +--- + drivers/usb/gadget/function/uvc_video.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +--- a/drivers/usb/gadget/function/uvc_video.c ++++ b/drivers/usb/gadget/function/uvc_video.c +@@ -104,22 +104,22 @@ uvc_video_encode_isoc_sg(struct usb_requ + unsigned int len = video->req_size; + unsigned int sg_left, part = 0; + unsigned int i; +- int ret; ++ int header_len; + + sg = ureq->sgt.sgl; + sg_init_table(sg, ureq->sgt.nents); + + /* Init the header. */ +- ret = uvc_video_encode_header(video, buf, ureq->header, ++ header_len = uvc_video_encode_header(video, buf, ureq->header, + video->req_size); +- sg_set_buf(sg, ureq->header, UVCG_REQUEST_HEADER_LEN); +- len -= ret; ++ sg_set_buf(sg, ureq->header, header_len); ++ len -= header_len; + + if (pending <= len) + len = pending; + + req->length = (len == pending) ? +- len + UVCG_REQUEST_HEADER_LEN : video->req_size; ++ len + header_len : video->req_size; + + /* Init the pending sgs with payload */ + sg = sg_next(sg); +@@ -148,7 +148,7 @@ uvc_video_encode_isoc_sg(struct usb_requ + req->num_sgs = i + 1; + + req->length -= len; +- video->queue.buf_used += req->length - UVCG_REQUEST_HEADER_LEN; ++ video->queue.buf_used += req->length - header_len; + + if (buf->bytesused == video->queue.buf_used || !buf->sg) { + video->queue.buf_used = 0;