我司soc平台采用的synopsys dwc3 的 usb控制器ip。 发现usb rndis在连续压力灌包测试场景下,rndis会异常断开,其余endpoint都正常,包括adb/usb串口。
具体的测试场景是两台android设备分别通过usb连接两台电脑 ,设备与设备之间通过无线mesh空口连接(也就是同时modem子系统也在跑),通过两台电脑的iperf互相灌包。
经过加log分析,是rndis的endpoint没有收到xfercomplete的event。并且连续收到了2或3条xfernotready的event。
经过长时间的debug,过程不做分析。只说结果:
usb控制器内部dma向eventbuffer搬数据时,存在延迟,也就是说未等数据传输结束,就向ap发了中断,ap收到中断后,也读到了eventcount,在读eventbuffer内的data时,读到的是脏的data,也就是ringbuffer上一轮的数据。
root cause可能是控制器本身做法的问题,也有可能是ddr总线仲裁冲突,因为该测试场景下,多个master都会同时访问ddr,尤其是modem子系统,这也证明了如果不加modem子系统,只是ap与电脑之间灌包,是没有任何问题的。
解决方法,我的做法是每读4个字节的event,都会清0这个地址,所以说只要你读到的是0,就说明控制器还没有把数据传输完成,需要加个while循环,delay几个微秒,循环再读,即可解决。