devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/7] usb: mtu3: give back request when rx error happens
@ 2023-04-03  2:52 Chunfeng Yun
  2023-04-03  2:52 ` [PATCH 2/7] usb: mtu3: use boolean return value Chunfeng Yun
                   ` (6 more replies)
  0 siblings, 7 replies; 20+ messages in thread
From: Chunfeng Yun @ 2023-04-03  2:52 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Rob Herring
  Cc: Chunfeng Yun, Krzysztof Kozlowski, Matthias Brugger,
	AngeloGioacchino Del Regno, linux-usb, linux-arm-kernel,
	linux-mediatek, devicetree, linux-kernel, Eddie Hung,
	Tianping Fang

When the Rx enconnter errors, currently, only print error logs, that
may cause class driver's RX halt, shall give back the request with
error status meanwhile.

Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com>
---
 drivers/usb/mtu3/mtu3_qmu.c | 39 ++++++++++++++++++++++++++++++++++++-
 1 file changed, 38 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/mtu3/mtu3_qmu.c b/drivers/usb/mtu3/mtu3_qmu.c
index a2fdab8b63b2..7be4e4be1a6a 100644
--- a/drivers/usb/mtu3/mtu3_qmu.c
+++ b/drivers/usb/mtu3/mtu3_qmu.c
@@ -466,6 +466,39 @@ static void qmu_tx_zlp_error_handler(struct mtu3 *mtu, u8 epnum)
 	mtu3_qmu_resume(mep);
 }
 
+/*
+ * when rx error happens (except zlperr), QMU will stop, and RQCPR saves
+ * the GPD encountered error, Done irq will arise after resuming QMU again.
+ */
+static void qmu_error_rx(struct mtu3 *mtu, u8 epnum)
+{
+	struct mtu3_ep *mep = mtu->out_eps + epnum;
+	struct mtu3_gpd_ring *ring = &mep->gpd_ring;
+	struct qmu_gpd *gpd_current = NULL;
+	struct usb_request *req = NULL;
+	struct mtu3_request *mreq;
+	dma_addr_t cur_gpd_dma;
+
+	cur_gpd_dma = read_rxq_cur_addr(mtu->mac_base, epnum);
+	gpd_current = gpd_dma_to_virt(ring, cur_gpd_dma);
+
+	mreq = next_request(mep);
+	if (!mreq || mreq->gpd != gpd_current) {
+		dev_err(mtu->dev, "no correct RX req is found\n");
+		return;
+	}
+
+	req = &mreq->request;
+	req->status = -EAGAIN;
+
+	/* by pass the current GDP */
+	gpd_current->dw0_info |= cpu_to_le32(GPD_FLAGS_BPS | GPD_FLAGS_HWO);
+	mtu3_qmu_resume(mep);
+
+	dev_dbg(mtu->dev, "%s EP%d, current=%p, req=%p\n",
+		__func__, epnum, gpd_current, mreq);
+}
+
 /*
  * NOTE: request list maybe is already empty as following case:
  * queue_tx --> qmu_interrupt(clear interrupt pending, schedule tasklet)-->
@@ -571,14 +604,18 @@ static void qmu_exception_isr(struct mtu3 *mtu, u32 qmu_status)
 
 	if ((qmu_status & RXQ_CSERR_INT) || (qmu_status & RXQ_LENERR_INT)) {
 		errval = mtu3_readl(mbase, U3D_RQERRIR0);
+		mtu3_writel(mbase, U3D_RQERRIR0, errval);
+
 		for (i = 1; i < mtu->num_eps; i++) {
 			if (errval & QMU_RX_CS_ERR(i))
 				dev_err(mtu->dev, "Rx %d CS error!\n", i);
 
 			if (errval & QMU_RX_LEN_ERR(i))
 				dev_err(mtu->dev, "RX %d Length error\n", i);
+
+			if (errval & (QMU_RX_CS_ERR(i) | QMU_RX_LEN_ERR(i)))
+				qmu_error_rx(mtu, i);
 		}
-		mtu3_writel(mbase, U3D_RQERRIR0, errval);
 	}
 
 	if (qmu_status & RXQ_ZLPERR_INT) {
-- 
2.18.0


^ permalink raw reply related	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2023-04-17  1:07 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-04-03  2:52 [PATCH 1/7] usb: mtu3: give back request when rx error happens Chunfeng Yun
2023-04-03  2:52 ` [PATCH 2/7] usb: mtu3: use boolean return value Chunfeng Yun
2023-04-03 12:31   ` AngeloGioacchino Del Regno
2023-04-03  2:52 ` [PATCH 3/7] usb: mtu3: fix KE at qmu transfer done irq handler Chunfeng Yun
2023-04-03 12:31   ` AngeloGioacchino Del Regno
2023-04-07  7:59     ` Chunfeng Yun (云春峰)
2023-04-07  9:08       ` AngeloGioacchino Del Regno
2023-04-03  2:52 ` [PATCH 4/7] usb: mtu3: unlock @mtu->lock just before giving back request Chunfeng Yun
2023-04-03 12:31   ` AngeloGioacchino Del Regno
2023-04-03  2:52 ` [PATCH 5/7] usb: mtu3: expose role-switch control to userspace Chunfeng Yun
2023-04-03 12:34   ` AngeloGioacchino Del Regno
2023-04-03  2:52 ` [PATCH 6/7] dt-bindings: usb: mtu3: add two optional clocks Chunfeng Yun
2023-04-04 13:43   ` Rob Herring
2023-04-07  8:03     ` Chunfeng Yun (云春峰)
2023-04-03  2:52 ` [PATCH 7/7] usb: mtu3: add optional clock xhci_ck and frmcnt_ck Chunfeng Yun
2023-04-03 12:34   ` AngeloGioacchino Del Regno
2023-04-07  8:12     ` Chunfeng Yun (云春峰)
2023-04-03 12:31 ` [PATCH 1/7] usb: mtu3: give back request when rx error happens AngeloGioacchino Del Regno
2023-04-07  7:24   ` Chunfeng Yun (云春峰)
2023-04-17  1:07   ` Chunfeng Yun (云春峰)

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).