7.5.3. 调试指南

7.5.3.1. 调试开关

7.5.3.1.1. Log 等级

调试的时候需要设置 log 等级为最高7,设置方法为参考快速入门 - 编译概述 - Kernel配置, 打开 kernel 的 menuconfig

Kernel hacking
    printk and dmesg options
        (8) Default console loglevel (1-15)
        (7) Default message log level (1-7)

7.5.3.1.2. 调试开关

参考快速入门 - 编译概述 - Kernel配置, 打开 kernel 的 menuconfig, 如下路径选中 GMAC 的调试开关

Kernel hacking
    [*] Kernel debuging
        ZX Debug
        [*] GMAC Driver Debug

7.5.3.2. 功能验证

网络模块是否可以正常工作可以通过如下顺序排查:

  • 驱动是否加载成功

  • 本机 MAC 和 PHY 的连接是否成功

  • 本机 PHY 和对端 PHY 的连接是否成功

  • 本机网络和对端网络的连接是否成功

  • 是否可以通信

7.5.3.2.1. 驱动加载

在 log 等级为7的情况下,可以通过如下信息对模块的启动进程进行追踪

  • 有任何的 error 信息输出,模块都将不正常工作,因此任何的 error 信息都必须要解决

  • libphy: aicgmac: probed

    总线注册成功

  • aicmac_probe success.

    驱动加载成功,使用 ifconfig -a 命令应该可以看到设备

  • 其他日志

aicmac_phy_init_data phy_addr = 1
aicmac_mac_init_data mac_interface:8 max_speed:1000
aicmac_mdio_init_data mdio:1
mac addr: 4a:2a1e:fbeb:26
aicmac_platform_get_config bus_id:0
libphy: aicgmac: probed
aicmac_probe success.

7.5.3.2.2. 设备可发现

驱动加载成功的主要标志是网络设备存在,可以通过 “ifconfig -a” 命令查看设备是否存在,如果某一个设备不存在,则要排查驱动是否编译,是否加载,设备的系统参数和功能参数配置是否正确

[aic@] # ifconfig -a
eth0    Link encap:Ethernet  HWaddr DA:BD:4C:BA:5D:80
        BROADCAST MULTICAST  MTU:1500  Metric:1
        RX packets:0 errors:0 dropped:0 overruns:0 frame:0
        TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
        collisions:0 txqueuelen:1000
        RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
        Interrupt:25

eth1    Link encap:Ethernet  HWaddr 6A:8D:2A:7F:EA:3E
        BROADCAST MULTICAST  MTU:1500  Metric:1
        RX packets:0 errors:0 dropped:0 overruns:0 frame:0
        TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
        collisions:0 txqueuelen:1000
        RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
        Interrupt:26

7.5.3.2.3. 设备可启动

设备启动的时候 MAC 会尝试和 PHY 建立连接,可以通过 “ifconfig eth0 up” 命令来启动网络设备,如果启动不成功,则说明 MAC 和 PHY 的连接不成功, 居多 MDC 时钟不工作, 也可能是 phy-addr 设置错误

[aic@] # ifconfig eth0 up
    gmac 10280000.ethernet eth0: PHY [aicgmac-0:01] driver [RTL8211F Gigabit Ethernet] (irq=POLL)
    gmac 10280000.ethernet eth0: RX IPC Checksum Offload disabled
    gmac 10280000.ethernet eth0: configuring for phy/rgmii link mode

7.5.3.2.4. 网络可联通

网络的联通是本机 PHY 和远端 PHY 通过网线建立的,同时要牵涉到 MAC 到 PHY,PHY 到 PHY,PHY 到 MAC 的一个循环

7.5.3.2.4.1. 物理连接信息

PHY 和 PHY 的协商是自动的,不需要 MAC,AP 的参与,因此两个 PHY 通过网线连接时,二者应该是自协商成功的,对于有指示灯的系统,PHY 物理连接成功后指示灯会呼吸

7.5.3.2.4.2. 模块状态信息

通过命令 “ifconfig eth0 up” 打开设备,如果连接成功,则会报告 Link is Up 的信息,如下所示

如果没有连接成功,并且 MAC 和 PHY 的连接是成功的,则说明两个 PHY 的连接或者协商不成功,有两个可能

  • 二者的工作模块无法协商成功,如某一方只支持百兆,而另一方只支持千兆,或者是两个标准的 PHY 模块等,可以更换对端的网络设备,如换为路由器,PC 等

  • 物理网络不通,更换网线

[aic@] # ifconfig eth0 up
    gmac 10280000.ethernet eth0: Link is Up - 1Gbps/Full - flow control rx/tx
    IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready

