All of lore.kernel.org
 help / color / mirror / Atom feed
* [BUG REPORT] usb: dwc3: Bug while setting the USB transfer bandwidth on UVC gadget driver
@ 2021-05-14  3:20 Chow, Watson
  2021-05-14  7:16 ` Felipe Balbi
  0 siblings, 1 reply; 10+ messages in thread
From: Chow, Watson @ 2021-05-14  3:20 UTC (permalink / raw)
  To: linux-usb

Hi,

I'm using the SoC (Xilinx MPSoC) with DWC3 USB controller. I need to emulate my hardware to work like a USB camera and so make use of the USB UVC gadget driver - g_webcam.

[My problem]

Refer to this link and the driver source code, I find 3 parameters to configure the ISOC transfer bandwidth.
https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/transfer-data-to-isochronous-endpoints#isochronous-transfer-example

They are:

streaming_maxpacket : range [1 - 3072] 
streaming_maxburst : range [0 - 15]
streaming_interval : [1 - 16]

So, I load the driver in this way
# modprobe g_webcam streaming_maxpacket=3072 streaming_maxburst=9 streaming_interval=2

Create my own app base on
https://github.com/wlhe/uvc-gadget

Test result
In my evaluation, I can set the combination of parameters up to this. The streaming is ok.
# modprobe g_webcam streaming_maxpacket=3072 streaming_maxburst=9 streaming_interval=2

This should be around 900Mbit/sec. Far less than 5Gbps bandwidth of USB3.0


When I increase the parameter combination to:
# modprobe g_webcam streaming_maxpacket=3072 streaming_maxburst=10 streaming_interval=2

I get the below error message and everything stop.

[ 1089.751559] g_webcam gadget: uvc: VS request completed with status -18.

1.	This error is somehow related to the underflow of the transfer queue. Is my understanding correct? 
If so, how to solve?
2.	My goal is to utilize the full bandwidth of USB3.0. How can I achive?


[Some background information and my test setup]

I started from the Xilinx TRD here.
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/541786361/Zynq+UltraScale+MPSoC+VCU+TRD+2020.1+-+Xilinx+Low+Latency+PS+DDR+NV12+HDMI+Audio+Video+Capture+and+Display

With kernel version v5.4:
https://github.com/Xilinx/linux-xlnx/tree/xlnx_rebase_v5.4_2020.2


Enabled the UVC gadget and made my own test code to evaluate the transfer throughput on the USB3.0 port.

Test platform:
.	Xilinx ZCU106 evaluation board connected to PC through USB3.0 cable
.	Xilinx ZCU106 evaluation board would emulate a webcam through USB UVC gadget

My test app:
.	Capture 3840x2160@60 video and scale to 1920x1080@60
.	Queue the frames to UVC gadget driver
Host PC side:
.	X86 PC with Ubuntu 18.04LTS OS
.	Use ffplay to capture and display frame from ZCU106
# ffplay /dev/video2 -video_size 1920x1080 -framerate 30



Best regards,

Watson Chow
Design Manager
Avnet Technology Hong Kong Limited
 



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

* Re: [BUG REPORT] usb: dwc3: Bug while setting the USB transfer bandwidth on UVC gadget driver
  2021-05-14  3:20 [BUG REPORT] usb: dwc3: Bug while setting the USB transfer bandwidth on UVC gadget driver Chow, Watson
@ 2021-05-14  7:16 ` Felipe Balbi
  2021-05-14  8:59   ` Chow, Watson
  0 siblings, 1 reply; 10+ messages in thread
From: Felipe Balbi @ 2021-05-14  7:16 UTC (permalink / raw)
  To: Chow, Watson, linux-usb

[-- Attachment #1: Type: text/plain, Size: 2714 bytes --]


Hi Watson,

(please teach your mailer to break lines at 80 columns)

"Chow, Watson" <Watson.Chow@Avnet.com> writes:
> Hi,
>
> I'm using the SoC (Xilinx MPSoC) with DWC3 USB controller. I need to
> emulate my hardware to work like a USB camera and so make use of the
> USB UVC gadget driver - g_webcam.

which Kernel version are you running?

> Refer to this link and the driver source code, I find 3 parameters to
> configure the ISOC transfer bandwidth.
>
> https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/transfer-data-to-isochronous-endpoints#isochronous-transfer-example
>
> They are:
>
> streaming_maxpacket : range [1 - 3072] 
> streaming_maxburst : range [0 - 15]
> streaming_interval : [1 - 16]
>
> So, I load the driver in this way
>
> # modprobe g_webcam streaming_maxpacket=3072 streaming_maxburst=9 streaming_interval=2
>
> Create my own app base on
> https://github.com/wlhe/uvc-gadget
>
> Test result
>
> In my evaluation, I can set the combination of parameters up to
> this. The streaming is ok.
>
> # modprobe g_webcam streaming_maxpacket=3072 streaming_maxburst=9 streaming_interval=2

streaming_maxburst=15 should work here too.

> This should be around 900Mbit/sec. Far less than 5Gbps bandwidth of
> USB3.0

IIRC Isoc endpoints can't take the full bus bandwidth, I don't remember
the exact limit but I think it's 80% of full bandwidth. Still, that
should be around 4Gbit/sec

> When I increase the parameter combination to:
> # modprobe g_webcam streaming_maxpacket=3072 streaming_maxburst=10 streaming_interval=2
>
> I get the below error message and everything stop.
>
> [ 1089.751559] g_webcam gadget: uvc: VS request completed with status -18.

> 1. This error is somehow related to the underflow of the transfer
> queue. Is my understanding correct?

that means the controller lost an isoc interval. There is still
discussion going on regarding isoc intervals in dwc3. It turns out the
HW doesn't make scheduling super easy for SW :-)

> If so, how to solve?
> 2.	My goal is to utilize the full bandwidth of USB3.0. How can I achive?
>
> [Some background information and my test setup]
>
> I started from the Xilinx TRD here.
>
> https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/541786361/Zynq+UltraScale+MPSoC+VCU+TRD+2020.1+-+Xilinx+Low+Latency+PS+DDR+NV12+HDMI+Audio+Video+Capture+and+Display
>
> With kernel version v5.4:
> https://github.com/Xilinx/linux-xlnx/tree/xlnx_rebase_v5.4_2020.2

v5.4 is super old, please test with v5.12 or the latest v5.13-rc. Also,
when reporting dwc3 bugs, make sure to include regdump and trace events
as described in dwc3 documentation

-- 
balbi

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 511 bytes --]

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

* RE: [BUG REPORT] usb: dwc3: Bug while setting the USB transfer bandwidth on UVC gadget driver
  2021-05-14  7:16 ` Felipe Balbi
