Re: Chipidea USB controller hangs in peripheral mode under high memory bus pressure

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Am 05.05.2017 um 14:56 schrieb Thomas Entner / EE:
Hi, I am Thomas who contacted Laurent regarding this issue. We have some further observations:
Am 04.05.2017 um 08:45 schrieb Peter Chen:
On Wed, May 03, 2017 at 01:32:28PM +0300, Laurent Pinchart wrote:
There was no one reported this problem before, but from the description,
it seems an IC issue which is triggered at high loading memory bus,
controller may not get time to visit memory at limited time.
That's my guess too. I was expecting the USB controller's bus master interface to get stalled but eventually perform the access (or retry it, I'm not sure what kind of bus it sits on), but there might be a hardware bug that messes up the controller's state machine. I won't rule out the possibility of a software
issue yet, it might be possible to detect this condition and retry the
transfer.
I am not sure if it can be recovered, you can call ->fifo_flush, and
->ep_disable and ->ep_enable if it returns -ETIME, and re-submit this
request.

At Xilinx Zynq, its tx buffer is small, and less than 512 bytes
(84bc70f94d81, "usb: chipidea: add xilinx zynq platform data"), and your throughput may be > (512 * 3) bytes/SoF, you can't use non-stream mode by
reducing max packet size.
My throughput is actually 1*1024 bytes / SOF.

>From previous discussion, the tx fifo size is 341.33 bytes for xilinx
zynq, you can set max packet size as 341 and mult as 3, then you can
transfer 1023 bytes / SoF for non-stream mode, assumed the non-stream
mode can fix your problem.
I am not sure if this is totally correct: Xilinx UG585, page 1815, register HWTXBUF (TXADD), the TxBuffer size of the Xilinx controller is only 768 Bytes. However, I think you are correct that the issue is related to this topic:

When we reduce the max packet size to 512, we no longer get the full lock-ups, but UVC streaming still stops after some time (under have memory traffic).

When we reduce the max packet size to 256, things appear to work stable (but very slow).

When we use a max packet size of 720 we still see lock-ups (which is a bit of surprise to me, I would have expected something close to 768 to be the magical limit).
We have further debugged the issue now with a USB bus analyzer and made a (for us) surprising observation:

Both the lock-ups (packet size = 1024) and the stop of streaming without lock-up (packet size = 512) always happen at the end of a UVC frame (i.e. end of image). We can see the payload header (e.g. 02 83) with the EOF bit set, but that packet has a CRC error (end the end of the packet is not FF D9, as it should be for our MJPEG payload), I assume because the Tx-buffer did underrun.

My present understanding was that the DMA of the Chipidea IP was not able to fast enough refill the Tx buffer, but then I would expect this to happen also e.g. in the middle of the image and not only at the last transfer?

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux