USB: dwc3: drop dead hibernation code
authorJohan Hovold <johan+linaro@kernel.org>
Tue, 4 Apr 2023 07:25:18 +0000 (09:25 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 20 Apr 2023 08:18:22 +0000 (10:18 +0200)
The hibernation code is broken and has never been enabled in mainline
and should thus be dropped.

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").

Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
Link: https://lore.kernel.org/r/20230404072524.19014-6-johan+linaro@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/dwc3/core.c
drivers/usb/dwc3/core.h

index bb737c3..4ed9885 100644 (file)
@@ -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;
@@ -887,7 +803,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);
@@ -915,9 +830,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.
@@ -1161,10 +1073,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);
 
@@ -1920,14 +1828,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);
@@ -1956,10 +1860,6 @@ err5:
        phy_exit(dwc->usb3_generic_phy);
 
        dwc3_ulpi_exit(dwc);
-
-err4:
-       dwc3_free_scratch_buffers(dwc);
-
 err3:
        dwc3_free_event_buffers(dwc);
 
@@ -1999,7 +1899,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);
index 26c8efe..19490dc 100644 (file)
@@ -973,12 +973,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
@@ -1003,7 +1001,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
@@ -1060,7 +1057,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.
@@ -1130,11 +1126,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;
 
@@ -1194,7 +1188,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;
@@ -1291,7 +1284,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;