• Minas Harutyunyan's avatar
    usb: dwc2: gadget: Fix ISOC flow for BDMA and Slave · 91bb163e
    Minas Harutyunyan authored
    According USB spec each ISOC transaction should be performed in a
    designated for that transaction interval. On bus errors or delays
    in operating system scheduling of client software can result in no
    packet being transferred for a (micro)frame. An error indication
    should be returned as status to the client software in such a case.
    
    Current implementation in case of missed/dropped interval send same
    data in next possible interval instead of reporting missed isoc.
    
    This fix complete requests with -ENODATA if interval elapsed.
    
    HSOTG core in BDMA and Slave modes haven't HW support for
    (micro)frames tracking, this is why SW should care about tracking
    of (micro)frames. Because of that method and consider operating
    system scheduling delays, added few additional checking's of elapsed
    target (micro)frame:
    1. Immediately before enabling EP to start transfer.
    2. With any transfer completion interrupt.
    3. With incomplete isoc in/out interrupt.
    4. With EP disabled interrupt because of incomplete transfer.
    5. With OUT token received while EP disabled interrupt (for OUT
    transfers).
    6. With NAK replied to IN token interrupt (for IN transfers).
    
    As part of ISOC flow, additionally fixed 'current' and 'target' frame
    calculation functions. In HS mode SOF limits provided by DSTS register
    is 0x3fff, but in non HS mode this limit is 0x7ff.
    
    Tested by internal tool which also using for dwc3 testing.
    Signed-off-by: default avatarMinas Harutyunyan <Minas.Harutyunyan@synopsys.com>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/95d1423adf4b0f68187c9894820c4b7e964a3f7f.1631175721.git.Minas.Harutyunyan@synopsys.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    91bb163e
gadget.c 146 KB