Basically I am trying to get a usb gadget to enumerate in SuperSpeed mode. The board for the gadget is an imx8mp-evk with a dwc3. I've tested connecting to a couple of different hosts, but I can't get the gadget to enumerate on either host at superspeed. Tracing through the code it seems to understand that it is intended to operate in SuperSpeed - calls to dwc3_gadget_set_speed() are trying to set SuperSpeed for example - however when the dwc3 interrupt route runs dwc3_gadget_conndone_interrupt() at that point it sets high-speed instead. That setting comes from the register at offset 0xc70c, but when I enable trace points for dwc3_readl() and dwc3_writel() I don't see any events that write to that, only reads. I assume that means that the hardware itself is negotiating high-speed mode, and I'm hoping you might be able to suggest reasons that might influence that to happen.
I attached a dump of the tracepoints and registers. I think from DCFG=0x00d8081c that it's setting max speed to superspeed but from DSTS=0x008edb68 that the actual speed is set to high speed, but I could be wrong there. As I say I suspect that this isn't a "software" (or at least kernel) decision - if that's borne out by the traces could you suggest possible causes for the hardware to choose to fall back to high speed?
Thanks very much Dan
Attachment:
dwc3_trace.tar.gz
Description: application/gzip