Appearance
DesignWare 网卡常见问题分析
本文汇总 DW 网卡在 BSP 适配、设备树配置、PHY 调试和性能压测过程中常见的问题与排查方向,便于快速定位网卡创建失败、通信异常、协商异常和性能不达标等问题。
创建网卡失败
共用 MDIO 总线场景
如果多个网卡共用同一条 MDIO 总线,重点检查:
- 设备树配置是否正确,确认
phy-handle、mdio子节点和 PHY 地址配置一致。 - 网卡创建顺序是否正确:应先创建提供 MDIO 总线的网卡,再创建复用该总线的网卡。
- 如果打印顺序相反,可调整设备树中
gmac0、gmac1节点定义顺序。 - DW 网卡默认使用零拷贝,BSP 中 DMA 预留内存建议不少于
64M。
相关配置可参考:共用 MDIO 设备树配置。
非共用 MDIO 总线场景
如果每个网卡独立使用自己的 MDIO 总线,重点检查:
- 设备树中是否配置了 PHY 地址,并确认 PHY 地址与硬件 strap 地址一致。
- PHY 的 GPIO reset 引脚是否配置正确,包括 GPIO 编号、有效电平和复位延时。
- PHY 芯片上的 MDC 时钟是否处于芯片允许范围内。
- BSP 中 DMA 预留内存是否满足零拷贝需求,建议不少于
64M。 - 对于 DW PCI 网卡,插入 PCI 设备后 BAR 基地址可能变化,可启动后通过
pcis命令查看新的 PCI 地址,并同步更新设备树配置。
网卡无法正常通信
网卡创建成功但无法收发数据时,可按以下顺序排查:
- 中断号、时钟配置是否正确。
- 设备树中的
phy-mode是否与硬件连接方式一致,例如rgmii、rgmii-id、rgmii-rxid、rgmii-txid。 - PHY 驱动中的 RX/TX delay 是否处于合适范围。
- DMA 内存是否与物理地址一一映射。
- BSP 或内核中的 cache 刷新、失效逻辑是否正常。
自协商时间较长
ifdown 到 ifup 过程中会将 PHY 重新 down/up 并触发自协商。当前实现与 Linux 行为保持一致,而 IEEE 协议中默认的 link down 和 link up 时间本身较长。
如果业务侧需要更快检测 down 状态,可通过读取 PHY 标准寄存器辅助判断:
- 读取 PHY
1号寄存器第3位; - 读取 PHY
10号寄存器第13位; - 结合两者判断当前链路状态。
切换百兆后无法通信
网卡从千兆切换到百兆后无法正常通信时,重点确认:
- 不要在强制千兆配置下尝试与百兆链路通信。
- PHY 自协商打印的速率是否正确。
- PHY 协商完成后,MAC 时钟是否按速率正确切换:
- 千兆:
125M - 百兆:
25M - 十兆:
2.5M
- 千兆:
压测过程中断流
压测断流通常出现在发送方向,可按以下步骤定位:
- 先在同一板卡的 Linux 系统下使用
iperf测试 TCP 发送,观察测试过程中的Retr统计是否为0。 - 如果 Linux 下也存在
Retr,优先排查原 Linux 驱动或网卡硬件时序问题。 - 如果 Linux 下无重传,再确认 SylixOS 当前配置的
phy-mode和 PHY 型号是否正确。 - 检查当前 PHY 驱动是否支持配置
rx_delay、tx_delay,必要时调整时延参数。 - 如果未开启流控,可使用以下命令打开流控后复测:
bash
ifethtool -A en2 rx on tx on autoneg on性能不达标
如果 TCP/UDP 性能不达预期,可从协议栈参数、接收聚合和硬件能力三个方向排查:
- SylixOS 中可使用
iftcpwnd调整 TCP 窗口大小。 - 可使用
iftcpaf调整 TCP ACK 频率。 - 接收性能不足时,可使用
xgro工具开启 TCP/UDP 接收方向报文聚合。 - 部分板卡受 CPU 频率限制,例如 FMQL 类板卡,TCP/UDP 性能可能无法达到完整千兆带宽。
xgro 使用说明可参考:xgro 软件 GRO。