• Peter Chen's avatar
    usb: chipidea: udc: using MultO at TD as real mult value for ISO-TX · 2fc5a7da
    Peter Chen authored
    We have met a bug that the high bandwidth ISO-TX transfer has failed
    at the last packet if it is less than 1024, the TD status shows it
    is "Transaction Error".
    
    The root cause of this problem is: the mult value at qh is not correct
    for current TD's transfer length. We use TD list to queue un-transfer
    TDs, and change mult for new adding TDs. If new adding TDs transfer length
    less than 1024, but the queued un-transfer TDs transfer length is larger
    than 1024, the transfer error will occur, and vice versa.
    Usually, this problem occurs at the last packet, and the first packet for
    new frame.
    
    We fixed this problem by setting Mult at QH as the largest value (3), and
    set MultO (Multiplier Override) at TD according to every transfer length.
    It can cover both hardware version less than 2.3 (the real mult is MultO
    if it is not 0) and 2.3+ (the real mult is min(qh.mult, td.multo)).
    
    Since the MultO bits are only existed at TX TD, we keep the ISO-RX behavior
    unchanged.
    
    For stable tree: 3.11+.
    
    Cc: stable <stable@vger.kernel.org>
    Cc: Michael Grzeschik <m.grzeschik@pengutronix.de>
    Reported-by: default avatarMatthieu Vanin <b47495@freescale.com>
    Tested-by: default avatarMatthieu Vanin <b47495@freescale.com>
    Signed-off-by: default avatarPeter Chen <peter.chen@freescale.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    2fc5a7da
udc.c 44.8 KB