@ 2021-05-14  8:59   ` Chow, Watson
  2021-05-14 10:31     ` Felipe Balbi
  0 siblings, 1 reply; 10+ messages in thread
From: Chow, Watson @ 2021-05-14  8:59 UTC (permalink / raw)
  To: Felipe Balbi, linux-usb

Balbi,

Thanks for your quick reply.

Some questions

1. You mentioned that the max bandwidth in isoc mode (USB3.0) should be 
around 4Gbps.  

I have the below calcuation on bandwidth:
In USB3.0, 1 micro frame would take 125us and can transfer max 45000 bytes
So, in 1 sec, we will have 8000 micro frames

Max bandwidth = 8000 x 4500 x 8 = 2.88Gbps

Is my understanding correct?

2. To achieve the max throughput, I need to configure the uvc gadget driver 
with below parameters. Am I right?

# modprobe g_webcam streaming_maxpacket=3072 streaming_maxburst=15 
streaming_interval=1


3. You suggest me to try on kernel v5.12 or the latest v5.13-rc. It looks not
easy in my side to upgrade the kernel version. It would affect those other 
device drivers I'm currently using. So, do you think there's any short cut 
to fix this problem under my current kernel version - v5.4?


4. I read through the procedures to capture debug info by debugfs. However,
in my test with "streaming_maxburst" set to 10 or above, my system would 
crash and I can't pick the log from that point. Any suggestion?

best regards,

Watson


-----Original Message-----
From: Felipe Balbi <balbi@kernel.org> 
Sent: Friday, May 14, 2021 3:16 PM
To: Chow, Watson <Watson.Chow@Avnet.com>; linux-usb@vger.kernel.org
Subject: Re: [BUG REPORT] usb: dwc3: Bug while setting the USB transfer bandwidth on UVC gadget driver


Hi Watson,

(please teach your mailer to break lines at 80 columns)

"Chow, Watson" <Watson.Chow@Avnet.com> writes:
> Hi,
>
> I'm using the SoC (Xilinx MPSoC) with DWC3 USB controller. I need to 
> emulate my hardware to work like a USB camera and so make use of the 
> USB UVC gadget driver - g_webcam.

which Kernel version are you running?

> Refer to this link and the driver source code, I find 3 parameters to 
> configure the ISOC transfer bandwidth.
>
> https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/trans
> fer-data-to-isochronous-endpoints#isochronous-transfer-example
>
> They are:
>
> streaming_maxpacket : range [1 - 3072] streaming_maxburst : range [0 - 
> 15] streaming_interval : [1 - 16]
>
> So, I load the driver in this way
>
> # modprobe g_webcam streaming_maxpacket=3072 streaming_maxburst=9 
> streaming_interval=2
>
> Create my own app base on
> https://github.com/wlhe/uvc-gadget
>
> Test result
>
> In my evaluation, I can set the combination of parameters up to this. 
> The streaming is ok.
>
> # modprobe g_webcam streaming_maxpacket=3072 streaming_maxburst=9 
> streaming_interval=2

streaming_maxburst=15 should work here too.

> This should be around 900Mbit/sec. Far less than 5Gbps bandwidth of
> USB3.0

IIRC Isoc endpoints can't take the full bus bandwidth, I don't remember the exact limit but I think it's 80% of full bandwidth. Still, that should be around 4Gbit/sec

> When I increase the parameter combination to:
> # modprobe g_webcam streaming_maxpacket=3072 streaming_maxburst=10 
> streaming_interval=2
>
> I get the below error message and everything stop.
>
> [ 1089.751559] g_webcam gadget: uvc: VS request completed with status -18.

> 1. This error is somehow related to the underflow of the transfer 
> queue. Is my understanding correct?

that means the controller lost an isoc interval. There is still discussion going on regarding isoc intervals in dwc3. It turns out the HW doesn't make scheduling super easy for SW :-)

> If so, how to solve?
> 2.	My goal is to utilize the full bandwidth of USB3.0. How can I achive?
>
> [Some background information and my test setup]
>
> I started from the Xilinx TRD here.
>
> https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/541786361/Zynq+U
> ltraScale+MPSoC+VCU+TRD+2020.1+-+Xilinx+Low+Latency+PS+DDR+NV12+HDMI+A
> udio+Video+Capture+and+Display
>
> With kernel version v5.4:
> https://github.com/Xilinx/linux-xlnx/tree/xlnx_rebase_v5.4_2020.2

v5.4 is super old, please test with v5.12 or the latest v5.13-rc. Also, when reporting dwc3 bugs, make sure to include regdump and trace events as described in dwc3 documentation

--
balbi

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

