• Thomas Poussevin's avatar
    USB: EHCI: fix HUB TT scheduling issue with iso transfer · 811c926c
    Thomas Poussevin authored
    The current TT scheduling doesn't allow to play and then record on a
    full-speed device connected to a high speed hub.
    
    The IN iso stream can only start on the first uframe (0-2 for a 165 us)
    because of CSPLIT transactions.
    For the OUT iso stream there no such restriction. uframe 0-5 are possible.
    
    The idea of this patch is that the first uframe are precious (for IN TT iso
    stream) and we should allocate the last uframes first if possible.
    
    For that we reverse the order of uframe allocation (last uframe first).
    
    Here an example :
    
    hid interrupt stream
    ----------------------------------------------------------------------
    uframe                |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |
    ----------------------------------------------------------------------
    max_tt_usecs          | 125 | 125 | 125 | 125 | 125 | 125 | 30  |  0  |
    ----------------------------------------------------------------------
    used usecs on a frame | 13  |  0  |  0  |  0  |  0  |  0  |  0  |  0  |
    ----------------------------------------------------------------------
    
    iso OUT stream
    ----------------------------------------------------------------------
    uframe                |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |
    ----------------------------------------------------------------------
    max_tt_usecs          | 125 | 125 | 125 | 125 | 125 | 125 | 30  |  0  |
    ----------------------------------------------------------------------
    used usecs on a frame | 13  | 125 |  39 |  0  |  0  |  0  |  0  |  0  |
    ----------------------------------------------------------------------
    
    There no place for iso IN stream  (uframe 0-2 are used) and we got "cannot
    submit datapipe for urb 0, error -28: not enough bandwidth" error.
    
    With the patch this become.
    
    iso OUT stream
    ----------------------------------------------------------------------
    uframe                |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |
    ----------------------------------------------------------------------
    max_tt_usecs          | 125 | 125 | 125 | 125 | 125 | 125 | 30  |  0  |
    ----------------------------------------------------------------------
    used usecs on a frame |  13 |  0  |  0  |  0  | 125 |  39 |  0  |  0  |
    ----------------------------------------------------------------------
    
    iso IN stream
    ----------------------------------------------------------------------
    uframe                |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |
    ----------------------------------------------------------------------
    max_tt_usecs          | 125 | 125 | 125 | 125 | 125 | 125 | 30  |  0  |
    ----------------------------------------------------------------------
    used usecs on a frame |  13 |  0  | 125 | 40  | 125 |  39 |  0  |  0  |
    ----------------------------------------------------------------------
    Signed-off-by: default avatarMatthieu Castet <matthieu.castet@parrot.com>
    Signed-off-by: default avatarThomas Poussevin <thomas.poussevin@parrot.com>
    Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    811c926c
ehci-sched.c 65 KB