All of lore.kernel.org
 help / color / mirror / Atom feed
From: Anurag Kumar Vulisha <anurag.kumar.vulisha@xilinx.com>
To: Felipe Balbi <balbi@kernel.org>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Alan Stern <stern@rowland.harvard.edu>,
	Johan Hovold <johan@kernel.org>,
	Jaejoong Kim <climbbb.kim@gmail.com>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Roger Quadros <rogerq@ti.com>
Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org,
	v.anuragkumar@gmail.com, Thinh Nguyen <thinhn@synopsys.com>,
	Tejas Joglekar <tejas.joglekar@synopsys.com>,
	Ajay Yugalkishore Pandey <APANDEY@xilinx.com>,
	Anurag Kumar Vulisha <anurag.kumar.vulisha@xilinx.com>
Subject: [V6,02/10] usb: dwc3: gadget: Add stream timeout handler for avoiding deadlock
Date: Sat, 13 Oct 2018 18:44:49 +0530	[thread overview]
Message-ID: <1539436498-24892-3-git-send-email-anurag.kumar.vulisha@xilinx.com> (raw)

According to dwc3 databook when streams are enabled, it may be possible
for the host and gadget to become out of sync, where gadget may wait for
host to issue prime transcation and host may wait for gadget to issue
ERDY. To avoid such potential deadlock conditions, a timer is implemented
in udc/core.c and which is started after queuing a valid request in
usb_ep_queue(). This timer would be stopped by the gadget driver when
a valid stream event is found, otherwise the timer gets expired after
STREAM_TIMEOUT_MS value and stream_timeout_function() which is registered
as a callback function to usb_ep->ops->stream_timeout is called by udc
core.

As a part of recovery mechanism, the stream_timeout_function() stops
the active transfer on the endpoint and starts the transfer again on
the endpoint. Doing so, will reset the stream into ready state and ERDY
is sent to the host, thus the deadlock is avoided.

Signed-off-by: Anurag Kumar Vulisha <anurag.kumar.vulisha@xilinx.com>
---
 Changes in v6:
	1. This patch is newly added in this series
---
 drivers/usb/dwc3/gadget.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 032ea7d..aab2970 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -573,6 +573,7 @@ static int dwc3_gadget_set_ep_config(struct dwc3_ep *dep, unsigned int action)
 		params.param1 |= DWC3_DEPCFG_STREAM_CAPABLE
 			| DWC3_DEPCFG_STREAM_EVENT_EN;
 		dep->stream_capable = true;
+		dep->endpoint.stream_capable = true;
 	}
 
 	if (!usb_endpoint_xfer_control(desc))
@@ -1535,6 +1536,18 @@ static int dwc3_gadget_ep_set_wedge(struct usb_ep *ep)
 	return ret;
 }
 
