06 MDIO 与 phylink

06 MDIO 与 phylink

源码:stmmac_mdio.cstmmac_main.c(phylink 回调)
依赖:Linux phylinkphylibpcs-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
2
3
4
stmmac_dvr_probe()
→ stmmac_phy_setup()
→ stmmac_mdio_register()
→ mdiobus_alloc + of_mdiobus_register

priv->miistruct 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.1 初始化

stmmac_phy_setup()

  1. 填充 phylink_configmac_capabilities 等)
  2. phylink_create() / phylink_of_phy_connect() 或 PCS 模式
  3. 注册 mac ops:
1
2
3
4
5
static const struct phylink_mac_ops stmmac_phylink_mac_ops = {
.mac_config = stmmac_mac_config,
.mac_link_down = stmmac_mac_link_down,
.mac_link_up = stmmac_mac_link_up,
};

3.2 链路 Up 流程

stmmac_mac_link_up()

  1. 记录 priv->speedduplex
  2. 调用 plat->fix_mac_speed()RK3588 配置 RGMII 时钟
  3. stmmac_mac_flow_ctrl() 配置 PAUSE
  4. stmmac_mac_set(enable) 使能 MAC
  5. netif_carrier_on()

3.3 链路 Down 流程

stmmac_mac_link_down()

  • 停 DMA / 关 MAC
  • netif_carrier_off()
  • EEE、FPE 状态清理

3.4 接口模式

stmmac_mac_config() 处理:

  • MIIRMIIRGMIISGMII1000BASE-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
2
3
4
5
# 查看 PHY 状态
ethtool eth0

# MDIO 调试(需 CONFIG_PHYLIB)
bus=platform-xxx mdio dev

7. 相关文档

文章互动

阅读 --

留言

0 条留言

正在加载留言…