Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a8d517e4 authored by Dov Levenglick's avatar Dov Levenglick
Browse files

usb: dwc3: gadget: ignore suspend interrupt before connect



The controller sees a suspend event prior to the the cable connect
or reset events. As a result, it runs through an unnecessary
suspend sequence. Adding a check on the gadget's state avoids
the overhead.
The root cause of this appears to be a situation where the
controller senses/is told that there is a VBUS, but the port
reset is not forthcoming. In such a case, the line state is
interpreted as suspend, and the event is generated.
When VBUS detach is sensed/indicated, the state is returned to
USB_STATE_NOTATTACHED, in preparation for the next cable connect.

Change-Id: I639454ceb0ad3a8ff2c02d527c553a934b8639fc
Signed-off-by: default avatarDov Levenglick <dovl@codeaurora.org>
parent 172bca28
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -1648,6 +1648,7 @@ static int dwc3_gadget_run_stop(struct dwc3 *dwc, int is_on)
	} else {
		reg &= ~DWC3_DCTL_RUN_STOP;
		dwc->pullups_connected = false;
		usb_gadget_set_state(&dwc->gadget, USB_STATE_NOTATTACHED);
	}

	dwc3_writel(dwc->regs, DWC3_DCTL, reg);
@@ -2844,6 +2845,14 @@ static void dwc3_gadget_suspend_interrupt(struct dwc3 *dwc,

	if (next == DWC3_LINK_STATE_U3) {
		dbg_event(0xFF, "SUSPEND", 0);
		/*
		 * When first connecting the cable, even before the initial
		 * DWC3_DEVICE_EVENT_RESET or DWC3_DEVICE_EVENT_CONNECT_DONE
		 * events, the controller sees a DWC3_DEVICE_EVENT_SUSPEND
		 * event. In such a case, ignore.
		 */
		if (dwc->gadget.state == USB_STATE_NOTATTACHED)
			return;
		/*
		 * gadget_driver suspend function might require some dwc3-gadget
		 * operations, such as ep_disable. Hence, dwc->lock must be