linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/8] fix broken BULK stream support to dwc3 gadget driver
@ 2018-07-25 11:51 Anurag Kumar Vulisha
  2018-07-25 11:51 ` [PATCH 1/8] usb: dwc3: Correct the logic for checking TRB full in __dwc3_prepare_one_trb() Anurag Kumar Vulisha
                   ` (7 more replies)
  0 siblings, 8 replies; 13+ messages in thread
From: Anurag Kumar Vulisha @ 2018-07-25 11:51 UTC (permalink / raw)
  To: balbi, gregkh
  Cc: v.anuragkumar, linux-usb, linux-kernel, Anurag Kumar Vulisha

These patch series fixes the broken BULK streaming support in
dwc3 gadget driver.

Anurag Kumar Vulisha (8):
  usb: dwc3: Correct the logic for checking TRB full in
    __dwc3_prepare_one_trb()
  usb: dwc3: update stream id in depcmd
  usb: dwc3: make controller clear transfer resources after complete
  usb: dwc3: implement stream transfer timeout
  usb: dwc3: don't issue no-op trb for stream capable endpoints
  usb: dwc3: check for requests in started list for stream capable
    endpoints
  usb: dwc3: Check for IOC/LST bit in both event->status and TRB->ctrl
    fields
  usb: dwc3: Check MISSED ISOC bit only for ISOC endpoints

 drivers/usb/dwc3/core.h   |  7 +++++
 drivers/usb/dwc3/gadget.c | 78 ++++++++++++++++++++++++++++++++++++++++++-----
 2 files changed, 78 insertions(+), 7 deletions(-)

-- 
2.1.1


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

* [PATCH 1/8] usb: dwc3: Correct the logic for checking TRB full in __dwc3_prepare_one_trb()
  2018-07-25 11:51 [PATCH 0/8] fix broken BULK stream support to dwc3 gadget driver Anurag Kumar Vulisha
@ 2018-07-25 11:51 ` Anurag Kumar Vulisha
  2018-07-25 11:51 ` [PATCH 2/8] usb: dwc3: update stream id in depcmd Anurag Kumar Vulisha
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 13+ messages in thread
From: Anurag Kumar Vulisha @ 2018-07-25 11:51 UTC (permalink / raw)
  To: balbi, gregkh
  Cc: v.anuragkumar, linux-usb, linux-kernel, Anurag Kumar Vulisha

In __dwc3_prepare_one_trb(), IOC bit is set if the total number of
available TRB's are zero. The number of available TRBs are calculated
using dwc3_calc_trbs_left(), which determines TRBs full or not based
on HWO bit set in the TRB.
During preparation of TRB __dwc3_prepare_one_trb() is always called
with a TRB which doesn't have HWO bit set. __dwc3_prepare_one_trb()
depends on dwc3_calc_trbs_left() to calculate the free available TRBs
and set IOC bit if not available. Since dwc3_calc_trbs_left()
determines TRB available based on HWO bit, there are chances that
dwc3_calc_trbs_left() wrongly calculates the present working TRB as
free TRB (since HWO bit is not yet set).
This patch corrects this issue by setting HWO bit before calling
dwc3_calc_trbs_left().

Signed-off-by: Anurag Kumar Vulisha <anurag.kumar.vulisha@xilinx.com>
---
 drivers/usb/dwc3/gadget.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 69bf137..f73d219 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -990,6 +990,8 @@ static void __dwc3_prepare_one_trb(struct dwc3_ep *dep, struct dwc3_trb *trb,
 			trb->ctrl |= DWC3_TRB_CTRL_ISP_IMI;
 	}
 
+	trb->ctrl |= DWC3_TRB_CTRL_HWO;
+
 	if ((!no_interrupt && !chain) ||
 			(dwc3_calc_trbs_left(dep) == 0))
 		trb->ctrl |= DWC3_TRB_CTRL_IOC;
@@ -1000,8 +1002,6 @@ static void __dwc3_prepare_one_trb(struct dwc3_ep *dep, struct dwc3_trb *trb,
 	if (usb_endpoint_xfer_bulk(dep->endpoint.desc) && dep->stream_capable)
 		trb->ctrl |= DWC3_TRB_CTRL_SID_SOFN(stream_id);
 
-	trb->ctrl |= DWC3_TRB_CTRL_HWO;
-
 	trace_dwc3_prepare_trb(dep, trb);
 }
 
