对比寄存器解决千兆丢包问题
问题现象
客户反馈在连接局域网的场景下,相同板卡硬件(d2000+ar8035)上,嵌入式系统千兆ping丢包率很高,而ubuntu文件系统+飞腾提供的测试内核正常。
以下将工作异常的系统称为系统A。
问题复现
客户板卡上搭建测试环境,成功复现问题。
连接局域网环境下,在板卡与陪测端抓包分析:
丢了4个包:序号为2、10、13、18
与ping结果可对应上:
172.30.110.35为陪测机(enx),172.30.110.37为异常板卡(eth0)。eth抓到了那4个包的request,enx没有抓到。说明板卡网口eth0可能没有发出来。
后续测试使板卡与陪测机直连,仍可复现异常现象,说明客户反馈的现象不准确。。。。。后续均以直连方式测试。
异常板卡系统A环回测试
mac环回正常
对mac做环回测试。由于,mac层是由cpu集成的gmac芯片实现的,故查看d2000软件编程手册:
手册里查询到,在mac配置寄存器的bit 12控制mac loopback功能。
从启动日志里输出的dts设备树文件可以确认eth0网卡对应的是GMAC0:
故需要向GMAC0私有寄存器的基地址加上偏移量来写入bit(12),即0x2820c000+0x0 = 0x2820c000地址的bit12。
先搭建环回测试场景,将ip配为非网线网段的ip(10.3.3.1),arp -s 10.3.3.2 本机mac 创建一条arp地址映像避免后续环回时找不到目的主机发不出ping包。
root@KylinV10Embeded 20240301-jingsu# ./mdio eth0 0x0
read phy addr: 0x0 reg: 0x0 value : 0x3100
root@KylinV10Embeded 20240301-jingsu# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 3C:6A:2C:3C:6A:2C
inet addr:10.3.3.1 Bcast:10.255.255.255 Mask:255.0.0.0
inet6 addr: fe80::3e6a:2cff:fe3c:6a2c/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1165 errors:0 dropped:0 overruns:0 frame:0
TX packets:493 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:256524 (250.5 KiB) TX bytes:102132 (99.7 KiB)
Interrupt:22 Base address:0x2000
root@KylinV10Embeded 20240301-jingsu# arp -n
? (10.3.3.2) at 3c:6a:2c:3c:6a:2c [ether] PERM on eth0
root@KylinV10Embeded 20240301-jingsu#
root@KylinV10Embeded 20240301-jingsu# devmem2 0x0002820c000 w
-/bin/sh: devmem2: not found
root@KylinV10Embeded 20240301-jingsu# ls
devmem2 mdio phytool.tar.gz
root@KylinV10Embeded 20240301-jingsu# ./devmem2 0x0002820c000 w
/dev/mem opened.
Memory mapped at address 0xffffbe217000.
Memory mapped at address 0xffffbe216000.
Value at address 0x2820C000 (0xffffbe217000): 0x610C8C
root@KylinV10Embeded 20240301-jingsu# ./devmem2 0x0002820c000 w 0x611c8c //上面读到了mac配置寄存器内容是0x610c8c,将第12bit置1后则是0x611c8c
/dev/mem opened.
Memory mapped at address 0xffffa5e5b000.
Memory mapped at address 0xffffa5e5a000.
Value at address 0x2820C000 (0xffffa5e5b000): 0x610C8C
Written 0x611C8C; readback 0x611C8C
root@KylinV10Embeded 20240301-jingsu# tcpdump -i eth0 &
root@KylinV10Embeded 20240301-jingsu# [ 3810.513776][ 0] device eth0 entered promiscuous mode
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
root@KylinV10Embeded 20240301-jingsu# ping 10.3.3.2 -c 1
PING 10.3.3.2 (10.3.3.2): 56 data bytes
09:03:38.456902 IP 10.3.3.1 > 10.3.3.2: ICMP echo request, id 483, seq 0, length 64
09:03:38.456961 IP 10.3.3.1 > 10.3.3.2: ICMP echo request, id 483, seq 0, length 64
--- 10.3.3.2 ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss
root@KylinV10Embeded 20240301-jingsu#
root@KylinV10Embeded 20240301-jingsu#
root@KylinV10Embeded 20240301-jingsu# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 3C:6A:2C:3C:6A:2C
inet addr:10.3.3.1 Bcast:10.255.255.255 Mask:255.0.0.0
inet6 addr: fe80::3e6a:2cff:fe3c:6a2c/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX pac