概述一般网卡灯有一个绿灯、一个黄灯,分别代表连接指示灯LINK、信号传输指示灯ACT,连接指示灯亮表示网卡与网络连接状况良好(有些板载网卡只有工作在100M时,此灯才亮)。信号传输指示灯闪烁表示网卡正在进行数据传输。
本项目需要将网卡配置成link灯常亮、ACT灯闪烁
以下以rtl8211f网卡为例,进行讲述
看网卡芯片手册和硬件原理图看网卡芯片手册,确定LCR寄存器说明:看硬件原理图,确定网卡link灯和ACT LED连接方式:设置 led1(green) Link 10/100/1000M设置 led2(yellow) Link 10/100/1000M+Active相关代码如下
解决rtl8211f-cg驱动:网卡灯异常diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/kernel/drivers/net/etherne
index 34f216cf5..886f9f586 100755
--- a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -61,6 +61,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
@@ -125,6 +130,34 @@ static void stmmac_exit_fs(struct net_device *dev);
#define STMMAC_COAL_TIMER(x) (jiffies + usecs_to_jiffies(x))
+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_verify_args - verify the driver parameters.
* Description: it checks the driver parameters and set a default in case of
@@ -4465,6 +4498,10 @@ int stmmac_dvr_probe(struct device *device,
netdev_warn(priv->dev, "%s: failed debugFS registration\n",
__func__);
#endif
+ ret = phy_register_fixup_for_uid(RTL_8211F_PHY_ID, RTL_8211F_PHY_ID_MASK, phy_rtl8211f_led_fi
+ if (ret) {
+ dev_warn(priv->device, "Cannot register PHY board fixup, terry in :%s.\n", __func__);
+ }
return ret;