[X]关闭

解决发送延时设置不当导致的丢包问题

文档创建者:linux-01
浏览次数:4298
最后更新:2021-11-22
本帖最后由 linux-01 于 2022-5-17 10:33 编辑

一、背景
       在使用PL侧的网口时,如果我们使用官方的驱动加上官方的设备树时,往往会产生丢包的现象,列如07A和07B的PL侧网口,在以前我们通常使用修改realtek的驱动来去掉延迟。目前通过对驱动的分析,得到了更好的解决方法。

二、修改方法
在现有的设备树的基础上,进行修改可以解决丢包问题。
原有设备树:
  1. xlnx,phy-type = <0x3>;
复制代码

修改后的设备树:
  1. xlnx,phy-type = <0x8>;
复制代码

一个设备树修改的案例:
0.jpg

三、测试
通过修改后使用如下命令测试网口是否丢包:
  1. sudo ping 192.168.XXX.1 -A -c 10000
复制代码

测试现象:
10000个包中,应该0丢包。即达到10000/10000。

四、解决思路
       造成网口丢包的原因很清晰,那就是发送延迟的设置。在原驱动(realtek.c)中有如下代码:
1.jpg
       在代码的175、176两行不难发现,当网口的协议遵循PHY_INTERFACE_MODE_RGMII_ID或PHY_INTERFACE_MODE_RGMII_TXID模式时,应当加上TX-delay即发送延时。我们继续查询这两种模式之外还有哪些内容,使用转到定义功能,可以查询到在phy.h内的如下定义:
2.jpg
       这是一个枚举型,我们上述提到的PHY_INTERFACE_MODE_RGMII_ID和PHY_INTERFACE_MODE_RGMII_TXID模式分别可以用9和11代替,为方便表述,后面会使用模式几这样的叫法代替模式的全称。
       由于无法使用gdb进行debug,我们只能使用最原始的printk来调试。首先修改realtek.c,来检查当前网口的实际进入的模式:
3.jpg
       当网口初始化时,会打印三个参数,分别为网口实际使用的模式、网口的硬件地址和发送延迟的值。修改完成后我们编译新内核并放在开发板中启动,可以读到如下的开机信息:
PS网口:
4.jpg
PL网口:
5.jpg

       通过观察不难发现,PS与PL端的网口均选择了模式9进行初始化,对比设备树的设置,PL端的网口被设置成了错误的模式:
6.jpg
       本应该使用rgmii即模式8初始化的网口,却使用了模式9,导致其被多加上了发送延时。在分析PL端网口时,就不能单纯地使用realtek的驱动了,根据设备树内的compatible关键词全局搜索,发现对应的驱动为xilinx_axienet_main.c。
7.jpg
       紧接着需要在该驱动内寻找对网口模式设置的地方:
8.jpg
       在官方的驱动中,支持模式3、模式9和自定义,在之前的分析中我们一直是模式9,所以可以肯定lp->phy_mode == XAE_PHY_TYPE_RGMII_2_0为真。那既然如此,就要找出lp->phy_mode在驱动中是如何设置的。
       好在这个参数的定义也是非常地好找,搜索一下就找到了:
9.jpg
       这个参数是由设备树中的xlnx,phy-type决定的,再翻到设备树发现其值居然为0x3:
10.jpg
       这也很好地印证了为什么rgmii模式却使用了rgmii-id模式启动。我们将设备树内的该字段改为0x8,修改设备树后重新制作系统,开机打印信息正常。
PS网口:
11.jpg
PL网口:
12.jpg
经过测试网口恢复正常。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则