Hi Anders,

Thank you for the patch.

On Thu, Jul 16, 2026 at 15:42, Anders Roxell <[email protected]> wrote:

> From: Jens Wiklander <[email protected]>
>
> Sync Linux kernel dwc3 changes from v6.1 to v6.2.
>
> The following files are preserved accross the import:
> Makefile Kconfig dwc3-meson-g12a.c dwc3-meson-gxl.c dwc3-omap.c
> dwc3-uniphier.c dwc3-generic.h dwc3-generic.c dwc3-generic-sti.c
> dwc3-layerscape.c ti_usb_phy.c
>
> Skipping unused files:
> debugfs.c drd.c dwc3-exynos.c dwc3-haps.c dwc3-imx8mp.c dwc3-keystone.c
> dwc3-octeon.c dwc3-of-simple.c dwc3-pci.c dwc3-qcom.c dwc3-qcom-legacy.c
> dwc3-rtk.c dwc3-st.c dwc3-xilinx.c host.c trace.c trace.h ulpi.c
>
> Note that this is a raw import and doesn't build.
> A fixup commit at the end of the series fixes that.
>
> List of commits: git log --oneline v6.1..v6.2
> Commits imported:
> eb320f76e31d usb: dwc3: qcom: enable vbus override when in OTG dr-mode
> 7d80dbd708c1 usb: dwc3: fix extcon dependency
> c4e3ef568539 usb: dwc3: gadget: Ignore End Transfer delay on teardown
> e498a0444324 usb: dwc3: xilinx: include linux/gpio/consumer.h
> 63130462c919 usb: dwc3: core: defer probe on ulpi_read_id timeout
> 97a48da1619b usb: dwc3: qcom: Fix memory leak in dwc3_qcom_interconnect_init
> 62c73bfea048 usb: dwc3: Fix race between dwc3_set_mode and __dwc3_set_mode
> f05f80f217bf usb: dwc3: pci: Update PCIe device ID for USB3 controller on CPU 
> sub-system for Raptor Lake
> 3205054dc6fe usb: dwc3: improve the config dependency of USB_DWC3_XILINX
> 049142335613 usb: dwc3: gadget: Reduce TRB IOC settings

Please drop the irrelevant lines from the changelog (for example qcom,
xilinx)

With that fixed:

Reviewed-by: Mattijs Korpershoek <[email protected]>

>
> Signed-off-by: Jens Wiklander <[email protected]>
> Signed-off-by: Anders Roxell <[email protected]>