-- 
2.1.1


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

* [PATCH 2/8] usb: dwc3: update stream id in depcmd
  2018-07-25 11:51 [PATCH 0/8] fix broken BULK stream support to dwc3 gadget driver Anurag Kumar Vulisha
  2018-07-25 11:51 ` [PATCH 1/8] usb: dwc3: Correct the logic for checking TRB full in __dwc3_prepare_one_trb() Anurag Kumar Vulisha
@ 2018-07-25 11:51 ` Anurag Kumar Vulisha
  2018-07-25 11:51 ` [PATCH 3/8] usb: dwc3: make controller clear transfer resources after complete Anurag Kumar Vulisha
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 13+ messages in thread
From: Anurag Kumar Vulisha @ 2018-07-25 11:51 UTC (permalink / raw)
  To: balbi, gregkh
  Cc: v.anuragkumar, linux-usb, linux-kernel, Anurag Kumar Vulisha

For stream capable endpoints, stream id related information
needs to be updated into DEPCMD while issuing START TRANSFER.
This patch does the same.

Signed-off-by: Anurag Kumar Vulisha <anurag.kumar.vulisha@xilinx.com>
---
 drivers/usb/dwc3/gadget.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index f73d219..efc6e13 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -1224,6 +1224,9 @@ static int __dwc3_gadget_kick_transfer(struct dwc3_ep *dep)
 		params.param1 = lower_32_bits(req->trb_dma);
 		cmd = DWC3_DEPCMD_STARTTRANSFER;
 
+		if (dep->stream_capable)
+			cmd |= DWC3_DEPCMD_PARAM(req->request.stream_id);
+
 		if (usb_endpoint_xfer_isoc(dep->endpoint.desc))
 			cmd |= DWC3_DEPCMD_PARAM(dep->frame_number);
 	} else {
-- 
2.1.1


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

* [PATCH 3/8] usb: dwc3: make controller clear transfer resources after complete
  2018-07-25 11:51 [PATCH 0/8] fix broken BULK stream support to dwc3 gadget driver Anurag Kumar Vulisha
  2018-07-25 11:51 ` [PATCH 1/8] usb: dwc3: Correct the logic for checking TRB full in __dwc3_prepare_one_trb() Anurag Kumar Vulisha
  2018-07-25 11:51 ` [PATCH 2/8] usb: dwc3: update stream id in depcmd Anurag Kumar Vulisha
@ 2018-07-25 11:51 ` Anurag Kumar Vulisha
  2018-07-25 11:51 ` [PATCH 4/8] usb: dwc3: implement stream transfer timeout Anurag Kumar Vulisha
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 13+ messages in thread
From: Anurag Kumar Vulisha @ 2018-07-25 11:51 UTC (permalink / raw)
  To: balbi, gregkh
  Cc: v.anuragkumar, linux-usb, linux-kernel, Anurag Kumar Vulisha

To start transfer with another stream id, controller needs to free
previously allocated transfer resource. This will be automatically
done by the controller at the time of XferComplete Event. This
patch updates the code to issue XferComplete event once all transfers
are done by setting LST bit in the ctrl field of the last TRB.

Signed-off-by: Anurag Kumar Vulisha <anurag.kumar.vulisha@xilinx.com>
---
 drivers/usb/dwc3/gadget.c | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index efc6e13..b3e9e7f 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -571,7 +571,8 @@ static int dwc3_gadget_set_ep_config(struct dwc3_ep *dep, unsigned int action)
 
 	if (usb_ss_max_streams(comp_desc) && usb_endpoint_xfer_bulk(desc)) {
 		params.param1 |= DWC3_DEPCFG_STREAM_CAPABLE
-			| DWC3_DEPCFG_STREAM_EVENT_EN;
+			| DWC3_DEPCFG_STREAM_EVENT_EN
+			| DWC3_DEPCFG_XFER_COMPLETE_EN;
 		dep->stream_capable = true;
 	}
 
@@ -999,6 +1000,15 @@ static void __dwc3_prepare_one_trb(struct dwc3_ep *dep, struct dwc3_trb *trb,
 	if (chain)
 		trb->ctrl |= DWC3_TRB_CTRL_CHN;
 
+	/*
+	 * To issue start transfer on another stream, controller need to free
+	 * previously acquired transfer resource. Setting the LST bit in
+	 * last TRB makes the controller clear transfer resource for that
+	 * endpoint, allowing to start another stream on that endpoint.
+	 */
+	else if (dep->stream_capable)
+		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);
 
@@ -2268,7 +2278,7 @@ static int dwc3_gadget_ep_reclaim_completed_trb(struct dwc3_ep *dep,
 	if (event->status & DEPEVT_STATUS_SHORT && !chain)
 		return 1;
 
-	if (event->status & DEPEVT_STATUS_IOC)
+	if (event->status & (DEPEVT_STATUS_IOC | DEPEVT_STATUS_LST))
 		return 1;
 
 	return 0;
@@ -2457,6 +2467,10 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc,
 	}
 
 	switch (event->endpoint_event) {
+	case DWC3_DEPEVT_XFERCOMPLETE:
+		if (!dep->stream_capable)
+			break;
+		dep->flags &= ~DWC3_EP_TRANSFER_STARTED;
 	case DWC3_DEPEVT_XFERINPROGRESS:
 		dwc3_gadget_endpoint_transfer_in_progress(dep, event);
 		break;
@@ -2472,7 +2486,6 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc,
 		}
 		break;
 	case DWC3_DEPEVT_STREAMEVT:
-	case DWC3_DEPEVT_XFERCOMPLETE:
 	case DWC3_DEPEVT_RXTXFIFOEVT:
 		break;
 	}
-- 
2.1.1


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

* [PATCH 4/8] usb: dwc3: implement stream transfer timeout
  2018-07-25 11:51 [PATCH 0/8] fix broken BULK stream support to dwc3 gadget driver Anurag Kumar Vulisha
                   ` (2 preceding siblings ...)
  2018-07-25 11:51 ` [PATCH 3/8] usb: dwc3: make controller clear transfer resources after complete Anurag Kumar Vulisha
@ 2018-07-25 11:51 ` Anurag Kumar Vulisha
  2018-07-25 15:06   ` Andy Shevchenko
  2018-07-25 11:51 ` [PATCH 5/8] usb: dwc3: don't issue no-op trb for stream capable endpoints Anurag Kumar Vulisha
                   ` (3 subsequent siblings)
  7 siblings, 1 reply; 13+ messages in thread
From: Anurag Kumar Vulisha @ 2018-07-25 11:51 UTC (permalink / raw)
  To: balbi, gregkh
  Cc: v.anuragkumar, linux-usb, linux-kernel, Anurag Kumar Vulisha

According to dwc3 databook when streams are used, it may be possible
for the host and device become out of sync, where device may wait for
host to issue prime transcation and host may wait for device to issue
erdy. To avoid such deadlock, timeout needs to be implemented. After
timeout occurs, device will first stop transfer and restart the transfer
again. This patch does the same.

Signed-off-by: Anurag Kumar Vulisha <anurag.kumar.vulisha@xilinx.com>
---
 drivers/usb/dwc3/core.h   |  7 +++++++
 drivers/usb/dwc3/gadget.c | 39 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 46 insertions(+)

diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
index 285ce0e..581f619 100644
--- a/drivers/usb/dwc3/core.h
+++ b/drivers/usb/dwc3/core.h
@@ -619,6 +619,11 @@ struct dwc3_event_buffer {
 
 #define DWC3_TRB_NUM		256
 
+/*
+ * Timeout value in msecs used by stream_timeout_timer when streams are enabled
+ */
+#define STREAM_TIMEOUT		50
+
 /**
  * struct dwc3_ep - device side endpoint representation
  * @endpoint: usb endpoint
@@ -642,6 +647,7 @@ struct dwc3_event_buffer {
  * @name: a human readable name e.g. ep1out-bulk
  * @direction: true for TX, false for RX
  * @stream_capable: true when streams are enabled
+ * @stream_timeout_timer: timer used to aviod deadlock when streams are used
  */
 struct dwc3_ep {
 	struct usb_ep		endpoint;
@@ -691,6 +697,7 @@ struct dwc3_ep {
 
 	unsigned		direction:1;
 	unsigned		stream_capable:1;
+	struct timer_list	stream_timeout_timer;
 };
 
 enum dwc3_phy {
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index b3e9e7f..e2ccb55 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -254,6 +254,7 @@ int dwc3_send_gadget_generic_command(struct dwc3 *dwc, unsigned cmd, u32 param)
 }
 
 static int __dwc3_gadget_wakeup(struct dwc3 *dwc);
+static void stream_timeout_function(struct timer_list *arg);
 
 /**
  * dwc3_send_gadget_ep_cmd - issue an endpoint command
@@ -574,6 +575,8 @@ static int dwc3_gadget_set_ep_config(struct dwc3_ep *dep, unsigned int action)
 			| DWC3_DEPCFG_STREAM_EVENT_EN
 			| DWC3_DEPCFG_XFER_COMPLETE_EN;
 		dep->stream_capable = true;
+		timer_setup(&dep->stream_timeout_timer,
+			    stream_timeout_function, 0);
 	}
 
 	if (!usb_endpoint_xfer_control(desc))
@@ -730,6 +733,9 @@ static int __dwc3_gadget_ep_disable(struct dwc3_ep *dep)
 
 	trace_dwc3_gadget_ep_disable(dep);
 
+	if (dep->stream_capable)
+		del_timer(&dep->stream_timeout_timer);
+
 	dwc3_remove_requests(dwc, dep);
 
 	/* make sure HW endpoint isn't stalled */
@@ -1257,6 +1263,12 @@ static int __dwc3_gadget_kick_transfer(struct dwc3_ep *dep)
 		return ret;
 	}
 
+	if (starting && dep->stream_capable) {
+		dep->stream_timeout_timer.expires = jiffies +
+					msecs_to_jiffies(STREAM_TIMEOUT);
+		add_timer(&dep->stream_timeout_timer);
+	}
+
 	return 0;
 }
 
@@ -2403,6 +2415,13 @@ static void dwc3_gadget_endpoint_transfer_in_progress(struct dwc3_ep *dep,
 			stop = true;
 	}
 
+	/*
+	 * Delete the timer that was started in __dwc3_gadget_kick_transfer()
+	 * for stream capable endpoints.
+	 */
+	if (dep->stream_capable)
+		del_timer(&dep->stream_timeout_timer);
+
 	dwc3_gadget_ep_cleanup_completed_requests(dep, event, status);
 
 	if (stop) {
@@ -2486,6 +2505,14 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc,
 		}
 		break;
 	case DWC3_DEPEVT_STREAMEVT:
+		switch (event->status) {
+		case DEPEVT_STREAMEVT_FOUND:
+			del_timer(&dep->stream_timeout_timer);
+			break;
+		case DEPEVT_STREAMEVT_NOTFOUND:
+		default:
+			dev_err(dwc->dev, "unable to find suitable stream");
+		}
 	case DWC3_DEPEVT_RXTXFIFOEVT:
 		break;
 	}
@@ -2587,6 +2614,18 @@ static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force)
 	}
 }
 
+static void stream_timeout_function(struct timer_list *arg)
+{
+	struct dwc3_ep *dep = from_timer(dep, arg, stream_timeout_timer);
+	struct dwc3		*dwc = dep->dwc;
+	unsigned long		flags;
+
+	spin_lock_irqsave(&dwc->lock, flags);
+	dwc3_stop_active_transfer(dep, true);
+	__dwc3_gadget_kick_transfer(dep);
+	spin_unlock_irqrestore(&dwc->lock, flags);
+}
+
 static void dwc3_clear_stall_all_ep(struct dwc3 *dwc)
 {
 	u32 epnum;
-- 
2.1.1


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

* [PATCH 5/8] usb: dwc3: don't issue no-op trb for stream capable endpoints
  2018-07-25 11:51 [PATCH 0/8] fix broken BULK stream support to dwc3 gadget driver Anurag Kumar Vulisha
                   ` (3 preceding siblings ...)
  2018-07-25 11:51 ` [PATCH 4/8] usb: dwc3: implement stream transfer timeout Anurag Kumar Vulisha
@ 2018-07-25 11:51 ` Anurag Kumar Vulisha
  2018-07-25 11:51 ` [PATCH 6/8] usb: dwc3: check for requests in started list " Anurag Kumar Vulisha
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 13+ messages in thread
From: Anurag Kumar Vulisha @ 2018-07-25 11:51 UTC (permalink / raw)
  To: balbi, gregkh
  Cc: v.anuragkumar, linux-usb, linux-kernel, Anurag Kumar Vulisha

The stream capable endpoints require stream id to be given
when issuing START TRANSFER. While issuing no-op trb the
stream id is not yet known, so don't issue no-op trb's on
stream capable endpoints.

Signed-off-by: Anurag Kumar Vulisha <anurag.kumar.vulisha@xilinx.com>
---
 drivers/usb/dwc3/gadget.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index e2ccb55..af8d470 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -668,7 +668,7 @@ static int __dwc3_gadget_ep_enable(struct dwc3_ep *dep, unsigned int action)
 	 * Issue StartTransfer here with no-op TRB so we can always rely on No
 	 * Response Update Transfer command.
 	 */
-	if (usb_endpoint_xfer_bulk(desc) ||
+	if ((usb_endpoint_xfer_bulk(desc) && !dep->stream_capable) ||
 			usb_endpoint_xfer_int(desc)) {
 		struct dwc3_gadget_ep_cmd_params params;
 		struct dwc3_trb	*trb;
-- 
2.1.1


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

* [PATCH 6/8] usb: dwc3: check for requests in started list for stream capable endpoints
  2018-07-25 11:51 [PATCH 0/8] fix broken BULK stream support to dwc3 gadget driver Anurag Kumar Vulisha
                   ` (4 preceding siblings ...)
  2018-07-25 11:51 ` [PATCH 5/8] usb: dwc3: don't issue no-op trb for stream capable endpoints Anurag Kumar Vulisha
@ 2018-07-25 11:51 ` Anurag Kumar Vulisha
  2018-07-25 11:51 ` [PATCH 7/8] usb: dwc3: Check for IOC/LST bit in both event->status and TRB->ctrl fields Anurag Kumar Vulisha
  2018-07-25 11:51 ` [PATCH 8/8] usb: dwc3: Check MISSED ISOC bit only for ISOC endpoints Anurag Kumar Vulisha
  7 siblings, 0 replies; 13+ messages in thread
