the host needs to allow the device to initiate a U1/U2-transition by setting U1/U2_ENABLE feature in the device using the standard-request SET_FEATURE. You can request the current values of the U1/U2_ENABLE by using the standard-request GET_STATUS. Have a look in the USB3.0 specification chapter 9.4 for more details on the standard-requests and it's definitions.
I've done some more work/research on this today and I'm still running into issues. Robert, you were correct that the function wasn't being called using the explicit SET_FEATURE call for U2_ENABLE. I had taken one of the SDK examples and modified it for my purposes, but I'm not sure that the U2 transition actually works in the example code (I couldn't get it to work as I thought it should). I found this in the API guide:
void CyU3PUsbRegisterSetupCallback ( CyU3PUSBSetupCb_t callback, CyBool_t fastEnum )
Register a USB setup request handler.
This function is used to register a USB setup request handler with the USB driver. The fastEnum parameter specifies whether this setup handler should be used only for unknown setup requests or for all USB setup requests.
The example code had fastEnum set to CyTrue, which is why I couldn't initially run the code using a SET_FEATURE request. So, I took the example cyfxlowpowertest.c and added the 'CyU3PSetPowerLink' code there. I'm still seeing the same issue with the link state never changing from U0, even though, using debug print statements, I can see it filtering through the setup callback as expected.
Is there another example in the SDK that I'm missing that reproducibly forces the various states? On the host side, I'm running Python on top of Libusb to set in the various commands, so attempt to set the link to U2, I do the following:
Is that right, or am I missing something? Like I stated before, I can see via debug messages that everything is successful until the CyU3PSetPowerLink function call.