* RE: [BUG REPORT] usb: dwc3: Bug while setting the USB transfer bandwidth on UVC gadget driver
  2021-05-14  8:59   ` Chow, Watson
@ 2021-05-14 10:31     ` Felipe Balbi
  2021-05-17  3:58       ` Chow, Watson
  0 siblings, 1 reply; 10+ messages in thread
From: Felipe Balbi @ 2021-05-14 10:31 UTC (permalink / raw)
  To: Chow, Watson, linux-usb

[-- Attachment #1: Type: text/plain, Size: 1624 bytes --]


Hi,

(please don't top-post :-)

"Chow, Watson" <Watson.Chow@Avnet.com> writes:
> Balbi,
>
> Thanks for your quick reply.
>
> Some questions
>
> 1. You mentioned that the max bandwidth in isoc mode (USB3.0) should be 
> around 4Gbps.  
>
> I have the below calcuation on bandwidth:
> In USB3.0, 1 micro frame would take 125us and can transfer max 45000 bytes
> So, in 1 sec, we will have 8000 micro frames
>
> Max bandwidth = 8000 x 4500 x 8 = 2.88Gbps
>
> Is my understanding correct?

probably, It's been a while since I've dug through the spec, to be frank

> 2. To achieve the max throughput, I need to configure the uvc gadget driver 
> with below parameters. Am I right?
>
> # modprobe g_webcam streaming_maxpacket=3072 streaming_maxburst=15 
> streaming_interval=1

right, but there's an assumption here that the gadget will be able to
feed data in a timely manner.

> 3. You suggest me to try on kernel v5.12 or the latest v5.13-rc. It looks not
> easy in my side to upgrade the kernel version. It would affect those other 
> device drivers I'm currently using. So, do you think there's any short cut 
> to fix this problem under my current kernel version - v5.4?

In that case, you need to ask for support from whoever forces you to
stay with such an old kernel. I believe that would be Xilinx.

> 4. I read through the procedures to capture debug info by debugfs. However,
> in my test with "streaming_maxburst" set to 10 or above, my system would 
> crash and I can't pick the log from that point. Any suggestion?

have a look at ftrace_dump_on_oops.

-- 
balbi

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 511 bytes --]

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

* RE: [BUG REPORT] usb: dwc3: Bug while setting the USB transfer bandwidth on UVC gadget driver
  2021-05-14 10:31     ` Felipe Balbi
@ 2021-05-17  3:58       ` Chow, Watson
  2021-05-17  5:32         ` Felipe Balbi
  0 siblings, 1 reply; 10+ messages in thread
From: Chow, Watson @ 2021-05-17  3:58 UTC (permalink / raw)
  To: Felipe Balbi, linux-usb

Hi,

