器件型号: AM2634
我们在 AM263x 芯片上当前实现的 3P CPSW 偶尔会在 CPSW 上看到故障、在这种情况下我们能够看到从主机端口 0 发往其他 2 个端口的流量、但在其中一个端口上发送多播数据包溢出后、它将传入的 RX 流量中断到 CPSW、并且只能通过复位来修复。
通过探究原因、我们可以看到、长度为 32 的 CPDMA 缓冲区在此期间达到饱和、导致 HDP 指针在 0/nullptr 处被锁存、并停止触发中断、使系统能够处理新数据包。 我已经确定了一些可能导致系统锁存在这种状态的竞态条件:
- HDP 到达队列的末尾、并在 Nullptr 处停驻。 在 enet_cpdma.c 中、如果在我们完成数据包处理后已停止 HDP 指针、我们会尝试解除停止 HDP 指针。 如果 CPDMA 完成处理所有新数据包或没有要处理的新数据包、我们可以进入竞态条件、在该条件下、检查是否已成功解除停止、可能会导致代码认为它没有解除停止、从而导致状态机停止。 本节将禁用中断、因此不会生成新的中断来尝试再次解除停止 HDP 指针。
- 当 CPDMA 处理完数据包后、它将检查是否设置了链接列表 pNext 中的下一项。 CPDMA 检查它的时间和执行它的时间可能与微处理器将该指针更改为新的空闲条目的时间不同。 这将导致 CPDMA 认为它已停止、因为没有要处理的其他条目、而链接列表可能包含一个或多个仍可处理的条目。
是否有 CPDMA 驱动程序级别的解决方案可避免达到 CPDMA 将停止的这些条件?