mctp路由表缺失问题分析
更新时间: 2026/05/28
在Gitcode上查看源码问题背景
- 单板类型:自研板;
- 软件版本:openUBMC 25.09;
- 涉及功能:网卡适配,PCIe链路;
- 预制条件:环境上安装MCX623436MN-CDAB网卡,代码层配置CSR文件;
- 触发条件:web页面升级后查看网卡信息;
- 业务表现:预期正常获取网卡信息;实际网卡信息获取不到。
问题复现步骤
环境上安装MCX623436MN-CDAB网卡,代码层配置CSR文件,出包web页面升级后,web页面查看网卡信息。
关键日志信息
web页面信息: mdb_info.log日志文件如下: imu日志如下:
定位过程
确认资源树上路由表信息,发现没有所需网卡的路由表;
查看imu日志,可以搜到mctp task ok,并且可以找到OCP网卡的ep,其中55是本次调试的OCP卡,98是硬盘;
按照社区提供的方案,尝试读取寄存器数值; 步骤为:
- 1711 telent下使用maint_debug_cli进入debug模式
- 执行attach mctp
- 执行static,显示如下图所示。 上图对应的参数对应的说明:
- packets_in: 接收到的包的个数。(devmem 0xcd30048);
- Packets_out: 上层软件发送的包的个数;
- Packets_out_reg: 硬件实际发送的包的个数。(devmem 0xcd30044);
- Packets_drop_len: 接收方向长度错误包的个数(devmem 0xcd30034);
- Packets_drop_crc: 接收CRC错误包的个数。(devmem 0xcd30040);
- Packets_drop_fifo: 接收fifo溢出而丢弃的包。(devmem 0xcd30038);
- Packets_drop_fifo1: 因上层数据FIFO满而丢弃的包; 上述是debug命令行提供的打印,若版本不支持debug,可以通过读寄存器的方式来获取。除了上述几个值可提供定位外,MCTP本身还有如下寄存器可供定位: (devmem 0xcd30038):MCTP包头域匹配的状态。 (devmem 0xcd30030):数据FIFO状态寄存器。
按照社区方法,读取对应寄存器的值后,结果如下,寄存器的值全部为0,意味着驱动没有收到任何mctp报文,BMC也没有和imu建链;
怀疑建链出现问题,需要进一步通过PCIe的建链状态寄存器来确认,方法为对应状态寄存器(bit0-bit5对应的trace记录)如下,PCIe0:0x8b21094 PCIe1:0xcd0e094,当bit0-bit5的值为0x11(gen1)或0x51(gen2)时表示建链成功;实际环境寄存器0x8b21094读值为0x25E02051,0xcd0e094寄存器实际读值为0x00000800,根据实际的读值确认PCIe0建链成功,但是PCIe1建链失败,需要bios开发确认PCIe1的配置是否正常。
bios开发回复,PCIe1配置正常,需要硬件确认PCIe1链路接线是否正常;
硬件在实际环境确认后回复,PCIe1他们未接任何东西悬空状态。
问题原因
硬件PCIe1链路空悬,导致建链失败,网卡信息未获取成功;
解决方案
硬件开发按照硬件原理图接线,保证PCIe1硬件链路正常,在尝试建链。