关闭网口EEE模式
问题引出:客户使用8211芯片,网口灯闪烁不正常,但是通信正常
经过排查发现是网口灯进入了一种低功耗EEE模式
EEE模式简介:
RTL8211FS(-VS)以10 Mbps、100 Mbps和1000 Mbps支持IEEE 802.3az-2010,也称为节能以太网(EEE)。它提供了一种协议,用于基于链路利用率协调到或从低功耗级别(低功耗空闲模式)的转换。当不发送数据包时,系统采用低功耗空闲模式以节省功耗。一旦需要传输数据包,系统就会返回正常模式,并在不改变链路状态和不中断/损坏帧的情况下执行此操作。为了节省功耗,当系统处于低功耗空闲模式时,大部分电路都被禁用,但从低功耗空闲模式到或从低功耗空闲模式的过渡时间保持得足够小,以便对上层协议和应用程序透明。
目前一些低端(比如RTL8211)的PHY芯片开启EEE后会出现各种问题,比如链路过若干小时down一次甚至直接不通,LED指示错误,目前解决方法是关掉EEE。
查看8211手册的相应章节
EEE Idle Mode: LED continuous slow blinking. // EeeIdle模式:LED连续缓慢闪烁。
EEE Active Mode: LED fast and slow blinking(on packet transmitting and receiving). // EEE活动模式:引导快速和慢闪烁(在数据包发送和接收)。
下图是LED行为图
查找EEE的Control Register,可以看到页地址是0xd04,块地址为0x11
将其16位置0即可关闭EEE模式
修改方法:
在板级文件里面修改Control Register ,添加如下两行代码
diff --git a/arch/arm/mach-imx/mach-imx6q.c b/arch/arm/mach-imx/mach-imx6q.c
index b42ef345..ca9b961a 100644
--- a/arch/arm/mach-imx/mach-imx6q.c
+++ b/arch/arm/mach-imx/mach-imx6q.c
@@ -195,7 +195,8 @@ static int rtl8211f_phy_fixup(struct phy_device *dev)
phy_write(dev, 0x11, 0x109);
phy_write(dev, 0x1f, 0xd04);
phy_write(dev, 0x10, 0x2340);
-
+ phy_write(dev, 0x1f, 0xd04); //写入0x1f,切换到对应分页
+ phy_write(dev, 0x11, 0x0); //写0到地址0x11
return 0;
下面是分页寄存器的介绍: