1. 问题现象与背景分析
最近在RK3568平台上调试PCIe扩展的RTL8111千兆网卡时,遇到了一个奇怪的LED指示灯问题:当网卡工作在千兆模式时,状态灯完全不亮;而切换到百兆模式后,LED灯却能正常点亮。这与我们的产品需求完全相反——通常我们希望千兆连接时有更明显的状态指示。
通过查阅Realtek官方提供的RTL8111数据手册(图1),发现这款网卡的LED行为确实可以通过寄存器进行配置。手册中明确标注了CustomLED寄存器的各个控制位功能(图2),特别是bit8-bit15这8个位专门用于控制LED的工作模式。
提示:RTL8111系列网卡的LED控制逻辑与常见的网络芯片有所不同,它的LED行为不仅受PHY状态影响,还受到内部寄存器的直接控制。
2. 技术原理深度解析
2.1 RTL8111 LED控制机制
RTL8111的LED控制器采用两级控制架构:
- 硬件自动控制层:根据链路状态(速度、双工、活动)自动驱动LED
- 软件配置层:通过CustomLED寄存器可以覆盖硬件自动行为
在默认配置下:
- bit[15:8]:LED模式选择(每个LED对应2个bit)
- bit[7:0]:LED极性控制(1=高电平点亮,0=低电平点亮)
2.2 问题根源定位
通过示波器测量LED引脚信号发现:
- 千兆模式下:LED引脚保持恒定电平(无变化)
- 百兆模式下:引脚有正常的高低电平切换
这说明不是硬件连接问题,而是芯片内部的LED控制器在千兆模式下没有正确输出驱动信号。进一步追踪Linux内核中的r8168驱动代码,发现驱动在初始化时没有正确配置CustomLED寄存器。
3. 解决方案实现
3.1 驱动修改位置
需要修改的内核驱动文件路径:
bash复制/kernel/drivers/net/ethernet/realtek/r8168/r8168_n.c
3.2 关键代码修改
在驱动初始化函数中添加以下代码段:
c复制/* 读取当前LED配置 */
tp->NicCustLedValue = RTL_R16(tp, CustomLED);
/* 强制配置LED行为:
* - bit15:8 = 0xAA (每个LED工作在链路状态指示模式)
