All of lore.kernel.org
 help / color / mirror / Atom feed
From: Anders Roxell <anders.roxell@linaro.org>
To: u-boot@lists.u-boot-project.org
Cc: marek.vasut@mailbox.org, trini@konsulko.com,
	ilias.apalodimas@linaro.org, michal.simek@amd.com, lukma@denx.de,
	alchark@flipper.net, jerome.forissier@arm.com,
	Jens Wiklander <jens.wiklander@linaro.org>,
	Anders Roxell <anders.roxell@linaro.org>,
	Mattijs Korpershoek <mkorpershoek@kernel.org>
Subject: [PATCH v7 42/63] usb: dwc3: import from kernel v5.17
Date: Mon, 24 Aug 2026 17:27:13 +0200	[thread overview]
Message-ID: <20260824152734.159794-43-anders.roxell@linaro.org> (raw)
In-Reply-To: <20260824152734.159794-1-anders.roxell@linaro.org>

From: Jens Wiklander <jens.wiklander@linaro.org>

Sync Linux kernel dwc3 changes from v5.16 to v5.17.

The following files are preserved across 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 v5.16..v5.17
Commits imported:
84918a89d6ef usb: dwc3: gadget: Let the interrupt handler disable bottom halves.
117b4e96c7f3 usb: dwc3: gadget: Prevent core from processing stale TRBs
666f3de741f7 usb: dwc3: gadget: Support Multi-Stream Transfer
76c4c95dac0d usb: dwc3: gadget: Skip reading GEVNTSIZn
a02a26eb0aea usb: dwc3: gadget: Ignore Update Transfer cmd params
bc27117c7cdd usb: dwc3: gadget: Skip checking Update Transfer status

Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org>
Signed-off-by: Anders Roxell <anders.roxell@linaro.org>
Reviewed-by: Mattijs Korpershoek <mkorpershoek@kernel.org>
---
 drivers/usb/dwc3/core.h   |  9 +++++
 drivers/usb/dwc3/gadget.c | 74 ++++++++++++++++++++++++++++++---------
 2 files changed, 67 insertions(+), 16 deletions(-)

diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
index 5c491d0a19d7..e1cc3f7398fb 100644
--- a/drivers/usb/dwc3/core.h
+++ b/drivers/usb/dwc3/core.h
@@ -153,6 +153,7 @@
 #define DWC3_DGCMDPAR		0xc710
 #define DWC3_DGCMD		0xc714
 #define DWC3_DALEPENA		0xc720
+#define DWC3_DCFG1		0xc740 /* DWC_usb32 only */
 
 #define DWC3_DEP_BASE(n)	(0xc800 + ((n) * 0x10))
 #define DWC3_DEPCMDPAR2		0x00
@@ -382,6 +383,7 @@
 
 /* Global HWPARAMS9 Register */
 #define DWC3_GHWPARAMS9_DEV_TXF_FLUSH_BYPASS	BIT(0)
+#define DWC3_GHWPARAMS9_DEV_MST			BIT(1)
 
 /* Global Frame Length Adjustment Register */
 #define DWC3_GFLADJ_30MHZ_SDBND_SEL		BIT(7)
@@ -558,6 +560,9 @@
 /* The EP number goes 0..31 so ep0 is always out and ep1 is always in */
 #define DWC3_DALEPENA_EP(n)		BIT(n)
 
+/* DWC_usb32 DCFG1 config */
+#define DWC3_DCFG1_DIS_MST_ENH		BIT(1)
+
 #define DWC3_DEPCMD_TYPE_CONTROL	0
 #define DWC3_DEPCMD_TYPE_ISOC		1
 #define DWC3_DEPCMD_TYPE_BULK		2
