JL6107的驱动集成完后,正常单板上下电时工作正常,但单板reboot后,JL6107就不正常了。
通过代码追踪,发现phy_driver_register
驱动里的config_init
未被调用,所以JL6107未正常初始化。
驱动与设备注册存在时序问题?
先将模块自动加载去掉,改为手动加载模组,看问题是否还会复现。
- 初次上电后,由于不加载ko,Open失败,所以ifocnfig未看到eth0;手动加载ko后,再将eth0 up,可以看到JL6107初始化正常。
- 再次reboot后,未发现open失败的打印信息,ifconfig也能看到eth0?此时的ko都还未加载,难道stmmac_open未执行?--确认有执行,见下面的调用关系
- stmmac_open->stmmac_setup_phy->stmmac_init_phy->phy_connect->phy_connect_direct->phy_attach_direct->phy_init_hw
在phy_init_hw中有config_init的调用,发现config_init为空,所以调用失败。 - 在reboot后,执行ifconfig eth0 down,重新手动卸载ko,再加载ko,执行ifconfig eth0 up后,网卡工作正常。
从上面现象看,在reboot时驱动注册存在问题。
确认驱动注册问题
phy_driver_register
新发现
相同的软件版本加载到另一个单板内,就是OK的。驱别在于无问题板子reboot时网卡会断开,而有问题的板子网卡一直连着。怀疑是reboot过种中PHY的复位有区别。
手动调复位接口,PHY也不复位。
查看硬件,复位管脚与控制器断开了,下面这个Q601没有焊。
跳过Q601,分别将R625的两端连接到PHY的复位管脚,均发现无法复位,看来控制器驱动不行啊。让客户自己焊好Q601验证吧。
客户确认焊上Q601后问题解决
问题根因
后面确认是由于在reboot过程中,PHY未复位,所以总线扫到器件后又没有对应的驱动,就匹配上了通用的驱动,最终导致网卡异常。