
phy_read
/include/linux/phy.h のメソッドは 32 ビットの値を返します。 phy ドライバーは、16 ビットの MII レジスタを読み取るためにこのメソッドを使用します。phy_read
メソッドは 32 ビットの値を返します。 16 ビット値を 32 ビット フィールドに格納すると、0xFFFF は 0x0000FFFF になります。16 ビット フィールドでは、これは -1 (エラー) と見なされ、そのように処理されますが、これを 32 ビットに格納すると、エラーではなく大きな正の値になります。 これにより、ドライバーの実行コースが変わり、リンク パラメーターが望ましくない方法で変更されます。メソッドによって返される値がint(4 バイト) であるが、管理ラインが削除された場合や何らかのエラーが発生した場合に 0xFFFF が含まれる場合
にこれを確認しました。 返される値は 4 バイトであるため、ゼロより小さいかどうかを確認するすべてのチェックが失敗します。 このようなシナリオでは、リンク速度と重複性は、それが可能でなくても、最大可能速度 (つまり 1000Mbps) に変更されます。 では、phy ドライバーはこのような状況をどのように処理するのでしょうか。このようなハードウェア エラーが発生した場合、link が構成をこのように変更するのは正常ですか? 読み取りサイズを int から u16 に変更すると問題が解決する可能性がありますが、なぜそうしないのですか? これらの問題はすべて Linux カーネル 3.8.13 で確認されています。最新の Linux ソースでも同様であるようですが、そのエラー状況をテストしていません。genphy_read_status
phy_read