@@ -888,6 +893,10 @@ struct dwc3_hwparams {
 /* HWPARAMS7 */
 #define DWC3_RAM1_DEPTH(n)	((n) & 0xffff)
 
+/* HWPARAMS9 */
+#define DWC3_MST_CAPABLE(p)	(!!((p)->hwparams9 &		\
+			DWC3_GHWPARAMS9_DEV_MST))
+
 /**
  * struct dwc3_request - representation of a transfer request
  * @request: struct usb_request to be transferred
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 7e3db00e9759..a0c883f19a41 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -331,9 +331,17 @@ int dwc3_send_gadget_ep_cmd(struct dwc3_ep *dep, unsigned int cmd,
 		}
 	}
 
-	dwc3_writel(dep->regs, DWC3_DEPCMDPAR0, params->param0);
-	dwc3_writel(dep->regs, DWC3_DEPCMDPAR1, params->param1);
-	dwc3_writel(dep->regs, DWC3_DEPCMDPAR2, params->param2);
+	/*
+	 * For some commands such as Update Transfer command, DEPCMDPARn
+	 * registers are reserved. Since the driver often sends Update Transfer
+	 * command, don't write to DEPCMDPARn to avoid register write delays and
+	 * improve performance.
+	 */
+	if (DWC3_DEPCMD_CMD(cmd) != DWC3_DEPCMD_UPDATETRANSFER) {
+		dwc3_writel(dep->regs, DWC3_DEPCMDPAR0, params->param0);
+		dwc3_writel(dep->regs, DWC3_DEPCMDPAR1, params->param1);
+		dwc3_writel(dep->regs, DWC3_DEPCMDPAR2, params->param2);
+	}
 
 	/*
 	 * Synopsys Databook 2.60a states in section 6.3.2.5.6 of that if we're
@@ -357,6 +365,12 @@ int dwc3_send_gadget_ep_cmd(struct dwc3_ep *dep, unsigned int cmd,
 		cmd |= DWC3_DEPCMD_CMDACT;
 
 	dwc3_writel(dep->regs, DWC3_DEPCMD, cmd);
+
+	if (!(cmd & DWC3_DEPCMD_CMDACT)) {
+		ret = 0;
+		goto skip_status;
+	}
+
 	do {
 		reg = dwc3_readl(dep->regs, DWC3_DEPCMD);
 		if (!(reg & DWC3_DEPCMD_CMDACT)) {
@@ -398,6 +412,7 @@ int dwc3_send_gadget_ep_cmd(struct dwc3_ep *dep, unsigned int cmd,
 		cmd_status = -ETIMEDOUT;
 	}
 
+skip_status:
 	trace_dwc3_gadget_ep_cmd(dep, cmd, params, cmd_status);
 
 	if (DWC3_DEPCMD_CMD(cmd) == DWC3_DEPCMD_STARTTRANSFER) {
@@ -1260,17 +1275,35 @@ static void __dwc3_prepare_one_trb(struct dwc3_ep *dep, struct dwc3_trb *trb,
 			trb->ctrl |= DWC3_TRB_CTRL_ISP_IMI;
 	}
 
+	/* All TRBs setup for MST must set CSP=1 when LST=0 */
+	if (dep->stream_capable && DWC3_MST_CAPABLE(&dwc->hwparams))
+		trb->ctrl |= DWC3_TRB_CTRL_CSP;
+
 	if ((!no_interrupt && !chain) || must_interrupt)
 		trb->ctrl |= DWC3_TRB_CTRL_IOC;
 
 	if (chain)
 		trb->ctrl |= DWC3_TRB_CTRL_CHN;
-	else if (dep->stream_capable && is_last)
+	else if (dep->stream_capable && is_last &&
+		 !DWC3_MST_CAPABLE(&dwc->hwparams))
 		trb->ctrl |= DWC3_TRB_CTRL_LST;
 
 	if (usb_endpoint_xfer_bulk(dep->endpoint.desc) && dep->stream_capable)
 		trb->ctrl |= DWC3_TRB_CTRL_SID_SOFN(stream_id);
 
+	/*
+	 * As per data book 4.2.3.2TRB Control Bit Rules section
+	 *
+	 * The controller autonomously checks the HWO field of a TRB to determine if the
+	 * entire TRB is valid. Therefore, software must ensure that the rest of the TRB
+	 * is valid before setting the HWO field to '1'. In most systems, this means that
+	 * software must update the fourth DWORD of a TRB last.
+	 *
+	 * However there is a possibility of CPU re-ordering here which can cause
+	 * controller to observe the HWO bit set prematurely.
+	 * Add a write memory barrier to prevent CPU re-ordering.
+	 */
+	wmb();
 	trb->ctrl |= DWC3_TRB_CTRL_HWO;
 
 	dwc3_ep_inc_enq(dep);
@@ -1513,7 +1546,8 @@ static int dwc3_prepare_trbs(struct dwc3_ep *dep)
 		 * burst capability may try to read and use TRBs beyond the
 		 * active transfer instead of stopping.
 		 */
-		if (dep->stream_capable && req->request.is_last)
+		if (dep->stream_capable && req->request.is_last &&
+		    !DWC3_MST_CAPABLE(&dep->dwc->hwparams))
 			return ret;
 	}
 
@@ -1546,7 +1580,8 @@ static int dwc3_prepare_trbs(struct dwc3_ep *dep)
 		 * burst capability may try to read and use TRBs beyond the
 		 * active transfer instead of stopping.
 		 */
