• Hans de Goede's avatar
    [media] gspca: submit interrupt urbs *after* isoc urbs · 314b3e08
    Hans de Goede authored
    Currently gspca supported usb-1.1 webcams for which we support the input
    button through an interrupt endpoint won't stream (not enough bandwidth
    error) when used through an USB-2.0 hub.
    
    After much debugging I've found out that the cause for this is that the
    ehci-sched.c schedeling code does not like it when there are already urb's
    scheduled when (large) isoc urbs are queued. By moving the submission
    of the interrupt urbs to after submitting the isoc urbs the camera
    starts working again through usb-2.0 hubs.
    
    Note that this does not fix isoc. streaming through a usb-hub while another
    1.1 usb device (like the microphone of the same cam) is also active
    at the same time :(
    
    I've spend a long time analyzing the linux kernel ehci scheduler code,
    resulting in this (long) mail:
    http://www.spinics.net/lists/linux-usb/msg37982.html
    
    The conclusion of the following mail thread is that yes there are several
    issues when using usb-1.1 devices through a usb-2.0 hub, but these are not
    easily fixable in the current code. Fixing this in ehci-sched.c requires
    an almost full rewrite, which is not bound to happen anytime soon.
    
    So with this patch gspca driven usb-1.1 webcams will atleast work when
    connected through an usb-2.0 hub when the microphone is not used.
    
    As an added bonus this patch avoids extra destroy/create input urb cycles
    when we end up falling back to a lower speed alt setting because of bandwidth
    limitations.
    Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
    Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
    314b3e08
gspca.c 59.9 KB