mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-23 01:10:04 +00:00
usb: dwc2: host: Fix remote wakeup when not in DWC2_L2
In commit734643dfbd
("usb: dwc2: host: add flag to reflect bus state") we changed dwc2_port_suspend() not to set the lx_state anymore (instead it sets the new bus_suspended variable). This introduced a bug where we would fail to detect device insertions if: 1. Plug empty hub into dwc2 2. Plug USB flash drive into the empty hub. 3. Wait a few seconds 4. Unplug USB flash drive 5. Less than 2 seconds after step 4, plug the USB flash drive in again. The dwc2_hcd_rem_wakeup() function should have been changed to look at the new bus_suspended variable. Let's fix it. Since commitb46146d59f
("usb: dwc2: host: resume root hub on remote wakeup") talks about needing the root hub resumed if the bus was suspended, we'll include it in our test. It appears that the "port_l1_change" should only be set to 1 if we were in DWC2_L1 (the driver currently never sets this), so we'll update the former "else" case based on this test. Fixes:734643dfbd
("usb: dwc2: host: add flag to reflect bus state") Acked-by: John Youn <johnyoun@synopsys.com> Tested-by: Gregory Herrero <gregory.herrero@intel.com> Reviewed-by: Heiko Stuebner <heiko@sntech.de> Signed-off-by: Douglas Anderson <dianders@chromium.org> Signed-off-by: Felipe Balbi <balbi@ti.com>
This commit is contained in:
parent
f16593034a
commit
1fb7f12d5b
1 changed files with 5 additions and 4 deletions
|
@ -324,12 +324,13 @@ void dwc2_hcd_disconnect(struct dwc2_hsotg *hsotg)
|
|||
*/
|
||||
static void dwc2_hcd_rem_wakeup(struct dwc2_hsotg *hsotg)
|
||||
{
|
||||
if (hsotg->lx_state == DWC2_L2) {
|
||||
if (hsotg->bus_suspended) {
|
||||
hsotg->flags.b.port_suspend_change = 1;
|
||||
usb_hcd_resume_root_hub(hsotg->priv);
|
||||
} else {
|
||||
hsotg->flags.b.port_l1_change = 1;
|
||||
}
|
||||
|
||||
if (hsotg->lx_state == DWC2_L1)
|
||||
hsotg->flags.b.port_l1_change = 1;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1428,8 +1429,8 @@ static void dwc2_wakeup_detected(unsigned long data)
|
|||
dev_dbg(hsotg->dev, "Clear Resume: HPRT0=%0x\n",
|
||||
dwc2_readl(hsotg->regs + HPRT0));
|
||||
|
||||
hsotg->bus_suspended = 0;
|
||||
dwc2_hcd_rem_wakeup(hsotg);
|
||||
hsotg->bus_suspended = 0;
|
||||
|
||||
/* Change to L0 state */
|
||||
hsotg->lx_state = DWC2_L0;
|
||||
|
|
Loading…
Reference in a new issue