• Felipe Balbi's avatar
    usb: dwc3: ep0: move DATA phase away from on-demand · fca8892a
    Felipe Balbi authored
    We uncovered a limitation of this core WRT to the
    Link Layer Compliance Suite's TD7.06.
    
    On that test, host will start a GetDescriptor(DEVICE)
    standard request, but it will do so only on the
    SETUP phase, meaning there will *NOT* be any DATA or
    STATUS phases.
    
    The idea of the test is to verify robustness of the
    IP WRT framing errors, so the test will send a
    sequence of different SETUP_DPs each with a different
    framing error and the Suite expects us to be able to
    receive all SETUP_DPs with no timeouts.
    
    This core, has the ability to tell us which phase the
    host is expecting before we start it. Whenever we
    receive a TP or DP when no transfers are cached on
    the internal IP's caches, the IP will generate a
    XferNotReady event with status informing us (in case
    of physical ep0/ep1) if it's related to DATA or STATUS
    phases - SETUP phase is expected to be prestarted.
    
    Because we're always waiting for XferNotReady
    events for DATA and STATUS phases, we will never
    be able to know that the Host wants to start another
    SETUP phase instead, which will render us "not
    compliant" with TD7.06.
    
    In order to "fix" the problem we must not rely
    on XferNotReady events for the DATA phase  and try
    to always pre-start DATA transfers on physical
    endpoints 0 and 1. If host goes back to SETUP phase
    from DATA phase we will receive a XferComplete for
    that phase with TRB's status set to SETUP_PENDING,
    which is only useful for printing a debugging log as
    the core expects us to still go through to the STATUS
    phase, initiate a CONTROL_STATUS TRB just so it
    completes right away and, only then, we go back to
    the pending SETUP phase.
    
    SNPS has decided to modify the programming model of
    the core so that on-demand DATA phases will not be
    supported anymore. Note that this limitation does not
    affect 2-stage transfers, meaning that if TD7.06 would
    start a 2-stage transfer instead of a 3-stage transfer,
    we would receive a "fake" XferNotReady(STATUS) which
    would complete right after being initiated with
    SETUP_PENDING status.
    
    Other endpoints are also not affected, so we can still
    use on-demand transfers on Bulk/Isoc/Interrupt endpoints.
    Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
    fca8892a
ep0.c 25.7 KB