I might have discovered the reason by accident last week.
If a device requires interrupt transfers, plugging it into
a hub and then into EHCI will not work. Requests to transfer
interrupt URBs fail (unless the interrupt period is bigger
than a certain value, usually 4ms). The EHCI driver is unable
to calculate the bandwidth correctly and refusts the transfer.
This happens because USB 2.0 hubs already contain interrupt
endpoints, and so transfer are already started in slots.
And the current EHCI driver cannot provide sharing between
those transfers.
Unfortunately, prognosis is not good. The upstream author (David B)
says that more fine grained interrupt transfer scheduling is
possible, but not easy to do. I looked at the code and was unable
to understand it at all.
The workaround is to use a USB 1.1 hub and/or move devices with
interrupt endpoints to different buses/controllers.
Lesezeichen