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

From: Thinh Nguyen
Date: Thu Apr 06 2023 - 21:59:04 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.

Hibernation is not implemented in the kernel mainline. We only have some
small stub/placeholder code for it. It's fine to remove these.

>
> Specifically, the scratch buffer DMA mapping would have been leaked on
> every suspend cycle since commit 51f5d49ad6f0 ("usb: dwc3: core:
> simplify suspend/resume operations") if this feature was ever enabled.
>
> The related error handling was also broken and could have resulted in
> attempts to unmap never mapped buffers, etc.
>
> This effectively revert commit 0ffcaf3798bf ("usb: dwc3: core: allocate
> scratch buffers").
>
> Signed-off-by: Johan Hovold <johan+linaro@xxxxxxxxxx>
> ---
> drivers/usb/dwc3/core.c | 103 +---------------------------------------
> drivers/usb/dwc3/core.h | 8 ----
> 2 files changed, 1 insertion(+), 110 deletions(-)
>
> diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
> index 5b362ed43e7e..d837ab511686 100644
> --- a/drivers/usb/dwc3/core.c
> +++ b/drivers/usb/dwc3/core.c
> @@ -534,90 +534,6 @@ void dwc3_event_buffers_cleanup(struct dwc3 *dwc)
> dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), 0);
> }
>
> -static int dwc3_alloc_scratch_buffers(struct dwc3 *dwc)
> -{
> - if (!dwc->has_hibernation)
> - return 0;
> -
> - if (!dwc->nr_scratch)
> - return 0;
> -
> - dwc->scratchbuf = kmalloc_array(dwc->nr_scratch,
> - DWC3_SCRATCHBUF_SIZE, GFP_KERNEL);
> - if (!dwc->scratchbuf)
> - return -ENOMEM;
> -
> - return 0;
> -}
> -
> -static int dwc3_setup_scratch_buffers(struct dwc3 *dwc)
> -{
> - dma_addr_t scratch_addr;
> - u32 param;
> - int ret;
> -
> - if (!dwc->has_hibernation)
> - return 0;
> -
> - if (!dwc->nr_scratch)
> - return 0;
> -
> - /* should never fall here */
> - if (!WARN_ON(dwc->scratchbuf))
> - return 0;
> -
> - scratch_addr = dma_map_single(dwc->sysdev, dwc->scratchbuf,
> - dwc->nr_scratch * DWC3_SCRATCHBUF_SIZE,
> - DMA_BIDIRECTIONAL);
> - if (dma_mapping_error(dwc->sysdev, scratch_addr)) {
> - dev_err(dwc->sysdev, "failed to map scratch buffer\n");
> - ret = -EFAULT;
> - goto err0;
> - }
> -
> - dwc->scratch_addr = scratch_addr;
> -
> - param = lower_32_bits(scratch_addr);
> -
> - ret = dwc3_send_gadget_generic_command(dwc,
> - DWC3_DGCMD_SET_SCRATCHPAD_ADDR_LO, param);
> - if (ret < 0)
> - goto err1;
> -
> - param = upper_32_bits(scratch_addr);
> -
> - ret = dwc3_send_gadget_generic_command(dwc,
> - DWC3_DGCMD_SET_SCRATCHPAD_ADDR_HI, param);
> - if (ret < 0)
> - goto err1;
> -
> - return 0;
> -
> -err1:
> - dma_unmap_single(dwc->sysdev, dwc->scratch_addr, dwc->nr_scratch *
> - DWC3_SCRATCHBUF_SIZE, DMA_BIDIRECTIONAL);
> -
> -err0:
> - return ret;
> -}
> -
> -static void dwc3_free_scratch_buffers(struct dwc3 *dwc)
> -{
> - if (!dwc->has_hibernation)
> - return;
> -
> - if (!dwc->nr_scratch)
> - return;
> -
> - /* should never fall here */
> - if (!WARN_ON(dwc->scratchbuf))
> - return;
> -
> - dma_unmap_single(dwc->sysdev, dwc->scratch_addr, dwc->nr_scratch *
> - DWC3_SCRATCHBUF_SIZE, DMA_BIDIRECTIONAL);
> - kfree(dwc->scratchbuf);
> -}
> -
> static void dwc3_core_num_eps(struct dwc3 *dwc)
> {
> struct dwc3_hwparams *parms = &dwc->hwparams;
> @@ -877,7 +793,6 @@ static bool dwc3_core_is_valid(struct dwc3 *dwc)
>
> static void dwc3_core_setup_global_control(struct dwc3 *dwc)
> {
> - u32 hwparams4 = dwc->hwparams.hwparams4;
> u32 reg;
>
> reg = dwc3_readl(dwc->regs, DWC3_GCTL);
> @@ -905,9 +820,6 @@ static void dwc3_core_setup_global_control(struct dwc3 *dwc)
> reg &= ~DWC3_GCTL_DSBLCLKGTNG;
> break;
> case DWC3_GHWPARAMS1_EN_PWROPT_HIB:
> - /* enable hibernation here */
> - dwc->nr_scratch = DWC3_GHWPARAMS4_HIBER_SCRATCHBUFS(hwparams4);
> -
> /*
> * REVISIT Enabling this bit so that host-mode hibernation
> * will work. Device-mode hibernation is not yet implemented.
> @@ -1151,10 +1063,6 @@ static int dwc3_core_init(struct dwc3 *dwc)
> dwc3_core_setup_global_control(dwc);
> dwc3_core_num_eps(dwc);
>
> - ret = dwc3_setup_scratch_buffers(dwc);
> - if (ret)
> - goto err1;
> -
> /* Set power down scale of suspend_clk */
> dwc3_set_power_down_clk_scale(dwc);
>
> @@ -1908,14 +1816,10 @@ static int dwc3_probe(struct platform_device *pdev)
> if (ret)
> goto err3;
>
> - ret = dwc3_alloc_scratch_buffers(dwc);
> - if (ret)
> - goto err3;
> -
> ret = dwc3_core_init(dwc);
> if (ret) {
> dev_err_probe(dev, ret, "failed to initialize core\n");
> - goto err4;
> + goto err3;
> }
>
> dwc3_check_params(dwc);
> @@ -1944,10 +1848,6 @@ static int dwc3_probe(struct platform_device *pdev)
> phy_exit(dwc->usb3_generic_phy);
>
> dwc3_ulpi_exit(dwc);
> -
> -err4:
> - dwc3_free_scratch_buffers(dwc);
> -
> err3:
> dwc3_free_event_buffers(dwc);
>
> @@ -1987,7 +1887,6 @@ static int dwc3_remove(struct platform_device *pdev)
> pm_runtime_set_suspended(&pdev->dev);
>
> dwc3_free_event_buffers(dwc);
> - dwc3_free_scratch_buffers(dwc);
>
> if (dwc->usb_psy)
> power_supply_put(dwc->usb_psy);
> diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
> index 4743e918dcaf..fbbc565d3b34 100644
> --- a/drivers/usb/dwc3/core.h
> +++ b/drivers/usb/dwc3/core.h
> @@ -969,12 +969,10 @@ struct dwc3_scratchpad_array {
> * @drd_work: workqueue used for role swapping
> * @ep0_trb: trb which is used for the ctrl_req
> * @bounce: address of bounce buffer
> - * @scratchbuf: address of scratch buffer
> * @setup_buf: used while precessing STD USB requests
> * @ep0_trb_addr: dma address of @ep0_trb
> * @bounce_addr: dma address of @bounce
> * @ep0_usb_req: dummy req used while handling STD USB requests
> - * @scratch_addr: dma address of scratchbuf
> * @ep0_in_setup: one control transfer is completed and enter setup phase
> * @lock: for synchronizing
> * @mutex: for mode switching
> @@ -999,7 +997,6 @@ struct dwc3_scratchpad_array {
> * @current_otg_role: current role of operation while using the OTG block
> * @desired_otg_role: desired role of operation while using the OTG block
> * @otg_restart_host: flag that OTG controller needs to restart host
> - * @nr_scratch: number of scratch buffers
> * @u1u2: only used on revisions <1.83a for workaround
> * @maximum_speed: maximum speed requested (mainly for testing purposes)
> * @max_ssp_rate: SuperSpeed Plus maximum signaling rate and lane count
> @@ -1056,7 +1053,6 @@ struct dwc3_scratchpad_array {
> * @delayed_status: true when gadget driver asks for delayed status
> * @ep0_bounced: true when we used bounce buffer
> * @ep0_expect_in: true when we expect a DATA IN transfer
> - * @has_hibernation: true when dwc3 was configured with Hibernation
> * @sysdev_is_parent: true when dwc3 device has a parent driver
> * @has_lpm_erratum: true when core was configured with LPM Erratum. Note that
> * there's now way for software to detect this in runtime.
> @@ -1123,11 +1119,9 @@ struct dwc3 {
> struct work_struct drd_work;
> struct dwc3_trb *ep0_trb;
> void *bounce;
> - void *scratchbuf;
> u8 *setup_buf;
> dma_addr_t ep0_trb_addr;
> dma_addr_t bounce_addr;
> - dma_addr_t scratch_addr;
> struct dwc3_request ep0_usb_req;
> struct completion ep0_in_setup;
>
> @@ -1187,7 +1181,6 @@ struct dwc3 {
> u32 current_otg_role;
> u32 desired_otg_role;
> bool otg_restart_host;
> - u32 nr_scratch;
> u32 u1u2;
> u32 maximum_speed;
> u32 gadget_max_speed;
> @@ -1284,7 +1277,6 @@ struct dwc3 {
> unsigned delayed_status:1;
> unsigned ep0_bounced:1;
> unsigned ep0_expect_in:1;
> - unsigned has_hibernation:1;
> unsigned sysdev_is_parent:1;
> unsigned has_lpm_erratum:1;
> unsigned is_utmi_l1_suspend:1;
> --
> 2.39.2
>

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

Thanks,
Thinh