
phy_read
/include/linux/phy.h의 메소드는 32비트 값을 반환합니다. phy 드라이버는 16비트인 MII 레지스터를 읽는 데 이 방법을 사용합니다. phy_read
메소드는 32비트 값을 반환합니다. 32비트 필드에 16비트 값을 저장하면 0xFFFF가 0x0000FFFF가 되고, 16비트 필드에서는 -1(오류)로 간주되어 그런 식으로 처리되지만, 이를 32비트에 저장하면 큰 양수 값이 됩니다. 오류. 이로 인해 드라이버 실행 과정이 변경되고 원하지 않는 방식으로 링크 매개변수가 변경됩니다. is 및 int(4바이트) 에 의해 반환된 값이 메서드
에서 관찰되었지만 관리 라인이 제거되거나 일부 오류가 발생할 경우 0xFFFF가 포함됩니다. 반환된 값은 4바이트이므로 0보다 작은지 확인하는 모든 검사는 실패합니다. 이러한 시나리오에서는 링크 속도와 이중성이 가능하지 않더라도 가능한 최대 속도(즉, 1000Mbps)로 변경됩니다. 그렇다면 phy 드라이버는 이러한 상황을 어떻게 처리합니까? 이러한 하드웨어 오류가 발생하면 링크가 이러한 방식으로 구성을 변경하는 것이 정상입니까? 읽기 크기를 int에서 u16으로 변경하면 문제가 해결될 수 있는데 왜 그렇게 하지 않습니까? 이러한 모든 문제는 Linux 커널 3.8.13에서 관찰되었습니다. 최신 Linux 소스는 오류 상황을 테스트하지는 않았지만 비슷한 것 같습니다.genphy_read_status
phy_read