CHAPTER 02
2. MDIO Clause 22와 Clause 45 transaction을 raw로 읽는다
MDC/MDIO는 packet data path가 아니라 관리 bus입니다. PHY address, register 또는 MMD address, turnaround, latch-low status와 indirect MMD access를 구분해야 raw 값과 Linux 출력이 맞습니다.
Clause 22
5-bit PHY address와 5-bit register address를 사용합니다. 기본 control/status와 ID, advertisement가 이 공간에 있습니다.
Clause 45
PRTAD와 DEVAD, 16-bit register address를 사용해 PMA/PMD, PCS, AN 같은 MMD를 접근합니다.
C22 MMD indirect
Clause 22 register 13/14를 address/data 단계로 사용합니다. function field를 틀리면 주소가 아니라 데이터가 바뀝니다.
Latch-low
BMSR link와 일부 fault bit는 과거의 low를 보존할 수 있어 두 번 읽어 현재값을 얻습니다. 한 번 읽은 0을 현재 link down으로 단정하지 않습니다.
레지스터와 관측값을 함께 읽는 표
| 항목 | 소유 블록 | 설정 또는 의미 | 정상 증거 | 실패 해석 |
|---|---|---|---|---|
| BMCR 0 | Clause 22 | reset, loopback, speed, AN enable/restart | write 후 self-clear/상태 변화가 규격대로 | reserved bit와 speed encoding 오해 주의 |
| BMSR 1 | Clause 22 | capability, link, AN complete | 두 번 읽은 현재 link가 PCS와 일치 | latch-low를 link flap으로 오판 |
| PHYID1/2 | Clause 22 | OUI/model/revision | driver match table와 일치 | board address 충돌 또는 잘못된 PHY |
| ANAR/ANLPAR 4/5 | Clause 22 AN | 10/100 ability와 pause | local/partner 공통 mode 존재 | advertisement가 비어 AN이 끝나지 않음 |
| MMD control/data 13/14 | C22 indirect | DEVAD, address/data function | 같은 MMD direct access와 동일값 | 주소 단계 생략 또는 post-increment 오용 |
| MMD 1/3/7 status | C45 PMA/PCS/AN | signal, block lock, AN 상태 | 해당 interface에서 구현된 bit만 사용 | 미구현 MMD의 0xffff를 유효값으로 해석 |
증상에서 첫 실패 경계를 찾는 표
| 관측 증상 | 직전 통과 증거 | 우선 확인 | 반증 시험 | 판정 |
|---|---|---|---|---|
| MDC는 보이나 응답 없음 | controller가 start/op/address를 전송 | turnaround와 PHY address | logic analyzer에서 Z0/10 패턴 확인 | PHY가 TA를 구동하지 않으면 address/reset 경계 |
| 값이 매번 바뀜 | frame 형식 정상 | MDC 주파수, hold, pull-up | MDC를 낮춰 반복 read | timing 개선 시 bus signal integrity |
| C22는 되고 C45는 실패 | PHY ID 정상 | PHY의 C45 지원 방식 | direct와 C22 indirect를 각각 시도 | 접근 프로토콜 선택 오류 |
| Linux 값과 raw 값 불일치 | 같은 PHY address | latch-low와 page/MMD selector | page를 고정하고 연속 두 번 read | side effect 또는 bank 상태 |
| 두 PHY가 같은 값으로 응답 | MDC/MDIO 배선 정상 | strap address 충돌 | 각 PHY reset을 따로 제어해 scan | 주소 충돌 |
| suspend 후 0xffff | resume 전에는 정상 | MDIO clock/power domain | runtime PM을 막고 재현 | 관리 bus 전원 복귀 경계 |
실제 검증 절차
| 순서 | 실행 | 남길 증거 | 판정 목적 |
|---|---|---|---|
| 1 | Clause 22 PHY ID read를 raw bitstream으로 저장합니다. | 주소와 turnaround가 표시된 decode | 기본 bus 검증 |
| 2 | BMSR를 연속 두 번 읽어 두 값을 모두 기록합니다. | latch-low와 current value | link 판정 규칙 확인 |
| 3 | 같은 C45 register를 direct와 indirect 방식으로 비교합니다. | 동일한 16-bit 값 | MMD sequence 검증 |
| 4 | MDC 주파수를 단계별로 바꾸며 error rate를 측정합니다. | 주파수별 read 실패율 | timing margin 확인 |
주의vendor page register와 MMD selector는 공유 상태입니다. 여러 thread나 firmware가 동시에 접근하면 다른 bank를 읽을 수 있으므로 bus lock과 access sequence를 확인합니다.
공개적으로 다시 확인할 수 있는 자료
공개되지 않은 vendor register나 integration별 offset을 추측해서 채우지 않았습니다. 아래 제조사 자료, architecture 문서와 Linux v6.18.37 원본에서 다시 확인할 수 있는 범위만 사용했습니다.
Linux PHY Abstraction Layer
PHY 장치, MDIO, link 상태와 PHY driver의 공개 Linux 계약
Linux phylink
PHY, fixed-link, in-band PCS와 MAC callback의 관계
Linux Ethernet controller binding
phy-mode, phy-handle, fixed-link와 managed 속성
Linux v6.18.37 phy_device.c
PHY 장치 생성, attach, start/stop과 상태 갱신
Linux v6.18.37 phylink.c
link resolve, MAC config, link up/down 실행 경로
TI DP83867IR/CR datasheet
strap, RGMII/SGMII, extended register, clock, interrupt와 진단 기능
TI DP83867 RGMII timing budget
0.25ns 단계 internal delay와 setup/hold margin 계산 및 측정 절차
Linux DP83867 driver
DT 속성, RGMIIDCTL, FIFO, impedance, interrupt와 downshift 초기화
Linux RTL8211F driver
paged register, RGMII TX/RX delay, ALDPS, CLKOUT, EEE, WOL과 interrupt 처리
Microchip LAN8841 product and datasheet
RGMII, IEEE 1588v2, cable diagnostics와 제조사 데이터시트
Linux LAN8841 driver in micrel.c
KSZ9131 공통 초기화, LAN8841 errata, PTP, interrupt와 cable test 경로