usb: dwc3: Issue core soft reset before enabling run/stop
[ Upstream commit 0066472de157439d58454f4a55786f1045ea5681 ] It is recommended by the Synopsis databook to issue a DCTL.CSftReset when reconnecting from a device-initiated disconnect routine. This resolves issues with enumeration during fast composition switching cases, which result in an unknown device on the host. Reviewed-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com> Signed-off-by: Wesley Cheng <quic_wcheng@quicinc.com> Link: https://lore.kernel.org/r/20220316011358.3057-1-quic_wcheng@quicinc.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Stable-dep-of: 040f2dbd2010 ("usb: dwc3: gadget: Avoid duplicate requests to enable Run/Stop") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
e24f90d761
commit
62b6cbc598
@ -227,7 +227,7 @@ u32 dwc3_core_fifo_space(struct dwc3_ep *dep, u8 type)
|
|||||||
* dwc3_core_soft_reset - Issues core soft reset and PHY reset
|
* dwc3_core_soft_reset - Issues core soft reset and PHY reset
|
||||||
* @dwc: pointer to our context structure
|
* @dwc: pointer to our context structure
|
||||||
*/
|
*/
|
||||||
static int dwc3_core_soft_reset(struct dwc3 *dwc)
|
int dwc3_core_soft_reset(struct dwc3 *dwc)
|
||||||
{
|
{
|
||||||
u32 reg;
|
u32 reg;
|
||||||
int retries = 1000;
|
int retries = 1000;
|
||||||
|
@ -1422,6 +1422,8 @@ bool dwc3_has_imod(struct dwc3 *dwc);
|
|||||||
int dwc3_event_buffers_setup(struct dwc3 *dwc);
|
int dwc3_event_buffers_setup(struct dwc3 *dwc);
|
||||||
void dwc3_event_buffers_cleanup(struct dwc3 *dwc);
|
void dwc3_event_buffers_cleanup(struct dwc3 *dwc);
|
||||||
|
|
||||||
|
int dwc3_core_soft_reset(struct dwc3 *dwc);
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_USB_DWC3_HOST) || IS_ENABLED(CONFIG_USB_DWC3_DUAL_ROLE)
|
#if IS_ENABLED(CONFIG_USB_DWC3_HOST) || IS_ENABLED(CONFIG_USB_DWC3_DUAL_ROLE)
|
||||||
int dwc3_host_init(struct dwc3 *dwc);
|
int dwc3_host_init(struct dwc3 *dwc);
|
||||||
void dwc3_host_exit(struct dwc3 *dwc);
|
void dwc3_host_exit(struct dwc3 *dwc);
|
||||||
|
@ -2088,6 +2088,17 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on)
|
|||||||
dwc->ev_buf->length;
|
dwc->ev_buf->length;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
/*
|
||||||
|
* In the Synopsys DWC_usb31 1.90a programming guide section
|
||||||
|
* 4.1.9, it specifies that for a reconnect after a
|
||||||
|
* device-initiated disconnect requires a core soft reset
|
||||||
|
* (DCTL.CSftRst) before enabling the run/stop bit.
|
||||||
|
*/
|
||||||
|
spin_unlock_irqrestore(&dwc->lock, flags);
|
||||||
|
dwc3_core_soft_reset(dwc);
|
||||||
|
spin_lock_irqsave(&dwc->lock, flags);
|
||||||
|
|
||||||
|
dwc3_event_buffers_setup(dwc);
|
||||||
__dwc3_gadget_start(dwc);
|
__dwc3_gadget_start(dwc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user