[aic@] # ethtool  eth0
    Speed: 1000Mb/s
    Duplex: Full
    Auto-negotiation: on
    master-slave cfg: preferred slave
    master-slave status: master
    Port: Twisted Pair
    PHYAD: 1
    Transceiver: external
    MDI-X: Unknown
    Supports Wake-on: d
    Wake-on: d
    Current message level: 0x0000003f (63)
                           drv probe link timer ifdown ifup
    Link detected: yes

7.5.3.2.5. 网络可通信

经过上述的排查,MAC 和 PHY,PHY 和远端 PHY 的通路均正常,则可以进行网络通信验证

7.5.3.2.5.1. 验证方法

  • 通过 ifconfig eth0 ipaddr 设置一IP地址

  • 通过 ping 对端 ipaddr 来验证是否可以通信

[aic@] # ifconfig eth0 192.168.168.100
[aic@] # ping 192.168.168.101
PING 192.168.168.101 (192.168.168.101): 56 data bytes
64 bytes from 192.168.168.101: seq=0 ttl=64 time=4.004 ms
64 bytes from 192.168.168.101: seq=1 ttl=64 time=0.943 ms
64 bytes from 192.168.168.101: seq=2 ttl=64 time=0.818 ms

7.5.3.2.5.2. 问题分析

如果通信不正常,在没有对驱动进行修改的情况下,一般不会是寄存器配置的问题,可能的原因有

  • cl k配置,如果使用外部 clk,则要设置 aic,use_extclk

  • clk 频率,测量 MII Data的TX/RX Clk 的频率,满足当前标准

  • 时延,如果使用的是千兆网络,确定时延的配置和硬件匹配

  • 防火墙,确认路由器,对端设备不受防火墙的隔离保护

如果以上问题均排除,则请获取日志提交原厂分析

7.5.3.3. 寄存器信息

一个可以正常工作的 MAC 模块的寄存器样板

7.5.3.3.1. 千兆

reg-dump -a 0x10280000 -c 128
0x10280000: 00000012 06432208 00080400 04660000
0x10280010: 0001a061 00000000 00000000 00000311
0x10280020: 00000003 00000061 00000009 00000000
0x10280030: 00000000 ffff000e 00000000 00000000
0x10280040: 00000404 00000000 00000000 00000000
0x10280050: 80009d32 195ef056 00000000 00000000
0x10280060: 00000000 00000000 00000000 00000000
0x10280070: 00000000 00000000 00000000 00000000
0x10280080: 00000000 00000000 00000000 00000000
0x10280090: 00000850 000079ad 00000000 00000000
0x102800a0: 00000000 0000000d 00000000 00000000
0x102800b0: 4341c000 43418000 4341c000 434182e0
0x102800c0: 00000000 40d25000 00000000 00000000
0x102800d0: 00000000 00000000 00000000 00000000
0x102800e0: 00000000 00000000 00000000 00000000
0x102800f0: 00000000 00000000 00000000 00000000
0x10280100: 00002000 00000000 00000000 00000000
0x10280110: 00000000 00000000 00000000 00000000
0x10280120: 00000000 00000000 00000000 00000000
0x10280130: 00000000 00000000 00000000 00000000
0x10280140: 00000000 00000000 00000000 00000000
0x10280150: 00000000 00000000 00000000 ffffffff
0x10280160: 00000000 00000000 00000000 00000000

7.5.3.3.2. 百兆

reg-dump -a 0x10280000 -c 128
0x10280000: 00000016 06432208 00080400 00660000
0x10280010: 0001a061 00000000 00000000 00000311
0x10280020: 00000003 00000061 00000009 00000000
0x10280030: 00000000 ffff000e 00000000 00000000
0x10280040: 00000404 00000000 00000000 00000000
0x10280050: 8000c416 44da1a5a 00000000 00000000
0x10280060: 00000000 00000000 00000000 00000000
0x10280070: 00000000 00000000 00000000 00000000
0x10280080: 00000000 00000000 00000000 00000000
0x10280090: 00000850 0000786d 00000000 00000000
0x102800a0: 00000000 00000008 00000000 00000000
0x102800b0: 4383c000 43838000 4383c000 43838440
0x102800c0: 00000000 41f9c000 00000000 00000000
0x102800d0: 00000000 00000000 00000000 00000000
0x102800e0: 00000000 00000000 00000000 00000000
0x102800f0: 00000000 00000000 00000000 00000000
0x10280100: 00002000 00000000 00000000 00000000
0x10280110: 00000000 00000000 00000000 00000000
0x10280120: 00000000 00000000 00000000 00000000
0x10280130: 00000000 00000000 00000000 00000000
0x10280140: 00000000 00000000 00000000 00000000
0x10280150: 00000000 00000000 00000000 ffffffff
0x10280160: 00000000 00000000 00000000 00000000

7.5.3.4. 驱动信息

通过 “ethtool -i eth0” 命令可以查看设备驱动信息,用以确认驱动版本,mii 总线挂载信息