+static void stream_timeout_function(struct usb_ep *ep)
+{
+	struct dwc3_ep	*dep = to_dwc3_ep(ep);
+	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 struct usb_endpoint_descriptor dwc3_gadget_ep0_desc = {
@@ -1563,6 +1576,7 @@ static const struct usb_ep_ops dwc3_gadget_ep_ops = {
 	.dequeue	= dwc3_gadget_ep_dequeue,
 	.set_halt	= dwc3_gadget_ep_set_halt,
 	.set_wedge	= dwc3_gadget_ep_set_wedge,
+	.stream_timeout	= stream_timeout_function,
 };
 
 /* -------------------------------------------------------------------------- */
@@ -2469,6 +2483,10 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc,
 		}
 		break;
 	case DWC3_DEPEVT_STREAMEVT:
+		if ((event->status == DEPEVT_STREAMEVT_FOUND) &&
+			timer_pending(&dep->endpoint.stream_timeout_timer))
+			del_timer(&dep->endpoint.stream_timeout_timer);
+
 	case DWC3_DEPEVT_XFERCOMPLETE:
 	case DWC3_DEPEVT_RXTXFIFOEVT:
 		break;

WARNING: multiple messages have this Message-ID (diff)
From: Anurag Kumar Vulisha <anurag.kumar.vulisha@xilinx.com>
To: Felipe Balbi <balbi@kernel.org>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Alan Stern <stern@rowland.harvard.edu>,
	Johan Hovold <johan@kernel.org>,
	Jaejoong Kim <climbbb.kim@gmail.com>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Roger Quadros <rogerq@ti.com>
Cc: <linux-usb@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	<v.anuragkumar@gmail.com>, Thinh Nguyen <thinhn@synopsys.com>,
	Tejas Joglekar <tejas.joglekar@synopsys.com>,
	Ajay Yugalkishore Pandey <APANDEY@xilinx.com>,
	Anurag Kumar Vulisha <anurag.kumar.vulisha@xilinx.com>
Subject: [PATCH V6 02/10] usb: dwc3: gadget: Add stream timeout handler for avoiding deadlock
Date: Sat, 13 Oct 2018 18:44:49 +0530	[thread overview]
Message-ID: <1539436498-24892-3-git-send-email-anurag.kumar.vulisha@xilinx.com> (raw)
In-Reply-To: <1539436498-24892-1-git-send-email-anurag.kumar.vulisha@xilinx.com>

According to dwc3 databook when streams are enabled, it may be possible
for the host and gadget to become out of sync, where gadget may wait for
host to issue prime transcation and host may wait for gadget to issue
ERDY. To avoid such potential deadlock conditions, a timer is implemented
in udc/core.c and which is started after queuing a valid request in
usb_ep_queue(). This timer would be stopped by the gadget driver when
a valid stream event is found, otherwise the timer gets expired after
STREAM_TIMEOUT_MS value and stream_timeout_function() which is registered
as a callback function to usb_ep->ops->stream_timeout is called by udc
core.

As a part of recovery mechanism, the stream_timeout_function() stops
the active transfer on the endpoint and starts the transfer again on
the endpoint. Doing so, will reset the stream into ready state and ERDY
is sent to the host, thus the deadlock is avoided.

Signed-off-by: Anurag Kumar Vulisha <anurag.kumar.vulisha@xilinx.com>
---
 Changes in v6:
	1. This patch is newly added in this series
---
 drivers/usb/dwc3/gadget.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 032ea7d..aab2970 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -573,6 +573,7 @@ static int dwc3_gadget_set_ep_config(struct dwc3_ep *dep, unsigned int action)
 		params.param1 |= DWC3_DEPCFG_STREAM_CAPABLE
 			| DWC3_DEPCFG_STREAM_EVENT_EN;
 		dep->stream_capable = true;
+		dep->endpoint.stream_capable = true;
 	}
 
 	if (!usb_endpoint_xfer_control(desc))
@@ -1535,6 +1536,18 @@ static int dwc3_gadget_ep_set_wedge(struct usb_ep *ep)
 	return ret;
 }
 
