lkml.org 
[lkml]   [2014]   [May]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.10 63/86] media: uvcvideo: Do not use usb_set_interface on bulk EP
    Date
    3.10-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Oleksij Rempel <linux@rempel-privat.de>

    commit b1e43f232698274871e1358c276d7b0242a7d607 upstream.

    The UVC specification uses alternate setting selection to notify devices
    of stream start/stop. This breaks when using bulk-based devices, as the
    video streaming interface has a single alternate setting in that case,
    making video stream start and video stream stop events to appear
    identical to the device. Bulk-based devices are thus not well supported
    by UVC.

    The webcam built in the Asus Zenbook UX302LA ignores the set interface
    request and will keep the video stream enabled when the driver tries to
    stop it. If USB autosuspend is enabled the device will then be suspended
    and will crash, requiring a cold reboot.

    USB trace capture showed that Windows sends a CLEAR_FEATURE(HALT)
    request to the bulk endpoint when stopping the stream instead of
    selecting alternate setting 0. The camera then behaves correctly, and
    thus seems to require that behaviour.

    Replace selection of alternate setting 0 with clearing of the endpoint
    halt feature at video stream stop for bulk-based devices. Let's refrain
    from blaming Microsoft this time, as it's not clear whether this
    Windows-specific but USB-compliant behaviour was specifically developed
    to handle bulkd-based UVC devices, or if the camera just took advantage
    of it.

    Signed-off-by: Oleksij Rempel <linux@rempel-privat.de>
    Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
    Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/media/usb/uvc/uvc_video.c | 20 +++++++++++++++++++-
    1 file changed, 19 insertions(+), 1 deletion(-)

    --- a/drivers/media/usb/uvc/uvc_video.c
    +++ b/drivers/media/usb/uvc/uvc_video.c
    @@ -1846,7 +1846,25 @@ int uvc_video_enable(struct uvc_streamin

    if (!enable) {
    uvc_uninit_video(stream, 1);
    - usb_set_interface(stream->dev->udev, stream->intfnum, 0);
    + if (stream->intf->num_altsetting > 1) {
    + usb_set_interface(stream->dev->udev,
    + stream->intfnum, 0);
    + } else {
    + /* UVC doesn't specify how to inform a bulk-based device
    + * when the video stream is stopped. Windows sends a
    + * CLEAR_FEATURE(HALT) request to the video streaming
    + * bulk endpoint, mimic the same behaviour.
    + */
    + unsigned int epnum = stream->header.bEndpointAddress
    + & USB_ENDPOINT_NUMBER_MASK;
    + unsigned int dir = stream->header.bEndpointAddress
    + & USB_ENDPOINT_DIR_MASK;
    + unsigned int pipe;
    +
    + pipe = usb_sndbulkpipe(stream->dev->udev, epnum) | dir;
    + usb_clear_halt(stream->dev->udev, pipe);
    + }
    +
    uvc_queue_enable(&stream->queue, 0);
    uvc_video_clock_cleanup(stream);
    return 0;



    \
     
     \ /
      Last update: 2014-05-04 18:41    [W:2.678 / U:0.284 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site