3093 U-Boot 阶段网口直连可通、接百兆 Hub 不通的问题定位与修复

最近在 HI3093 板子上排查了一个比较典型的 U-Boot 网络问题,现象如下:

  1. 板子网口直连上位机时,灯是绿灯,U-Boot 下网络可以正常 ping 通。
  2. 板子接到百兆 Hub/交换设备时,灯变黄灯,U-Boot 下网络不通。
  3. 同样的硬件连接方式下,进入早期 Euler/Linux 系统后网络是正常的。

一开始容易怀疑是:

  • IP 配置问题
  • TFTP 服务器问题
  • PHY 地址选错
  • 交换机兼容性问题

但最后定位下来,根因在 U-Boot 网卡驱动本身,主要不是“完全不支持 Hub”,而是“百兆降速场景下链路建立和 MAC 跟随逻辑不完整”。

现象背后的判断是:

  1. 直连绿灯基本对应千兆链路。
  2. 接 Hub 黄灯基本对应百兆链路。
  3. Linux 下能通,说明硬件本身没有死,PHY 也不是完全不工作。
  4. U-Boot 下不通,说明问题更像是 U-Boot 没把 PHY 协商出来的链路状态正确同步到 MAC。

最终确认的问题点有两个:

  1. 当前板上实际使用的 PHY 需要走本地补充的处理分支,不能简单按原始 U-Boot 默认支持来理解。
  2. get_phy_link_mode() 在接 Hub 这种百兆场景下,之前没有充分等待 link up/autoneg 稳定,就继续往下配置 MAC;这样会导致 PHY 侧已经降到 100M,但 MAC 侧仍然按
    错误模式工作,最终表现为 U-Boot 下发包失败。

修复思路是:

  1. 补齐对应 PHY 的处理分支。
  2. 在 get_phy_link_mode() 里先轮询等待 PHY 链路稳定,再读取 speed/duplex。
  3. 如果链路模式没拿到,就直接返回失败,不再继续启用 TX/RX。
  4. 避免“链路没起来但 MAC 已经盲目启动”的情况。

修复后的验证结果是:

  1. U-Boot 在相同 Hub 接法下已经可以正常建立链路。
  2. ping 192.168.17.159 已经成功。
  3. 从日志看,修复后链路状态会进入稳定态,不再停留在错误配置下发包失败。

问题经验总结:

  1. U-Boot 下“直连能通、过百兆 Hub 不通”,优先怀疑链路协商和 MAC/PHY 跟随逻辑,不要先怀疑 IP。
  2. Linux 能通而 U-Boot 不通,通常说明不是硬件坏,而是 U-Boot 驱动初始化不完整。
  3. PHY 从 1000M 降到 100M 时,如果 U-Boot 没有等待 autoneg 完成,或者没有把 speed/duplex 正确同步到 MAC,就很容易出现这种问题。
  4. 这类问题修复重点不是继续试网线,而是补齐:
    • PHY link wait
    • speed/duplex 同步
    • link 失败时禁止继续启用 MAC