Re: [PATCH 04/11] USB: dwc3: gadget: drop dead hibernation code

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Apr 04, 2023, Johan Hovold wrote:
> The hibernation code is broken and has never been enabled in mainline
> and should thus be dropped.
> 
> Remove the hibernation bits from the gadget code, which effectively
> reverts commits e1dadd3b0f27 ("usb: dwc3: workaround: bogus hibernation
> events") and 7b2a0368bbc9 ("usb: dwc3: gadget: set KEEP_CONNECT in case
> of hibernation") except for the spurious interrupt warning.
> 
> Signed-off-by: Johan Hovold <johan+linaro@xxxxxxxxxx>
> ---
>  drivers/usb/dwc3/gadget.c | 46 +++++----------------------------------
>  1 file changed, 6 insertions(+), 40 deletions(-)
> 
> diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
> index cf5b4f49c3ed..ef51399fd89e 100644
> --- a/drivers/usb/dwc3/gadget.c
> +++ b/drivers/usb/dwc3/gadget.c
> @@ -2478,7 +2478,7 @@ static void __dwc3_gadget_set_speed(struct dwc3 *dwc)
>  	dwc3_writel(dwc->regs, DWC3_DCFG, reg);
>  }
>  
> -static int dwc3_gadget_run_stop(struct dwc3 *dwc, int is_on, int suspend)
> +static int dwc3_gadget_run_stop(struct dwc3 *dwc, int is_on)
>  {
>  	u32			reg;
>  	u32			timeout = 2000;
> @@ -2497,17 +2497,11 @@ static int dwc3_gadget_run_stop(struct dwc3 *dwc, int is_on, int suspend)
>  			reg &= ~DWC3_DCTL_KEEP_CONNECT;
>  		reg |= DWC3_DCTL_RUN_STOP;
>  
> -		if (dwc->has_hibernation)
> -			reg |= DWC3_DCTL_KEEP_CONNECT;
> -
>  		__dwc3_gadget_set_speed(dwc);
>  		dwc->pullups_connected = true;
>  	} else {
>  		reg &= ~DWC3_DCTL_RUN_STOP;
>  
> -		if (dwc->has_hibernation && !suspend)
> -			reg &= ~DWC3_DCTL_KEEP_CONNECT;
> -
>  		dwc->pullups_connected = false;
>  	}
>  
> @@ -2574,7 +2568,7 @@ static int dwc3_gadget_soft_disconnect(struct dwc3 *dwc)
>  	 * remaining event generated by the controller while polling for
>  	 * DSTS.DEVCTLHLT.
>  	 */
> -	return dwc3_gadget_run_stop(dwc, false, false);
> +	return dwc3_gadget_run_stop(dwc, false);
>  }
>  
>  static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on)
> @@ -2628,7 +2622,7 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on)
>  
>  		dwc3_event_buffers_setup(dwc);
>  		__dwc3_gadget_start(dwc);
> -		ret = dwc3_gadget_run_stop(dwc, true, false);
> +		ret = dwc3_gadget_run_stop(dwc, true);
>  	}
>  
>  	pm_runtime_put(dwc->dev);
> @@ -4195,30 +4189,6 @@ static void dwc3_gadget_suspend_interrupt(struct dwc3 *dwc,
>  	dwc->link_state = next;
>  }
>  
> -static void dwc3_gadget_hibernation_interrupt(struct dwc3 *dwc,
> -		unsigned int evtinfo)
> -{
> -	unsigned int is_ss = evtinfo & BIT(4);
> -
> -	/*
> -	 * WORKAROUND: DWC3 revision 2.20a with hibernation support
> -	 * have a known issue which can cause USB CV TD.9.23 to fail
> -	 * randomly.
> -	 *
> -	 * Because of this issue, core could generate bogus hibernation
> -	 * events which SW needs to ignore.
> -	 *
> -	 * Refers to:
> -	 *
> -	 * STAR#9000546576: Device Mode Hibernation: Issue in USB 2.0
> -	 * Device Fallback from SuperSpeed
> -	 */
> -	if (is_ss ^ (dwc->speed == USB_SPEED_SUPER))
> -		return;
> -
> -	/* enter hibernation here */
> -}
> -
>  static void dwc3_gadget_interrupt(struct dwc3 *dwc,
>  		const struct dwc3_event_devt *event)
>  {
> @@ -4236,11 +4206,7 @@ static void dwc3_gadget_interrupt(struct dwc3 *dwc,
>  		dwc3_gadget_wakeup_interrupt(dwc);
>  		break;
>  	case DWC3_DEVICE_EVENT_HIBER_REQ:
> -		if (dev_WARN_ONCE(dwc->dev, !dwc->has_hibernation,
> -					"unexpected hibernation event\n"))
> -			break;
> -
> -		dwc3_gadget_hibernation_interrupt(dwc, event->event_info);
> +		dev_WARN_ONCE(dwc->dev, true, "unexpected hibernation event\n");
>  		break;
>  	case DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE:
>  		dwc3_gadget_linksts_change_interrupt(dwc, event->event_info);
> @@ -4584,7 +4550,7 @@ int dwc3_gadget_suspend(struct dwc3 *dwc)
>  	if (!dwc->gadget_driver)
>  		return 0;
>  
> -	dwc3_gadget_run_stop(dwc, false, false);
> +	dwc3_gadget_run_stop(dwc, false);
>  
>  	spin_lock_irqsave(&dwc->lock, flags);
>  	dwc3_disconnect_gadget(dwc);
> @@ -4605,7 +4571,7 @@ int dwc3_gadget_resume(struct dwc3 *dwc)
>  	if (ret < 0)
>  		goto err0;
>  
> -	ret = dwc3_gadget_run_stop(dwc, true, false);
> +	ret = dwc3_gadget_run_stop(dwc, true);
>  	if (ret < 0)
>  		goto err1;
>  
> -- 
> 2.39.2
> 

Acked-by: Thinh Nguyen <Thinh.Nguyen@xxxxxxxxxxxx>

Thinh




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux