SP681网卡插上后,该卡所在板卡的I2C链路频繁报错

基于2603开发的openUBMC版本

板卡连接是:基础板上接一个switch板,switch板上有12个pcie插槽,其中槽位1会接sp681网卡。

不接SP681的情况下,switch板的I2C链路正常:
switch信息读值正常:


smc读写正常:

插上SP681网卡后,就频繁读写失败:
switch信息频繁获取不到:


smc报错:

接下来除了让硬件帮忙量信号,BMC这边还有什么深入定位的方法么?

答案内容由AI生成,仅供参考:

总结:BMC 侧优先排查清单

步骤 操作 参考来源
1 分析 dmesg、app.log,确认具体错误码(ret:5 等) 文档块 8
2 核查 I2C 地址是否左移一位,SR 配置是否匹配 文档块 2
3 检查 Accessor/Chip 的 AddrWidth/OffsetWidth 文档块 8
4 查看是否有多个服务并发访问该总线,尝试串行化并增加延迟 文档块 1
5 使用 hisportdetect 或 busctl 手动验证 I2C 通信 文档块 2、4
6 尝试降低 I2C 时钟或增加重试 经验方法
7 确认 SP681 网卡固件及 MCTP 兼容性 文档块 5、10

若以上方法仍无法定位,建议将完整日志与硬件原理图提交至 openUBMC 社区论坛(discuss.openubmc.cn),获取更专业的分析。

点击此处查看详细分析解答

根据您描述的问题(基于 openUBMC 2603 版本,基础板 + switch 板,槽位 1 插入 SP681 网卡后 I2C 链路频繁报错),结合提供的上下文,BMC 侧可以尝试以下深入定位方法:


1. 精确分析错误日志,定位具体错误码

  • 检查 dmesg、app.log、sensor.log,重点关注 I2C 访问失败时的返回码。

    • 若出现 i2c write/read fail, ret: 5,表示 slave 未发送 ACK,通信失败(参考《V3硬件访问错误排查指南》)。
    • 若出现 BMC.Error.Unknow 或 Bmc_Error_Unknown,表明系统无法分类错误,需进一步结合上下文分析。
  • 查看 dmesg 中类似如下格式的日志:

    I2C-08-RT<-5|-5> M<0x2e|0x0|0x0|3|10> ... E<0x1|0x0|0x0|0x1>
    

    这表示从器件未响应(参考文档块 1 中的论坛回复),可用逻辑分析仪抓取波形验证,但 BMC 侧可先对比插卡前后的日志差异。


2. 核查 I2C 地址与拓扑配置

  • 7 位地址左移:确认 switch 板上各器件(如 SMC、温度传感器、EEPROM)的 I2C 地址在 BMC 配置中是否为 7 位地址左移一位 后的值(参考文档块 2)。若未正确左移,BMC 发送的地址与实际器件不匹配,导致无 ACK。

  • SR 文件配置:检查 SR(System Resource)或管理拓扑(ManagementTopology)中 I2C 总线的定义是否与实际硬件连接一致。例如 I2c_8 总线连接了 SMC_ExpBoardSMC_0101、Eeprom_DemoEeprom_1 等器件,需确保 Bus、Address、Chip 映射正确(参考知识图谱中 I2c_8 的描述)。

  • Accessor/Chip 属性:确认访问该 switch 板所用的 Chip(如 SMC、PCA9555 等)的 AddrWidth 和 OffsetWidth 配置正确。若配置错误,BMC 写入总线的数据格式会异常,导致器件无法解析(参考《V3硬件访问错误排查指南》)。


3. 检查 I2C 总线冲突与资源竞争

  • 多服务并发访问:插入 SP681 网卡后,可能新增了某些服务(如 devmon、网络适配器驱动)同时访问 switch 板所在的 I2C 总线,导致总线冲突。可在配置中 将硬盘日志收集、传感器扫描等任务改为串行触发,并增加每次 I2C 交互后的等待时间(例如从 3ms 改为 5ms,参考文档块 1 的解决方案)。

  • 查看 hwproxy 插件队列:确认是否有插件请求阻塞 I2C 总线。文档块 1 中曾提到“硬盘日志收集有多个硬盘由多个硬盘任务并行触发改为串行触发,减轻插件队列阻塞”。


4. 尝试软件调整与规避措施

  • 增加重试机制:在读取 switch 板信息或 SMC 时,增加 3~5 次重试,每次间隔适当延时(如 50ms)。文档块 5 中 SP681 网卡 SN 跳变问题曾尝试加 5 次重试,虽仍读出错误数据,但可结合其他方法使用。

  • 降低 I2C 时钟频率:若怀疑插入网卡后总线电容增加或信号质量下降,可尝试在驱动中降低 I2C 时钟频率(如从 400kHz 降为 100kHz),验证是否改善。

  • 禁用无关的 MCTP 协议访问:参考文档块 10,QLE 网卡需打开 MCTP 使能,但若 SP681 网卡未正确支持 MCTP,其 MCTP 通信阻塞也可能影响同一 I2C 总线。可临时关闭不必要的 MCTP 会话,观察问题是否消失。


