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