CHAPTER 06
6. phylib와 phylink의 object lifetime과 callback 순서를 읽는다
MDIO bus 등록, PHY discovery, driver bind, attach, start, 상태 갱신, MAC config, link_up/down과 detach를 순서대로 봅니다. `netif_carrier_on()`이 호출됐다는 로그만으로 앞선 callback이 완료됐다고 가정하지 않습니다.
mii_bus
MDIO controller와 PHY address mask, read/write callback을 소유합니다. bus 등록 뒤 PHY device가 발견되고 driver model에 들어옵니다.
phy_device
PHY ID, supported/advertising, state, link tuple와 attached netdev 관계를 가집니다. PHY reset과 state machine lifetime이 netdev open/close와 연결됩니다.
phylink
PHY, fixed-link, in-band PCS를 하나의 MAC 계약으로 정규화합니다. resolve work와 state mutex 때문에 callback context를 확인해야 합니다.
MAC callbacks
mac_prepare, mac_config, mac_finish, mac_link_down/up의 역할을 분리합니다. register write가 어느 callback에서 이루어지는지 driver 원본으로 확인합니다.
레지스터와 관측값을 함께 읽는 표
| 항목 | 소유 블록 | 설정 또는 의미 | 정상 증거 | 실패 해석 |
|---|---|---|---|---|
| MDIO bus state | mii_bus/device core | registered, phy_mask, IRQ mode | 예상 address에 한 phy_device | 중복 address/scan mask |
| phydev state | phylib | state, link, speed, duplex, pause | raw PHY와 일치 | poll/IRQ event 유실 |
| phylink link_config | phylink | supported/advertising/interface | MAC capability와 교집합 | validate 결과로 mode 제거 |
| PCS state | phylink PCS | link/an_complete/inband tuple | PCS raw 값과 일치 | pcs_get_state 구현 오류 |
| MAC callback tuple | MAC driver | interface/speed/duplex/pause | PHY/PCS resolved result와 동일 | old mode 잔존 |
| carrier/queue | net_device | carrier와 TX queue state | link_up 완료 뒤 carrier | carrier와 datapath 준비 순서 역전 |
증상에서 첫 실패 경계를 찾는 표
| 관측 증상 | 직전 통과 증거 | 우선 확인 | 반증 시험 | 판정 |
|---|---|---|---|---|
| PHY driver가 안 붙음 | MDIO read 성공 | PHY ID와 match table | generic driver와 vendor driver 비교 | ID/match 경계 |
| state가 계속 UP/DOWN 반복 | raw link 안정 | PHY IRQ ack와 polling | IRQ를 polling으로 바꿔 비교 | event/interrupt 경계 |
| resolved speed가 제한됨 | PHY는 더 높은 mode 광고 | MAC validate capability | phylink supported mask dump | MAC/PCS capability 경계 |
| mac_config 호출되나 carrier OFF | config callback 완료 | PCS state와 link_up 조건 | resolve trace 순서 확인 | in-band/PHY mode 선택 |
| close/open 후 link 안 옴 | 첫 open 성공 | stop/detach/reset lifetime | callback과 runtime PM trace | teardown/restart 순서 |
| suspend 중 callback 접근 | runtime suspend 진입 | work cancellation과 lock | KASAN/lockdep 및 workqueue trace | object lifetime 오류 |
실제 검증 절차
| 순서 | 실행 | 남길 증거 | 판정 목적 |
|---|---|---|---|
| 1 | bus/PHY/phylink/netdev object 생성과 해제 시각을 trace합니다. | object pointer와 refcount/lifecycle | 수명 겹침 확인 |
| 2 | raw PHY tuple와 phylink resolve input을 같은 행에 기록합니다. | link/speed/duplex/pause | 상태 전달 검증 |
| 3 | 모든 MAC callback 인자와 register readback을 남깁니다. | 호출 순서와 적용 결과 | callback 책임 확인 |
| 4 | open/close, cable reconnect, suspend/resume를 반복합니다. | 매 cycle 동일한 lifetime | 잔존 work와 초기화 누락 검출 |
주의phylib의 state 이름과 phylink가 MAC에 넘기는 resolved state를 같은 상태로 부르지 않습니다. 서로 다른 object의 snapshot입니다.
공개적으로 다시 확인할 수 있는 자료
공개되지 않은 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 경로