我们有一个定制的 Keystone 2 (66ak2ho6)电路板设计、其中很大一部分电路板(12个中的3个)以完全相同的方式挂起。 该电路板是对设计的极小的重新旋转、该设计在超过25块电路板上从未出现过此问题。
挂起是指 u-boot 尝试访问网络(例如 DHCP)。 使用仿真器、我们已经隔离了导致挂起的特定指令。 它是对 MDIO 控制寄存器的读取:
CTL = readl (&adap_mdio->control);
在 drivers/net/keyston_net.c:keystone2_eth_mdio_enable 中
当单步执行该指令(实际执行读取的汇编器指令)时、仿真器会报告它无法停止 CPU、因为流水线处于停滞状态。 需要进行系统复位才能重新获得控制。
我在有问题的指令前后还有一个调试打印、当我直接运行它(没有仿真器)时、我会看到指令前消息、而不是后消息(当电路板挂起时)。
我还使用仿真器读取该寄存器(而不是指令步进)、并从仿真器中获得读取错误。 我读取同一区域(以太网交换机子系统)中的其他寄存器、它们会导致相同的问题。
请注意、每次读取该寄存器时、电路板都不会挂起、每次电路板挂起时、电路板都会读取该寄存器。 此外、我对该寄存器进行了两次读取(包含中间的消息)、虽然它有时能够成功运行、但在第一次读取之后、它从未失败。 还请注意、该例程在读取该寄存器之前首先写入该寄存器、并且写入永远不会挂起。
有没有这种情况听起来很熟悉?
我有一个具体的问题:在读取这样一个寄存器时、网络协处理器系统中的问题是否会导致 ARM 内核以这种方式挂起?
谢谢、
兰斯