U-Boot Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Mattijs Korpershoek <mkorpershoek@kernel.org>
To: Anders Roxell <anders.roxell@linaro.org>,
	u-boot@lists.denx.de, marex@denx.de
Cc: mkorpershoek@kernel.org, ilias.apalodimas@linaro.org,
	trini@konsulko.com, michal.simek@amd.com, alchark@flipper.net,
	jerome.forissier@arm.com,
	Jens Wiklander <jens.wiklander@linaro.org>,
	Simon Glass <sjg@chromium.org>,
	Anders Roxell <anders.roxell@linaro.org>,
	Lukasz Majewski <lukma@denx.de>
Subject: Re: [PATCH v5 07/75] usb: dwc3: import from kernel v4.4
Date: Mon, 27 Jul 2026 10:54:11 +0200	[thread overview]
Message-ID: <87qzko6cek.fsf@kernel.org> (raw)
In-Reply-To: <20260716134305.614278-8-anders.roxell@linaro.org>

Hi Anders,

Thank you for the patch.

On Thu, Jul 16, 2026 at 15:41, Anders Roxell <anders.roxell@linaro.org> wrote:

> From: Jens Wiklander <jens.wiklander@linaro.org>
>
> Sync Linux kernel dwc3 changes from v4.3 to v4.4.
>
> 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 v4.3..v4.4
> Commits imported:
> 62e345ae5b6e usb: dwc3: gadget: don't prestart interrupt endpoints
> b9e51b2b1fda usb: dwc3: gadget: let us set lower max_speed
> b4c580a43d52 usb: dwc3: pci: add support for Intel Broxton SOC
> d115d7050a0d Revert "usb: dwc3: gadget: drop unnecessary loop when cleaning up TRBs"
> e5f68b4a3e7b Revert "usb: dwc3: gadget: remove unnecessary _irqsave()"
> 94218ee31ba5 usb: dwc3: pci: Set enblslpm quirk for Synopsys platforms
> ec791d149bca usb: dwc3: Add dis_enblslpm_quirk
> bb7f3d6d323a usb: dwc3: pci: Add platform data for Synopsys HAPS
> 9a5a0783e491 usb: dwc3: pci: trivial: Formatting
> 690fb3718a70 usb: dwc3: Support Synopsys USB 3.1 IP
> e8095a25364a usb: dwc3: pci: Add the PCI Product ID for Synopsys USB 3.1
> 41adc59caece usb: dwc3: pci: Add the Synopsys HAPS AXI Product ID
> 70f3a9caa116 usb: dwc3: gadget: remove unnecessary _irqsave()
> e6e709b7ab89 usb: dwc3: gadget: use Update Transfer from Xfer In Progress
> 6bb4fe12ea08 usb: dwc3: gadget: use update transfer command
> 8a1a9c9e4503 usb: dwc3: gadget: start transfer on XFER_COMPLETE
> 9caeb06ebd46 usb: dwc3: pci: passing forward the ACPI companion
> 3d128919b7e5 usb: dwc3: core: convert to unified device property interface
> 06e7114f0d82 usb: common: of_usb_get_dr_mode to usb_get_dr_mode
> 666472733b8c usb: dwc3: st: prepare the driver for generic usb_get_dr_mode function
> 63863b988eec usb: common: of_usb_get_maximum_speed to usb_get_maximum_speed
> 6344475f5397 usb: dwc3: support for pinctrl state change during system sleep
> db2be4e9e30c usb: dwc3: Add frame length adjustment quirk
> a8f32817eeb0 usb: dwc3: gadget: improve ep_queue's error reporting
> 89185916d229 usb: dwc3: gadget: clear DWC3_PENDING_REQUEST when request is queued
> 1d6a39186b37 usb: dwc3: gadget: start requests as soon as they come
> fe84f522ed6d usb: dwc3: gadget: move trace_dwc3_ep_queue()
>
> Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org>
> Reviewed-by: Simon Glass <sjg@chromium.org>
> Signed-off-by: Anders Roxell <anders.roxell@linaro.org>

I've file-compared with the mentioned Linux kernel release, and this
looks good to me:

Reviewed-by: Mattijs Korpershoek <mkorpershoek@kernel.org>

