• Wesley Cheng's avatar
    usb: dwc3: gadget: Add 1ms delay after end transfer command without IOC · d8a2bb4e
    Wesley Cheng authored
    Previously, there was a 100uS delay inserted after issuing an end transfer
    command for specific controller revisions.  This was due to the fact that
    there was a GUCTL2 bit field which enabled synchronous completion of the
    end transfer command once the CMDACT bit was cleared in the DEPCMD
    register.  Since this bit does not exist for all controller revisions and
    the current implementation heavily relies on utizling the EndTransfer
    command completion interrupt, add the delay back in for uses where the
    interrupt on completion bit is not set, and increase the duration to 1ms
    for the controller to complete the command.
    
    An issue was seen where the USB request buffer was unmapped while the DWC3
    controller was still accessing the TRB.  However, it was confirmed that the
    end transfer command was successfully submitted. (no end transfer timeout)
    In situations, such as dwc3_gadget_soft_disconnect() and
    __dwc3_gadget_ep_disable(), the dwc3_remove_request() is utilized, which
    will issue the end transfer command, and follow up with
    dwc3_gadget_giveback().  At least for the USB ep disable path, it is
    required for any pending and started requests to be completed and returned
    to the function driver in the same context of the disable call.  Without
    the GUCTL2 bit, it is not ensured that the end transfer is completed before
    the buffers are unmapped.
    
    Fixes: cf2f8b63 ("usb: dwc3: gadget: Remove END_TRANSFER delay")
    Cc: stable <stable@kernel.org>
    Signed-off-by: default avatarWesley Cheng <quic_wcheng@quicinc.com>
    Acked-by: default avatarThinh Nguyen <Thinh.Nguyen@synopsys.com>
    Link: https://lore.kernel.org/r/20230306200557.29387-1-quic_wcheng@quicinc.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    d8a2bb4e
gadget.c 121 KB