I agree with Ben; the best way to solve this is in the kernel. Even if
you did manage to make sure that modules were loaded in the right order
initially, that wouldn't help if somebody starts unloading and loading
modules by hand.
The underlying cause of the problem appears to be related to the fact
that it is impossible in principle to detect a disconnect while a
full/low-speed reset is in progress. However the hardware shouldn't
rely on this, and it should fail gracefully when an unexpected
disconnect does occur.
For example, what would the controller do if the user unplugged the USB
cable right in the middle of a reset?
Anyway, it certainly would be easy enough to make port resets mutually
exclusive with EHCI initialization. That would work on any platform,
PCI or not.
Alan Stern
-