概述一般网卡灯有一个绿灯、一个黄灯,分别代表连接指示灯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;