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
					
				| @ -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 New Issue
	
	Block a user