Re: [PATCH 04/11] USB: dwc3: gadget: drop dead hibernation code
From: Thinh Nguyen
Date: Thu Apr 06 2023 - 22:00:22 EST
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