My suggestions to solve your issue,
Try printing the setupcb requests and decode the request before the failure. It may help you to see if the corresponding type where your failure occurs.
Also you might not use the CyU3PDmaChannelSetSuspend() if you are not playing with 2.0.
Thank you for the reply. Of course I do decode the request before sending reply with CyU3PUsbSendEP0Data() :-)
These are CY_U3P_USB_VENDOR_RQT. The problem happens with various requests, the only common thing is using CyU3PUsbSendEP0Data() while DMA is active on another thread (different DMA channel).
I did not see any mention about CyU3PDmaChannelSetSuspend() being limited to USB-2.0 pipes anywhere in docs/sources. Is it "official"?
It is specified in one of the cypress examples as "When operating at USB 2.0 speeds, there is a possibility that the bulk transfers create errors during control transfers. Ensure that the bulk channel is suspended for the duration of the control request to avoid this possibility."
I would suggest you using USB bus analyzers or protocol analyzer to have a clue.