mctp路由表缺失问题分析
更新时间: 2026/05/28
在Gitcode上查看源码

问题背景

  • 单板类型:自研板;
  • 软件版本:openUBMC 25.09;
  • 涉及功能:网卡适配,PCIe链路;
  • 预制条件:环境上安装MCX623436MN-CDAB网卡,代码层配置CSR文件;
  • 触发条件:web页面升级后查看网卡信息;
  • 业务表现:预期正常获取网卡信息;实际网卡信息获取不到。

问题复现步骤

环境上安装MCX623436MN-CDAB网卡,代码层配置CSR文件,出包web页面升级后,web页面查看网卡信息。

关键日志信息

web页面信息: mdb_info.log日志文件如下: imu日志如下:

定位过程

  1. 确认资源树上路由表信息,发现没有所需网卡的路由表;

  2. 查看imu日志,可以搜到mctp task ok,并且可以找到OCP网卡的ep,其中55是本次调试的OCP卡,98是硬盘;

  3. 按照社区提供的方案,尝试读取寄存器数值; 步骤为:

    • 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状态寄存器。
  4. 按照社区方法,读取对应寄存器的值后,结果如下,寄存器的值全部为0,意味着驱动没有收到任何mctp报文,BMC也没有和imu建链;

  5. 怀疑建链出现问题,需要进一步通过PCIe的建链状态寄存器来确认,方法为对应状态寄存器(bit0-bit5对应的trace记录)如下,PCIe0:0x8b21094 PCIe1:0xcd0e094,当bit0-bit5的值为0x11(gen1)或0x51(gen2)时表示建链成功;实际环境寄存器0x8b21094读值为0x25E02051,0xcd0e094寄存器实际读值为0x00000800,根据实际的读值确认PCIe0建链成功,但是PCIe1建链失败,需要bios开发确认PCIe1的配置是否正常。

  6. bios开发回复,PCIe1配置正常,需要硬件确认PCIe1链路接线是否正常;

  7. 硬件在实际环境确认后回复,PCIe1他们未接任何东西悬空状态。

问题原因

硬件PCIe1链路空悬,导致建链失败,网卡信息未获取成功;

解决方案

硬件开发按照硬件原理图接线,保证PCIe1硬件链路正常,在尝试建链。