最近在 HI3093 板子上排查了一个比较典型的 U-Boot 网络问题,现象如下:
- 板子网口直连上位机时,灯是绿灯,U-Boot 下网络可以正常 ping 通。
- 板子接到百兆 Hub/交换设备时,灯变黄灯,U-Boot 下网络不通。
- 同样的硬件连接方式下,进入早期 Euler/Linux 系统后网络是正常的。
一开始容易怀疑是:
- IP 配置问题
- TFTP 服务器问题
- PHY 地址选错
- 交换机兼容性问题
但最后定位下来,根因在 U-Boot 网卡驱动本身,主要不是“完全不支持 Hub”,而是“百兆降速场景下链路建立和 MAC 跟随逻辑不完整”。
现象背后的判断是:
- 直连绿灯基本对应千兆链路。
- 接 Hub 黄灯基本对应百兆链路。
- Linux 下能通,说明硬件本身没有死,PHY 也不是完全不工作。
- U-Boot 下不通,说明问题更像是 U-Boot 没把 PHY 协商出来的链路状态正确同步到 MAC。
最终确认的问题点有两个:
- 当前板上实际使用的 PHY 需要走本地补充的处理分支,不能简单按原始 U-Boot 默认支持来理解。
- get_phy_link_mode() 在接 Hub 这种百兆场景下,之前没有充分等待 link up/autoneg 稳定,就继续往下配置 MAC;这样会导致 PHY 侧已经降到 100M,但 MAC 侧仍然按
错误模式工作,最终表现为 U-Boot 下发包失败。
修复思路是:
- 补齐对应 PHY 的处理分支。
- 在 get_phy_link_mode() 里先轮询等待 PHY 链路稳定,再读取 speed/duplex。
- 如果链路模式没拿到,就直接返回失败,不再继续启用 TX/RX。
- 避免“链路没起来但 MAC 已经盲目启动”的情况。
修复后的验证结果是:
- U-Boot 在相同 Hub 接法下已经可以正常建立链路。
- ping 192.168.17.159 已经成功。
- 从日志看,修复后链路状态会进入稳定态,不再停留在错误配置下发包失败。
问题经验总结:
- U-Boot 下“直连能通、过百兆 Hub 不通”,优先怀疑链路协商和 MAC/PHY 跟随逻辑,不要先怀疑 IP。
- Linux 能通而 U-Boot 不通,通常说明不是硬件坏,而是 U-Boot 驱动初始化不完整。
- PHY 从 1000M 降到 100M 时,如果 U-Boot 没有等待 autoneg 完成,或者没有把 speed/duplex 正确同步到 MAC,就很容易出现这种问题。
- 这类问题修复重点不是继续试网线,而是补齐:
- PHY link wait
- speed/duplex 同步
- link 失败时禁止继续启用 MAC