5. 利用 BMC 提供的诊断工具

  • 使用 hisportdetect 工具:扫描 I2C 总线,确认是否所有预期器件都能被正确枚举。若扫描不到,则可能是地址配置或硬件链路问题。

  • 通过 busctl 直接访问相关 DBus 对象:例如 bmc.kepler.general_hardware 下的接口,手动发送 I2C 读写命令,观察返回结果与错误信息。

  • 模拟测试:在 QEMU 仿真环境中搭建相同的硬件拓扑(基础板+switch板+SP681虚拟设备),复现问题并进行软件调试(参考《openUBMC Qemu特性设计说明书》)。


6. 参考已知的 SP681 网卡相关问题

文档块 5 明确记录了 SP681 网卡在 BMC Reset 长稳测试中 SN 跳变,且加 5 次重试仍读出错误数据。这表明该网卡可能存在 固件缺陷或硬件链路设计问题,尤其在多卡插满时更易复现。建议:

  • 检查 SP681 网卡固件版本,确认是否需要升级。
  • 联系网卡厂商确认其 MCTP / I2C 协议实现是否与 openUBMC 兼容。

7. 结合硬件排查建议(补充但非替代)

虽然用户已提及“让硬件帮忙量信号”,但 BMC 侧可主动提供以下协助:

  • 在问题复现时,通过 BMC 日志记录时间点,方便硬件用逻辑分析仪在对应时刻抓取 I2C 波形,对比成功与失败报文。
  • 确认硬件上是否有 上拉电阻缺失、电平不匹配、或插卡导致总线电容超限 的情况。

总结:BMC 侧优先排查清单

步骤 操作 参考来源
1 分析 dmesg、app.log,确认具体错误码(ret:5 等) 文档块 8
2 核查 I2C 地址是否左移一位,SR 配置是否匹配 文档块 2
3 检查 Accessor/Chip 的 AddrWidth/OffsetWidth 文档块 8
4 查看是否有多个服务并发访问该总线,尝试串行化并增加延迟 文档块 1
5 使用 hisportdetect 或 busctl 手动验证 I2C 通信 文档块 2、4
6 尝试降低 I2C 时钟或增加重试 经验方法
7 确认 SP681 网卡固件及 MCTP 兼容性 文档块 5、10

若以上方法仍无法定位,建议将完整日志与硬件原理图提交至 openUBMC 社区论坛(discuss.openubmc.cn),获取更专业的分析。

completion code 4表明SMC在处理i2c请求时发生内部错误

SMC协议实现的I2c扩展 ,所有的i2c访问实际上都是BMC把i2c请求封装成SMC协议报文发给SMC,再由SMC去做处理

当前的情况是i2c请求传递给SMC后,SMC返回这个请求处理时发生内部错误(具体那种类型的错误,需要SMC的同事分析下),但是基于当前的场景,推测时链路异常之类的问题,导致请求发送失败。

具体的可以求助SMC的同事提供更明确的错误类型,或者更直接点测量下链路信号

你试下走vpd版本,大概率不报错,推测是设备树版本的这张卡少了什么东西导致的

2509版本也有这样的问题 当时应该走的是VPD

与框架同事确认,这个问题当前没有软件侧更好的排查方法了。建议参考楼上的解决方法,从SMC或硬件链路入手排查

抓取

BMC → CPLD 红色

CPLD → 网卡 黄色

数据波形如下:

发现波形异常点: SMC opcode 0~2 是 0xE9 0x40 0x00, 要读取的数据长度是64(0x40)个,实际读取17长度后网卡进行时钟延展(拉低),网卡实际响应为17个byte(手册截图如下),由此怀疑64个字节需求超出了网卡的响应字节长度。

在南向驱动层组装的数据包应该是SMBUS请求体,向chip发送的参数data(SMBUS请求体)和readlen(SMC透传帧的第五个Byte)

请问这个SMC透传帧的组装是在哪里做的?

也是在component_drivers里 component_drivers实现了bmc.dev.chip/bus的read接口。
南向驱动从底层的总线操作到上层的设备管理都实现。

在component_drivers中发现两个问题:
1.std_smbus.cpp中m_buffer_len的长度默认为64,如果csr中不配置的话,这会导致SMC固定从网卡回读64个Byte,如果实际网卡的返回体没有64Byte,就会导致时钟延展;
2.在drivers/internal/chip/chip_smc/smc.cpp中的forward_by_front_chip中,在 if (!is_smc) {}分支里,forward_write的入参buffer_offset来自于csr中配置的OffsetWidth,对SP681网卡来说就是0,这会导致smc收不到BMC想发给网卡的请求体。

你好,component_drivers的两个问题是否解决

目前完成问题确认 已反馈需求,社区应该在Q3解决问题

好的

@liujie_11 问下社区的Issue和MR链接有吗?

之前以为沟通确认问题之后以为华为内部会提。

这次的RM sig来不及了,下次rm sig之前我们提一下。

问题关闭跟踪