This is my solution using a 2kHz polling for PSoC 3. I know this is not what you want.
I think it is better to have a FIFO to get and put one packet at once to reduce the number of packets.
I have another repository for PSoC 5LP to investigate the three Endpoint Buffer Management methods which is specified in the USBFS component.
As the result of the investigation, 64 Byte packet is too small to be handled with DMA.
Thank you for your response and your suggestion.
I actually found the solution I needed. My code had an "oops". I had a single character error in the definition of one of my callbacks.
The callback that does work is USBUART_EP_3_ISR_ExitCallback(). Once I fixed the #define of USBUART_EP_3_ISR_EXIT_CALLBACK, I now only get a single ISR call for each new data that comes from the host. I can now turn off the SOF_ISR and I'm up an running without the need of the 1ms SOF heartbeat.
Note: USBUART_EP_2_ISR_ExitCallback() is for outputing data to the host.
I hope this help someone with a similar problem.