• Wesley Cheng's avatar
    usb: dwc3: Do not service EP0 and conndone events if soft disconnected · 359d5a85
    Wesley Cheng authored
    There are some operations that need to be ignored if there is a soft
    disconnect in progress.  This is to avoid having a pending EP0 transfer in
    progress while attempting to stop active transfers and halting the
    controller.
    
    There were several instances seen where a soft disconnect was able to occur
    during early link negotiation, i.e. bus reset/conndone, which leads to the
    conndone handler re-configuring EPs while attempting to halt the
    controller, as DEP flags are cleared as part of the soft disconnect path.
    
    ep0out: cmd 'Start New Configuration'
    ep0out: cmd 'Set Endpoint Transfer Resource'
    ep0in: cmd 'Set Endpoint Transfer Resource'
    ep1out: cmd 'Set Endpoint Transfer Resource'
    ...
    event (00030601): Suspend [U3]
    event (00000101): Reset [U0]
    ep0out: req ffffff87e5c9e100 length 0/0 zsI ==> 0
    event (00000201): Connection Done [U0]
    ep0out: cmd 'Start New Configuration'
    ep0out: cmd 'Set Endpoint Transfer Resource'
    
    In addition, if a soft disconnect occurs, EP0 events are still allowed to
    process, however, it will stall/restart during the SETUP phase.  The
    host is still able to query for the DATA phase, leading to a
    xfernotready(DATA) event.  Since none of the SETUP transfer parameters are
    populated, the xfernotready is treated as a "wrong direction" error,
    leading to a duplicate stall/restart routine.
    
    Add the proper softconnect/connected checks in sequences that are
    potentially involved during soft disconnect processing.
    Reviewed-by: default avatarThinh Nguyen <Thinh.Nguyen@synopsys.com>
    Signed-off-by: default avatarWesley Cheng <quic_wcheng@quicinc.com>
    Link: https://lore.kernel.org/r/20220817182359.13550-2-quic_wcheng@quicinc.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    359d5a85
gadget.c 119 KB