I am currently implementing the Enhanced Host Controller Interface for USB 2.0 support. Everything is working fine in QEMU. I am even able to read and write sectors using SCSI commands. Trying to get the device descriptor on real hardware results in an NMI (Parity Check bit is set).

This is how I read the Device Descriptor after I reset the EHCI:
- Create new Queue Head for the USB devices control endpoint ( device address = 0, endpoint = 0, max packet size = 64 )
- Insert Queue Head
- create SETUP qTD with GetDeviceDescriptor request (data toggle = 0)
- create IN qTD with 18 bytes (data toggle = 1)
- create OUT qTD with 0 bytes (Handshake) (data toggle = 1)
- link SETUP -> IN -> OUT
- Wait until control Queue Head processed all previous qTDs
- Set SETUP qTD as next in Overlay Area
Right after the transaction completes I get the NMI. Did someone have a similar problem? I can't explain why this is happening... Thanks!
//EDIT
The NMI occurs right after the IN qTD is processed. Booting from USB works, so the device is working.