于社区2603 basecode发现的问题
正常的smc透传命令帧:
当前南向驱动发送的smc透传命令帧:
BMC只发送了smc数据头,没有带上smbus请求体负载。
且smc数据头的读取长度字节固定为0x40,如果smbus从设备的返回体没有64Byte,就会导致时钟延展。
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想发给网卡的请求体。
答案内容由AI生成,仅供参考:
根据社区讨论记录,该问题定位在 component_drivers 组件中,具体现象、原因与解决进展如下。
问题现象
- 当前南向驱动发送的 SMC 透传命令帧只包含了 SMC 数据头,没有携带 SMBus 请求体负载。
- SMC 数据头的读取长度字节固定为 0x40(即 64)。如果 SMBus 从设备实际返回体不足 64 字节,会引发**时钟延展(clock stretching)**问题。
问题原因
社区成员 liujie_11 在 component_drivers 代码中定位到以下两个具体问题:
-
std_smbus.cpp 中 m_buffer_len 默认值为 64
- 如果
csr 中不配置该值,SMC 会固定从网卡回读 64 个 Byte。
- 当实际网卡的返回体不足 64 Byte 时,就会导致时钟延展。
-
drivers/internal/chip/chip_smc/smc.cpp 的 forward_by_front_chip 中 buffer_offset 取值问题
- 在
if (!is_smc) {} 分支里,forward_write 的入参 buffer_offset 来自 csr 中配置的 OffsetWidth。
- 对 SP681 网卡来说该值为 0,这会导致 SMC 收不到 BMC 想发给网卡的请求体。
解决进展
- liujie_11 表示:“目前完成问题确认,已反馈需求,社区应该在 Q3 解决问题。”
- 后续讨论中也提到,该需求会考虑在下次 RM SIG 之前提交。