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 레지스터 읽기 오류를 처리하는 방법은 무엇입니까?
관련 정보
- 파일 소유자 찾기
- 사운드 카드의 내용을 녹음하여 WAV 파일을 재구성할 수 있습니까? [폐쇄]
- 내 복사 명령에 어떤 문제가 있나요?
- 쉘 스크립트에 명령줄 인수로 '*' 전달
- loadlocale.c _nl_intern_locale_data 어설션 오류
- mupdf-gl을 고정 해상도의 기본 응용 프로그램으로 설정하는 방법
- NGINX가 /home/user의 소켓에 연결할 수 있도록 하려면 어떤 태그 조합이 사용됩니까?
- 쉘 전환의 별칭으로 새로운 .bashrc를 얻는 방법은 무엇입니까?
- Bash에서 기호가 포함된 줄이나 빈 줄을 제거하세요.
- 개행을 기준으로 파일을 분할하고 분할 후 파일의 두 번째 필드만 가져오는 방법