4. PHY 节点基础:phy-handle、phy-device、max-speed、broken-turnaround 等属性
PHY(Physical Layer)节点是设备树中描述以太网物理层收发器的关键部分。MAC 节点通过特定的属性与 PHY 节点建立绑定关系,从而完成数据链路层与物理层的连接。本章将详细解析 PHY 节点中最核心的属性,包括绑定句柄、设备实例、速率限制以及兼容性标志。
4.1 phy-handle:MAC 到 PHY 的绑定句柄
phy-handle 是 MAC 节点中最重要的属性之一,它建立了一个从 MAC 控制器到 PHY 设备的引用关系。该属性的值是一个 phandle,指向设备树中某个 PHY 节点的标签。
phy-handle 是 MAC 节点与 PHY 节点之间的“桥梁”。没有这个属性,MAC 驱动无法找到对应的 PHY 设备,网络接口将无法正常工作。
典型用法示例:
/* MAC 节点 */
&macb0 {
status = "okay";
phy-mode = "rgmii-id";
phy-handle = &phy0; /* 引用下方 PHY 节点 */
phy0: ethernet-phy@0 {
reg = <0x0>;
/* ... 其他 PHY 属性 ... */
};
};
在上例中,phy-handle = &phy0; 将 MAC 节点与标签为 phy0 的 PHY 节点绑定。驱动在解析时,会通过 of_phy_find_device() 或 of_phy_connect() 等 API 获取该句柄对应的 PHY 设备。
4.2 phy-device:内核中的 PHY 设备实例
phy-device 并不是设备树中的直接属性,而是内核在解析 phy-handle 后,在驱动层创建的 phy_device 结构体实例。理解这一点对于区分设备树描述与内核运行时结构至关重要。
| 概念 | 层次 | 说明 |
|---|---|---|
| phy-handle | 设备树(静态描述) | MAC 节点中的属性,指向 PHY 节点的 phandle |
| PHY 节点 | 设备树(静态描述) | 描述 PHY 芯片的寄存器地址、速率、中断等硬件信息 |
| phy_device | 内核运行时(动态实例) | 内核根据 PHY 节点创建的设备实例,包含驱动绑定、状态机等 |
/sys/bus/mdio_bus/devices/ 目录查看系统注册的 phy_device 实例。每个实例对应设备树中的一个 PHY 节点。
4.3 max-speed:速率上限约束
max-speed 属性用于限制 PHY 能够协商的最大链路速率,单位是 Mbps。该属性通常放置在 PHY 节点内部,用于硬件设计上无法支持更高速度的场景。
常见取值:
10— 限制为 10BASE-T100— 限制为 100BASE-TX1000— 限制为 1000BASE-T2500— 限制为 2.5GBASE-T
示例:
phy1: ethernet-phy@1 {
reg = <0x1>;
max-speed = <100>; /* 强制限制为 100Mbps */
};
当该属性存在时,内核 PHY 驱动在自动协商完成后,会调用 phy_speed_down_core() 检查协商结果是否超过 max-speed,如果超过则降级到该上限值。
max-speed 只限制自动协商的结果上限,不会强制 PHY 工作在固定速率。如果需要固定速率,应使用 fixed-link 子节点。
4.4 broken-turnaround:兼容性标志
broken-turnaround 是一个布尔属性,用于处理某些不符合 IEEE 802.3 标准的 PHY 芯片。在标准的 MDIO 读操作中,PHY 在地址阶段后需要插入一个“转向时间”(Turnaround),但部分 PHY 芯片会跳过或缩短这个时间。
适用场景:
- 某些国产或低成本的 PHY 芯片
- 老旧的 PHY 芯片,其 MDIO 实现存在时序偏差
- FPGA 模拟的 PHY,其 MDIO 控制器实现不完整
设备树写法:
phy2: ethernet-phy@2 {
reg = <0x2>;
broken-turnaround; /* 告知内核该 PHY 存在转向时间缺陷 */
};
当该属性存在时,内核 MDIO 总线驱动会在读操作中调整时序,跳过标准的转向等待,从而正确读取 PHY 的寄存器值。
4.5 PHY 节点属性关系图
下面的 SVG 图展示了 MAC 节点、PHY 节点以及各属性之间的绑定与约束关系:
4.6 属性对比与使用场景
| 属性名 | 所属节点 | 类型 | 作用 | 是否必需 |
|---|---|---|---|---|
| phy-handle | MAC 节点 | phandle | 绑定 MAC 到 PHY | 是(非 fixed-link 时) |
| reg | PHY 节点 | u32 | PHY 在 MDIO 总线上的地址 | 是 |
| max-speed | PHY 节点 | u32 | 限制最大协商速率 | 否 |
| broken-turnaround | PHY 节点 | boolean | 兼容非标准 MDIO 时序 | 否 |
| interrupts | PHY 节点 | u32 | PHY 中断号 | 否 |
4.7 完整 PHY 节点示例
以下是一个包含多个属性的完整 PHY 节点示例,展示了实际项目中的典型写法:
/* 设备树中的 PHY 节点 */
&mdio0 {
status = "okay";
phy3: ethernet-phy@3 {
reg = <0x3>; /* MDIO 地址 3 */
max-speed = <1000>; /* 限制千兆 */
broken-turnaround; /* 兼容非标准时序 */
interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>;
status = "okay";
};
};
/* MAC 节点引用 PHY */
&macb1 {
status = "okay";
phy-mode = "rgmii-id";
phy-handle = &phy3;
};
reg 属性是否与硬件原理图一致。其次,对于非标准 PHY,尝试添加 broken-turnaround 属性。最后,使用 max-speed 排除速率协商异常。
4.8 常见问题与避坑指南
- phy-handle 拼写错误: 内核严格区分大小写,
phy-handle不能写成phy_handle或phyhandle。 - reg 地址冲突: 同一 MDIO 总线上不能有两个 PHY 节点使用相同的
reg值,否则后注册的 PHY 会失败。 - max-speed 与 fixed-link 冲突: 如果使用
fixed-link子节点,max-speed属性将被忽略,因为固定链接不经过自动协商。 - broken-turnaround 滥用: 仅当确认 PHY 存在转向时间缺陷时才添加该属性,否则可能导致正常 PHY 的 MDIO 通信异常。