phy_read
/include/linux/phy.h 中的方法返回一个 32 位值。 phy 驱动程序使用此方法读取 16 位 MII 寄存器。phy_read
方法返回一个 32 位值。在 32 位字段上存储 16 位值会使 0xFFFF 变为 0x0000FFFF,在 16 位字段中会被视为 -1(错误)并以这种方式处理,但将其存储在 32 位中会使其成为一个大的正值,而不是一个错误。这会改变驱动程序执行的过程,并以不期望的方式创建更改链接参数。
我观察到这个genphy_read_status
方法,其中phy_read
is 和 int(4 字节) 返回的值,但它包含 0xFFFF,以防管理行被删除或发生某些错误。由于返回值是 4 个字节,所有检查它是否小于零的检查都会失败。在这种情况下,链路速度和口是心非会更改为最大可能速度(即 1000Mbps),即使它无法做到这一点。
那么phy driver如何处理这种情况呢?如果发生此类硬件错误,链路以这种方式更改其配置是否正常?将读取大小从 int 更改为 u16 可能会解决问题,那么为什么不这样做呢?
所有这些问题都在 Linux 内核 3.8.13 中观察到。最新的 linux 源似乎是相似的,尽管我没有测试错误情况。