+static void stream_timeout_function(struct usb_ep *ep)
+{
+	struct dwc3_ep	*dep = to_dwc3_ep(ep);
+	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 struct usb_endpoint_descriptor dwc3_gadget_ep0_desc = {
@@ -1563,6 +1576,7 @@ static const struct usb_ep_ops dwc3_gadget_ep_ops = {
 	.dequeue	= dwc3_gadget_ep_dequeue,
 	.set_halt	= dwc3_gadget_ep_set_halt,
 	.set_wedge	= dwc3_gadget_ep_set_wedge,
+	.stream_timeout	= stream_timeout_function,
 };
 
 /* -------------------------------------------------------------------------- */
@@ -2469,6 +2483,10 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc,
 		}
 		break;
 	case DWC3_DEPEVT_STREAMEVT:
+		if ((event->status == DEPEVT_STREAMEVT_FOUND) &&
+			timer_pending(&dep->endpoint.stream_timeout_timer))
+			del_timer(&dep->endpoint.stream_timeout_timer);
+
 	case DWC3_DEPEVT_XFERCOMPLETE:
 	case DWC3_DEPEVT_RXTXFIFOEVT:
 		break;
-- 
2.1.1


             reply	other threads:[~2018-10-13 13:14 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-13 13:14 Anurag Kumar Vulisha [this message]
2018-10-13 13:14 ` [PATCH V6 02/10] usb: dwc3: gadget: Add stream timeout handler for avoiding deadlock Anurag Kumar Vulisha
  -- strict thread matches above, loose matches on Subject: below --
2018-11-29 15:51 [V6,01/10] usb: gadget: udc: Add timer for stream capable endpoints Anurag Kumar Vulisha
2018-11-29 15:51 ` [PATCH V6 01/10] " Anurag Kumar Vulisha
2018-11-29 12:51 [V6,01/10] " Felipe Balbi
2018-11-29 12:51 ` [PATCH V6 01/10] " Felipe Balbi
2018-11-28 16:15 [V6,01/10] " Anurag Kumar Vulisha
2018-11-28 16:15 ` [PATCH V6 01/10] " Anurag Kumar Vulisha
2018-11-14 13:57 [V6,01/10] " Felipe Balbi
2018-11-14 13:57 ` [PATCH V6 01/10] " Felipe Balbi
2018-10-13 13:14 [V6,10/10] usb: dwc3: Check MISSED ISOC bit only for ISOC endpoints Anurag Kumar Vulisha
2018-10-13 13:14 ` [PATCH V6 10/10] " Anurag Kumar Vulisha
2018-10-13 13:14 [V6,09/10] usb: dwc3: Check for IOC/LST bit in both event->status and TRB->ctrl fields Anurag Kumar Vulisha
2018-10-13 13:14 ` [PATCH V6 09/10] " Anurag Kumar Vulisha
2018-10-13 13:14 [V6,08/10] usb: dwc3: Correct the logic for checking TRB full in __dwc3_prepare_one_trb() Anurag Kumar Vulisha
2018-10-13 13:14 ` [PATCH V6 08/10] " Anurag Kumar Vulisha
2018-10-13 13:14 [V6,08/10] " Anurag Kumar Vulisha
2018-10-13 13:14 ` [PATCH V6 08/10] " Anurag Kumar Vulisha
2018-10-13 13:14 [V6,07/10] usb: dwc3: check for requests in started list for stream capable endpoints Anurag Kumar Vulisha
2018-10-13 13:14 ` [PATCH V6 07/10] " Anurag Kumar Vulisha
2018-10-13 13:14 [V6,06/10] usb: dwc3: don't issue no-op trb " Anurag Kumar Vulisha
2018-10-13 13:14 ` [PATCH V6 06/10] " Anurag Kumar Vulisha
2018-10-13 13:14 [V6,05/10] usb: dwc3: make controller clear transfer resources after complete Anurag Kumar Vulisha
2018-10-13 13:14 ` [PATCH V6 05/10] " Anurag Kumar Vulisha
2018-10-13 13:14 [V6,04/10] usb: dwc3: update stream id in depcmd Anurag Kumar Vulisha
2018-10-13 13:14 ` [PATCH V6 04/10] " Anurag Kumar Vulisha
2018-10-13 13:14 [V6,03/10] usb: dwc3: gadget: Remove references to dep->stream_capable Anurag Kumar Vulisha
2018-10-13 13:14 ` [PATCH V6 03/10] " Anurag Kumar Vulisha
2018-10-13 13:14 [V6,01/10] usb: gadget: udc: Add timer for stream capable endpoints Anurag Kumar Vulisha
2018-10-13 13:14 ` [PATCH V6 01/10] " Anurag Kumar Vulisha
2018-10-13 13:14 [PATCH V6 00/10] usb: dwc3: Fix broken BULK stream support to dwc3 gadget driver Anurag Kumar Vulisha
2018-11-11  8:48 ` Anurag Kumar Vulisha

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=1539436498-24892-3-git-send-email-anurag.kumar.vulisha@xilinx.com \
    --to=anurag.kumar.vulisha@xilinx.com \
    --cc=APANDEY@xilinx.com \
    --cc=balbi@kernel.org \
    --cc=benh@kernel.crashing.org \
    --cc=climbbb.kim@gmail.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=johan@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=rogerq@ti.com \
    --cc=stern@rowland.harvard.edu \
    --cc=tejas.joglekar@synopsys.com \
    --cc=thinhn@synopsys.com \
    --cc=v.anuragkumar@gmail.com \
    /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.