From: Anurag Kumar Vulisha @ 2018-07-25 11:51 UTC (permalink / raw)
  To: balbi, gregkh
  Cc: v.anuragkumar, linux-usb, linux-kernel, Anurag Kumar Vulisha

For stream capable endpoints, uas layer can queue mulpile requests on
single ep with different stream ids. So, there can be multiple pending
requests waiting to be transferred. This patch changes the code to check
for any pending requests waiting to be transferred on ep started_list and
calls __dwc3_gadget_kick_transfer() if any.

Signed-off-by: Anurag Kumar Vulisha <anurag.kumar.vulisha@xilinx.com>
---
 drivers/usb/dwc3/gadget.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index af8d470..fe1ea245 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -2424,6 +2424,9 @@ static void dwc3_gadget_endpoint_transfer_in_progress(struct dwc3_ep *dep,
 
 	dwc3_gadget_ep_cleanup_completed_requests(dep, event, status);
 
+	if (dep->stream_capable && !list_empty(&dep->started_list))
+		__dwc3_gadget_kick_transfer(dep);
+
 	if (stop) {
 		dwc3_stop_active_transfer(dep, true);
 		dep->flags = DWC3_EP_ENABLED;
-- 
2.1.1


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

* [PATCH 7/8] usb: dwc3: Check for IOC/LST bit in both event->status and TRB->ctrl fields
  2018-07-25 11:51 [PATCH 0/8] fix broken BULK stream support to dwc3 gadget driver Anurag Kumar Vulisha
                   ` (5 preceding siblings ...)
  2018-07-25 11:51 ` [PATCH 6/8] usb: dwc3: check for requests in started list " Anurag Kumar Vulisha
@ 2018-07-25 11:51 ` Anurag Kumar Vulisha
  2018-07-25 11:51 ` [PATCH 8/8] usb: dwc3: Check MISSED ISOC bit only for ISOC endpoints Anurag Kumar Vulisha
  7 siblings, 0 replies; 13+ messages in thread
From: Anurag Kumar Vulisha @ 2018-07-25 11:51 UTC (permalink / raw)
  To: balbi, gregkh
  Cc: v.anuragkumar, linux-usb, linux-kernel, Anurag Kumar Vulisha

The present code in dwc3_gadget_ep_reclaim_completed_trb() will check
for IOC/LST bit in the event->status and returns if IOC/LST bit is
set. This logic doesn't work if multiple TRBs are queued per
request and the IOC/LST bit is set on the last TRB of that request.
Consider an example where a queued request has multiple queued TRBs
and IOC/LST bit is set only for the last TRB. In this case, the Core
generates XferComplete/XferInProgress events only for the last TRB
(since IOC/LST are set only for the last TRB). As per the logic in
dwc3_gadget_ep_reclaim_completed_trb() event->status is checked for
IOC/LST bit and returns on the first TRB. This makes the remaining
TRBs left unhandled.
To aviod this, changed the code to check for IOC/LST bits in both
event->status & TRB->ctrl. This patch does the same.

Signed-off-by: Anurag Kumar Vulisha <anurag.kumar.vulisha@xilinx.com>
---
 drivers/usb/dwc3/gadget.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index fe1ea245..1e5cd4b 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -2290,7 +2290,12 @@ static int dwc3_gadget_ep_reclaim_completed_trb(struct dwc3_ep *dep,
 	if (event->status & DEPEVT_STATUS_SHORT && !chain)
 		return 1;
 
-	if (event->status & (DEPEVT_STATUS_IOC | DEPEVT_STATUS_LST))
+	if ((event->status & DEPEVT_STATUS_IOC) &&
+	    (trb->ctrl & DWC3_TRB_CTRL_IOC))
+		return 1;
+
+	if ((event->status & DEPEVT_STATUS_LST) &&
+	    (trb->ctrl & DWC3_TRB_CTRL_LST))
 		return 1;
 
 	return 0;
-- 
2.1.1


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

* [PATCH 8/8] usb: dwc3: Check MISSED ISOC bit only for ISOC endpoints
  2018-07-25 11:51 [PATCH 0/8] fix broken BULK stream support to dwc3 gadget driver Anurag Kumar Vulisha
                   ` (6 preceding siblings ...)
  2018-07-25 11:51 ` [PATCH 7/8] usb: dwc3: Check for IOC/LST bit in both event->status and TRB->ctrl fields Anurag Kumar Vulisha
@ 2018-07-25 11:51 ` Anurag Kumar Vulisha
  7 siblings, 0 replies; 13+ messages in thread
From: Anurag Kumar Vulisha @ 2018-07-25 11:51 UTC (permalink / raw)
  To: balbi, gregkh
  Cc: v.anuragkumar, linux-usb, linux-kernel, Anurag Kumar Vulisha

When streaming is enabled on BULK endpoints and LST bit is set
observed MISSED ISOC bit set in event->status for BULK ep. Since
this bit is only valid for isocronous endpoints, changed the code
to check for isocrnous endpoints when MISSED ISOC bit is set.

Signed-off-by: Anurag Kumar Vulisha <anurag.kumar.vulisha@xilinx.com>
---
 drivers/usb/dwc3/gadget.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 1e5cd4b..0293be2 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -2413,7 +2413,8 @@ static void dwc3_gadget_endpoint_transfer_in_progress(struct dwc3_ep *dep,
 	if (event->status & DEPEVT_STATUS_BUSERR)
 		status = -ECONNRESET;
 
-	if (event->status & DEPEVT_STATUS_MISSED_ISOC) {
+	if ((event->status & DEPEVT_STATUS_MISSED_ISOC) &&
+	    usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
 		status = -EXDEV;
 
 		if (list_empty(&dep->started_list))
-- 
2.1.1


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

* Re: [PATCH 4/8] usb: dwc3: implement stream transfer timeout
  2018-07-25 11:51 ` [PATCH 4/8] usb: dwc3: implement stream transfer timeout Anurag Kumar Vulisha
@ 2018-07-25 15:06   ` Andy Shevchenko
  2018-07-25 15:14     ` Anurag Kumar Vulisha
  0 siblings, 1 reply; 13+ messages in thread
From: Andy Shevchenko @ 2018-07-25 15:06 UTC (permalink / raw)
  To: Anurag Kumar Vulisha
  Cc: Felipe Balbi, Greg Kroah-Hartman, v.anuragkumar, USB,
	Linux Kernel Mailing List

On Wed, Jul 25, 2018 at 2:51 PM, Anurag Kumar Vulisha
<anurag.kumar.vulisha@xilinx.com> wrote:
> According to dwc3 databook when streams are used, it may be possible
> for the host and device become out of sync, where device may wait for
> host to issue prime transcation and host may wait for device to issue
> erdy. To avoid such deadlock, timeout needs to be implemented. After
> timeout occurs, device will first stop transfer and restart the transfer
> again. This patch does the same.

> +/*
> + * Timeout value in msecs used by stream_timeout_timer when streams are enabled
> + */
> +#define STREAM_TIMEOUT         50

Perhaps, STREAM_TIMEOUT_MS 50

Dunno about this driver, but it's a usual practice to help reader with
understanding code on the first glance.

-- 
With Best Regards,
Andy Shevchenko

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

* RE: [PATCH 4/8] usb: dwc3: implement stream transfer timeout
  2018-07-25 15:06   ` Andy Shevchenko
@ 2018-07-25 15:14     ` Anurag Kumar Vulisha
  2018-07-25 15:24       ` Andy Shevchenko
  0 siblings, 1 reply; 13+ messages in thread
From: Anurag Kumar Vulisha @ 2018-07-25 15:14 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Felipe Balbi, Greg Kroah-Hartman, v.anuragkumar, USB,
	Linux Kernel Mailing List

Hi Andy,

Thanks for your review comments, please find my comments inline 

>-----Original Message-----
>From: Andy Shevchenko [mailto:andy.shevchenko@gmail.com]
>Sent: Wednesday, July 25, 2018 8:36 PM
>To: Anurag Kumar Vulisha <anuragku@xilinx.com>
>Cc: Felipe Balbi <balbi@kernel.org>; Greg Kroah-Hartman
><gregkh@linuxfoundation.org>; v.anuragkumar@gmail.com; USB <linux-
>usb@vger.kernel.org>; Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
>Subject: Re: [PATCH 4/8] usb: dwc3: implement stream transfer timeout
>
>On Wed, Jul 25, 2018 at 2:51 PM, Anurag Kumar Vulisha
><anurag.kumar.vulisha@xilinx.com> wrote:
>> According to dwc3 databook when streams are used, it may be possible
>> for the host and device become out of sync, where device may wait for
>> host to issue prime transcation and host may wait for device to issue
>> erdy. To avoid such deadlock, timeout needs to be implemented. After
>> timeout occurs, device will first stop transfer and restart the
>> transfer again. This patch does the same.
>
>> +/*
>> + * Timeout value in msecs used by stream_timeout_timer when streams
>> +are enabled  */
>> +#define STREAM_TIMEOUT         50
>
>Perhaps, STREAM_TIMEOUT_MS 50
>
>Dunno about this driver, but it's a usual practice to help reader with understanding
>code on the first glance.
>

Since I have mentioned "msecs" in comment above describing the STREAM_TIMEOUT,
thought it would suffice. But if you feel I should change it, I  will fix it in v2

Thanks,
Anurag Kumar Vulisha
 
>--
>With Best Regards,
>Andy Shevchenko

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

* Re: [PATCH 4/8] usb: dwc3: implement stream transfer timeout
  2018-07-25 15:14     ` Anurag Kumar Vulisha
@ 2018-07-25 15:24       ` Andy Shevchenko
  2018-07-25 15:51         ` Anurag Kumar Vulisha
  0 siblings, 1 reply; 13+ messages in thread
From: Andy Shevchenko @ 2018-07-25 15:24 UTC (permalink / raw)
  To: Anurag Kumar Vulisha
  Cc: Felipe Balbi, Greg Kroah-Hartman, v.anuragkumar, USB,
	Linux Kernel Mailing List

On Wed, Jul 25, 2018 at 6:14 PM, Anurag Kumar Vulisha
<anuragku@xilinx.com> wrote:

>>> +/*
>>> + * Timeout value in msecs used by stream_timeout_timer when streams
>>> +are enabled  */
>>> +#define STREAM_TIMEOUT         50
>>
>>Perhaps, STREAM_TIMEOUT_MS 50
>>
>>Dunno about this driver, but it's a usual practice to help reader with understanding
>>code on the first glance.
>>
>
> Since I have mentioned "msecs" in comment above describing the STREAM_TIMEOUT,
> thought it would suffice. But if you feel I should change it, I  will fix it in v2

But you didn't put that comment before each occurrence of this
constant in the code, right?
That's what I'm talking about. If reader looks into the code, there is
no need to understand the order of the value for timeout, since units
are part of the name.

Of course, you may ignore this comment.

-- 
With Best Regards,
Andy Shevchenko

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

* RE: [PATCH 4/8] usb: dwc3: implement stream transfer timeout
  2018-07-25 15:24       ` Andy Shevchenko
@ 2018-07-25 15:51         ` Anurag Kumar Vulisha
  0 siblings, 0 replies; 13+ messages in thread
From: Anurag Kumar Vulisha @ 2018-07-25 15:51 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: Felipe Balbi, Greg Kroah-Hartman, v.anuragkumar, USB,
	Linux Kernel Mailing List



>-----Original Message-----
>From: Andy Shevchenko [mailto:andy.shevchenko@gmail.com]
>Sent: Wednesday, July 25, 2018 8:55 PM
>To: Anurag Kumar Vulisha <anuragku@xilinx.com>
>Cc: Felipe Balbi <balbi@kernel.org>; Greg Kroah-Hartman
><gregkh@linuxfoundation.org>; v.anuragkumar@gmail.com; USB <linux-
>usb@vger.kernel.org>; Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
>Subject: Re: [PATCH 4/8] usb: dwc3: implement stream transfer timeout
>
>On Wed, Jul 25, 2018 at 6:14 PM, Anurag Kumar Vulisha
><anuragku@xilinx.com> wrote:
>
>>>> +/*
>>>> + * Timeout value in msecs used by stream_timeout_timer when streams
>>>> +are enabled  */
>>>> +#define STREAM_TIMEOUT         50
>>>
>>>Perhaps, STREAM_TIMEOUT_MS 50
>>>
>>>Dunno about this driver, but it's a usual practice to help reader with understanding
>>>code on the first glance.
>>>
>>
>> Since I have mentioned "msecs" in comment above describing the
>STREAM_TIMEOUT,
>> thought it would suffice. But if you feel I should change it, I  will fix it in v2
>
>But you didn't put that comment before each occurrence of this
>constant in the code, right?
>That's what I'm talking about. If reader looks into the code, there is
>no need to understand the order of the value for timeout, since units
>are part of the name.
>
>Of course, you may ignore this comment.
>

I agree with your comments , will wait for other comments on this patch
series and address them altogether in v2

Thanks,
Anurag Kumar Vulisha
>--
>With Best Regards,
>Andy Shevchenko

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

end of thread, other threads:[~2018-07-25 15:51 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-07-25 11:51 [PATCH 0/8] fix broken BULK stream support to dwc3 gadget driver Anurag Kumar Vulisha
2018-07-25 11:51 ` [PATCH 1/8] usb: dwc3: Correct the logic for checking TRB full in __dwc3_prepare_one_trb() Anurag Kumar Vulisha
2018-07-25 11:51 ` [PATCH 2/8] usb: dwc3: update stream id in depcmd Anurag Kumar Vulisha
2018-07-25 11:51 ` [PATCH 3/8] usb: dwc3: make controller clear transfer resources after complete Anurag Kumar Vulisha
2018-07-25 11:51 ` [PATCH 4/8] usb: dwc3: implement stream transfer timeout Anurag Kumar Vulisha
2018-07-25 15:06   ` Andy Shevchenko
2018-07-25 15:14     ` Anurag Kumar Vulisha
2018-07-25 15:24       ` Andy Shevchenko
2018-07-25 15:51         ` Anurag Kumar Vulisha
2018-07-25 11:51 ` [PATCH 5/8] usb: dwc3: don't issue no-op trb for stream capable endpoints Anurag Kumar Vulisha
2018-07-25 11:51 ` [PATCH 6/8] usb: dwc3: check for requests in started list " Anurag Kumar Vulisha
2018-07-25 11:51 ` [PATCH 7/8] usb: dwc3: Check for IOC/LST bit in both event->status and TRB->ctrl fields Anurag Kumar Vulisha
2018-07-25 11:51 ` [PATCH 8/8] usb: dwc3: Check MISSED ISOC bit only for ISOC endpoints Anurag Kumar Vulisha

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).