phy_read
/include/linux/phy.h의 메서드는 32비트 값을 반환합니다. phy 드라이버는 이 방법을 사용하여 16비트 MII 레지스터를 읽습니다. phy_read
이 메서드는 32비트 값을 반환합니다. 32비트 필드에 16비트 값을 저장하면 0xFFFF가 0x0000FFFF가 되고, 16비트 필드에서는 -1(오류)로 처리되어 그런 식으로 처리되지만 32비트에 저장하면 큰 양수 값이 됩니다. , 오류가 아닙니다. 이로 인해 드라이버 실행 과정이 변경되고 바람직하지 않은 방식으로 링크 매개변수가 변경될 수 있습니다.
이 메서드를 관찰했는데 genphy_read_status
, 여기서 phy_read
is 및 int(4바이트)는 값을 반환하지만 관리 라인이 삭제되거나 일부 오류가 발생할 경우 0xFFFF가 포함됩니다. 반환 값은 4바이트이므로 0보다 작은지 확인하는 모든 검사는 실패합니다. 이 경우 링크 속도와 이중성은 그렇게 할 수 없더라도 가능한 최대 속도(예: 1000Mbps)로 변경됩니다.
그렇다면 phy 드라이버는 이 상황을 어떻게 처리합니까? 이와 같은 하드웨어 오류가 발생하면 링크가 이런 방식으로 구성을 변경하는 것이 정상입니까? 읽기 크기를 int에서 u16으로 변경하면 문제가 해결될 수 있는데 왜 안 될까요?
이러한 모든 문제는 Linux 커널 3.8.13에서 관찰되었습니다. 오류 조건을 테스트하지는 않았지만 최신 Linux 소스도 비슷한 것 같습니다.
16비트 phy 레지스터의 MII 레지스터 읽기 오류를 처리하는 방법은 무엇입니까?
관련 정보
- 루트 사용자의 로그인 기록을 확인하세요.
- 명령 출력을 보유하는 bash 변수에 일부 콘텐츠를 추가합니다.
- NFS - no_root_squash 및 squash_all 옵션 결합
- NTFS 파티션에서 손상된 파일을 삭제하는 방법은 무엇입니까?
- debian에서 openjdk-7을 openjdk-8로 업그레이드하세요.
- 두 개의 HDD 이미지를 1개로 병합하는 데 문제가 있습니다.
- /etc/inittab respawn 이미 실행 중인 프로세스, Debian9
- sway/wayland에서 화면 공유를 구현하는 방법은 무엇입니까? 초보자를 위한
- PulseAudio 스트리밍이 무작위로 작동을 멈췄다가 다시 작동합니다.
- -bash: 미리보기 및 되돌아보기를 사용할 때 예기치 않은 표시 "(" 근처에 구문 오류가 있습니까?