• Alan Stern's avatar
    USB: EHCI: handle isochronous underruns with tasklets · 46c73d1d
    Alan Stern authored
    This patch updates the iso_stream_schedule() routine in ehci-sched.c
    to handle cases where an underrun causes an isochronous endpoint's
    queue to empty out, but the client driver wants to maintain
    synchronization with the device (i.e., the URB_ISO_ASAP flag is not
    set).  This could not happen until recently, when ehci-hcd switched
    over to completing URBs in a tasklet.
    
    (This may seem like an unlikely case to worry about, but underruns are
    all too common with the snd-usb-audio driver, which doesn't use
    URB_ISO_ASAP.)
    
    As part of the fix, some URBs may need to be given back when they are
    submitted.  This is necessary when the URB's scheduled slots all fall
    before the current value of ehci->last_iso_frame, and as an
    optimization we do it also when the slots all fall before the current
    frame number.
    
    As a second part of the fix, we may need to skip some but not all of
    an URB's packets.  This is necessary when some of the URB's scheduled
    slots fall before the current value of ehci->last_iso_frame and some
    of them fall after the current frame number.  A new field
    (first_packet) is added to struct ehci_iso_sched, to indicate how many
    packets should be skipped.
    Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
    CC: Ming Lei <tom.leiming@gmail.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    46c73d1d
ehci.h 25.8 KB