-		if (dep->stream_capable && req->request.is_last)
+		if (dep->stream_capable && req->request.is_last &&
+		    !DWC3_MST_CAPABLE(&dwc->hwparams))
 			return ret;
 	}
 
@@ -1623,7 +1658,8 @@ static int __dwc3_gadget_kick_transfer(struct dwc3_ep *dep)
 		return ret;
 	}
 
-	if (dep->stream_capable && req->request.is_last)
+	if (dep->stream_capable && req->request.is_last &&
+	    !DWC3_MST_CAPABLE(&dep->dwc->hwparams))
 		dep->flags |= DWC3_EP_WAIT_TRANSFER_COMPLETE;
 
 	return 0;
@@ -2638,6 +2674,13 @@ static int __dwc3_gadget_start(struct dwc3 *dwc)
 	reg |= DWC3_DCFG_IGNSTRMPP;
 	dwc3_writel(dwc->regs, DWC3_DCFG, reg);
 
+	/* Enable MST by default if the device is capable of MST */
+	if (DWC3_MST_CAPABLE(&dwc->hwparams)) {
+		reg = dwc3_readl(dwc->regs, DWC3_DCFG1);
+		reg &= ~DWC3_DCFG1_DIS_MST_ENH;
+		dwc3_writel(dwc->regs, DWC3_DCFG1, reg);
+	}
+
 	/* Start with SuperSpeed Default */
 	dwc3_gadget_ep0_desc.wMaxPacketSize = cpu_to_le16(512);
 
@@ -3437,7 +3480,8 @@ static void dwc3_gadget_endpoint_stream_event(struct dwc3_ep *dep,
 	case DEPEVT_STREAM_NOSTREAM:
 		if ((dep->flags & DWC3_EP_IGNORE_NEXT_NOSTREAM) ||
 		    !(dep->flags & DWC3_EP_FORCE_RESTART_STREAM) ||
-		    !(dep->flags & DWC3_EP_WAIT_TRANSFER_COMPLETE))
+		    (!DWC3_MST_CAPABLE(&dwc->hwparams) &&
+		     !(dep->flags & DWC3_EP_WAIT_TRANSFER_COMPLETE)))
 			break;
 
 		/*
@@ -4067,7 +4111,6 @@ static irqreturn_t dwc3_process_event_buf(struct dwc3_event_buffer *evt)
 	struct dwc3 *dwc = evt->dwc;
 	irqreturn_t ret = IRQ_NONE;
 	int left;
-	u32 reg;
 
 	left = evt->count;
 
@@ -4099,9 +4142,8 @@ static irqreturn_t dwc3_process_event_buf(struct dwc3_event_buffer *evt)
 	ret = IRQ_HANDLED;
 
 	/* Unmask interrupt */
-	reg = dwc3_readl(dwc->regs, DWC3_GEVNTSIZ(0));
-	reg &= ~DWC3_GEVNTSIZ_INTMASK;
-	dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0), reg);
+	dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0),
+		    DWC3_GEVNTSIZ_SIZE(evt->length));
 
 	if (dwc->imod_interval) {
 		dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(0), DWC3_GEVNTCOUNT_EHB);
@@ -4118,9 +4160,11 @@ static irqreturn_t dwc3_thread_interrupt(int irq, void *_evt)
 	unsigned long flags;
 	irqreturn_t ret = IRQ_NONE;
 
+	local_bh_disable();
 	spin_lock_irqsave(&dwc->lock, flags);
 	ret = dwc3_process_event_buf(evt);
 	spin_unlock_irqrestore(&dwc->lock, flags);
+	local_bh_enable();
 
 	return ret;
 }
@@ -4130,7 +4174,6 @@ static irqreturn_t dwc3_check_event_buf(struct dwc3_event_buffer *evt)
 	struct dwc3 *dwc = evt->dwc;
 	u32 amount;
 	u32 count;
-	u32 reg;
 
 	if (pm_runtime_suspended(dwc->dev)) {
 		pm_runtime_get(dwc->dev);
@@ -4157,9 +4200,8 @@ static irqreturn_t dwc3_check_event_buf(struct dwc3_event_buffer *evt)
 	evt->flags |= DWC3_EVENT_PENDING;
 
 	/* Mask interrupt */
-	reg = dwc3_readl(dwc->regs, DWC3_GEVNTSIZ(0));
-	reg |= DWC3_GEVNTSIZ_INTMASK;
-	dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0), reg);
+	dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0),
+		    DWC3_GEVNTSIZ_INTMASK | DWC3_GEVNTSIZ_SIZE(evt->length));
 
 	amount = min(count, evt->length - evt->lpos);
 	memcpy(evt->cache + evt->lpos, evt->buf + evt->lpos, amount);
