06 MDIO 与 phylink
源码:
stmmac_mdio.c、stmmac_main.c(phylink 回调)
依赖:Linuxphylink、phylib、pcs-xpcs
1. 模块职责
| 组件 | 文件 | 职责 |
|---|---|---|
| MDIO 总线 | stmmac_mdio.c |
通过 MAC 内置 MII 访问 PHY 寄存器 |
| phylink | stmmac_main.c |
链路状态机、接口模式、MAC 侧配置 |
| PCS/XPCS | stmmac_mdio.c + mac ops |
SGMII/QSGMII 等 SerDes 模式 |
2. MDIO 实现
2.1 注册流程
1 | stmmac_dvr_probe() |
priv->mii 为 struct mii_bus *,挂接在 netdev 上供 phylink/PHY 驱动使用。
2.2 读写路径
GMAC4 MDIO 寄存器格式(stmmac_mdio.c):
MII_GMAC4_GOC_SHIFT:读/写命令MII_GMAC4_REG_ADDR_SHIFT:PHY 地址与寄存器号MII_GMAC4_C45E:Clause 45 扩展
XGMAC 使用独立 MII_XGMAC_* 位域,支持 C22/C45 端口映射。
2.3 主要 API
| 函数 | 说明 |
|---|---|
stmmac_mdio_register() |
注册 MDIO 总线 |
stmmac_mdio_unregister() |
注销 |
stmmac_mdio_idle() |
等待 MII busy 清除 |
stmmac_mdio_reset() |
总线复位 |
stmmac_xpcs_setup() |
配置 Synopsys XPCS |
2.4 时钟分频
stmmac_clk_csr_set() 根据 MAC 时钟设置 MDIO CSR 分频(priv->clk_csr),保证 MDC 频率符合 IEEE 802.3(≤ 2.5 MHz)。
3. phylink 集成
3.1 初始化
stmmac_phy_setup():
- 填充
phylink_config(mac_capabilities等) phylink_create()/phylink_of_phy_connect()或 PCS 模式- 注册 mac ops:
1 | static const struct phylink_mac_ops stmmac_phylink_mac_ops = { |
3.2 链路 Up 流程
stmmac_mac_link_up():
- 记录
priv->speed、duplex - 调用
plat->fix_mac_speed()(RK3588 配置 RGMII 时钟) stmmac_mac_flow_ctrl()配置 PAUSEstmmac_mac_set(enable)使能 MACnetif_carrier_on()
3.3 链路 Down 流程
stmmac_mac_link_down():
- 停 DMA / 关 MAC
netif_carrier_off()- EEE、FPE 状态清理
3.4 接口模式
stmmac_mac_config() 处理:
MII、RMII、RGMII、SGMII、1000BASE-X等- PCS 模式:
stmmac_check_pcs_mode()、pcs_ctrl_ane()
4. PHY 与内置 PHY
| 场景 | 处理 |
|---|---|
| 外接 PHY | DT phy-handle → phylink 连接 |
| 固定链路 | fixed-link 节点 |
| 内置 PHY | integrated_phy_power() 回调上下电 |
| SerDes | XPCS + PCS ops,RK3588 dwmac-rk.c |
5. 与 Platform Glue 协作
Rockchip rk_fix_speed() 在 link up 时:
- 调用
rk3588_ops->set_rgmii_speed()或 RMII 等 - 写 GRF 寄存器切换 TX/RX clock
详见 11-dwmac-rockchip-RK3588.md。
6. 调试
1 | # 查看 PHY 状态 |
正在加载留言…