From 5aa4dbed7c0f0401f51779a66edf838103582bf3 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 2df3d04d26f5..3ed5d3398831 100644 --- a/drivers/usb/dwc2/hcd.c +++ b/drivers/usb/dwc2/hcd.c @@ -1928,11 +1928,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->regs + HPRT0); - if (!(hprt0 & HPRT0_CONNDET) && (hprt0 & HPRT0_CONNSTS)) - dwc2_hcd_connect(hsotg); - } + hprt0 = dwc2_readl(hsotg->regs + 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); } /** -- 2.34.1