Scanner打开9548通道失败

问题描述

DC cycle稳定性测试,出现一块nvme硬盘温度丢失现象,且后续一直没有恢复。

查看后台发现Scanner状态异常,导致Connector未加载,相应的Nvme对象没有创建。
直接访问Chip,是正常的;用Scanner访问,会报错(看错误描述是打开通道失败):

BMC.Error.Unknow: ./opt/bmc/libmc/lualib/sd_bus/object.lua:990: bus: I2c_6, chip: Pca9545_i2c6_E2_5_E4_0101 open channel(5) failed, error: ./opt/bmc/apps/hwproxy/lualib/chip.lua:657: ./opt/bmc/apps/hwproxy/lualib/stream/i2c.lua:120: response error, i2c write fail, ret: 5, input:{“addrWidth”:1,“addr”:228,“is_trace”:false,“has_error”:false,“offset”:0,“name”:“Pca9545_i2c6_E2_5_E4_0101”,“len”:1,“offsetWidth”:0,“type”:1,“rw_type”:0,“requestor”:“bmc.kepler.hwproxy”,“buffer”:"20 ",“mask”:255}[times:3]

CSR配置如下:

环境信息

openUBMC 2512 SP1版本
hwproxy/1.110.0@openubmc/stable#eacdf0c7950e3a3af3bf25a249beb756%1769571447.712
hwdiscovery/1.100.11@openubmc/stable#b5d8c822cd96d23d589cc5f6f18f3a26%1768459019.306

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

三、结论与建议

结论:本次问题最可能的根因是 CSR配置文件中的I2cMux通道号(ChannelId)配置错误,或者是由 DC cycle测试引发的初始化时序/对象残留问题

建议排查步骤

  1. 重点审查CSR配置

    • 检查您提供的CSR中,Pca9545对象下所有I2cMux子对象的ChannelId属性。确保其值严格在 03 之间,尤其是在报错的I2c_6总线上
    • 对比报错日志中的 channel(5),确认是否有通道号被错误地写为 45,或是否存在配置与硬件原理图不符的情况。
  2. 检查对象初始化流程

    • 参照 《Nvme盘加载调速失败问题分析》 的处理逻辑,检查Pca9545对象及其通道对象(I2cMux)的析构函数(dtor())。确认在对象卸载时,是否已正确释放或关闭了已打开的I2C通道,以避免残留。
  3. 硬件与底层驱动验证

    • 使用 I2C Scanner and Reader Tool 手动在I2c_6总线上执行通道切换操作。验证能否正常切换并读写Pca9545后的设备,以排除硬件链路间歇性问题。
    • (可选) 联系硬件团队,确认NVMe背板的CPLD版本是否满足该硬件版本的需求。文档 《V3 上适配nvme盘个人总结》 提到,CPLD版本过旧可能导致Chip通信失败。更新CPLD固件可能解决问题。
  4. 优化系统鲁棒性

    • 建议在Scanner初始化逻辑中增加防抖处理重试机制,避免因一次瞬态错误就永久放弃加载对象。
    • 参考 《器件资源协作接口新增属性器件访问状态》 方案,为Pca9545等中继器件添加硬件访问状态监控属性。这可以帮助在故障时更精确地定位是末端硬盘问题,还是中间链路(如Pca9545)的问题。
点击此处查看详细分析解答

好的,根据您提供的问题描述和系统上下文信息,我对“Scanner打开9548通道失败”导致NVMe硬盘温度丢失的问题进行了综合分析。

该问题的核心是:在DC cycle测试后,Scanner对象因无法成功打开Pca9545多路复用器的通道而创建失败,进而导致NVMe温度传感器对象缺失,最终表现为硬盘温度丢失。

以下是对该问题的详细分析、可能原因及建议。


一、问题根因分析

根据您提供的日志和上下文,问题的直接触发点是:

bus: I2c_6, chip: Pca9545_i2c6_E2_5_E4_0101 open channel(5) failed

