1 Reply Latest reply on Jun 6, 2016 2:36 PM by madhul_36

    Zero-Length Packet Lost when using SS HUB

      Hi all,


      I use FX3 connected to FPGA throw GPIF2 interface in synchronous slave mode.


      For my application I use 3 endpoints :


      > 0x01 : Burst Configuration Writes


      > 0x81 : Burst Configuration Reads (or test)


      > 0x82 : Burst Streaming


      Every reads on 0x81 is preceded by a write operation on endpoint 0x01 and its length is known in advance.


      Reads on endpoint 0x82 don't have predictable length so FPGA generate a ZERO-LENGTH every 20 ms in order to complete the current transaction and wake up the host.


      Here is my code on host side to start the transaction :


      size = 4096 * 256;
      m_stream_endptstream.xferbuff = (PUCHAR)buff;
      m_stream_endptstream.xfersize = (LONG)size;
      m_stream_endptstream.xferlast = 0;
      m_endptstream_in->TimeOut = 100;
      m_stream_endptstream.context = m_endptstream_in->BeginDataXfer(m_stream_endptstream.xferbuff, m_stream_endptstream.xfersize, &m_stream_endptstream.ov);


      And to finish :


      m_endptstream_in->WaitForXfer(&m_stream_endptstream.ov, 100);
      if(!m_endptstream_in->FinishDataXfer(m_stream_endptstream.xferbuff, m_stream_endptstream.xferlast, &m_stream_endptstream.ov, m_stream_endptstream.context))


      I need to use asynchronous transfer in order to process previous data blocks during read.




      When connection between host and device is composed by a single USB3.0 cable (or even with an front panel extender), WaitForXfer is woken up by Zero-Length packet (or when XFerSize is reached) everytime. (see USBlyzer_SingleCable_NoError)


      When I add a HUB (Hub controller is GL3520 from Genesys) between Host and Device WaitForXFer does often fail to wakeup on ZeroLength Packet (see USBlyzer_failure_HUB). When this failure occurs, endpoint is blocked, does not react on XFerSize reached and can only be recovered by a Reset().


      In that HUB configuration, if I decide to add an extra thread to generate periodic transactions on Endpoint 0x01 and 0x81, previous failure occurrence is significantly reduced from 1 over 3 without extra activity, to 1 over more than 1000 with extra activity. (see USBlyzer_HUB_ExtraTransaction)




      Does anyone ever meet this issue ?


      Is there any explanation to that ?




      Thanks for any returns,