-- 
2.53.0


  parent reply	other threads:[~2026-08-24 16:46 UTC|newest]

Thread overview: 65+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-24 15:26 [PATCH v7 00/63] usb: dwc3: part 1, reset and import from Linux v6.16 Anders Roxell
2026-08-24 15:26 ` [PATCH v7 01/63] usb: host: re-import xhci-ext-caps.h from kernel v6.16 Anders Roxell
2026-08-24 15:26 ` [PATCH v7 02/63] usb: dwc3: restore to original v3.19-rc1 kernel import Anders Roxell
2026-08-24 15:26 ` [PATCH v7 03/63] usb: dwc3: import from kernel v3.19 Anders Roxell
2026-08-24 15:26 ` [PATCH v7 04/63] usb: dwc3: import from kernel v4.0 Anders Roxell
2026-08-24 15:26 ` [PATCH v7 05/63] usb: dwc3: import from kernel v4.1 Anders Roxell
2026-08-24 15:26 ` [PATCH v7 06/63] usb: dwc3: import from kernel v4.2 Anders Roxell
2026-08-24 15:26 ` [PATCH v7 07/63] usb: dwc3: import from kernel v4.3 Anders Roxell
2026-08-24 15:26 ` [PATCH v7 08/63] usb: dwc3: import from kernel v4.4 Anders Roxell
2026-08-24 15:26 ` [PATCH v7 09/63] usb: dwc3: import from kernel v4.5 Anders Roxell
2026-08-24 15:26 ` [PATCH v7 10/63] usb: dwc3: import from kernel v4.6 Anders Roxell
2026-08-24 15:26 ` [PATCH v7 11/63] usb: dwc3: import from kernel v4.7 Anders Roxell
2026-08-24 15:26 ` [PATCH v7 12/63] usb: dwc3: import from kernel v4.8 Anders Roxell
2026-08-24 15:26 ` [PATCH v7 13/63] usb: dwc3: import from kernel v4.9 Anders Roxell
2026-08-24 15:26 ` [PATCH v7 14/63] usb: dwc3: import from kernel v4.10 Anders Roxell
2026-08-24 15:26 ` [PATCH v7 15/63] usb: dwc3: import from kernel v4.11 Anders Roxell
2026-08-24 15:26 ` [PATCH v7 16/63] usb: dwc3: import from kernel v4.12 Anders Roxell
2026-08-24 15:26 ` [PATCH v7 17/63] usb: dwc3: import from kernel v4.13 Anders Roxell
2026-08-24 15:26 ` [PATCH v7 18/63] usb: dwc3: import from kernel v4.14 Anders Roxell
2026-08-24 15:26 ` [PATCH v7 19/63] usb: dwc3: import from kernel v4.15 Anders Roxell
2026-08-24 15:26 ` [PATCH v7 20/63] usb: dwc3: import from kernel v4.16 Anders Roxell
2026-08-24 15:26 ` [PATCH v7 21/63] usb: dwc3: import from kernel v4.17 Anders Roxell
2026-08-24 15:26 ` [PATCH v7 22/63] usb: dwc3: import from kernel v4.18 Anders Roxell
2026-08-24 15:26 ` [PATCH v7 23/63] usb: dwc3: import from kernel v4.19 Anders Roxell
2026-08-24 15:26 ` [PATCH v7 24/63] usb: dwc3: import from kernel v4.20 Anders Roxell
2026-08-24 15:26 ` [PATCH v7 25/63] usb: dwc3: import from kernel v5.0 Anders Roxell
2026-08-24 15:26 ` [PATCH v7 26/63] usb: dwc3: import from kernel v5.1 Anders Roxell
2026-08-24 15:26 ` [PATCH v7 27/63] usb: dwc3: import from kernel v5.2 Anders Roxell
2026-08-24 15:26 ` [PATCH v7 28/63] usb: dwc3: import from kernel v5.3 Anders Roxell
2026-08-24 15:27 ` [PATCH v7 29/63] usb: dwc3: import from kernel v5.4 Anders Roxell
2026-08-24 15:27 ` [PATCH v7 30/63] usb: dwc3: import from kernel v5.5 Anders Roxell
2026-08-24 15:27 ` [PATCH v7 31/63] usb: dwc3: import from kernel v5.6 Anders Roxell
2026-08-24 15:27 ` [PATCH v7 32/63] usb: dwc3: import from kernel v5.7 Anders Roxell
2026-08-24 15:27 ` [PATCH v7 33/63] usb: dwc3: import from kernel v5.8 Anders Roxell
2026-08-24 15:27 ` [PATCH v7 34/63] usb: dwc3: import from kernel v5.9 Anders Roxell
2026-08-24 15:27 ` [PATCH v7 35/63] usb: dwc3: import from kernel v5.10 Anders Roxell
2026-08-24 15:27 ` [PATCH v7 36/63] usb: dwc3: import from kernel v5.11 Anders Roxell
2026-08-24 15:27 ` [PATCH v7 37/63] usb: dwc3: import from kernel v5.12 Anders Roxell
2026-08-24 15:27 ` [PATCH v7 38/63] usb: dwc3: import from kernel v5.13 Anders Roxell
2026-08-24 15:27 ` [PATCH v7 39/63] usb: dwc3: import from kernel v5.14 Anders Roxell
2026-08-24 15:27 ` [PATCH v7 40/63] usb: dwc3: import from kernel v5.15 Anders Roxell
2026-08-24 15:27 ` [PATCH v7 41/63] usb: dwc3: import from kernel v5.16 Anders Roxell
2026-08-24 15:27 ` Anders Roxell [this message]
2026-08-24 15:27 ` [PATCH v7 43/63] usb: dwc3: import from kernel v5.18 Anders Roxell
2026-08-24 15:27 ` [PATCH v7 44/63] usb: dwc3: import from kernel v5.19 Anders Roxell
2026-08-24 15:27 ` [PATCH v7 45/63] usb: dwc3: import from kernel v6.0 Anders Roxell
2026-08-24 15:27 ` [PATCH v7 46/63] usb: dwc3: import from kernel v6.1 Anders Roxell
2026-08-24 15:27 ` [PATCH v7 47/63] usb: dwc3: import from kernel v6.2 Anders Roxell
2026-08-24 15:27 ` [PATCH v7 48/63] usb: dwc3: import from kernel v6.3 Anders Roxell
2026-08-24 15:27 ` [PATCH v7 49/63] usb: dwc3: import from kernel v6.4 Anders Roxell
2026-08-24 15:27 ` [PATCH v7 50/63] usb: dwc3: import from kernel v6.5 Anders Roxell
2026-08-24 15:27 ` [PATCH v7 51/63] usb: dwc3: import from kernel v6.6 Anders Roxell
2026-08-24 15:27 ` [PATCH v7 52/63] usb: dwc3: import from kernel v6.7 Anders Roxell
2026-08-24 15:27 ` [PATCH v7 53/63] usb: dwc3: import from kernel v6.8 Anders Roxell
2026-08-24 15:27 ` [PATCH v7 54/63] usb: dwc3: import from kernel v6.9 Anders Roxell
2026-08-24 15:27 ` [PATCH v7 55/63] usb: dwc3: import from kernel v6.10 Anders Roxell
2026-08-24 15:27 ` [PATCH v7 56/63] usb: dwc3: import from kernel v6.11 Anders Roxell
2026-08-24 15:27 ` [PATCH v7 57/63] usb: dwc3: import from kernel v6.12 Anders Roxell
2026-08-24 15:27 ` [PATCH v7 58/63] usb: dwc3: import from kernel v6.13 Anders Roxell
2026-08-24 15:27 ` [PATCH v7 59/63] usb: dwc3: import from kernel v6.14 Anders Roxell
2026-08-24 15:27 ` [PATCH v7 60/63] usb: dwc3: import from kernel v6.15 Anders Roxell
2026-08-24 15:27 ` [PATCH v7 61/63] usb: dwc3: import from kernel v6.16 Anders Roxell
2026-08-24 15:27 ` [PATCH v7 62/63] usb: gadget: re-import epautoconf.c " Anders Roxell
2026-08-24 15:27 ` [PATCH v7 63/63] usb: udc: re-import udc-core.c " Anders Roxell
2026-09-11 10:39 ` [PATCH v7 00/63] usb: dwc3: part 1, reset and import from Linux v6.16 Love Kumar

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=20260824152734.159794-43-anders.roxell@linaro.org \
    --to=anders.roxell@linaro.org \
    --cc=alchark@flipper.net \
    --cc=ilias.apalodimas@linaro.org \
    --cc=jens.wiklander@linaro.org \
    --cc=jerome.forissier@arm.com \
    --cc=lukma@denx.de \
    --cc=marek.vasut@mailbox.org \
    --cc=michal.simek@amd.com \
    --cc=mkorpershoek@kernel.org \
    --cc=trini@konsulko.com \
    --cc=u-boot@lists.u-boot-project.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.