0

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

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

手机有 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 在不同的 core(cpu7) 运行,问题就消失了,不明白为什么。

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

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

提前致谢。

4

1 回答 1

0

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

因此,它并没有错过 xfercomplete,而是延迟了。不知道为什么会发生延迟,应该是在传输完成后产生中断。

于 2021-02-04T09:07:34.090 回答