网卡PartNumber属性同步失败

问题描述

修改SP681网卡的CSR文件,使用同步语法将FRU信息中的部件编码同步到NetworkAdapter对象下的PartNumber属性,修改如下:


修改后BMC下出现属性同步报错:

The property PartNumber of the object NetworkAdapter_1_0101010301 is a synchronous property and cannot be set

日志如下:

请问下是否是PartNumber属性不支持同步语法更新?代码中是如何配置的?

环境信息

  • 操作系统:openEuler2403

  • 软件版本:OpenUBMC2512 sp2

  • 硬件配置:无

期望结果

NetworkAdapter对象下的PartNumber能够正常同步,BMC下无异常报错

实际结果

NetworkAdapter对象下的PartNumber无法同步,BMC异常报错导致服务终止

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

建议解决方案

  1. 查阅已评审的更新顺序方案
    访问论坛链接(如https://discuss.openubmc.cn/t/topic/4950),获取网卡PartNumber、SerialNumber更新优先级顺序的标准流程,避免重复造轮。

  2. 检查代码中PartNumber的同步定义
    搜索pcie_device仓库中的set_sn_pn相关实现,确认NetworkAdapter对象的PartNumber属性是否已有默认同步源(如从VPD或FRU直接读取)。若有,则应移除CSR中的同步语法,让已有机制工作;若无,则需按标准方法添加广播或轮询逻辑。

  3. 根据属性是否通知选择方式

    • 若有属性变更通知:注册监听回调,在收到信号时更新本地PartNumber。
    • 若无通知:在CSR中可通过循环轮询(例如使用Scanner或定时任务)从源读取值并设置。
  4. 考虑修改PartNumber为广播属性
    如论坛诉求2所述,若同步语法无法满足需求,可修改NetworkAdapter的PartNumber属性实现,使其在变更时广播信号,这样CSR中的<=/同步语法就能正常工作。

  5. 确认CSR配置语法正确性
    检查您修改的CSR文件,确保同步语法格式正确(如PartNumber: "<=/某个FruData.PartNumber"),并且引用的源对象确实存在且属性已定义。同时,目标对象(NetworkAdapter)的PartNumber属性在model.json中应允许作为同步目标(不应被标记为ReadOnly或Persist后的只读状态)。

结论

PartNumber属性并非绝对不支持同步语法,但在当前OpenUBMC2512 sp2版本中,NetworkAdapter的PartNumber可能因不广播变更或已被其他同步逻辑占用而导致CSR配置失败。建议您:

  • 优先参考论坛中已评审的优先级顺序和pcie_device仓库中的标准实现。
  • 检查南向驱动是否已包含PartNumber同步,避免重复配置。
  • 若必须使用同步语法,需确保源属性变更时发出信号,或改用监听/轮询方式。

以上分析完全基于您提供的上下文信息,未引入外部知识。如有更多细节(如CSR配置片段),可进一步定位。

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

根据您提供的问题描述以及上下文信息(包括知识图谱、文档块和搜索结果),我对您遇到的错误进行分析并给出相关建议。

问题分析

您在使用同步语法(<=/)将FRU中的部件编码(PartNumber)同步到NetworkAdapter对象时,BMC报错:

The property PartNumber of the object NetworkAdapter_1_0101010301 is a synchronous property and cannot be set

该错误表明PartNumber属性已被标记为同步属性,而尝试直接设置(或通过同步语法再次作为目标设置)时会触发此异常。这可能由以下原因导致:

  1. 属性变更不广播
    在论坛讨论(topic 6783)中,用户 huangyuxuan 明确指出:

    2512LTS分支上NetworkAdapter对象的PartNumber属性变更后不广播通知,PCIeCard对象的partnumber无法通过在csr里关联进行刷新。
    诉求:能否将NetworkAdapter对象的PartNumber属性修改为变更后广播。

    如果属性变更后不发出信号(signal),那么同步语法无法感知源值的变化,导致同步机制未能正确建立或更新。这可能使系统认为该属性已经是同步目标(但实际未正确连线),从而拒绝再次设置。

  2. 南向驱动已实现同步冲突
    在类似案例(LPe32002 FC卡,搜索结果6)中,南向设备树对象(属于 component_drivers)的PartNumber属性会被从FRU读取的值覆盖。这说明南向驱动中可能已经存在自动同步逻辑。若您在CSR中再次对同一个属性使用同步语法,会与已有的同步逻辑冲突,导致属性被标记为“同步属性”且无法被外部重复设置。

  3. 同步语法使用位置不当
    同步语法通常用于将源属性值自动同步到目标属性。但若目标属性本身在代码层面已被定义为只能由特定内部机制更新(如只读或已绑定其他源),则CSR中的<=/配置可能会被系统拒绝。

上下文中的参考信息

论坛已有讨论(文档块1)

  • 相同问题的诉求已在论坛提出,回复建议:

    PCIe卡更新PN/SN顺序参考 【已评审】网卡partnumber、serialnumber更新优先级顺序 - Hardware SIG / Hardware评审 - openUBMC 论坛
    如需自己定制,在pcie_device仓库中搜索set_sn_pn,如果属性变化有通知,可以注册监听,如果没有通知,可以自行使用一个循环轮询读取。

    这表明官方已有评审通过的更新顺序方案,且提供了监听或轮询两种方式供定制。

同步语法机制说明(搜索结果3)

同步语法是异步更新,需要源属性发出变更信号才能触发同步。如果NetworkAdapter的PartNumber属性本身不广播其变化,则同步语法无法正常生效。

南向驱动中的行为(搜索结果6)

对于FC卡,南向设备树对象的PartNumber在运行时会被FRU值覆盖。这提示您需要检查component_drivers组件或vpd组件中是否已经为SP681网卡实现了PartNumber的同步逻辑。如果已实现,CSR中不应重复配置同步语法,而应确保南向驱动正确加载和运行。

建议解决方案

  1. 查阅已评审的更新顺序方案
    访问论坛链接(如https://discuss.openubmc.cn/t/topic/4950),获取网卡PartNumber、SerialNumber更新优先级顺序的标准流程,避免重复造轮。

  2. 检查代码中PartNumber的同步定义
    搜索pcie_device仓库中的set_sn_pn相关实现,确认NetworkAdapter对象的PartNumber属性是否已有默认同步源(如从VPD或FRU直接读取)。若有,则应移除CSR中的同步语法,让已有机制工作;若无,则需按标准方法添加广播或轮询逻辑。

  3. 根据属性是否通知选择方式

    • 若有属性变更通知:注册监听回调,在收到信号时更新本地PartNumber。
    • 若无通知:在CSR中可通过循环轮询(例如使用Scanner或定时任务)从源读取值并设置。
  4. 考虑修改PartNumber为广播属性
    如论坛诉求2所述,若同步语法无法满足需求,可修改NetworkAdapter的PartNumber属性实现,使其在变更时广播信号,这样CSR中的<=/同步语法就能正常工作。

  5. 确认CSR配置语法正确性
    检查您修改的CSR文件,确保同步语法格式正确(如PartNumber: "<=/某个FruData.PartNumber"),并且引用的源对象确实存在且属性已定义。同时,目标对象(NetworkAdapter)的PartNumber属性在model.json中应允许作为同步目标(不应被标记为ReadOnly或Persist后的只读状态)。

结论

PartNumber属性并非绝对不支持同步语法,但在当前OpenUBMC2512 sp2版本中,NetworkAdapter的PartNumber可能因不广播变更或已被其他同步逻辑占用而导致CSR配置失败。建议您:

  • 优先参考论坛中已评审的优先级顺序和pcie_device仓库中的标准实现。
  • 检查南向驱动是否已包含PartNumber同步,避免重复配置。
  • 若必须使用同步语法,需确保源属性变更时发出信号,或改用监听/轮询方式。

以上分析完全基于您提供的上下文信息,未引入外部知识。如有更多细节(如CSR配置片段),可进一步定位。

c_network_adapter:init_asset_data_info()这里对网卡的PartNumber进行了赋值,对于同步语法的属性,代码不能进行赋值,否则会报错。

建议取别名,代码赋值时对别名进行赋值