Skip to content

Commit

Permalink
usb: gadget: uvc: stop pump thread on video disable
Browse files Browse the repository at this point in the history
Since the uvc-video gadget driver is using the v4l2 interface,
the streamon and streamoff can be triggered at any times. To ensure
that the pump worker will be closed as soon the userspace is
calling streamoff we synchronize the state of the gadget ensuring
the pump worker to bail out.

Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
Link: https://lore.kernel.org/r/20230911140530.2995138-2-m.grzeschik@pengutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Michael Grzeschik authored and Greg Kroah-Hartman committed Oct 2, 2023
1 parent 0ea39e0 commit 3a63f86
Showing 1 changed file with 7 additions and 1 deletion.
8 changes: 7 additions & 1 deletion drivers/usb/gadget/function/uvc_video.c
Original file line number Diff line number Diff line change
Expand Up @@ -384,13 +384,14 @@ static void uvcg_video_pump(struct work_struct *work)
struct uvc_video_queue *queue = &video->queue;
/* video->max_payload_size is only set when using bulk transfer */
bool is_bulk = video->max_payload_size;
struct uvc_device *uvc = video->uvc;
struct usb_request *req = NULL;
struct uvc_buffer *buf;
unsigned long flags;
bool buf_done;
int ret;

while (video->ep->enabled) {
while (video->ep->enabled && uvc->state == UVC_STATE_STREAMING) {
/*
* Retrieve the first available USB request, protected by the
* request lock.
Expand Down Expand Up @@ -488,6 +489,7 @@ static void uvcg_video_pump(struct work_struct *work)
*/
int uvcg_video_enable(struct uvc_video *video, int enable)
{
struct uvc_device *uvc = video->uvc;
unsigned int i;
int ret;

Expand All @@ -498,6 +500,8 @@ int uvcg_video_enable(struct uvc_video *video, int enable)
}

if (!enable) {
uvc->state = UVC_STATE_CONNECTED;

cancel_work_sync(&video->pump);
uvcg_queue_cancel(&video->queue, 0);

Expand All @@ -523,6 +527,8 @@ int uvcg_video_enable(struct uvc_video *video, int enable)
video->encode = video->queue.use_sg ?
uvc_video_encode_isoc_sg : uvc_video_encode_isoc;

uvc->state = UVC_STATE_STREAMING;

video->req_int_count = 0;

queue_work(video->async_wq, &video->pump);
Expand Down

0 comments on commit 3a63f86

Please sign in to comment.