• Manu Gautam's avatar
    usb: dwc3: gadget: Correct ISOC DATA PIDs for short packets · 40d829fb
    Manu Gautam authored
    The PIDs for Isochronous data transfers are incorrect
    for high bandwidth IN endpoints when the request length
    is less than EP wMaxPacketSize.
    
    As per spec correct PIDs for ISOC data transfers are:
    
    1) For request length <= maxpacket
    	- DATA0,
    
    2) For maxpacket < length <= (2 * maxpacket)
    	- DATA1, DATA0
    
    3) For (2 * maxpacket) <  length <= (3 * maxpacket)
    	- DATA2, DATA1, DATA0.
    
    But driver always sets PCM fields based on wMaxPacketSize
    due to which DATA2 happens even for small requests.
    
    Fix this by setting the PCM field of trb->size depending
    on request length rather than fixing it to the value
    depending on wMaxPacketSize.
    
    Ideally it shouldn't give any issues as dwc3 will send
    0-length packet for next IN token if host sends (even
    after receiving a short packet). Windows seems to ignore
    this but with MacOS frame loss observed when using f_uvc.
    Signed-off-by: default avatarManu Gautam <mgautam@codeaurora.org>
    Signed-off-by: default avatarFelipe Balbi <felipe.balbi@linux.intel.com>
    40d829fb
gadget.c 82.9 KB