> ---
>  drivers/usb/dwc3/core.c   | 23 ++++++++++++++++-------
>  drivers/usb/dwc3/gadget.c | 19 ++++++++++++++++---
>  2 files changed, 32 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
> index 1f348bc867c2..476b63618511 100644
> --- a/drivers/usb/dwc3/core.c
> +++ b/drivers/usb/dwc3/core.c
> @@ -122,21 +122,25 @@ static void __dwc3_set_mode(struct work_struct *work)
>       unsigned long flags;
>       int ret;
>       u32 reg;
> +     u32 desired_dr_role;
>  
>       mutex_lock(&dwc->mutex);
> +     spin_lock_irqsave(&dwc->lock, flags);
> +     desired_dr_role = dwc->desired_dr_role;
> +     spin_unlock_irqrestore(&dwc->lock, flags);
>  
>       pm_runtime_get_sync(dwc->dev);
>  
>       if (dwc->current_dr_role == DWC3_GCTL_PRTCAP_OTG)
>               dwc3_otg_update(dwc, 0);
>  
> -     if (!dwc->desired_dr_role)
> +     if (!desired_dr_role)
>               goto out;
>  
> -     if (dwc->desired_dr_role == dwc->current_dr_role)
> +     if (desired_dr_role == dwc->current_dr_role)
>               goto out;
>  
> -     if (dwc->desired_dr_role == DWC3_GCTL_PRTCAP_OTG && dwc->edev)
> +     if (desired_dr_role == DWC3_GCTL_PRTCAP_OTG && dwc->edev)
>               goto out;
>  
>       switch (dwc->current_dr_role) {
> @@ -164,7 +168,7 @@ static void __dwc3_set_mode(struct work_struct *work)
>        */
>       if (dwc->current_dr_role && ((DWC3_IP_IS(DWC3) ||
>                       DWC3_VER_IS_PRIOR(DWC31, 190A)) &&
> -                     dwc->desired_dr_role != DWC3_GCTL_PRTCAP_OTG)) {
> +                     desired_dr_role != DWC3_GCTL_PRTCAP_OTG)) {
>               reg = dwc3_readl(dwc->regs, DWC3_GCTL);
>               reg |= DWC3_GCTL_CORESOFTRESET;
>               dwc3_writel(dwc->regs, DWC3_GCTL, reg);
> @@ -184,11 +188,11 @@ static void __dwc3_set_mode(struct work_struct *work)
>  
>       spin_lock_irqsave(&dwc->lock, flags);
>  
> -     dwc3_set_prtcap(dwc, dwc->desired_dr_role);
> +     dwc3_set_prtcap(dwc, desired_dr_role);
>  
>       spin_unlock_irqrestore(&dwc->lock, flags);
>  
> -     switch (dwc->desired_dr_role) {
> +     switch (desired_dr_role) {
>       case DWC3_GCTL_PRTCAP_HOST:
>               ret = dwc3_host_init(dwc);
>               if (ret) {
> @@ -1096,8 +1100,13 @@ static int dwc3_core_init(struct dwc3 *dwc)
>  
>       if (!dwc->ulpi_ready) {
>               ret = dwc3_core_ulpi_init(dwc);
> -             if (ret)
> +             if (ret) {
> +                     if (ret == -ETIMEDOUT) {
> +                             dwc3_core_soft_reset(dwc);
> +                             ret = -EPROBE_DEFER;
> +                     }
>                       goto err0;
> +             }
>               dwc->ulpi_ready = true;
>       }
>  
> diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
> index 6d524fa76443..89dcfac01235 100644
> --- a/drivers/usb/dwc3/gadget.c
> +++ b/drivers/usb/dwc3/gadget.c
> @@ -1464,8 +1464,18 @@ static int dwc3_prepare_trbs_sg(struct dwc3_ep *dep,
>                        */
>                       if (num_trbs_left == 1 || (needs_extra_trb &&
>                                       num_trbs_left <= 2 &&
> -                                     sg_dma_len(sg_next(s)) >= length))
> -                             must_interrupt = true;
> +                                     sg_dma_len(sg_next(s)) >= length)) {
> +                             struct dwc3_request *r;
> +
> +                             /* Check if previous requests already set IOC */
> +                             list_for_each_entry(r, &dep->started_list, 
> list) {
> +                                     if (r != req && 
> !r->request.no_interrupt)
> +                                             break;
> +
> +                                     if (r == req)
> +                                             must_interrupt = true;
> +                             }
> +                     }
>  
>                       dwc3_prepare_one_trb(dep, req, trb_length, 1, i, false,
>                                       must_interrupt);
> @@ -1717,6 +1727,7 @@ static int __dwc3_stop_active_transfer(struct dwc3_ep 
> *dep, bool force, bool int
>       else if (!ret)
>               dep->flags |= DWC3_EP_END_TRANSFER_PENDING;
>  
> +     dep->flags &= ~DWC3_EP_DELAY_STOP;
>       return ret;
>  }
>  
> @@ -3722,8 +3733,10 @@ void dwc3_stop_active_transfer(struct dwc3_ep *dep, 
> bool force,
>       if (dep->number <= 1 && dwc->ep0state != EP0_DATA_PHASE)
>               return;
>  
> +     if (interrupt && (dep->flags & DWC3_EP_DELAY_STOP))
> +             return;
> +
>       if (!(dep->flags & DWC3_EP_TRANSFER_STARTED) ||
> -         (dep->flags & DWC3_EP_DELAY_STOP) ||
>           (dep->flags & DWC3_EP_END_TRANSFER_PENDING))
>               return;
>  
> -- 
> 2.53.0

Reply via email to