From: Felipe Balbi <balbi@kernel.org>
To: Anurag Kumar Vulisha <anurag.kumar.vulisha@xilinx.com>,
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>
Subject: [V6,01/10] usb: gadget: udc: Add timer for stream capable endpoints
Date: Wed, 14 Nov 2018 15:57:44 +0200 [thread overview]
Message-ID: <87k1lfiwx3.fsf@linux.intel.com> (raw)
Hi,
Anurag Kumar Vulisha <anurag.kumar.vulisha@xilinx.com> writes:
> When bulk streams are enabled for an endpoint, there can
> be a condition where the gadget controller waits for the
> host to issue prime transaction and the host controller
> waits for the gadget to issue ERDY. This condition could
> create a deadlock. To avoid such potential deadlocks, a
> timer is started after queuing any request for the stream
> capable endpoint in usb_ep_queue(). The gadget driver is
> expected to stop the timer if a valid stream event is found.
> If no stream event is found, the timer expires after the
> STREAM_TIMEOUT_MS value and a callback function registered
> by gadget driver to endpoint ops->stream_timeout API would be
> called, so that the gadget driver can handle this situation.
> This kind of behaviour is observed in dwc3 controller and
> expected to be generic issue with other controllers supporting
> bulk streams also.
>
> Signed-off-by: Anurag Kumar Vulisha <anurag.kumar.vulisha@xilinx.com>
> ---
> Changes in v6:
> 1. This patch is newly added in this series to add timer into udc/core.c
> ---
> drivers/usb/gadget/udc/core.c | 71 ++++++++++++++++++++++++++++++++++++++++++-
> include/linux/usb/gadget.h | 12 ++++++++
> 2 files changed, 82 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/usb/gadget/udc/core.c b/drivers/usb/gadget/udc/core.c
> index af88b48..41cc23b 100644
> --- a/drivers/usb/gadget/udc/core.c
> +++ b/drivers/usb/gadget/udc/core.c
> @@ -52,6 +52,24 @@ static int udc_bind_to_driver(struct usb_udc *udc,
> /* ------------------------------------------------------------------------- */
>
> /**
> + * usb_ep_stream_timeout - callback function for endpoint stream timeout timer
> + * @arg: pointer to struct timer_list
> + *
> + * This function gets called only when bulk streams are enabled in the endpoint
> + * and only after ep->stream_timeout_timer has expired. The timer gets expired
> + * only when the gadget controller failed to find a valid stream event for this
> + * endpoint. On timer expiry, this function calls the endpoint-specific timeout
> + * handler registered to endpoint ops->stream_timeout API.
> + */
> +static void usb_ep_stream_timeout(struct timer_list *arg)
> +{
> + struct usb_ep *ep = from_timer(ep, arg, stream_timeout_timer);
> +
> + if (ep->stream_capable && ep->ops->stream_timeout)
why is the timer only for stream endpoints? What if we want to run this
on non-stream capable eps?
> + ep->ops->stream_timeout(ep);
you don't ned an extra operation here, ep_dequeue should be enough.
> @@ -102,6 +132,10 @@ int usb_ep_enable(struct usb_ep *ep)
> if (ret)
> goto out;
>
> + if (ep->stream_capable)
> + timer_setup(&ep->stream_timeout_timer,
> + usb_ep_stream_timeout, 0);
the timer should be per-request, not per-endpoint. Otherwise in case of
multiple requests being queued, you can't give them different timeouts
> @@ -269,6 +321,13 @@ int usb_ep_queue(struct usb_ep *ep,
>
> ret = ep->ops->queue(ep, req, gfp_flags);
>
> + if (ep->stream_capable) {
> + ep->stream_timeout_timer.expires = jiffies +
> + msecs_to_jiffies(STREAM_TIMEOUT_MS);
timeout value should be passed by the gadget driver. Add a new
usb_ep_queue_timeout() that takes the new argument. Rename the current
usb_ep_queue() to static int __usb_ep_queue() with an extra argument for
timeout and introduce usb_ep_queue() without the argument, calling
__usb_ep_queue() passing timeout as 0.
> diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h
> index e5cd84a..2ebaef0 100644
> --- a/include/linux/usb/gadget.h
> +++ b/include/linux/usb/gadget.h
> @@ -144,6 +144,7 @@ struct usb_ep_ops {
>
> int (*fifo_status) (struct usb_ep *ep);
> void (*fifo_flush) (struct usb_ep *ep);
> + void (*stream_timeout) (struct usb_ep *ep);
why?
WARNING: multiple messages have this Message-ID (diff)
From: Felipe Balbi <balbi@kernel.org>
To: Anurag Kumar Vulisha <anurag.kumar.vulisha@xilinx.com>,
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: Re: [PATCH V6 01/10] usb: gadget: udc: Add timer for stream capable endpoints
Date: Wed, 14 Nov 2018 15:57:44 +0200 [thread overview]
Message-ID: <87k1lfiwx3.fsf@linux.intel.com> (raw)
In-Reply-To: <1539436498-24892-2-git-send-email-anurag.kumar.vulisha@xilinx.com>
[-- Attachment #1: Type: text/plain, Size: 3945 bytes --]
Hi,
Anurag Kumar Vulisha <anurag.kumar.vulisha@xilinx.com> writes:
> When bulk streams are enabled for an endpoint, there can
> be a condition where the gadget controller waits for the
> host to issue prime transaction and the host controller
> waits for the gadget to issue ERDY. This condition could
> create a deadlock. To avoid such potential deadlocks, a
> timer is started after queuing any request for the stream
> capable endpoint in usb_ep_queue(). The gadget driver is
> expected to stop the timer if a valid stream event is found.
> If no stream event is found, the timer expires after the
> STREAM_TIMEOUT_MS value and a callback function registered
> by gadget driver to endpoint ops->stream_timeout API would be
> called, so that the gadget driver can handle this situation.
> This kind of behaviour is observed in dwc3 controller and
> expected to be generic issue with other controllers supporting
> bulk streams also.
>
> Signed-off-by: Anurag Kumar Vulisha <anurag.kumar.vulisha@xilinx.com>
> ---
> Changes in v6:
> 1. This patch is newly added in this series to add timer into udc/core.c
> ---
> drivers/usb/gadget/udc/core.c | 71 ++++++++++++++++++++++++++++++++++++++++++-
> include/linux/usb/gadget.h | 12 ++++++++
> 2 files changed, 82 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/usb/gadget/udc/core.c b/drivers/usb/gadget/udc/core.c
> index af88b48..41cc23b 100644
> --- a/drivers/usb/gadget/udc/core.c
> +++ b/drivers/usb/gadget/udc/core.c
> @@ -52,6 +52,24 @@ static int udc_bind_to_driver(struct usb_udc *udc,
> /* ------------------------------------------------------------------------- */
>
> /**
> + * usb_ep_stream_timeout - callback function for endpoint stream timeout timer
> + * @arg: pointer to struct timer_list
> + *
> + * This function gets called only when bulk streams are enabled in the endpoint
> + * and only after ep->stream_timeout_timer has expired. The timer gets expired
> + * only when the gadget controller failed to find a valid stream event for this
> + * endpoint. On timer expiry, this function calls the endpoint-specific timeout
> + * handler registered to endpoint ops->stream_timeout API.
> + */
> +static void usb_ep_stream_timeout(struct timer_list *arg)
> +{
> + struct usb_ep *ep = from_timer(ep, arg, stream_timeout_timer);
> +
> + if (ep->stream_capable && ep->ops->stream_timeout)
why is the timer only for stream endpoints? What if we want to run this
on non-stream capable eps?
> + ep->ops->stream_timeout(ep);
you don't ned an extra operation here, ep_dequeue should be enough.
> @@ -102,6 +132,10 @@ int usb_ep_enable(struct usb_ep *ep)
> if (ret)
> goto out;
>
> + if (ep->stream_capable)
> + timer_setup(&ep->stream_timeout_timer,
> + usb_ep_stream_timeout, 0);
the timer should be per-request, not per-endpoint. Otherwise in case of
multiple requests being queued, you can't give them different timeouts
> @@ -269,6 +321,13 @@ int usb_ep_queue(struct usb_ep *ep,
>
> ret = ep->ops->queue(ep, req, gfp_flags);
>
> + if (ep->stream_capable) {
> + ep->stream_timeout_timer.expires = jiffies +
> + msecs_to_jiffies(STREAM_TIMEOUT_MS);
timeout value should be passed by the gadget driver. Add a new
usb_ep_queue_timeout() that takes the new argument. Rename the current
usb_ep_queue() to static int __usb_ep_queue() with an extra argument for
timeout and introduce usb_ep_queue() without the argument, calling
__usb_ep_queue() passing timeout as 0.
> diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h
> index e5cd84a..2ebaef0 100644
> --- a/include/linux/usb/gadget.h
> +++ b/include/linux/usb/gadget.h
> @@ -144,6 +144,7 @@ struct usb_ep_ops {
>
> int (*fifo_status) (struct usb_ep *ep);
> void (*fifo_flush) (struct usb_ep *ep);
> + void (*stream_timeout) (struct usb_ep *ep);
why?
--
balbi
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]
next reply other threads:[~2018-11-14 13:57 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-11-14 13:57 Felipe Balbi [this message]
2018-11-14 13:57 ` [PATCH V6 01/10] usb: gadget: udc: Add timer for stream capable endpoints Felipe Balbi
-- strict thread matches above, loose matches on Subject: below --
2018-11-29 15:51 [V6,01/10] " 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-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,02/10] usb: dwc3: gadget: Add stream timeout handler for avoiding deadlock Anurag Kumar Vulisha
2018-10-13 13:14 ` [PATCH V6 02/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=87k1lfiwx3.fsf@linux.intel.com \
--to=balbi@kernel.org \
--cc=APANDEY@xilinx.com \
--cc=anurag.kumar.vulisha@xilinx.com \
--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.