结合知识库中的信息,分析如下:

  1. 通道号配置错误是最大嫌疑

    • 知识库文档 《扩展板CSR配置指导书》《IEU CSR配置指导书》 均明确指出:Pca9545 的通道配置建议是 0-3不允许配置 1-4
    • 报错日志中尝试打开的是 channel(5),这明显超出了Pca9545的有效通道范围(0-3)。这是导致Scanner访问失败最直接、最可能的原因。
    • 因此,首要排查点在于您提供的CSR配置中,I2cMux 对象下的 ChannelId 属性是否被错误地配置为 54(某些系统内部映射可能导致偏移)。
  2. 初始化时序或对象残留问题

    • 文档 《Nvme盘加载调速失败问题分析》 描述了一个非常类似的场景:NVMe盘拔出时,与VPD Connect对象关联的定时任务未被正确停止(dtor()中缺少停止任务的代码)。当同一槽位重新插入硬盘时,旧任务残留,导致同名任务创建失败,从而使调速策略无法加载。
    • 您的场景中,DC cycle测试可能导致系统状态在断电上电过程中出现异常。如果前一次运行中,Scanner或Pca9545对象的析构函数未能正确清理其与I2C通道的上下文(例如,未释放通道锁定),那么在下一次上电时,新的Scanner初始化可能会因为与残留的、未释放的通道状态冲突而失败。
  3. 硬件链路瞬态或配置漂移

    • 知识库案例 《Scanner加载失败》 中提到,I2C读失败(i2c read fail, ret: 5)通常与硬件链路相关,如对端设备不存在或链路不通。但用户反馈“重启就恢复了”,排除了永久性硬件故障。
    • 在DC cycle这种反复上下电的测试中,可能存在以下瞬态问题:
      • 电源时序问题:NVMe盘与BMC的供电顺序不一致,导致BMC尝试访问I2C设备时,NVMe盘或其背板上的Pca9545尚未完全上电初始化。
      • I2C总线锁死:在频繁断电过程中,I2C总线(本例为I2c_6)可能会陷入错误状态,需要一次干净的复位才能恢复。您的日志显示直接访问Chip正常但通过Scanner访问失败,这符合总线锁死或通道切换逻辑出错的典型表现。
    • 硬件故障:虽然“重启恢复”降低了概率,但不能完全排除Pca9545器件本身或I2C链路上有虚焊、接触不良等间歇性故障,在特定电压或温度条件下才触发。

二、与上下文信息的关联

  • c_nvme 对象与 Chip_Temp:知识库指出 c_nvme 通过 Chip_Temp 监控温度。您的场景中,Scanner因打不开Pca9545通道而失败,导致Chip_Temp(即 Scanner_Temp)对象无法创建,最终c_nvme对象因缺少依赖的温度传感器而无法生成,温度数据丢失。
  • Board_Name_OpenUBMCBMC.BMCAccessI2CDeviceFailure:此问题发生在OpenUBMC平台上,是一个典型的I2C设备访问失败的案例(BMC.BMCAccessI2CDeviceFailure事件)。这与知识库中描述的该事件类型完全吻合。
  • Disk6Event_NVMeTempHighMinor:虽然您的场景是温度丢失(低温),但知识库中记录了Disk6存在高温事件(Event_NVMeTempHighMinor)。这体现了温度监控的双向性(高温报警/低温丢失),其底层原因都可能与Scanner_Temp对象加载失败有关。

三、结论与建议

结论:本次问题最可能的根因是 CSR配置文件中的I2cMux通道号(ChannelId)配置错误,或者是由 DC cycle测试引发的初始化时序/对象残留问题

建议排查步骤

  1. 重点审查CSR配置

    • 检查您提供的CSR中,Pca9545对象下所有I2cMux子对象的ChannelId属性。确保其值严格在 03 之间,尤其是在报错的I2c_6总线上
    • 对比报错日志中的 channel(5),确认是否有通道号被错误地写为 45,或是否存在配置与硬件原理图不符的情况。
  2. 检查对象初始化流程

    • 参照 《Nvme盘加载调速失败问题分析》 的处理逻辑,检查Pca9545对象及其通道对象(I2cMux)的析构函数(dtor())。确认在对象卸载时,是否已正确释放或关闭了已打开的I2C通道,以避免残留。
  3. 硬件与底层驱动验证

    • 使用 I2C Scanner and Reader Tool 手动在I2c_6总线上执行通道切换操作。验证能否正常切换并读写Pca9545后的设备,以排除硬件链路间歇性问题。
    • (可选) 联系硬件团队,确认NVMe背板的CPLD版本是否满足该硬件版本的需求。文档 《V3 上适配nvme盘个人总结》 提到,CPLD版本过旧可能导致Chip通信失败。更新CPLD固件可能解决问题。
  4. 优化系统鲁棒性

    • 建议在Scanner初始化逻辑中增加防抖处理重试机制,避免因一次瞬态错误就永久放弃加载对象。
    • 参考 《器件资源协作接口新增属性器件访问状态》 方案,为Pca9545等中继器件添加硬件访问状态监控属性。这可以帮助在故障时更精确地定位是末端硬盘问题,还是中间链路(如Pca9545)的问题。

直接访问成功,Scanner显示读取失败

  1. Scanner是周期性访问,周期2秒,如果失败硬件访问失败,为了避免无效访问这个周期还会延长,所以,可以通过mdbctl连续访问持续10s ,观察是否可以稳定成功;
  2. 调试版本,可以观察一键收集日志中的器件访问统计日志,观察9545器件的成功和失败数统计,看看是否器件确实是概率性会访问失败

可以看看dmesg是否有对应的i2c报错?