summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/usb/gadget/function/uvc_video.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/usb/gadget/function/uvc_video.c b/drivers/usb/gadget/function/uvc_video.c
index 91af3b1ef0d4..4b68a3a9815d 100644
--- a/drivers/usb/gadget/function/uvc_video.c
+++ b/drivers/usb/gadget/function/uvc_video.c
@@ -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.
@@ -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;
@@ -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);
@@ -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);