Skip to content

Commit 269cbcf

Browse files
Fabrice Gasniergregkh
authored andcommitted
usb: dwc2: drd: fix soft connect when gadget is unconfigured
When the gadget driver hasn't been (yet) configured, and the cable is connected to a HOST, the SFTDISCON gets cleared unconditionally, so the HOST tries to enumerate it. At the host side, this can result in a stuck USB port or worse. When getting lucky, some dmesg can be observed at the host side: new high-speed USB device number ... device descriptor read/64, error -110 Fix it in drd, by checking the enabled flag before calling dwc2_hsotg_core_connect(). It will be called later, once configured, by the normal flow: - udc_bind_to_driver - usb_gadget_connect - dwc2_hsotg_pullup - dwc2_hsotg_core_connect Fixes: 17f9340 ("usb: dwc2: override PHY input signals with usb role switch support") Cc: [email protected] Reviewed-by: Amelie Delaunay <[email protected]> Acked-by: Minas Harutyunyan <[email protected]> Signed-off-by: Fabrice Gasnier <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 38ea1ea commit 269cbcf

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

drivers/usb/dwc2/drd.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,10 @@ static int dwc2_drd_role_sw_set(struct usb_role_switch *sw, enum usb_role role)
130130
already = dwc2_ovr_avalid(hsotg, true);
131131
} else if (role == USB_ROLE_DEVICE) {
132132
already = dwc2_ovr_bvalid(hsotg, true);
133-
/* This clear DCTL.SFTDISCON bit */
134-
dwc2_hsotg_core_connect(hsotg);
133+
if (hsotg->enabled) {
134+
/* This clear DCTL.SFTDISCON bit */
135+
dwc2_hsotg_core_connect(hsotg);
136+
}
135137
} else {
136138
if (dwc2_is_device_mode(hsotg)) {
137139
if (!dwc2_ovr_bvalid(hsotg, false))

0 commit comments

Comments
 (0)