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보다 작은지 확인하는 모든 검사는 실패합니다. 이 경우 링크 속도와 이중성은 그렇게 할 수 없더라도 가능한 최대 속도(예: 1000Mbps)로 변경됩니다.
그렇다면 phy 드라이버는 이 상황을 어떻게 처리합니까? 이와 같은 하드웨어 오류가 발생하면 링크가 이런 방식으로 구성을 변경하는 것이 정상입니까? 읽기 크기를 int에서 u16으로 변경하면 문제가 해결될 수 있는데 왜 안 될까요?
이러한 모든 문제는 Linux 커널 3.8.13에서 관찰되었습니다. 오류 조건을 테스트하지는 않았지만 최신 Linux 소스도 비슷한 것 같습니다.

관련 정보