Skip to content

DesignWare 网卡常见问题分析 ​

本文汇总 DW 网卡在 BSP 适配、设备树配置、PHY 调试和性能压测过程中常见的问题与排查方向,便于快速定位网卡创建失败、通信异常、协商异常和性能不达标等问题。

创建网卡失败 ​

共用 MDIO 总线场景 ​

如果多个网卡共用同一条 MDIO 总线,重点检查:

  1. 设备树配置是否正确,确认 phy-handle、mdio 子节点和 PHY 地址配置一致。
  2. 网卡创建顺序是否正确:应先创建提供 MDIO 总线的网卡,再创建复用该总线的网卡。
  3. 如果打印顺序相反,可调整设备树中 gmac0、gmac1 节点定义顺序。
  4. DW 网卡默认使用零拷贝,BSP 中 DMA 预留内存建议不少于 64M。

相关配置可参考:共用 MDIO 设备树配置。

非共用 MDIO 总线场景 ​

如果每个网卡独立使用自己的 MDIO 总线,重点检查:

  1. 设备树中是否配置了 PHY 地址,并确认 PHY 地址与硬件 strap 地址一致。
  2. PHY 的 GPIO reset 引脚是否配置正确,包括 GPIO 编号、有效电平和复位延时。
  3. PHY 芯片上的 MDC 时钟是否处于芯片允许范围内。
  4. BSP 中 DMA 预留内存是否满足零拷贝需求,建议不少于 64M。
  5. 对于 DW PCI 网卡,插入 PCI 设备后 BAR 基地址可能变化,可启动后通过 pcis 命令查看新的 PCI 地址,并同步更新设备树配置。

网卡无法正常通信 ​

网卡创建成功但无法收发数据时,可按以下顺序排查:

  1. 中断号、时钟配置是否正确。
  2. 设备树中的 phy-mode 是否与硬件连接方式一致,例如 rgmii、rgmii-id、rgmii-rxid、rgmii-txid。
  3. PHY 驱动中的 RX/TX delay 是否处于合适范围。
  4. DMA 内存是否与物理地址一一映射。
  5. BSP 或内核中的 cache 刷新、失效逻辑是否正常。

自协商时间较长 ​

ifdown 到 ifup 过程中会将 PHY 重新 down/up 并触发自协商。当前实现与 Linux 行为保持一致,而 IEEE 协议中默认的 link down 和 link up 时间本身较长。

如果业务侧需要更快检测 down 状态,可通过读取 PHY 标准寄存器辅助判断:

  • 读取 PHY 1 号寄存器第 3 位;
  • 读取 PHY 10 号寄存器第 13 位;
  • 结合两者判断当前链路状态。

切换百兆后无法通信 ​

网卡从千兆切换到百兆后无法正常通信时,重点确认:

  1. 不要在强制千兆配置下尝试与百兆链路通信。
  2. PHY 自协商打印的速率是否正确。
  3. PHY 协商完成后,MAC 时钟是否按速率正确切换:
    • 千兆:125M
    • 百兆:25M
    • 十兆:2.5M

压测过程中断流 ​

压测断流通常出现在发送方向,可按以下步骤定位:

  1. 先在同一板卡的 Linux 系统下使用 iperf 测试 TCP 发送,观察测试过程中的 Retr 统计是否为 0。
  2. 如果 Linux 下也存在 Retr,优先排查原 Linux 驱动或网卡硬件时序问题。
  3. 如果 Linux 下无重传,再确认 SylixOS 当前配置的 phy-mode 和 PHY 型号是否正确。
  4. 检查当前 PHY 驱动是否支持配置 rx_delay、tx_delay,必要时调整时延参数。
  5. 如果未开启流控,可使用以下命令打开流控后复测:
bash
ifethtool -A en2 rx on tx on autoneg on

性能不达标 ​

如果 TCP/UDP 性能不达预期,可从协议栈参数、接收聚合和硬件能力三个方向排查:

  1. SylixOS 中可使用 iftcpwnd 调整 TCP 窗口大小。
  2. 可使用 iftcpaf 调整 TCP ACK 频率。
  3. 接收性能不足时,可使用 xgro 工具开启 TCP/UDP 接收方向报文聚合。
  4. 部分板卡受 CPU 频率限制,例如 FMQL 类板卡,TCP/UDP 性能可能无法达到完整千兆带宽。

xgro 使用说明可参考:xgro 软件 GRO。