RK3568 Android12 RJ45 网口led状态修改(二)

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:

简单分析

  1. 经过对比分析发现客户的网线是从路由器接出来的,而我这边是从交换机出来的,二者虽然都是支持千兆网络,但是它们的网络状态应该是有差别的。我这边也测试了路由器网线的连接,发现led状态确实与交换机的不一样,link灯有时候闪烁,active灯有时候不亮,关于网络的具体差异我暂时还没搞明白,但是问题可以先设法处理。

  2. 根据参考文章1,link灯没有常亮的原因可能是因为此时网口进入EEE节能状态,则led会出现闪烁。该功能是由寄存器17控制的, 默认开启,这里我把led1的EEE功能关闭。
    请添加图片描述
    请添加图片描述

  3. active灯没有正常闪烁的原因,我分析了下可能是之前对led的状态认识有误,原来是认为active是一种独立的状态,只要有数据收发就会闪烁。但根据下表应该理解为active的状态和link是绑定的,如果只有Link 1000+Active那么只有在连接千兆网络并有数据收发时才会亮灯和闪烁,其他情况下不亮。为此需要把100M和10M的link也配置上。请添加图片描述

  4. 与前一篇文章相比,我这次不是直接算好对应的寄存器值写入,而是用位操作的方法修改特定位的值。我觉得这样可能会更直观便于理解,也有利于按位调试。

经过我方和客户的测试,此时连接交换机和路由器上的效果都基本能满足需求了。


如有谬误欢迎指正,感谢阅读~

参考资料


  1. RTL8211千兆网PHY芯片LED灯配置 ↩︎

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值