No I am enumerating high speed devices like hard drives etc, I can read and write to them
It's actually slower devices that are technically harder because you have to install a relay split on the nearest parent port that supports high speed. So when you first start out you can usually enumerate high speed devices and find you can't enumerate low speed devices. That is a very common problem with new implementations.
I have been going thru it, something strange with the fake roothub message implementation. Just changing it to my newer implementation as we speak. Specifically it is HcdProcessRootHubMessage that seems to be causing the problem on that code. It's supposed to do a power and reset on the port with the new device and it seems clunky.
The newer implementation is cleaner in that it is broken into two calls a standard request and a class request in
dwc_root_hub_standard_request(struct usb_xfer_request *req)
dwc_root_hub_class_request(struct usb_xfer_request *req)
You can still see my links etc to beyond logic in the old code, I had not refactored it as I was still working out how it worked. Those two equal the original code if you look just different names on the calls .. that is the Fake root hub(tm) message handlers anyhow