OSDN Git Service

usb: gadget: uvc: Factor out video USB request queueing
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Fri, 10 Aug 2018 12:42:03 +0000 (15:42 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 22 Nov 2019 13:43:48 +0000 (14:43 +0100)
[ 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

index 0f01c04..540917f 100644 (file)
@@ -129,6 +129,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:
@@ -193,14 +206,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;
 
@@ -320,15 +332,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);