Hello,
I ran into an issue with a Xilinx Zynq XC7Z010 system. The system acts as a
USB peripheral, using the UVC gadget driver.
When transferring high bandwidth data over USB in isochronous mode, complete
system freezes are occasionally noticed. The problem was traced to the
following code from _hardware_enqueue() in drivers/usb/chipidea/udc.c.
wmb();
if (hw_read(ci, OP_ENDPTPRIME, BIT(n)))
goto done;
do {
hw_write(ci, OP_USBCMD, USBCMD_ATDTW, USBCMD_ATDTW);
tmp_stat = hw_read(ci, OP_ENDPTSTAT, BIT(n));
} while (!hw_read(ci, OP_USBCMD, USBCMD_ATDTW));
hw_write(ci, OP_USBCMD, USBCMD_ATDTW, 0);
if (tmp_stat)
goto done;
The do ... while loop loops forever, and as the function is called under a
spin_lock_irqsave(), the system doesn't appreciate. Adding a maximum number of
iterations to exit the loop is easy (I'll try to submit a patch after finding
the root cause of the problem). That fixes the system hang, but USB transfers
are still broken.
I've checked the code and unfortunately it seems to match the procedure
documented in the datasheet :-/
The MTBF is several hours, but running 'memtester -M100'
(http://pyropus.ca/software/memtester/) in parallel to UVC video transfer over
USB brings the MTBF to a few minutes. The problem thus seems to be related to
memory bus pressure.
Has anyone run into this problem before ? Is this a known issue ? I don't mind
getting my hands dirty debugging, but as I'm not familiar with the chipidea
USB controller pointers to what I should check in priority would be
appreciated.
--
Regards,
Laurent Pinchart
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html