Platform: RK3568
OS: Android 12
Kernel: v4.19.206
SDK Version:android-12.0-mid-rkr1
Module :RTL8211F-CG
问题
根据前一篇博文RK3568 Android12 RJ45 网口led状态修改(一),网口led修改后自测OK,但是客户反馈的测试情况是link灯也闪烁而不是常亮,不符合需求,需要进一步优化。
实现方法
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index 921edea1ee66..77f9550339fd 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -57,6 +57,11 @@
#define STMMAC_ALIGN(x) ALIGN(ALIGN(x, SMP_CACHE_BYTES), 16)
#define TSO_MAX_BUFF_SIZE (SZ_16K - 1)
+#define RTL_8211F_PHY_ID 0x001cc916
+#define RTL_8211F_PHY_ID_MASK 0x001fffff
+#define RTL_8211F_PAGE_SELECT 0x1f
+#define RTL_8211F_LCR_ADDR 0x10
+#define RTL_8211F_EEELCR_ADDR 0x11
/* Module parameters */
#define TX_TIMEO 5000
@@ -4266,6 +4271,40 @@ static int stmmac_hw_init(struct stmmac_priv *priv)
return 0;
}
+static int phy_rtl8211f_led_fixup(struct phy_device *phydev)
+{
+ u32 val, val2;
+
+ pr_info("terry in : %s\n", __func__);
+
+ /*switch to page0xd04*/
+ phy_write(phydev, RTL_8211F_PAGE_SELECT, 0xd04);
+
+ /*set led1(green) Link 10/100/1000M, and set led2(yellow) Link 10/100/1000M+Active*/
+ val = phy_read(phydev, RTL_8211F_LCR_ADDR);
+ val |= (1<<5);
+ val |= (1<<8);
+ val &= (~(1<<9));
+ val |= (1<<10);
+ val |= (1<<11);
+ phy_write(phydev, RTL_8211F_LCR_ADDR, val);
+
+ /*set led1(green) EEE LED function disabled so it can keep on when linked*/
+ val2 = phy_read(phydev, RTL_8211F_EEELCR_ADDR);
+ val2 &= (~(1<<2));
+ phy_write(phydev, RTL_8211F_EEELCR_ADDR, val2);
+
+ /*switch back to page0*/
+ phy_write(phydev,RTL_8211F_PAGE_SELECT, 0xa42);
+
+ return 0;
+}
+
/**
* stmmac_dvr_probe
* @device: device pointer
@@ -4458,7 +4497,11 @@ int stmmac_dvr_probe(struct device *device,
netdev_warn(priv->dev, "%s: failed debugFS registration\n",
__func__);
#endif
-
+ /* register the PHY board fixup */
+ ret = phy_register_fixup_for_uid(RTL_8211F_PHY_ID, RTL_8211F_PHY_ID_MASK, phy_rtl8211f_led_fixup);
+ if (ret) {
+ dev_warn(priv->device, "Cannot register PHY board fixup, terry in :%s.\n", __func__);
+ }
return ret;
error_netdev_register:
简单分析
-
经过对比分析发现客户的网线是从路由器接出来的,而我这边是从交换机出来的,二者虽然都是支持千兆网络,但是它们的网络状态应该是有差别的。我这边也测试了路由器网线的连接,发现led状态确实与交换机的不一样,link灯有时候闪烁,active灯有时候不亮,关于网络的具体差异我暂时还没搞明白,但是问题可以先设法处理。
-
根据参考文章1,link灯没有常亮的原因可能是因为此时网口进入EEE节能状态,则led会出现闪烁。该功能是由寄存器17控制的, 默认开启,这里我把led1的EEE功能关闭。
-
active灯没有正常闪烁的原因,我分析了下可能是之前对led的状态认识有误,原来是认为active是一种独立的状态,只要有数据收发就会闪烁。但根据下表应该理解为active的状态和link是绑定的,如果只有Link 1000+Active那么只有在连接千兆网络并有数据收发时才会亮灯和闪烁,其他情况下不亮。为此需要把100M和10M的link也配置上。
-
与前一篇文章相比,我这次不是直接算好对应的寄存器值写入,而是用位操作的方法修改特定位的值。我觉得这样可能会更直观便于理解,也有利于按位调试。
经过我方和客户的测试,此时连接交换机和路由器上的效果都基本能满足需求了。
如有谬误欢迎指正,感谢阅读~