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バイトなので、0より小さいことを確認するすべてのチェックは失敗します。この場合、リンク速度と二重性は、そうすることができなくても可能な最大速度(たとえば、1000 Mbps)に変わります。
それでは、phyドライバはこの状況をどのように処理しますか?このようなハードウェア障害が発生した場合、リンクがこのように構成を変更するのは正常ですか?読み取りサイズをintからu16に変更すると、問題が解決する可能性がありますが、なぜできないのですか?
これらすべての問題は、Linuxカーネル3.8.13で観察されました。エラー条件をテストしていませんが、最新のLinuxソースも同様のようです。

ベストアンサー1

おすすめ記事