为什么 dwc3 USB 控制器没有报告 xfercomplete 事件?或者小工具驱动程序错过了那个事件?

问题描述

使用usb的安卓手机连接PC,打开rndis,然后在手机和PC之间做iperf测试。经过几个小时的测试,rndis 的端点 ep1out 没有收到小工具驱动程序在发送传输命令后应该收到的 xfercomplete 事件。

我尝试将事件缓冲区大小从 256 扩大到 4096,还将 grxfifosize 从 delault 值放大,但问题仍然存在。

手机有8个cortex-A53核心,但我们留下1个小核心(cpu0)和1个大核心(cpu7)在线,并通过设置dwc irq的smp_affinity来设置dwc中断不路由到cpu0,因为吞吐量原因。所以 dwc3_interrupt 在 cpu7 上运行,dwc3_thread_interrupt 也在 cpu7 上运行。

很奇怪,如果我们将irq路由到cpu0,并且dwc3_thread_interrupt运行在不同的核心(cpu7)上,问题就消失了,不明白为什么。

代码是来自 Synopsys 的开源代码,您可以在 kernel/drivers/usb/dwc3/gadget.c 找到该代码

https://github.com/aosp-mirror/kernel_msm/blob/e8adfc30ff9282a728fd8b666b6418308164c415/drivers/usb/dwc3/gadget.c

提前致谢。

解决方法

终于找到答案了,eventbuffer中的事件数据延迟到了中断和EVENTCOUNT寄存器之后。问题发生时,事件缓冲区中的数据是上一轮的脏数据。通过多次阅读数据,得到了正确的。

所以,它不是错过了 xfercomplete,而是延迟了。不知道为什么会出现延迟,应该在传输完成后产生中断。