May I have one more question? When you create a new bulk or interrupt endpoint "epopen" is called. The aux field of the Ep is set to point to an array of two Qio structures. One for input and one for output. Both of those in turn have a pointer to, and a one-to-one correspondence with, an endpoint descriptor (Ed). "newed" is called for each Qio to link the Qio's endpoint descriptor into the controller's chain.
I can't figure out why there are two Qio structs. The usb spec says that bulk/interrupt endpoints are unidirectional, so why wouldn't just a single one do? Thanks, rod