-
David Brownell authored
This is an updated version of a patch submitted to me from Michal Sojka <sojkam1@fel.cvut.cz>, basically providing a much-needed rewrite of the highspeed ISO support. I updated the scheduling and made it a closer match to how OHCI works; and also tested it a bunch. So far it seems most of the requests for highspeed ISO support have been for realtime data collection -- custom apps, nothing a mainstream kernel would ship with. The USB Video class is now defined; highspeed video will also need these updates. Key changes: - Define an "iso_stream" head for iso endpoints. This acts enough like a QH that endpoint_disable() works. It holds the queue of ITDs, and the endpoint's current schedule state. And it's easy to find (spinlocked array access), no search. - Uses a temporary "itd_sched" while submitting each URB, with not-yet-linked ITDs and request-specific metadata. There's a per-stream cache of ITDs, so resubmitting ISO urbs (to achieve a "ring" of transfers) is typically cheap. - Scheduling for most URBs is almost a NOP: just a sanity check to make sure there's no need to reschedule, and then just link into the schedule at the current schedule slot. (The previous code was a gross hack that didn't even work reasonably with more than two URBs queued.) - Is a reasonable model to use with full speed ISO transfers. (They need additional TT scheduling hooks, most of which are already written but not merged.) - Handles several cases the previous code didn't, including high bandwidth transfers (loads up to 24 MByte/sec) - Has had more testing than the old code, including 20+ hour successful IN+OUT runs, more varied transfer intervals and maxpacket sizes. (Using net2280 and a gadgetfs driver.) So it's worth replacing the existing code with this; there aren't too many rough edges, and it's much more fixable than the previous version. p.s. Many thanks, Michal!
adffcfda