起因
我现在从事 Linux 驱动工程师一职。在试用期时,硬件同事给了我一块板子,让我进行驱动适配和移植。板子上的千兆网卡驱动加载完成后,出现了异常状态(平台为 RK3576)。
异常一:无法动态获取 IP
网卡驱动初始化正常,没有报错,phy_id 能够正常识别。但无法通过 udhcpc 命令从交换机动态获取 IP(确认公司 IP 段下的子 IP 数量充足)。
经过重新审查硬件设计,发现物理 PCB 的 layout 图与原理图中的 tx_ctrl 信号不一致------硬件把 tx_ctrl 和 rx_ctrl 两条控制线接反了。
**注意:**发送和接收控制线接反并不影响内核 Ethernet 驱动的运行,但会导致网卡无法正常使用。

异常二:千兆/百兆协商异常,百兆交换机可以得到IP,在千兆交换机中得不到IP(晶振的锅)
解决异常一后,又出现新情况:
- 网卡设备节点初始化完成,系统能识别网卡节点。
- 插入千兆交换机:交换机端口不亮,无法通过
udhcpc获取 IP,手动设置静态 IP 也无法与电脑 ping 通。 - 插入百兆交换机:交换机状态灯亮,但仍无法通过
udhcpc获取 IP;手动设置静态 IP 后可与电脑互相 ping 通。
排查思路
经过一整天的软件排查,未发现问题。于是转换思路:百兆可用,千兆不可用,问题可能出在网络协商阶段。
驱动代码在协商阶段出问题的概率极低,因为使用的是瑞芯微评估板 SDK,已经过严格测试和批量生产。因此,怀疑是硬件问题。
协商过程(参考 深入了解以太网 PHY 自协商过程)涉及 PHY 与 GMAC 之间的速率协商,而 PHY 的工作速率依赖于外部时钟晶振(设备树驱动中已配置为外部时钟模式)。
问题根因
使用示波器抓取晶振波形,发现频率仅为 24 MHz。由于硬件设计采用 RGMII 外部供应时钟给 PHY 芯片,要跑千兆网络,PHY 芯片必须获得标准的 25 MHz 时钟。
最终定位原因:硬件外发打板时,BOM 表中晶振规格被错误地换成了 24 MHz 的型号。
总结
这次经历虽然"坑人",但也积累了宝贵的调试经验:当软件层面排查无果时,需果断转向硬件信号测量,尤其是时钟、电源等基础信号。