For those who are interested and still using SA1111-based architecture (e.g. ziti): the ohci-recommended way of handling the WDH interrupt - reading the done_head pointer and testing its LSB without reading the interrupt status register must not be used. It appears that the SA1111 host controller never sets that bit and concurrent interrupts are missed. In general, this does not pose a big problem since subsequent WDH interrupts complete the maintenance tasks (unlinks, etc.). However, in the following situation, when a slow (or broken), single USB device is connected (e.g. the LogiTech Orbit camera) this can (and regularly does) lead to indefinite uninterruptible sleep in the usb_start_wait_urb. Here is what happens: Since the ohci_irq thinks that it is getting WDH interrupts only, it never reads the status register and therefore never clears the status register's SF bit. In other words the SF interrupts are not generated. That does not matter that much until there is no more data to transfer which yields the maintenance tasks to depend solely on the SF interrupt. This apparently happens when an inbound control message from the camera driver times out and the timer handler schedules the urb for unlinking. Since there are no other WDH interrupts and SF interrupts are not generated the urb's complete function will never get called.

The fix is obvious. Either always read the interrupt status register or always clear the SF bit in it.

--jf



-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to