Re: [PATCH v5 46/75] usb: dwc3: import from kernel v6.2

Mattijs Korpershoek <[email protected]>
Newsgroups gmane.comp.boot-loaders.u-boot
Message-ID <[email protected]>
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.