From eb6d585c9ab74dde93e8fa6fba0a5717f98957fb Mon Sep 17 00:00:00 2001 From: William Wu Date: Sat, 27 May 2017 11:23:36 +0800 Subject: [PATCH] FROMLIST: usb: dwc2: resume root hub to handle disconnect of device When handle disconnect of the hcd during bus_suspend, hcd needs to resume its root hub, otherwise the root hub will not disconnect the existing devices under its port. This issue always happens when connecting with usb devices which support auto-suspend function (e.g. usb hub). (am from https://patchwork.kernel.org/patch/9751469/) Change-Id: I663fdea73f36e89130d9a250612363968cbff941 Signed-off-by: William Wu --- drivers/usb/dwc2/hcd.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/drivers/usb/dwc2/hcd.c b/drivers/usb/dwc2/hcd.c index aad7edc29bdd..5e127848fd3c 100644 --- a/drivers/usb/dwc2/hcd.c +++ b/drivers/usb/dwc2/hcd.c @@ -2025,11 +2025,13 @@ void dwc2_hcd_disconnect(struct dwc2_hsotg *hsotg, bool force) * Without the extra check here we will end calling disconnect * and won't get any future interrupts to handle the connect. */ - if (!force) { - hprt0 = dwc2_readl(hsotg, HPRT0); - if (!(hprt0 & HPRT0_CONNDET) && (hprt0 & HPRT0_CONNSTS)) - dwc2_hcd_connect(hsotg); - } + hprt0 = dwc2_readl(hsotg, HPRT0); + + if (!force && !(hprt0 & HPRT0_CONNDET) && + (hprt0 & HPRT0_CONNSTS)) + dwc2_hcd_connect(hsotg); + else if (hsotg->lx_state != DWC2_L0) + usb_hcd_resume_root_hub(hsotg->priv); } /**