> ---
>  drivers/usb/dwc3/core.c          | 104 ++++++++++++++++++-------
>  drivers/usb/dwc3/core.h          |  27 +++++++
>  drivers/usb/dwc3/gadget.c        | 125 +++++++++++++++++++++----------
>  drivers/usb/dwc3/platform_data.h |   3 +
>  4 files changed, 194 insertions(+), 65 deletions(-)
>
> diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
> index 064123e44566..22b4797383cd 100644
> --- a/drivers/usb/dwc3/core.c
> +++ b/drivers/usb/dwc3/core.c
> @@ -34,6 +34,7 @@
>  #include <linux/dma-mapping.h>
>  #include <linux/of.h>
>  #include <linux/acpi.h>
> +#include <linux/pinctrl/consumer.h>
>  
>  #include <linux/usb/ch9.h>
>  #include <linux/usb/gadget.h>
> @@ -143,6 +144,32 @@ static int dwc3_soft_reset(struct dwc3 *dwc)
>  	return 0;
>  }
>  
> +/*
> + * dwc3_frame_length_adjustment - Adjusts frame length if required
> + * @dwc3: Pointer to our controller context structure
> + * @fladj: Value of GFLADJ_30MHZ to adjust frame length
> + */
> +static void dwc3_frame_length_adjustment(struct dwc3 *dwc, u32 fladj)
> +{
> +	u32 reg;
> +	u32 dft;
> +
> +	if (dwc->revision < DWC3_REVISION_250A)
> +		return;
> +
> +	if (fladj == 0)
> +		return;
> +
> +	reg = dwc3_readl(dwc->regs, DWC3_GFLADJ);
> +	dft = reg & DWC3_GFLADJ_30MHZ_MASK;
> +	if (!dev_WARN_ONCE(dwc->dev, dft == fladj,
> +	    "request value same as default, ignoring\n")) {
> +		reg &= ~DWC3_GFLADJ_30MHZ_MASK;
> +		reg |= DWC3_GFLADJ_30MHZ_SDBND_SEL | fladj;
> +		dwc3_writel(dwc->regs, DWC3_GFLADJ, reg);
> +	}
> +}
> +
>  /**
>   * dwc3_free_one_event_buffer - Frees one event buffer
>   * @dwc: Pointer to our controller context structure
> @@ -488,6 +515,9 @@ static int dwc3_phy_setup(struct dwc3 *dwc)
>  	if (dwc->dis_u2_susphy_quirk)
>  		reg &= ~DWC3_GUSB2PHYCFG_SUSPHY;
>  
> +	if (dwc->dis_enblslpm_quirk)
> +		reg &= ~DWC3_GUSB2PHYCFG_ENBLSLPM;
> +
>  	dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg);
>  
>  	return 0;
> @@ -507,12 +537,18 @@ static int dwc3_core_init(struct dwc3 *dwc)
>  
>  	reg = dwc3_readl(dwc->regs, DWC3_GSNPSID);
>  	/* This should read as U3 followed by revision number */
> -	if ((reg & DWC3_GSNPSID_MASK) != 0x55330000) {
> +	if ((reg & DWC3_GSNPSID_MASK) == 0x55330000) {
> +		/* Detected DWC_usb3 IP */
> +		dwc->revision = reg;
> +	} else if ((reg & DWC3_GSNPSID_MASK) == 0x33310000) {
> +		/* Detected DWC_usb31 IP */
> +		dwc->revision = dwc3_readl(dwc->regs, DWC3_VER_NUMBER);
> +		dwc->revision |= DWC3_REVISION_IS_DWC31;
> +	} else {
>  		dev_err(dwc->dev, "this is not a DesignWare USB3 DRD Core\n");
>  		ret = -ENODEV;
>  		goto err0;
>  	}
> -	dwc->revision = reg;
>  
>  	/*
>  	 * Write Linux Version Code to our GUID register so it's easy to figure
> @@ -773,12 +809,12 @@ static int dwc3_probe(struct platform_device *pdev)
>  {
>  	struct device		*dev = &pdev->dev;
>  	struct dwc3_platform_data *pdata = dev_get_platdata(dev);
> -	struct device_node	*node = dev->of_node;
>  	struct resource		*res;
>  	struct dwc3		*dwc;
>  	u8			lpm_nyet_threshold;
>  	u8			tx_de_emphasis;
>  	u8			hird_threshold;
> +	u32			fladj = 0;
>  
>  	int			ret;
>  
> @@ -842,51 +878,56 @@ static int dwc3_probe(struct platform_device *pdev)
>  	 */
>  	hird_threshold = 12;
>  
> -	if (node) {
> -		dwc->maximum_speed = of_usb_get_maximum_speed(node);
> -		dwc->has_lpm_erratum = of_property_read_bool(node,
> +	dwc->maximum_speed = usb_get_maximum_speed(dev);
> +	dwc->dr_mode = usb_get_dr_mode(dev);
> +
> +	dwc->has_lpm_erratum = device_property_read_bool(dev,
>  				"snps,has-lpm-erratum");
> -		of_property_read_u8(node, "snps,lpm-nyet-threshold",
> +	device_property_read_u8(dev, "snps,lpm-nyet-threshold",
>  				&lpm_nyet_threshold);
> -		dwc->is_utmi_l1_suspend = of_property_read_bool(node,
> +	dwc->is_utmi_l1_suspend = device_property_read_bool(dev,
>  				"snps,is-utmi-l1-suspend");
> -		of_property_read_u8(node, "snps,hird-threshold",
> +	device_property_read_u8(dev, "snps,hird-threshold",
>  				&hird_threshold);
> -		dwc->usb3_lpm_capable = of_property_read_bool(node,
> +	dwc->usb3_lpm_capable = device_property_read_bool(dev,
>  				"snps,usb3_lpm_capable");
>  
> -		dwc->needs_fifo_resize = of_property_read_bool(node,
> +	dwc->needs_fifo_resize = device_property_read_bool(dev,
>  				"tx-fifo-resize");
> -		dwc->dr_mode = of_usb_get_dr_mode(node);
>  
> -		dwc->disable_scramble_quirk = of_property_read_bool(node,
> +	dwc->disable_scramble_quirk = device_property_read_bool(dev,
>  				"snps,disable_scramble_quirk");
> -		dwc->u2exit_lfps_quirk = of_property_read_bool(node,
> +	dwc->u2exit_lfps_quirk = device_property_read_bool(dev,
>  				"snps,u2exit_lfps_quirk");
> -		dwc->u2ss_inp3_quirk = of_property_read_bool(node,
> +	dwc->u2ss_inp3_quirk = device_property_read_bool(dev,
>  				"snps,u2ss_inp3_quirk");
> -		dwc->req_p1p2p3_quirk = of_property_read_bool(node,
> +	dwc->req_p1p2p3_quirk = device_property_read_bool(dev,
>  				"snps,req_p1p2p3_quirk");
> -		dwc->del_p1p2p3_quirk = of_property_read_bool(node,
> +	dwc->del_p1p2p3_quirk = device_property_read_bool(dev,
>  				"snps,del_p1p2p3_quirk");
> -		dwc->del_phy_power_chg_quirk = of_property_read_bool(node,
> +	dwc->del_phy_power_chg_quirk = device_property_read_bool(dev,
>  				"snps,del_phy_power_chg_quirk");
> -		dwc->lfps_filter_quirk = of_property_read_bool(node,
> +	dwc->lfps_filter_quirk = device_property_read_bool(dev,
>  				"snps,lfps_filter_quirk");
> -		dwc->rx_detect_poll_quirk = of_property_read_bool(node,
> +	dwc->rx_detect_poll_quirk = device_property_read_bool(dev,
>  				"snps,rx_detect_poll_quirk");
> -		dwc->dis_u3_susphy_quirk = of_property_read_bool(node,
> +	dwc->dis_u3_susphy_quirk = device_property_read_bool(dev,
>  				"snps,dis_u3_susphy_quirk");
> -		dwc->dis_u2_susphy_quirk = of_property_read_bool(node,
> +	dwc->dis_u2_susphy_quirk = device_property_read_bool(dev,
>  				"snps,dis_u2_susphy_quirk");
> +	dwc->dis_enblslpm_quirk = device_property_read_bool(dev,
> +				"snps,dis_enblslpm_quirk");
>  
> -		dwc->tx_de_emphasis_quirk = of_property_read_bool(node,
> +	dwc->tx_de_emphasis_quirk = device_property_read_bool(dev,
>  				"snps,tx_de_emphasis_quirk");
> -		of_property_read_u8(node, "snps,tx_de_emphasis",
> +	device_property_read_u8(dev, "snps,tx_de_emphasis",
>  				&tx_de_emphasis);
> -		of_property_read_string(node, "snps,hsphy_interface",
> -					&dwc->hsphy_interface);
> -	} else if (pdata) {
> +	device_property_read_string(dev, "snps,hsphy_interface",
> +				    &dwc->hsphy_interface);
> +	device_property_read_u32(dev, "snps,quirk-frame-length-adjustment",
> +				 &fladj);
> +
> +	if (pdata) {
>  		dwc->maximum_speed = pdata->maximum_speed;
>  		dwc->has_lpm_erratum = pdata->has_lpm_erratum;
>  		if (pdata->lpm_nyet_threshold)
> @@ -909,12 +950,14 @@ static int dwc3_probe(struct platform_device *pdev)
>  		dwc->rx_detect_poll_quirk = pdata->rx_detect_poll_quirk;
>  		dwc->dis_u3_susphy_quirk = pdata->dis_u3_susphy_quirk;
>  		dwc->dis_u2_susphy_quirk = pdata->dis_u2_susphy_quirk;
> +		dwc->dis_enblslpm_quirk = pdata->dis_enblslpm_quirk;
>  
>  		dwc->tx_de_emphasis_quirk = pdata->tx_de_emphasis_quirk;
>  		if (pdata->tx_de_emphasis)
>  			tx_de_emphasis = pdata->tx_de_emphasis;
>  
>  		dwc->hsphy_interface = pdata->hsphy_interface;
> +		fladj = pdata->fladj_value;
>  	}
>  
>  	/* default to superspeed if no maximum_speed passed */
> @@ -971,6 +1014,9 @@ static int dwc3_probe(struct platform_device *pdev)
>  		goto err1;
>  	}
>  
> +	/* Adjust Frame Length */
> +	dwc3_frame_length_adjustment(dwc, fladj);
> +
>  	usb_phy_set_suspend(dwc->usb2_phy, 0);
>  	usb_phy_set_suspend(dwc->usb3_phy, 0);
>  	ret = phy_power_on(dwc->usb2_generic_phy);
> @@ -1091,6 +1137,8 @@ static int dwc3_suspend(struct device *dev)
>  	phy_exit(dwc->usb2_generic_phy);
>  	phy_exit(dwc->usb3_generic_phy);
>  
> +	pinctrl_pm_select_sleep_state(dev);
> +
>  	return 0;
>  }
>  
> @@ -1100,6 +1148,8 @@ static int dwc3_resume(struct device *dev)
>  	unsigned long	flags;
>  	int		ret;
>  
> +	pinctrl_pm_select_default_state(dev);
> +
>  	usb_phy_init(dwc->usb3_phy);
>  	usb_phy_init(dwc->usb2_phy);
>  	ret = phy_init(dwc->usb2_generic_phy);
> diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
> index 044778884585..36f1cb74588c 100644
> --- a/drivers/usb/dwc3/core.h
> +++ b/drivers/usb/dwc3/core.h
> @@ -108,6 +108,9 @@
>  #define DWC3_GPRTBIMAP_FS0	0xc188
>  #define DWC3_GPRTBIMAP_FS1	0xc18c
>  
> +#define DWC3_VER_NUMBER		0xc1a0
> +#define DWC3_VER_TYPE		0xc1a4
> +
>  #define DWC3_GUSB2PHYCFG(n)	(0xc200 + (n * 0x04))
>  #define DWC3_GUSB2I2CCTL(n)	(0xc240 + (n * 0x04))
>  
> @@ -124,6 +127,7 @@
>  #define DWC3_GEVNTCOUNT(n)	(0xc40c + (n * 0x10))
>  
>  #define DWC3_GHWPARAMS8		0xc600
> +#define DWC3_GFLADJ		0xc630
>  
>  /* Device Registers */
>  #define DWC3_DCFG		0xc700
> @@ -175,6 +179,7 @@
>  #define DWC3_GUSB2PHYCFG_PHYSOFTRST	(1 << 31)
>  #define DWC3_GUSB2PHYCFG_SUSPHY		(1 << 6)
>  #define DWC3_GUSB2PHYCFG_ULPI_UTMI	(1 << 4)
> +#define DWC3_GUSB2PHYCFG_ENBLSLPM	(1 << 8)
>  
>  /* Global USB2 PHY Vendor Control Register */
>  #define DWC3_GUSB2PHYACC_NEWREGREQ	(1 << 25)
> @@ -234,6 +239,10 @@
>  /* Global HWPARAMS6 Register */
>  #define DWC3_GHWPARAMS6_EN_FPGA			(1 << 7)
>  
> +/* Global Frame Length Adjustment Register */
> +#define DWC3_GFLADJ_30MHZ_SDBND_SEL		(1 << 7)
> +#define DWC3_GFLADJ_30MHZ_MASK			0x3f
> +
>  /* Device Configuration Register */
>  #define DWC3_DCFG_DEVADDR(addr)	((addr) << 3)
>  #define DWC3_DCFG_DEVADDR_MASK	DWC3_DCFG_DEVADDR(0x7f)
> @@ -712,6 +721,8 @@ struct dwc3_scratchpad_array {
>   * @rx_detect_poll_quirk: set if we enable rx_detect to polling lfps quirk
>   * @dis_u3_susphy_quirk: set if we disable usb3 suspend phy
>   * @dis_u2_susphy_quirk: set if we disable usb2 suspend phy
> + * @dis_enblslpm_quirk: set if we clear enblslpm in GUSB2PHYCFG,
> + *                      disabling the suspend signal to the PHY.
>   * @tx_de_emphasis_quirk: set if we enable Tx de-emphasis quirk
>   * @tx_de_emphasis: Tx de-emphasis value
>   * 	0	- -6dB de-emphasis
> @@ -766,6 +777,14 @@ struct dwc3 {
>  	u32			num_event_buffers;
>  	u32			u1u2;
>  	u32			maximum_speed;
> +
> +	/*
> +	 * All 3.1 IP version constants are greater than the 3.0 IP
> +	 * version constants. This works for most version checks in
> +	 * dwc3. However, in the future, this may not apply as
> +	 * features may be developed on newer versions of the 3.0 IP
> +	 * that are not in the 3.1 IP.
> +	 */
>  	u32			revision;
>  
>  #define DWC3_REVISION_173A	0x5533173a
> @@ -788,6 +807,13 @@ struct dwc3 {
>  #define DWC3_REVISION_270A	0x5533270a
>  #define DWC3_REVISION_280A	0x5533280a
>  
> +/*
> + * NOTICE: we're using bit 31 as a "is usb 3.1" flag. This is really
> + * just so dwc31 revisions are always larger than dwc3.
> + */
> +#define DWC3_REVISION_IS_DWC31		0x80000000
> +#define DWC3_USB31_REVISION_110A	(0x3131302a | DWC3_REVISION_IS_USB31)
> +
>  	enum dwc3_ep0_next	ep0_next_event;
>  	enum dwc3_ep0_state	ep0state;
>  	enum dwc3_link_state	link_state;
> @@ -841,6 +867,7 @@ struct dwc3 {
>  	unsigned		rx_detect_poll_quirk:1;
>  	unsigned		dis_u3_susphy_quirk:1;
>  	unsigned		dis_u2_susphy_quirk:1;
> +	unsigned		dis_enblslpm_quirk:1;
>  
>  	unsigned		tx_de_emphasis_quirk:1;
>  	unsigned		tx_de_emphasis:2;
> diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
> index 1e8bdf817811..a58376fd65fe 100644
> --- a/drivers/usb/dwc3/gadget.c
> +++ b/drivers/usb/dwc3/gadget.c
> @@ -948,7 +948,6 @@ static int __dwc3_gadget_kick_transfer(struct dwc3_ep *dep, u16 cmd_param,
>  		dwc3_trace(trace_dwc3_gadget, "%s: endpoint busy", dep->name);
>  		return -EBUSY;
>  	}
> -	dep->flags &= ~DWC3_EP_PENDING_REQUEST;
>  
>  	/*
>  	 * If we are getting here after a short-out-packet we don't enqueue any
> @@ -1050,6 +1049,8 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req)
>  	req->direction		= dep->direction;
>  	req->epnum		= dep->number;
>  
> +	trace_dwc3_ep_queue(req);
> +
>  	/*
>  	 * We only add to our list of requests now and
>  	 * start consuming the list once we get XferNotReady
> @@ -1069,6 +1070,20 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req)
>  
>  	list_add_tail(&req->list, &dep->request_list);
>  
> +	/*
> +	 * If there are no pending requests and the endpoint isn't already
> +	 * busy, we will just start the request straight away.
> +	 *
> +	 * This will save one IRQ (XFER_NOT_READY) and possibly make it a
> +	 * little bit faster.
> +	 */
> +	if (!usb_endpoint_xfer_isoc(dep->endpoint.desc) &&
> +			!usb_endpoint_xfer_int(dep->endpoint.desc) &&
> +			!(dep->flags & DWC3_EP_BUSY)) {
> +		ret = __dwc3_gadget_kick_transfer(dep, 0, true);
> +		goto out;
> +	}
> +
>  	/*
>  	 * There are a few special cases:
>  	 *
> @@ -1096,10 +1111,10 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req)
>  		}
>  
>  		ret = __dwc3_gadget_kick_transfer(dep, 0, true);
> -		if (ret && ret != -EBUSY)
> -			dev_dbg(dwc->dev, "%s: failed to kick transfers\n",
> -					dep->name);
> -		return ret;
> +		if (!ret)
> +			dep->flags &= ~DWC3_EP_PENDING_REQUEST;
> +
> +		goto out;
>  	}
>  
>  	/*
> @@ -1113,10 +1128,7 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req)
>  		WARN_ON_ONCE(!dep->resource_index);
>  		ret = __dwc3_gadget_kick_transfer(dep, dep->resource_index,
>  				false);
> -		if (ret && ret != -EBUSY)
> -			dev_dbg(dwc->dev, "%s: failed to kick transfers\n",
> -					dep->name);
> -		return ret;
> +		goto out;
>  	}
>  
>  	/*
> @@ -1124,14 +1136,17 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req)
>  	 * right away, otherwise host will not know we have streams to be
>  	 * handled.
>  	 */
> -	if (dep->stream_capable) {
> +	if (dep->stream_capable)
>  		ret = __dwc3_gadget_kick_transfer(dep, 0, true);
> -		if (ret && ret != -EBUSY)
> -			dev_dbg(dwc->dev, "%s: failed to kick transfers\n",
> -					dep->name);
> -	}
>  
> -	return 0;
> +out:
> +	if (ret && ret != -EBUSY)
> +		dev_dbg(dwc->dev, "%s: failed to kick transfers\n",
> +				dep->name);
> +	if (ret == -EBUSY)
> +		ret = 0;
> +
> +	return ret;
>  }
>  
>  static int dwc3_gadget_ep_queue(struct usb_ep *ep, struct usb_request *request,
> @@ -1159,8 +1174,6 @@ static int dwc3_gadget_ep_queue(struct usb_ep *ep, struct usb_request *request,
>  		goto out;
>  	}
>  
> -	trace_dwc3_ep_queue(req);
> -
>  	ret = __dwc3_gadget_ep_queue(dep, req);
>  
>  out:
> @@ -1872,27 +1885,32 @@ static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, struct dwc3_ep *dep,
>  	unsigned int		i;
>  	int			ret;
>  
> -	req = next_request(&dep->req_queued);
> -	if (!req) {
> -		WARN_ON_ONCE(1);
> -		return 1;
> -	}
> -	i = 0;
>  	do {
> -		slot = req->start_slot + i;
> -		if ((slot == DWC3_TRB_NUM - 1) &&
> +		req = next_request(&dep->req_queued);
> +		if (!req) {
> +			WARN_ON_ONCE(1);
> +			return 1;
> +		}
> +		i = 0;
> +		do {
> +			slot = req->start_slot + i;
> +			if ((slot == DWC3_TRB_NUM - 1) &&
>  				usb_endpoint_xfer_isoc(dep->endpoint.desc))
> -			slot++;
> -		slot %= DWC3_TRB_NUM;
> -		trb = &dep->trb_pool[slot];
> +				slot++;
> +			slot %= DWC3_TRB_NUM;
> +			trb = &dep->trb_pool[slot];
> +
> +			ret = __dwc3_cleanup_done_trbs(dwc, dep, req, trb,
> +					event, status);
> +			if (ret)
> +				break;
> +		} while (++i < req->request.num_mapped_sgs);
> +
> +		dwc3_gadget_giveback(dep, req, status);
>  
> -		ret = __dwc3_cleanup_done_trbs(dwc, dep, req, trb,
> -				event, status);
>  		if (ret)
>  			break;
> -	} while (++i < req->request.num_mapped_sgs);
> -
> -	dwc3_gadget_giveback(dep, req, status);
> +	} while (1);
>  
>  	if (usb_endpoint_xfer_isoc(dep->endpoint.desc) &&
>  			list_empty(&dep->req_queued)) {
> @@ -1955,6 +1973,14 @@ static void dwc3_endpoint_transfer_complete(struct dwc3 *dwc,
>  
>  		dwc->u1u2 = 0;
>  	}
> +
> +	if (!usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
> +		int ret;
> +
> +		ret = __dwc3_gadget_kick_transfer(dep, 0, is_xfer_complete);
> +		if (!ret || ret == -EBUSY)
> +			return;
> +	}
>  }
>  
>  static void dwc3_endpoint_interrupt(struct dwc3 *dwc,
> @@ -1992,15 +2018,16 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc,
>  		if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
>  			dwc3_gadget_start_isoc(dwc, dep, event);
>  		} else {
> +			int active;
>  			int ret;
>  
> +			active = event->status & DEPEVT_STATUS_TRANSFER_ACTIVE;
> +
>  			dwc3_trace(trace_dwc3_gadget, "%s: reason %s",
> -					dep->name, event->status &
> -					DEPEVT_STATUS_TRANSFER_ACTIVE
> -					? "Transfer Active"
> +					dep->name, active ? "Transfer Active"
>  					: "Transfer Not Active");
>  
> -			ret = __dwc3_gadget_kick_transfer(dep, 0, 1);
> +			ret = __dwc3_gadget_kick_transfer(dep, 0, !active);
>  			if (!ret || ret == -EBUSY)
>  				return;
>  
> @@ -2718,11 +2745,33 @@ int dwc3_gadget_init(struct dwc3 *dwc)
>  	}
>  
>  	dwc->gadget.ops			= &dwc3_gadget_ops;
> -	dwc->gadget.max_speed		= USB_SPEED_SUPER;
>  	dwc->gadget.speed		= USB_SPEED_UNKNOWN;
>  	dwc->gadget.sg_supported	= true;
>  	dwc->gadget.name		= "dwc3-gadget";
>  
> +	/*
> +	 * FIXME We might be setting max_speed to <SUPER, however versions
> +	 * <2.20a of dwc3 have an issue with metastability (documented
> +	 * elsewhere in this driver) which tells us we can't set max speed to
> +	 * anything lower than SUPER.
> +	 *
> +	 * Because gadget.max_speed is only used by composite.c and function
> +	 * drivers (i.e. it won't go into dwc3's registers) we are allowing this
> +	 * to happen so we avoid sending SuperSpeed Capability descriptor
> +	 * together with our BOS descriptor as that could confuse host into
> +	 * thinking we can handle super speed.
> +	 *
> +	 * Note that, in fact, we won't even support GetBOS requests when speed
> +	 * is less than super speed because we don't have means, yet, to tell
> +	 * composite.c that we are USB 2.0 + LPM ECN.
> +	 */
> +	if (dwc->revision < DWC3_REVISION_220A)
> +		dwc3_trace(trace_dwc3_gadget,
> +				"Changing max_speed on rev %08x\n",
> +				dwc->revision);
> +
> +	dwc->gadget.max_speed		= dwc->maximum_speed;
> +
>  	/*
>  	 * Per databook, DWC3 needs buffer size to be aligned to MaxPacketSize
>  	 * on ep out.
> diff --git a/drivers/usb/dwc3/platform_data.h b/drivers/usb/dwc3/platform_data.h
> index d3614ecbb9ca..2bb4d3ad0e6b 100644
> --- a/drivers/usb/dwc3/platform_data.h
> +++ b/drivers/usb/dwc3/platform_data.h
> @@ -42,9 +42,12 @@ struct dwc3_platform_data {
>  	unsigned rx_detect_poll_quirk:1;
>  	unsigned dis_u3_susphy_quirk:1;
>  	unsigned dis_u2_susphy_quirk:1;
> +	unsigned dis_enblslpm_quirk:1;
>  
>  	unsigned tx_de_emphasis_quirk:1;
>  	unsigned tx_de_emphasis:2;
>  
> +	u32 fladj_value;
> +
>  	const char *hsphy_interface;
>  };
> -- 
> 2.53.0

  reply	other threads:[~2026-07-27  8:54 UTC|newest]

Thread overview: 146+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-16 13:41 [PATCH v5 00/75] usb: dwc3: sync code with Linux v6.16 Anders Roxell
2026-07-16 13:41 ` [PATCH v5 01/75] usb: dwc3: restore to original v3.19-rc1 kernel import Anders Roxell
2026-07-27  8:39   ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 02/75] usb: dwc3: import from kernel v3.19 Anders Roxell
2026-07-27  8:42   ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 03/75] usb: dwc3: import from kernel v4.0 Anders Roxell
2026-07-27  8:44   ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 04/75] usb: dwc3: import from kernel v4.1 Anders Roxell
2026-07-27  8:48   ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 05/75] usb: dwc3: import from kernel v4.2 Anders Roxell
2026-07-27  8:52   ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 06/75] usb: dwc3: import from kernel v4.3 Anders Roxell
2026-07-27  8:53   ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 07/75] usb: dwc3: import from kernel v4.4 Anders Roxell
2026-07-27  8:54   ` Mattijs Korpershoek [this message]
2026-07-16 13:41 ` [PATCH v5 08/75] usb: dwc3: import from kernel v4.5 Anders Roxell
2026-07-27  8:55   ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 09/75] usb: dwc3: import from kernel v4.6 Anders Roxell
2026-07-27  8:56   ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 10/75] usb: dwc3: import from kernel v4.7 Anders Roxell
2026-07-27  8:56   ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 11/75] usb: dwc3: import from kernel v4.8 Anders Roxell
2026-07-27  8:58   ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 12/75] usb: dwc3: import from kernel v4.9 Anders Roxell
2026-07-27  8:59   ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 13/75] usb: dwc3: import from kernel v4.10 Anders Roxell
2026-07-27  9:00   ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 14/75] usb: dwc3: import from kernel v4.11 Anders Roxell
2026-07-27  9:00   ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 15/75] usb: dwc3: import from kernel v4.12 Anders Roxell
2026-07-27  9:01   ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 16/75] usb: dwc3: import from kernel v4.13 Anders Roxell
2026-07-27  9:02   ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 17/75] usb: dwc3: import from kernel v4.14 Anders Roxell
2026-07-27  9:04   ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 18/75] usb: dwc3: import from kernel v4.15 Anders Roxell
2026-07-27  9:08   ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 19/75] usb: dwc3: import from kernel v4.16 Anders Roxell
2026-07-27  9:09   ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 20/75] usb: dwc3: import from kernel v4.17 Anders Roxell
2026-07-16 13:41 ` [PATCH v5 21/75] usb: dwc3: import from kernel v4.18 Anders Roxell
2026-07-16 13:41 ` [PATCH v5 22/75] usb: dwc3: import from kernel v4.19 Anders Roxell
2026-07-27  9:12   ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 23/75] usb: dwc3: import from kernel v4.20 Anders Roxell
2026-07-27  9:13   ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 24/75] usb: dwc3: import from kernel v5.0 Anders Roxell
2026-07-27  9:14   ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 25/75] usb: dwc3: import from kernel v5.1 Anders Roxell
2026-07-27  9:15   ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 26/75] usb: dwc3: import from kernel v5.2 Anders Roxell
2026-07-27  9:19   ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 27/75] usb: dwc3: import from kernel v5.3 Anders Roxell
2026-07-27  9:22   ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 28/75] usb: dwc3: import from kernel v5.4 Anders Roxell
2026-07-27  9:23   ` Mattijs Korpershoek
2026-07-16 13:41 ` [PATCH v5 29/75] usb: dwc3: import from kernel v5.5 Anders Roxell
2026-07-27  9:26   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 30/75] usb: dwc3: import from kernel v5.6 Anders Roxell
2026-07-27 12:22   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 31/75] usb: dwc3: import from kernel v5.7 Anders Roxell
2026-07-28  8:50   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 32/75] usb: dwc3: import from kernel v5.8 Anders Roxell
2026-07-28  9:09   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 33/75] usb: dwc3: import from kernel v5.9 Anders Roxell
2026-07-28  9:12   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 34/75] usb: dwc3: import from kernel v5.10 Anders Roxell
2026-07-28  9:17   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 35/75] usb: dwc3: import from kernel v5.11 Anders Roxell
2026-07-28  9:19   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 36/75] usb: dwc3: import from kernel v5.12 Anders Roxell
2026-07-28  9:21   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 37/75] usb: dwc3: import from kernel v5.13 Anders Roxell
2026-07-28  9:22   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 38/75] usb: dwc3: import from kernel v5.14 Anders Roxell
2026-07-28  9:25   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 39/75] usb: dwc3: import from kernel v5.15 Anders Roxell
2026-07-28  9:29   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 40/75] usb: dwc3: import from kernel v5.16 Anders Roxell
2026-07-28  9:30   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 41/75] usb: dwc3: import from kernel v5.17 Anders Roxell
2026-07-28  9:51   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 42/75] usb: dwc3: import from kernel v5.18 Anders Roxell
2026-07-28  9:52   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 43/75] usb: dwc3: import from kernel v5.19 Anders Roxell
2026-07-28  9:54   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 44/75] usb: dwc3: import from kernel v6.0 Anders Roxell
2026-07-28 11:55   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 45/75] usb: dwc3: import from kernel v6.1 Anders Roxell
2026-07-28 11:56   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 46/75] usb: dwc3: import from kernel v6.2 Anders Roxell
2026-07-28 12:04   ` Mattijs Korpershoek
2026-07-28 12:10   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 47/75] usb: dwc3: import from kernel v6.3 Anders Roxell
2026-07-28 12:12   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 48/75] usb: dwc3: import from kernel v6.4 Anders Roxell
2026-07-28 12:16   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 49/75] usb: dwc3: import from kernel v6.5 Anders Roxell
2026-07-28 12:22   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 50/75] usb: dwc3: import from kernel v6.6 Anders Roxell
2026-07-29  9:19   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 51/75] usb: dwc3: import from kernel v6.7 Anders Roxell
2026-07-29  9:21   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 52/75] usb: dwc3: import from kernel v6.8 Anders Roxell
2026-07-29  9:22   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 53/75] usb: dwc3: import from kernel v6.9 Anders Roxell
2026-07-29  9:23   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 54/75] usb: dwc3: import from kernel v6.10 Anders Roxell
2026-07-29  9:25   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 55/75] usb: dwc3: import from kernel v6.11 Anders Roxell
2026-07-29  9:26   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 56/75] usb: dwc3: import from kernel v6.12 Anders Roxell
2026-07-29  9:27   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 57/75] usb: dwc3: import from kernel v6.13 Anders Roxell
2026-07-29  9:28   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 58/75] usb: dwc3: import from kernel v6.14 Anders Roxell
2026-07-29  9:30   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 59/75] usb: dwc3: import from kernel v6.15 Anders Roxell
2026-07-29  9:31   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 60/75] usb: dwc3: import from kernel v6.16 Anders Roxell
2026-07-29  9:32   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 61/75] usb: host: re-import xhci-ext-caps.h " Anders Roxell
2026-07-29  9:34   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 62/75] usb: gadget: re-import epautoconf.c " Anders Roxell
2026-07-29  9:38   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 63/75] usb: udc: re-import udc-core.c " Anders Roxell
2026-07-29  9:41   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 64/75] usb: add helpers needed by the resynced DWC3 code Anders Roxell
2026-07-29  9:56   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 65/75] usb: gadget: trim the gadget API after the resync Anders Roxell
2026-07-29 10:19   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 66/75] usb: gadget: udc: make udc-core build in u-boot Anders Roxell
2026-07-29 11:49   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 67/75] usb: dwc3: make the core driver " Anders Roxell
2026-07-29 12:16   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 68/75] usb: dwc3: make gadget and ep0 " Anders Roxell
2026-07-29 12:27   ` Mattijs Korpershoek
2026-07-16 13:42 ` [PATCH v5 69/75] usb: dwc3: make the am62 glue " Anders Roxell
2026-07-16 13:42 ` [PATCH v5 70/75] usb: gadget: ci_udc: drop code we do not use Anders Roxell
2026-07-16 13:42 ` [PATCH v5 71/75] usb: gadget: dwc2_udc_otg: fix up after the resync Anders Roxell
2026-07-16 13:42 ` [PATCH v5 72/75] usb: gadget: fix up the function drivers " Anders Roxell
2026-07-16 13:42 ` [PATCH v5 73/75] usb: gadget: fix up the last UDC " Anders Roxell
2026-07-16 13:42 ` [PATCH v5 74/75] usb: fix up musb-new and mtu3 " Anders Roxell
2026-07-20 23:22   ` David Lechner via U-Boot
2026-07-16 13:42 ` [PATCH v5 75/75] usb: host: fix up xhci and cdns3 " Anders Roxell
2026-07-16 19:22 ` [PATCH v5 00/75] usb: dwc3: sync code with Linux v6.16 Marek Vasut
     [not found] ` <178602223375.3156999.13542339251028864355.b4-review@b4>
     [not found]   ` <anmKNYbNQ73Kv3iX@monster>
2026-08-10  9:56     ` Anshul Dalal

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87qzko6cek.fsf@kernel.org \
    --to=mkorpershoek@kernel.org \
    --cc=alchark@flipper.net \
    --cc=anders.roxell@linaro.org \
    --cc=ilias.apalodimas@linaro.org \
    --cc=jens.wiklander@linaro.org \
    --cc=jerome.forissier@arm.com \
    --cc=lukma@denx.de \
    --cc=marex@denx.de \
    --cc=michal.simek@amd.com \
    --cc=sjg@chromium.org \
    --cc=trini@konsulko.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox