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

Commit 806fed89 authored by Mayank Rana's avatar Mayank Rana
Browse files

dwc3: gadget: Ignore suspend event if USB is not into CONFIGURED state



For reboot usecase with some of host machine, it has been observed that
Suspend event is being received in between USB enumeration process which
is highly unlikely case. Although due to this event, device side USB goes
into suspend state which cause USB device enumerates as unknown device
with host machine. Fix this issue by ignoring suspend event until USB
enumeration process is not being completed i.e. device side USB is not
reach into CONFIGURED state.

Add check for CONFIGURED state with controller suspend routine as well
to make sure that if this routine finds controller into L2 state before
it performs LPM functionality, it confirms that state of USB as
CONFIGURED.

CRs-Fixed: 717151
Change-Id: I86925f22edf94c526a3b7504333501b6e27412d7
Signed-off-by: default avatarMayank Rana <mrana@codeaurora.org>
parent 3a985277
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -1663,6 +1663,20 @@ static int dwc3_msm_suspend(struct dwc3_msm *mdwc)
				 (mdwc->charger.chg_type == DWC3_CDP_CHARGER));

	if (host_bus_suspend || device_bus_suspend) {

		/*
		 * Check if device is not in CONFIGURED state
		 * then check cotroller state of L2 and break
		 * LPM sequeunce.
		*/
		if (device_bus_suspend &&
			(dwc->gadget.state != USB_STATE_CONFIGURED)) {
			pr_err("%s(): Trying to go in LPM with state:%d\n",
						__func__, dwc->gadget.state);
			pr_err("%s(): LPM is not performed.\n", __func__);
			return -EBUSY;
		}

		ret = dwc3_msm_prepare_suspend(mdwc);
		if (ret)
			return ret;
+6 −1
Original line number Diff line number Diff line
@@ -3229,9 +3229,14 @@ static void dwc3_gadget_suspend_interrupt(struct dwc3 *dwc,
		 * 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.
		 * Ignore suspend event until device side usb is not into
		 * CONFIGURED state.
		 */
		if (dwc->gadget.state == USB_STATE_NOTATTACHED)
		if (dwc->gadget.state != USB_STATE_CONFIGURED) {
			pr_err("%s(): state:%d. Ignore SUSPEND.\n",
						__func__, dwc->gadget.state);
			return;
		}
		/*
		 * gadget_driver suspend function might require some dwc3-gadget
		 * operations, such as ep_disable. Hence, dwc->lock must be