[aic@] # ethtool -i eth0
driver: aicgmac
version: 20211010
firmware-version:
expansion-rom-version:
bus-info: aicgmac-0:01 : 设备id:phy addr id
supports-statistics: no
supports-test: no
supports-eeprom-access: no
supports-register-dump: yes
supports-priv-flags: no

7.5.3.5. 设备信息

设备的信息固化在 MAC 模块硬件寄存器和设备驱动中,通过 “ethtool eth0” 命令可以确认设备的配置信息是否正确

7.5.3.5.1. 连接成功前

[aic@] # ethtool eth0
Settings for eth0:
    Supported ports: [ TP    MII ]
    Supported link modes:   10baseT/Half 10baseT/Full
                            100baseT/Half 100baseT/Full
                            1000baseT/Full
    Supported pause frame use: Symmetric Receive-only
    Supports auto-negotiation: Yes
    Supported FEC modes: Not reported
    Advertised link modes:  10baseT/Half 10baseT/Full
                            100baseT/Half 100baseT/Full
                            1000baseT/Full
    Advertised pause frame use: Symmetric Receive-only
    Advertised auto-negotiation: Yes
    Advertised FEC modes: Not reported
    Speed: Unknown!
    Duplex: Unknown! (255)
    Auto-negotiation: on
    master-slave cfg: preferred slave
    master-slave status: unknown
    Port: Twisted Pair
    PHYAD: 1
    Transceiver: external
    MDI-X: Unknown
    Supports Wake-on: d
    Wake-on: d
    Current message level: 0x0000003f (63)
                           drv probe link timer ifdown ifup
    Link detected: no

7.5.3.5.2. 连接成功后

[aic@] # ethtool eth0
Settings for eth0:
    Supported ports: [ TP    MII ]
    Supported link modes:   10baseT/Half 10baseT/Full
                            100baseT/Half 100baseT/Full
                            1000baseT/Full
    Supported pause frame use: Symmetric Receive-only
    Supports auto-negotiation: Yes
    Supported FEC modes: Not reported
    Advertised link modes:  10baseT/Half 10baseT/Full
                            100baseT/Half 100baseT/Full
                            1000baseT/Full
    Advertised pause frame use: Symmetric Receive-only
    Advertised auto-negotiation: Yes
    Advertised FEC modes: Not reported
    Link partner advertised link modes:  10baseT/Half 10baseT/Full
                                        100baseT/Half 100baseT/Full
                                        1000baseT/Full
    Link partner advertised pause frame use: Symmetric Receive-only
    Link partner advertised auto-negotiation: Yes
    Link partner advertised FEC modes: Not reported
    Speed: 1000Mb/s
    Duplex: Full
    Auto-negotiation: on
    master-slave cfg: preferred slave
    master-slave status: slave
    Port: Twisted Pair
    PHYAD: 1
    Transceiver: external
    MDI-X: Unknown
    Supports Wake-on: d
    Wake-on: d
    Current message level: 0x0000003f (63)
                    drv probe link timer ifdown ifup
    Link detected: yes

7.5.3.6. 辅助工具

7.5.3.6.1. 数据包分析

一般使用 WiredShark 抓包工具进行数据包的分析,可以借助其分析发送和接收的数据内容,从而分析通信双方的行为

../../../_images/wireshark.jpg

7.5.3.6.2. 网速测试

压力测试的模型是搭建一个简单的 C/S 模型,Client 以最大资源利用发送数据,Server 端接收数据并进行相应计算

SDK 自带两种可用于进行压力测试的工具,iperf3 和 netperf,二者会以全速进行数据的收发,并进行丢包,错包,发送速率计算等辅助工作

网速测试因为需要验证收到的信息的准确性,因此有比较大的计算任务,所以也受 CPU 和 DDR 频率的影响

7.5.3.6.2.1. iperf3

  • server 命令

    iperf3 -s

  • client 命令

    iperf3 -c 192.168.168.100 -u -b 50M , 以 50M UDP 的方式和 server 192.168.168.100 进行测试

7.5.3.6.2.2. netperf

  • server 命令

    netserver

  • client 命令

    netperf -H 192.168.168.100 , 不限速和 server 192.168.168.100 进行测试

7.5.3.6.2.3. 持久测试

不管是 iperf3 还是 netperf 都是进行有限次的数据交互后即停止工作,如果进行长时间的压力测试,则需要脚本配合

#!/bin/bash

#Run as Server

ifconfig eth0 up
ifconfig eth0 192.168.168.100

#netserver >/dev/null
iperf3 -s >/dev/null
#!/bin/bash
#Run as Client

ifconfig eth0 up
ifconfig eth0 192.168.168.105

for i in $(seq 1 10000)
do
    echo "Start to test at $i times"
    #netperf -H 192.168.168.100
    iperf3 -c 192.168.168.100 -u -b 50M
    sleep 5
done