linux下以太网功能不能正常使用的原因及解决办法

一:以太网在bring up时遇到的问题
检查寄存器基地址,寄存器定义,寄存器配置(百兆,千兆,rmii,rgmii,内部,外部phy), pinmux, 检查phy的配置.
probe失败可能原因:
1.MAC reset失败。检查电源,clock。
2.无法读取phy id。检查phy的电源,clock,pinmux.
能正确显示link状态,但是数据不通:
1.检查寄存器配置,pinmux, 主要是rmii, rgmii相关配置
2.检查phy driver是否正确匹配上,phy driver中的phy id与 phy device 中的phy id如果不一致的话,phy driver就匹配不成功,导致phy config函数没有执行到。

二.传输过程中传输中断的问题

tx方向的传输中断。增加每秒运行一次的work queue, 检查在dma队列中是否有待发送的数据(已经交给dma),如果有,记下队列index, 过5秒之后再检查这个待发送的数据是否已发送完成,如果还未完成,认为TX传输中止,reset ethernet.
rx方向的传输中断。每条检查一次,检查phy的状态,如果状态异常,则reset ethernet. 还可以仿照TX方向增加监控和恢复机制。
在reset ethernet时,需要注意kernel panic。 reset过程是,停止TX,RX,释放之前alloc的所有memory, 重新alloc memory, 初始化mac, 初始化phy。出现panic的原因是,驱动代码还在使用已经被释放了的memory。因为已经停止了TX,RX,按道理不会再运行TX,RX部分的代码了。最后发现是tx timer handler里面会操作memory。当停止TX,RX之后, 释放所有memory, 然后tx timer handler触发,操作被释放的memory, 导致panic. 解决方法是,减少tx timer的expire时间,并且在停止TX之后,增加delay, 使tx timer handler完成之后,再释放memory.

原文地址:https://www.cnblogs.com/zongfanstudy/p/13962480.html