OSDN Git Service

dwc3: gadget: Ignore suspend event if USB is not into CONFIGURED state
authorMayank Rana <mrana@codeaurora.org>
Fri, 29 Aug 2014 21:36:05 +0000 (14:36 -0700)
committerDavid Keitel <dkeitel@codeaurora.org>
Tue, 22 Mar 2016 18:06:48 +0000 (11:06 -0700)
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: Mayank Rana <mrana@codeaurora.org>
drivers/usb/dwc3/gadget.c

index 0dceef9..ca8cedf 100644 (file)
@@ -2829,9 +2829,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;
+               }
 
                dwc3_suspend_gadget(dwc);
        }