如何處理 16 位元 phy 暫存器的 MII 暫存器讀取錯誤?

如何處理 16 位元 phy 暫存器的 MII 暫存器讀取錯誤?

phy_read/include/linux/phy.h 中的方法傳回一個 32 位元值。 phy 驅動程式使用此方法讀取 16 位元 MII 暫存器。phy_read方法傳回一個 32 位元值。在32 位元欄位上儲存16 位元值會使0xFFFF 變為0x0000FFFF,在16 位元欄位中會被視為-1(錯誤)並以這種方式處理,但將其儲存在32 位元中會使其成為一個大的正值,而不是一個錯誤。這會改變驅動程式的執行過程,並以不想要的方式更改連結參數。
我觀察到這個genphy_read_status方法,其中phy_readis 和 int(4 位元組) 傳回的值,但它包含 0xFFFF,以防管理行被刪除或發生某些錯誤。由於傳回值是 4 個位元組,因此所有檢查它是否小於零的檢查都會失敗。在這種情況下,鏈路速度和口是心非會更改為最大可能速度(即 1000Mbps),即使它無法做到這一點。
那麼phy driver如何處理這種情況呢?如果發生此類硬體錯誤,連結以這種方式更改其配置是否正常?將讀取大小從 int 更改為 u16 可能會解決問題,那麼為什麼不這樣做呢?
所有這些問題都在 Linux 核心 3.8.13 中觀察到。最新的 linux 來源似乎是相似的,儘管我沒有測試錯誤情況。

相關內容