diff mbox series

usb: dwc3: gadget: issue a stop command for ISOC endpoint

Message ID 1548064976-30196-1-git-send-email-prime.zeng@hisilicon.com (mailing list archive)
State New, archived
Headers show
Series usb: dwc3: gadget: issue a stop command for ISOC endpoint | expand

Commit Message

Zengtao (B) Jan. 21, 2019, 10:02 a.m. UTC
For ISOC transfers, if there is no available data for a period, we need
to stop the transfer by issue a stop command, otherwise, all the
upcoming transfers will started by update transfer command, and will be
dropped with MISS ISOC errors.

Signed-off-by: Zeng Tao <prime.zeng@hisilicon.com>
---
 drivers/usb/dwc3/gadget.c | 4 ++++
 1 file changed, 4 insertions(+)

Comments

Zengtao (B) Feb. 23, 2019, 9:26 a.m. UTC | #1
Hi balbi:

I got this issue in the UVC application, and I think this issue still exist in the 
latest dwc3 driver.

And we should issue an stop command and the queue is empty when it's 
ISOC transfer, otherwise we will end up with MISS ISOC error for all the 
upcoming transfers.

So I think you can test the UVC application with the latest driver.

Regards
Zengtao 

>-----Original Message-----
>From: Felipe Balbi [mailto:felipe.balbi@linux.intel.com]
>Sent: Monday, January 21, 2019 4:56 PM
>To: Zengtao (B) <prime.zeng@hisilicon.com>
>Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>;
>linux-usb@vger.kernel.org; linux-kernel@vger.kernel.org; Laurent
>Pinchart <laurent.pinchart@ideasonboard.com>
>Subject: RE: [PATCH] usb: dwc3: gadget: issue a stop command for ISOC
>endpoint
>
>* PGP Signed by an unknown key
>
>
>Hi,
>
>"Zengtao (B)" <prime.zeng@hisilicon.com> writes:
>>>-----Original Message-----
>>>From: Felipe Balbi [mailto:felipe.balbi@linux.intel.com]
>>>Sent: Monday, January 21, 2019 4:17 PM
>>>To: Zengtao (B) <prime.zeng@hisilicon.com>
>>>Cc: Zengtao (B) <prime.zeng@hisilicon.com>; Greg Kroah-Hartman
>>><gregkh@linuxfoundation.org>; linux-usb@vger.kernel.org;
>>>linux-kernel@vger.kernel.org
>>>Subject: Re: [PATCH] usb: dwc3: gadget: issue a stop command for
>ISOC
>>>endpoint
>>>
>>>> Old Signed by an unknown key
>>>
>>>
>>>Hi,
>>>
>>>Zeng Tao <prime.zeng@hisilicon.com> writes:
>>>> For ISOC transfers, if there is no available data for a period, we
>>>> need to stop the transfer by issue a stop command, otherwise, all
>>>> the upcoming transfers will started by update transfer command,
>and
>>>> will be dropped with MISS ISOC errors.
>>>
>>>We, actually, have code to handle missed isoc errors now. Have you
>>>tested with that applied? Which kernel are you using? Can you share
>>>tracepoints captured with v5.0-rc3?
>>>
>>
>> Not v5.0-rc3, but I tested it based on 4.9 with backported dwc3
>> driver. And with UVC application, it's very easy to reproduce it.
>
>Ok, so it could be that you missed patches while backporting, right?
>How can I reproduce this? What do I need? Care to give detailed
>instructions?
>
>--
>balbi
>
>* Unknown Key
>* 0xE11A9906
Felipe Balbi April 25, 2019, 1:03 p.m. UTC | #2
(please, avoid top-posting)

Hi,

"Zengtao (B)" <prime.zeng@hisilicon.com> writes:

> Hi balbi:
>
> I got this issue in the UVC application, and I think this issue still exist in the 
> latest dwc3 driver.
>
> And we should issue an stop command and the queue is empty when it's 
> ISOC transfer, otherwise we will end up with MISS ISOC error for all the 
> upcoming transfers.
>
> So I think you can test the UVC application with the latest driver.

right. Then what do I do? How do you load the driver, how do you start
the application? When do you plug the cable?

Please, provide exact steps so I can try to replicate the problem.
diff mbox series

Patch

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index e18c2a2..58e71ba 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -2500,6 +2500,10 @@  static void dwc3_gadget_endpoint_transfer_in_progress(struct dwc3_ep *dep,
 			stop = true;
 	}
 
+	if (list_empty(&dep->started_list) &&
+	    (usb_endpoint_xfer_isoc(dep->endpoint.desc)))
+		stop = true;
+
 	dwc3_gadget_ep_cleanup_completed_requests(dep, event, status);
 
 	if (stop) {