| From 8035bc092ec20901641d69bd3e73e7b37548f888 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 10 Aug 2018 15:42:03 +0300 |
| Subject: usb: gadget: uvc: Factor out video USB request queueing |
| |
| From: Laurent Pinchart <laurent.pinchart@ideasonboard.com> |
| |
| [ Upstream commit 9d1ff5dcb3cd3390b1e56f1c24ae42c72257c4a3 ] |
| |
| USB requests for video data are queued from two different locations in |
| the driver, with the same code block occurring twice. Factor it out to a |
| function. |
| |
| Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> |
| Reviewed-by: Paul Elder <paul.elder@ideasonboard.com> |
| Tested-by: Paul Elder <paul.elder@ideasonboard.com> |
| Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/usb/gadget/function/uvc_video.c | 30 ++++++++++++++++--------- |
| 1 file changed, 20 insertions(+), 10 deletions(-) |
| |
| diff --git a/drivers/usb/gadget/function/uvc_video.c b/drivers/usb/gadget/function/uvc_video.c |
| index d3567b90343a4..a95c8e2364edc 100644 |
| --- a/drivers/usb/gadget/function/uvc_video.c |
| +++ b/drivers/usb/gadget/function/uvc_video.c |
| @@ -125,6 +125,19 @@ uvc_video_encode_isoc(struct usb_request *req, struct uvc_video *video, |
| * Request handling |
| */ |
| |
| +static int uvcg_video_ep_queue(struct uvc_video *video, struct usb_request *req) |
| +{ |
| + int ret; |
| + |
| + ret = usb_ep_queue(video->ep, req, GFP_ATOMIC); |
| + if (ret < 0) { |
| + printk(KERN_INFO "Failed to queue request (%d).\n", ret); |
| + usb_ep_set_halt(video->ep); |
| + } |
| + |
| + return ret; |
| +} |
| + |
| /* |
| * I somehow feel that synchronisation won't be easy to achieve here. We have |
| * three events that control USB requests submission: |
| @@ -189,14 +202,13 @@ uvc_video_complete(struct usb_ep *ep, struct usb_request *req) |
| |
| video->encode(req, video, buf); |
| |
| - if ((ret = usb_ep_queue(ep, req, GFP_ATOMIC)) < 0) { |
| - printk(KERN_INFO "Failed to queue request (%d).\n", ret); |
| - usb_ep_set_halt(ep); |
| - spin_unlock_irqrestore(&video->queue.irqlock, flags); |
| + ret = uvcg_video_ep_queue(video, req); |
| + spin_unlock_irqrestore(&video->queue.irqlock, flags); |
| + |
| + if (ret < 0) { |
| uvcg_queue_cancel(queue, 0); |
| goto requeue; |
| } |
| - spin_unlock_irqrestore(&video->queue.irqlock, flags); |
| |
| return; |
| |
| @@ -316,15 +328,13 @@ int uvcg_video_pump(struct uvc_video *video) |
| video->encode(req, video, buf); |
| |
| /* Queue the USB request */ |
| - ret = usb_ep_queue(video->ep, req, GFP_ATOMIC); |
| + ret = uvcg_video_ep_queue(video, req); |
| + spin_unlock_irqrestore(&queue->irqlock, flags); |
| + |
| if (ret < 0) { |
| - printk(KERN_INFO "Failed to queue request (%d)\n", ret); |
| - usb_ep_set_halt(video->ep); |
| - spin_unlock_irqrestore(&queue->irqlock, flags); |
| uvcg_queue_cancel(queue, 0); |
| break; |
| } |
| - spin_unlock_irqrestore(&queue->irqlock, flags); |
| } |
| |
| spin_lock_irqsave(&video->req_lock, flags); |
| -- |
| 2.20.1 |
| |