>Hi,
>
>(please don't top-post :-)
I have tried my best to meet the format requirement

>
>"Chow, Watson" <Watson.Chow@Avnet.com> writes:
>> Balbi,
>>
>> Thanks for your quick reply.
>>
>> Some questions
>>
>> 1. You mentioned that the max bandwidth in isoc mode (USB3.0) should be 
>> around 4Gbps.  
>>
>> I have the below calcuation on bandwidth:
>> In USB3.0, 1 micro frame would take 125us and can transfer max 45000 bytes
>> So, in 1 sec, we will have 8000 micro frames
>>
>> Max bandwidth = 8000 x 4500 x 8 = 2.88Gbps
>>
>> Is my understanding correct?
>
>probably, It's been a while since I've dug through the spec, to be frank
>
>> 2. To achieve the max throughput, I need to configure the uvc gadget driver 
>> with below parameters. Am I right?
>>
>> # modprobe g_webcam streaming_maxpacket=3072 streaming_maxburst=15 
>> streaming_interval=1
>
>right, but there's an assumption here that the gadget will be able to
>feed data in a timely manner.
How does the DWC3 driver or the gadget driver handle the case with intermittent
drop of the input video streaming?

Any recover mechanism?

>
>> 3. You suggest me to try on kernel v5.12 or the latest v5.13-rc. It looks not
>> easy in my side to upgrade the kernel version. It would affect those other 
>> device drivers I'm currently using. So, do you think there's any short cut 
>> to fix this problem under my current kernel version - v5.4?
>
>In that case, you need to ask for support from whoever forces you to
>stay with such an old kernel. I believe that would be Xilinx.

I have a thought to back port those changes around the dwc3 and gadget driver
from the latest kernel version to my kernel (v5.4). Do you think this is 
feasible?

>
>> 4. I read through the procedures to capture debug info by debugfs. However,
>> in my test with "streaming_maxburst" set to 10 or above, my system would 
>> crash and I can't pick the log from that point. Any suggestion?
>
>have a look at ftrace_dump_on_oops.

I will explore how to enable this

>

Btw, do you know which SoC platform can run the UVC gadget in max throughput.
Raspberry Pi/TI Beaglebone/i.MX ???


best regards,

Watson
-----Original Message-----
From: Felipe Balbi <balbi@kernel.org> 
Sent: Friday, May 14, 2021 6:32 PM
To: Chow, Watson <Watson.Chow@Avnet.com>; linux-usb@vger.kernel.org
Subject: RE: [BUG REPORT] usb: dwc3: Bug while setting the USB transfer bandwidth on UVC gadget driver


Hi,

(please don't top-post :-)

"Chow, Watson" <Watson.Chow@Avnet.com> writes:
> Balbi,
>
> Thanks for your quick reply.
>
> Some questions
>
> 1. You mentioned that the max bandwidth in isoc mode (USB3.0) should be 
> around 4Gbps.  
>
> I have the below calcuation on bandwidth:
> In USB3.0, 1 micro frame would take 125us and can transfer max 45000 bytes
> So, in 1 sec, we will have 8000 micro frames
>
> Max bandwidth = 8000 x 4500 x 8 = 2.88Gbps
>
> Is my understanding correct?

probably, It's been a while since I've dug through the spec, to be frank

> 2. To achieve the max throughput, I need to configure the uvc gadget driver 
> with below parameters. Am I right?
>
> # modprobe g_webcam streaming_maxpacket=3072 streaming_maxburst=15 
> streaming_interval=1

right, but there's an assumption here that the gadget will be able to
feed data in a timely manner.

> 3. You suggest me to try on kernel v5.12 or the latest v5.13-rc. It looks not
> easy in my side to upgrade the kernel version. It would affect those other 
> device drivers I'm currently using. So, do you think there's any short cut 
> to fix this problem under my current kernel version - v5.4?

In that case, you need to ask for support from whoever forces you to
stay with such an old kernel. I believe that would be Xilinx.

> 4. I read through the procedures to capture debug info by debugfs. However,
> in my test with "streaming_maxburst" set to 10 or above, my system would 
> crash and I can't pick the log from that point. Any suggestion?

have a look at ftrace_dump_on_oops.

-- 
balbi

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

* RE: [BUG REPORT] usb: dwc3: Bug while setting the USB transfer bandwidth on UVC gadget driver
  2021-05-17  3:58       ` Chow, Watson
@ 2021-05-17  5:32         ` Felipe Balbi
  2021-06-04  2:53           ` Chow, Watson
  0 siblings, 1 reply; 10+ messages in thread
From: Felipe Balbi @ 2021-05-17  5:32 UTC (permalink / raw)
  To: Chow, Watson, linux-usb

[-- Attachment #1: Type: text/plain, Size: 2649 bytes --]


Hi,

"Chow, Watson" <Watson.Chow@Avnet.com> writes:
> Hi,
>
>>Hi,
>>
>>(please don't top-post :-)
> I have tried my best to meet the format requirement

Thanks

>>"Chow, Watson" <Watson.Chow@Avnet.com> writes:
>>> Balbi,
>>>
>>> Thanks for your quick reply.
>>>
>>> Some questions
>>>
>>> 1. You mentioned that the max bandwidth in isoc mode (USB3.0) should be 
>>> around 4Gbps.  
>>>
>>> I have the below calcuation on bandwidth:
>>> In USB3.0, 1 micro frame would take 125us and can transfer max 45000 bytes
>>> So, in 1 sec, we will have 8000 micro frames
>>>
>>> Max bandwidth = 8000 x 4500 x 8 = 2.88Gbps
>>>
>>> Is my understanding correct?
>>
>>probably, It's been a while since I've dug through the spec, to be frank
>>
>>> 2. To achieve the max throughput, I need to configure the uvc gadget driver 
>>> with below parameters. Am I right?
>>>
>>> # modprobe g_webcam streaming_maxpacket=3072 streaming_maxburst=15 
>>> streaming_interval=1
>>
>>right, but there's an assumption here that the gadget will be able to
>>feed data in a timely manner.
>
> How does the DWC3 driver or the gadget driver handle the case with intermittent
> drop of the input video streaming?
>
> Any recover mechanism?

yeah, the missed ISOC is reported to the gadget driver and that has to
queue new requests.

>>> 3. You suggest me to try on kernel v5.12 or the latest v5.13-rc. It looks not
>>> easy in my side to upgrade the kernel version. It would affect those other 
>>> device drivers I'm currently using. So, do you think there's any short cut 
>>> to fix this problem under my current kernel version - v5.4?
>>
>>In that case, you need to ask for support from whoever forces you to
>>stay with such an old kernel. I believe that would be Xilinx.
>
> I have a thought to back port those changes around the dwc3 and gadget driver
> from the latest kernel version to my kernel (v5.4). Do you think this is 
> feasible?

should be, but it's likely quite a bit of work:

$ git rev-list --count v5.4..linus/master -- drivers/usb/dwc3/
257

>>> 4. I read through the procedures to capture debug info by debugfs. However,
>>> in my test with "streaming_maxburst" set to 10 or above, my system would 
>>> crash and I can't pick the log from that point. Any suggestion?
>>
>>have a look at ftrace_dump_on_oops.
>
> I will explore how to enable this
>
>>
>
> Btw, do you know which SoC platform can run the UVC gadget in max throughput.
> Raspberry Pi/TI Beaglebone/i.MX ???

Raspberry Pi uses dwc2
Beaglebone uses musb
i.MX, I think some of them use dwc3 at least.

-- 
balbi

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 511 bytes --]

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

* RE: [BUG REPORT] usb: dwc3: Bug while setting the USB transfer bandwidth on UVC gadget driver
  2021-05-17  5:32         ` Felipe Balbi
@ 2021-06-04  2:53           ` Chow, Watson
  2021-06-04  5:15             ` Felipe Balbi
  2021-06-07  6:11             ` Peter Chen
  0 siblings, 2 replies; 10+ messages in thread
From: Chow, Watson @ 2021-06-04  2:53 UTC (permalink / raw)
  To: Felipe Balbi, linux-usb

Balbi,

>Hi,
>
>"Chow, Watson" <Watson.Chow@Avnet.com> writes:
>> Hi,
>>
>>>Hi,
>>>
>>>(please don't top-post :-)
>> I have tried my best to meet the format requirement
>
>Thanks
>
>>>"Chow, Watson" <Watson.Chow@Avnet.com> writes:
>>>> Balbi,
>>>>
>>>> Thanks for your quick reply.
>>>>
>>>> Some questions
>>>>
>>>> 1. You mentioned that the max bandwidth in isoc mode (USB3.0) should be 
>>>> around 4Gbps.  
>>>>
>>>> I have the below calcuation on bandwidth:
>>>> In USB3.0, 1 micro frame would take 125us and can transfer max 45000 bytes
>>>> So, in 1 sec, we will have 8000 micro frames
>>>>
>>>> Max bandwidth = 8000 x 4500 x 8 = 2.88Gbps
>>>>
>>>> Is my understanding correct?
>>>
>>>probably, It's been a while since I've dug through the spec, to be frank
>>>
>>>> 2. To achieve the max throughput, I need to configure the uvc gadget driver 
>>>> with below parameters. Am I right?
>>>>
>>>> # modprobe g_webcam streaming_maxpacket=3072 streaming_maxburst=15 
>>>> streaming_interval=1
>>>
>>>right, but there's an assumption here that the gadget will be able to
>>>feed data in a timely manner.
>>
>> How does the DWC3 driver or the gadget driver handle the case with intermittent
>> drop of the input video streaming?
>>
>> Any recover mechanism?
>
>yeah, the missed ISOC is reported to the gadget driver and that has to
>queue new requests.
>
>>>> 3. You suggest me to try on kernel v5.12 or the latest v5.13-rc. It looks not
>>>> easy in my side to upgrade the kernel version. It would affect those other 
>>>> device drivers I'm currently using. So, do you think there's any short cut 
>>>> to fix this problem under my current kernel version - v5.4?
>>>
>>>In that case, you need to ask for support from whoever forces you to
>>>stay with such an old kernel. I believe that would be Xilinx.
>>
>> I have a thought to back port those changes around the dwc3 and gadget driver
>> from the latest kernel version to my kernel (v5.4). Do you think this is 
>> feasible?
>
>should be, but it's likely quite a bit of work:
>
>$ git rev-list --count v5.4..linus/master -- drivers/usb/dwc3/
>257
>

Upgraded the kernel version to 5.9, I can set the g_webcam module pararmeters
as follow (for max bandwidth):

streaming_maxpacket=3072
streaming_maxburst=15
streaming_interval=1

Data transfer with above setting is working now - tested with dummy data
generator in the uvc-gadget app.

This concludes that kernel 5.4 is too old for DWC3 and UVC gadget driver
in high bandwidth usage


>>>> 4. I read through the procedures to capture debug info by debugfs. However,
>>>> in my test with "streaming_maxburst" set to 10 or above, my system would 
>>>> crash and I can't pick the log from that point. Any suggestion?
>>>
>>>have a look at ftrace_dump_on_oops.
>>
>> I will explore how to enable this
>>
>>>
>>
>> Btw, do you know which SoC platform can run the UVC gadget in max throughput.
>> Raspberry Pi/TI Beaglebone/i.MX ???
>
>Raspberry Pi uses dwc2
>Beaglebone uses musb
>i.MX, I think some of them use dwc3 at least.
>

Watson

-----Original Message-----
From: Felipe Balbi <balbi@kernel.org> 
Sent: Monday, May 17, 2021 1:32 PM
To: Chow, Watson <Watson.Chow@Avnet.com>; linux-usb@vger.kernel.org
Subject: RE: [BUG REPORT] usb: dwc3: Bug while setting the USB transfer bandwidth on UVC gadget driver


Hi,

"Chow, Watson" <Watson.Chow@Avnet.com> writes:
> Hi,
>
>>Hi,
>>
>>(please don't top-post :-)
> I have tried my best to meet the format requirement

Thanks

>>"Chow, Watson" <Watson.Chow@Avnet.com> writes:
>>> Balbi,
>>>
>>> Thanks for your quick reply.
>>>
>>> Some questions
>>>
>>> 1. You mentioned that the max bandwidth in isoc mode (USB3.0) should be 
>>> around 4Gbps.  
>>>
>>> I have the below calcuation on bandwidth:
>>> In USB3.0, 1 micro frame would take 125us and can transfer max 45000 bytes
>>> So, in 1 sec, we will have 8000 micro frames
>>>
>>> Max bandwidth = 8000 x 4500 x 8 = 2.88Gbps
>>>
>>> Is my understanding correct?
>>
>>probably, It's been a while since I've dug through the spec, to be frank
>>
>>> 2. To achieve the max throughput, I need to configure the uvc gadget driver 
>>> with below parameters. Am I right?
>>>
>>> # modprobe g_webcam streaming_maxpacket=3072 streaming_maxburst=15 
>>> streaming_interval=1
>>
>>right, but there's an assumption here that the gadget will be able to
>>feed data in a timely manner.
>
> How does the DWC3 driver or the gadget driver handle the case with intermittent
> drop of the input video streaming?
>
> Any recover mechanism?

yeah, the missed ISOC is reported to the gadget driver and that has to
queue new requests.

>>> 3. You suggest me to try on kernel v5.12 or the latest v5.13-rc. It looks not
>>> easy in my side to upgrade the kernel version. It would affect those other 
>>> device drivers I'm currently using. So, do you think there's any short cut 
>>> to fix this problem under my current kernel version - v5.4?
>>
>>In that case, you need to ask for support from whoever forces you to
>>stay with such an old kernel. I believe that would be Xilinx.
>
> I have a thought to back port those changes around the dwc3 and gadget driver
> from the latest kernel version to my kernel (v5.4). Do you think this is 
> feasible?

should be, but it's likely quite a bit of work:

$ git rev-list --count v5.4..linus/master -- drivers/usb/dwc3/
257

>>> 4. I read through the procedures to capture debug info by debugfs. However,
>>> in my test with "streaming_maxburst" set to 10 or above, my system would 
>>> crash and I can't pick the log from that point. Any suggestion?
>>
>>have a look at ftrace_dump_on_oops.
>
> I will explore how to enable this
>
>>
>
> Btw, do you know which SoC platform can run the UVC gadget in max throughput.
> Raspberry Pi/TI Beaglebone/i.MX ???

Raspberry Pi uses dwc2
Beaglebone uses musb
i.MX, I think some of them use dwc3 at least.

-- 
balbi

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

* RE: [BUG REPORT] usb: dwc3: Bug while setting the USB transfer bandwidth on UVC gadget driver
  2021-06-04  2:53           ` Chow, Watson
@ 2021-06-04  5:15             ` Felipe Balbi
  2021-06-07  6:11             ` Peter Chen
  1 sibling, 0 replies; 10+ messages in thread
From: Felipe Balbi @ 2021-06-04  5:15 UTC (permalink / raw)
  To: Chow, Watson, linux-usb

[-- Attachment #1: Type: text/plain, Size: 1313 bytes --]


Hi,

"Chow, Watson" <Watson.Chow@Avnet.com> writes:
>>>>> 3. You suggest me to try on kernel v5.12 or the latest v5.13-rc. It looks not
>>>>> easy in my side to upgrade the kernel version. It would affect those other 
>>>>> device drivers I'm currently using. So, do you think there's any short cut 
>>>>> to fix this problem under my current kernel version - v5.4?
>>>>
>>>>In that case, you need to ask for support from whoever forces you to
>>>>stay with such an old kernel. I believe that would be Xilinx.
>>>
>>> I have a thought to back port those changes around the dwc3 and gadget driver
>>> from the latest kernel version to my kernel (v5.4). Do you think this is 
>>> feasible?
>>
>>should be, but it's likely quite a bit of work:
>>
>>$ git rev-list --count v5.4..linus/master -- drivers/usb/dwc3/
>>257
>>
>
> Upgraded the kernel version to 5.9, I can set the g_webcam module pararmeters
> as follow (for max bandwidth):
>
> streaming_maxpacket=3072
> streaming_maxburst=15
> streaming_interval=1
>
> Data transfer with above setting is working now - tested with dummy data
> generator in the uvc-gadget app.
>
> This concludes that kernel 5.4 is too old for DWC3 and UVC gadget driver
> in high bandwidth usage

Cool, thanks for letting me know :-)

-- 
balbi

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 511 bytes --]

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

* Re: [BUG REPORT] usb: dwc3: Bug while setting the USB transfer bandwidth on UVC gadget driver
  2021-06-04  2:53           ` Chow, Watson
  2021-06-04  5:15             ` Felipe Balbi
@ 2021-06-07  6:11             ` Peter Chen
  2021-06-07 11:26               ` Chow, Watson
  1 sibling, 1 reply; 10+ messages in thread
From: Peter Chen @ 2021-06-07  6:11 UTC (permalink / raw)
  To: Chow, Watson; +Cc: Felipe Balbi, linux-usb

On 21-06-04 02:53:19, Chow, Watson wrote:
> 
> Upgraded the kernel version to 5.9, I can set the g_webcam module pararmeters
> as follow (for max bandwidth):
> 
> streaming_maxpacket=3072
> streaming_maxburst=15
> streaming_interval=1

According the spec:
Maximum number of packet within one SoF:
(bMaxBurst + 1) * (Mult + 1) = (15  + 1) * (2 + 1)= 48
Maximum bandwidth = 48 * 1024 * 8 (B/bit) * 8 (125us/1ms) = 3.072Gbps
USB 3.0 is 8/10b coding, the theory maximum bandwidth is 5 * 0.8 = 4.096Gbps
So, your setting tells host that your have the capabilities to get the
maximum bandwidth,but you may can't get it due to the FIFO depth for endpoint
and system bus latency.

Peter

> 
> Data transfer with above setting is working now - tested with dummy data
> generator in the uvc-gadget app.
> 
> This concludes that kernel 5.4 is too old for DWC3 and UVC gadget driver
> in high bandwidth usage
> 
> 
> >>>> 4. I read through the procedures to capture debug info by debugfs. However,
> >>>> in my test with "streaming_maxburst" set to 10 or above, my system would 
> >>>> crash and I can't pick the log from that point. Any suggestion?
> >>>
> >>>have a look at ftrace_dump_on_oops.
> >>
> >> I will explore how to enable this
> >>
> >>>
> >>
> >> Btw, do you know which SoC platform can run the UVC gadget in max throughput.
> >> Raspberry Pi/TI Beaglebone/i.MX ???
> >
> >Raspberry Pi uses dwc2
> >Beaglebone uses musb
> >i.MX, I think some of them use dwc3 at least.
> >
> 
> Watson
> 
> -----Original Message-----
> From: Felipe Balbi <balbi@kernel.org> 
> Sent: Monday, May 17, 2021 1:32 PM
> To: Chow, Watson <Watson.Chow@Avnet.com>; linux-usb@vger.kernel.org
> Subject: RE: [BUG REPORT] usb: dwc3: Bug while setting the USB transfer bandwidth on UVC gadget driver
> 
> 
> Hi,
> 
> "Chow, Watson" <Watson.Chow@Avnet.com> writes:
> > Hi,
> >
> >>Hi,
> >>
> >>(please don't top-post :-)
> > I have tried my best to meet the format requirement
> 
> Thanks
> 
> >>"Chow, Watson" <Watson.Chow@Avnet.com> writes:
> >>> Balbi,
> >>>
> >>> Thanks for your quick reply.
> >>>
> >>> Some questions
> >>>
> >>> 1. You mentioned that the max bandwidth in isoc mode (USB3.0) should be 
> >>> around 4Gbps.  
> >>>
> >>> I have the below calcuation on bandwidth:
> >>> In USB3.0, 1 micro frame would take 125us and can transfer max 45000 bytes
> >>> So, in 1 sec, we will have 8000 micro frames
> >>>
> >>> Max bandwidth = 8000 x 4500 x 8 = 2.88Gbps
> >>>
> >>> Is my understanding correct?
> >>
> >>probably, It's been a while since I've dug through the spec, to be frank
> >>
> >>> 2. To achieve the max throughput, I need to configure the uvc gadget driver 
> >>> with below parameters. Am I right?
> >>>
> >>> # modprobe g_webcam streaming_maxpacket=3072 streaming_maxburst=15 
> >>> streaming_interval=1
> >>
> >>right, but there's an assumption here that the gadget will be able to
> >>feed data in a timely manner.
> >
> > How does the DWC3 driver or the gadget driver handle the case with intermittent
> > drop of the input video streaming?
> >
> > Any recover mechanism?
> 
> yeah, the missed ISOC is reported to the gadget driver and that has to
> queue new requests.
> 
> >>> 3. You suggest me to try on kernel v5.12 or the latest v5.13-rc. It looks not
> >>> easy in my side to upgrade the kernel version. It would affect those other 
> >>> device drivers I'm currently using. So, do you think there's any short cut 
> >>> to fix this problem under my current kernel version - v5.4?
> >>
> >>In that case, you need to ask for support from whoever forces you to
> >>stay with such an old kernel. I believe that would be Xilinx.
> >
> > I have a thought to back port those changes around the dwc3 and gadget driver
> > from the latest kernel version to my kernel (v5.4). Do you think this is 
> > feasible?
> 
> should be, but it's likely quite a bit of work:
> 
> $ git rev-list --count v5.4..linus/master -- drivers/usb/dwc3/
> 257
> 
> >>> 4. I read through the procedures to capture debug info by debugfs. However,
> >>> in my test with "streaming_maxburst" set to 10 or above, my system would 
> >>> crash and I can't pick the log from that point. Any suggestion?
> >>
> >>have a look at ftrace_dump_on_oops.
> >
> > I will explore how to enable this
> >
> >>
> >
> > Btw, do you know which SoC platform can run the UVC gadget in max throughput.
> > Raspberry Pi/TI Beaglebone/i.MX ???
> 
> Raspberry Pi uses dwc2
> Beaglebone uses musb
> i.MX, I think some of them use dwc3 at least.
> 
> -- 
> balbi

-- 

Thanks,
Peter Chen


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

* RE: [BUG REPORT] usb: dwc3: Bug while setting the USB transfer bandwidth on UVC gadget driver
  2021-06-07  6:11             ` Peter Chen
@ 2021-06-07 11:26               ` Chow, Watson
  0 siblings, 0 replies; 10+ messages in thread
From: Chow, Watson @ 2021-06-07 11:26 UTC (permalink / raw)
  To: Peter Chen; +Cc: Felipe Balbi, linux-usb

Peter,

>On 21-06-04 02:53:19, Chow, Watson wrote:
>> 
>> Upgraded the kernel version to 5.9, I can set the g_webcam module pararmeters
>> as follow (for max bandwidth):
>> 
>> streaming_maxpacket=3072
>> streaming_maxburst=15
>> streaming_interval=1
>
>According the spec:
>Maximum number of packet within one SoF:
>(bMaxBurst + 1) * (Mult + 1) = (15  + 1) * (2 + 1)= 48
>Maximum bandwidth = 48 * 1024 * 8 (B/bit) * 8 (125us/1ms) = 3.072Gbps
>USB 3.0 is 8/10b coding, the theory maximum bandwidth is 5 * 0.8 = 4.096Gbps
>So, your setting tells host that your have the capabilities to get the
>maximum bandwidth,but you may can't get it due to the FIFO depth for endpoint
>and system bus latency.

This aligns with my thought. Thx!

>
>Peter
>
>> 
>> Data transfer with above setting is working now - tested with dummy data
>> generator in the uvc-gadget app.
>> 
>> This concludes that kernel 5.4 is too old for DWC3 and UVC gadget driver
>> in high bandwidth usage
>> 
>> 
>> >>>> 4. I read through the procedures to capture debug info by debugfs. However,
>> >>>> in my test with "streaming_maxburst" set to 10 or above, my system would 
>> >>>> crash and I can't pick the log from that point. Any suggestion?
>> >>>
>> >>>have a look at ftrace_dump_on_oops.
>> >>
>> >> I will explore how to enable this
>> >>
>> >>>
>> >>
>> >> Btw, do you know which SoC platform can run the UVC gadget in max throughput.
>> >> Raspberry Pi/TI Beaglebone/i.MX ???
>> >
>> >Raspberry Pi uses dwc2
>> >Beaglebone uses musb
>> >i.MX, I think some of them use dwc3 at least.
>> >
>> 
>> Watson
>> 
>> -----Original Message-----
>> From: Felipe Balbi <balbi@kernel.org> 
>> Sent: Monday, May 17, 2021 1:32 PM
>> To: Chow, Watson <Watson.Chow@Avnet.com>; linux-usb@vger.kernel.org
>> Subject: RE: [BUG REPORT] usb: dwc3: Bug while setting the USB transfer bandwidth on UVC gadget driver
>> 
>> 
>> Hi,
>> 
>> "Chow, Watson" <Watson.Chow@Avnet.com> writes:
>> > Hi,
>> >
>> >>Hi,
>> >>
>> >>(please don't top-post :-)
>> > I have tried my best to meet the format requirement
>> 
>> Thanks
>> 
>> >>"Chow, Watson" <Watson.Chow@Avnet.com> writes:
>> >>> Balbi,
>> >>>
>> >>> Thanks for your quick reply.
>> >>>
>> >>> Some questions
>> >>>
>> >>> 1. You mentioned that the max bandwidth in isoc mode (USB3.0) should be 
>> >>> around 4Gbps.  
>> >>>
>> >>> I have the below calcuation on bandwidth:
>> >>> In USB3.0, 1 micro frame would take 125us and can transfer max 45000 bytes
>> >>> So, in 1 sec, we will have 8000 micro frames
>> >>>
>> >>> Max bandwidth = 8000 x 4500 x 8 = 2.88Gbps
>> >>>
>> >>> Is my understanding correct?
>> >>
>> >>probably, It's been a while since I've dug through the spec, to be frank
>> >>
>> >>> 2. To achieve the max throughput, I need to configure the uvc gadget driver 
>> >>> with below parameters. Am I right?
>> >>>
>> >>> # modprobe g_webcam streaming_maxpacket=3072 streaming_maxburst=15 
>> >>> streaming_interval=1
>> >>
>> >>right, but there's an assumption here that the gadget will be able to
>> >>feed data in a timely manner.
>> >
>> > How does the DWC3 driver or the gadget driver handle the case with intermittent
>> > drop of the input video streaming?
>> >
>> > Any recover mechanism?
>> 
>> yeah, the missed ISOC is reported to the gadget driver and that has to
>> queue new requests.
>> 
>> >>> 3. You suggest me to try on kernel v5.12 or the latest v5.13-rc. It looks not
>> >>> easy in my side to upgrade the kernel version. It would affect those other 
>> >>> device drivers I'm currently using. So, do you think there's any short cut 
>> >>> to fix this problem under my current kernel version - v5.4?
>> >>
>> >>In that case, you need to ask for support from whoever forces you to
>> >>stay with such an old kernel. I believe that would be Xilinx.
>> >
>> > I have a thought to back port those changes around the dwc3 and gadget driver
>> > from the latest kernel version to my kernel (v5.4). Do you think this is 
>> > feasible?
>> 
>> should be, but it's likely quite a bit of work:
>> 
>> $ git rev-list --count v5.4..linus/master -- drivers/usb/dwc3/
>> 257
>> 
>> >>> 4. I read through the procedures to capture debug info by debugfs. However,
>> >>> in my test with "streaming_maxburst" set to 10 or above, my system would 
>> >>> crash and I can't pick the log from that point. Any suggestion?
>> >>
>> >>have a look at ftrace_dump_on_oops.
>> >
>> > I will explore how to enable this
>> >
>> >>
>> >
>> > Btw, do you know which SoC platform can run the UVC gadget in max throughput.
>> > Raspberry Pi/TI Beaglebone/i.MX ???
>> 
>> Raspberry Pi uses dwc2
>> Beaglebone uses musb
>> i.MX, I think some of them use dwc3 at least.
>> 
>> -- 
>> balbi
>
>-- 
>
>Thanks,
>Peter Chen
>

Watson Chow


-----Original Message-----
From: Peter Chen <peter.chen@kernel.org> 
Sent: Monday, June 7, 2021 2:11 PM
To: Chow, Watson <Watson.Chow@Avnet.com>
Cc: Felipe Balbi <balbi@kernel.org>; linux-usb@vger.kernel.org
Subject: Re: [BUG REPORT] usb: dwc3: Bug while setting the USB transfer bandwidth on UVC gadget driver

On 21-06-04 02:53:19, Chow, Watson wrote:
> 
> Upgraded the kernel version to 5.9, I can set the g_webcam module pararmeters
> as follow (for max bandwidth):
> 
> streaming_maxpacket=3072
> streaming_maxburst=15
> streaming_interval=1

According the spec:
Maximum number of packet within one SoF:
(bMaxBurst + 1) * (Mult + 1) = (15  + 1) * (2 + 1)= 48
Maximum bandwidth = 48 * 1024 * 8 (B/bit) * 8 (125us/1ms) = 3.072Gbps
USB 3.0 is 8/10b coding, the theory maximum bandwidth is 5 * 0.8 = 4.096Gbps
So, your setting tells host that your have the capabilities to get the
maximum bandwidth,but you may can't get it due to the FIFO depth for endpoint
and system bus latency.

Peter

> 
> Data transfer with above setting is working now - tested with dummy data
> generator in the uvc-gadget app.
> 
> This concludes that kernel 5.4 is too old for DWC3 and UVC gadget driver
> in high bandwidth usage
> 
> 
> >>>> 4. I read through the procedures to capture debug info by debugfs. However,
> >>>> in my test with "streaming_maxburst" set to 10 or above, my system would 
> >>>> crash and I can't pick the log from that point. Any suggestion?
> >>>
> >>>have a look at ftrace_dump_on_oops.
> >>
> >> I will explore how to enable this
> >>
> >>>
> >>
> >> Btw, do you know which SoC platform can run the UVC gadget in max throughput.
> >> Raspberry Pi/TI Beaglebone/i.MX ???
> >
> >Raspberry Pi uses dwc2
> >Beaglebone uses musb
> >i.MX, I think some of them use dwc3 at least.
> >
> 
> Watson
> 
> -----Original Message-----
> From: Felipe Balbi <balbi@kernel.org> 
> Sent: Monday, May 17, 2021 1:32 PM
> To: Chow, Watson <Watson.Chow@Avnet.com>; linux-usb@vger.kernel.org
> Subject: RE: [BUG REPORT] usb: dwc3: Bug while setting the USB transfer bandwidth on UVC gadget driver
> 
> 
> Hi,
> 
> "Chow, Watson" <Watson.Chow@Avnet.com> writes:
> > Hi,
> >
> >>Hi,
> >>
> >>(please don't top-post :-)
> > I have tried my best to meet the format requirement
> 
> Thanks
> 
> >>"Chow, Watson" <Watson.Chow@Avnet.com> writes:
> >>> Balbi,
> >>>
> >>> Thanks for your quick reply.
> >>>
> >>> Some questions
> >>>
> >>> 1. You mentioned that the max bandwidth in isoc mode (USB3.0) should be 
> >>> around 4Gbps.  
> >>>
> >>> I have the below calcuation on bandwidth:
> >>> In USB3.0, 1 micro frame would take 125us and can transfer max 45000 bytes
> >>> So, in 1 sec, we will have 8000 micro frames
> >>>
> >>> Max bandwidth = 8000 x 4500 x 8 = 2.88Gbps
> >>>
> >>> Is my understanding correct?
> >>
> >>probably, It's been a while since I've dug through the spec, to be frank
> >>
> >>> 2. To achieve the max throughput, I need to configure the uvc gadget driver 
> >>> with below parameters. Am I right?
> >>>
> >>> # modprobe g_webcam streaming_maxpacket=3072 streaming_maxburst=15 
> >>> streaming_interval=1
> >>
> >>right, but there's an assumption here that the gadget will be able to
> >>feed data in a timely manner.
> >
> > How does the DWC3 driver or the gadget driver handle the case with intermittent
> > drop of the input video streaming?
> >
> > Any recover mechanism?
> 
> yeah, the missed ISOC is reported to the gadget driver and that has to
> queue new requests.
> 
> >>> 3. You suggest me to try on kernel v5.12 or the latest v5.13-rc. It looks not
> >>> easy in my side to upgrade the kernel version. It would affect those other 
> >>> device drivers I'm currently using. So, do you think there's any short cut 
> >>> to fix this problem under my current kernel version - v5.4?
> >>
> >>In that case, you need to ask for support from whoever forces you to
> >>stay with such an old kernel. I believe that would be Xilinx.
> >
> > I have a thought to back port those changes around the dwc3 and gadget driver
> > from the latest kernel version to my kernel (v5.4). Do you think this is 
> > feasible?
> 
> should be, but it's likely quite a bit of work:
> 
> $ git rev-list --count v5.4..linus/master -- drivers/usb/dwc3/
> 257
> 
> >>> 4. I read through the procedures to capture debug info by debugfs. However,
> >>> in my test with "streaming_maxburst" set to 10 or above, my system would 
> >>> crash and I can't pick the log from that point. Any suggestion?
> >>
> >>have a look at ftrace_dump_on_oops.
> >
> > I will explore how to enable this
> >
> >>
> >
> > Btw, do you know which SoC platform can run the UVC gadget in max throughput.
> > Raspberry Pi/TI Beaglebone/i.MX ???
> 
> Raspberry Pi uses dwc2
> Beaglebone uses musb
> i.MX, I think some of them use dwc3 at least.
> 
> -- 
> balbi

-- 

Thanks,
Peter Chen


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

end of thread, other threads:[~2021-06-07 11:26 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-14  3:20 [BUG REPORT] usb: dwc3: Bug while setting the USB transfer bandwidth on UVC gadget driver Chow, Watson
2021-05-14  7:16 ` Felipe Balbi
2021-05-14  8:59   ` Chow, Watson
2021-05-14 10:31     ` Felipe Balbi
2021-05-17  3:58       ` Chow, Watson
2021-05-17  5:32         ` Felipe Balbi
2021-06-04  2:53           ` Chow, Watson
2021-06-04  5:15             ` Felipe Balbi
2021-06-07  6:11             ` Peter Chen
2021-06-07 11:26               ` Chow, Watson

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.