
Hi everyone,
I've seen this question posted a few times in the past with no answer. Since I was having the same problem, I thought I would share the solution I came up with. I'll try to provide a patch if I can get my mess cleaned up.
After some digging, I was able to see the EHCI HC getting a Master Abort over the PCI bus. It turns out that some.. all??.. PCI EHCI controllers have 64-bits for the buffer registers in the qTD structure. See Appendix B in the EHCI specification.
This is what I changed the qTD structure to.
/* Queue Element Transfer Descriptor (qTD). */ struct qTD { uint32_t qt_next; uint32_t qt_altnext; uint32_t qt_token; uint32_t qt_buffer[5]; uint32_t qt_buffer_hi[5]; uint32_t unused[3]; };
Adding the qt_buffer_hi array, realigning the buffers on 32-byte boundries, and filling qt_buffer_hi with zeros when qt_buffer is being filled fixes the problem.
Thanks, Dan Lykowski