lkml.org 
[lkml]   [2019]   [Nov]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.19 108/191] usb: gadget: uvc: Factor out video USB request queueing
    Date
    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
    \
     
     \ /
      Last update: 2019-11-10 04:12    [W:4.218 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site