问题描述
OpenUBMC通过MCTP over SMBus通信。MCTP Set EID命令通信正常。但是适配使用Hi182x的网卡NC-SI over MCTP,就出现“method call timeout”。
如下是在component_drivers的chip和bus层增加elog的现象:
1、增加log
在component_drivers的如下文件的函数中增加打印:
bus层:drivers/internal/bus/bus_i2c/i2c.cpp的bus_i2c::normal_read()增加打印。
chip层: drivers/internal/chip/chip_base/chip.cpp的chip_base::data_access()中增加打印。
2、 【正常】MCTP 控制报文交互正常,成功创建endpoint。
~ ~ $ busctl --user tree bmc.kepler.mctpd 中有
[2026-03-16 16:24:16] /bmc/kepler/Systems/1/Mctp
[2026-03-16 16:24:16] /bmc/kepler/Systems/1/Mctp/Endpoint
[2026-03-16 16:24:16] /bmc/kepler/Systems/1/Mctp/Endpoint/0103_50
[2026-03-16 16:24:16] /bmc/kepler/Systems/1/Mctp/Endpoint/0103_50/2
[2026-03-16 16:24:16] /bmc/kepler/Systems/1/Mctp/MctpBinding
[2026-03-16 16:24:16] /bmc/kepler/Systems/1/Mctp/Routing
[2026-03-16 16:24:16] /bmc/kepler/mctpd
[2026-03-16 16:24:16] /bmc/kepler/mctpd/MicroComponent
[2026-03-16 16:24:16] /bmc/kepler/mctpd/MicroComponent/Debug
3、【异常】使用Hi182x的网卡NC-SI驱动进行网卡管理,MCTPD报timeout超时:
3.1 修改component_drivers: drivers/pcie_nic_card/hisi/hi182x/hi182x_card.cpp中的hi182x_card::start_ncsi_protocol(),使得及时BDF是0,也创建mctp对象。
3.2 component_drivers: libraries/mctp/mctp.cpp中增加request日志。
最终app.log中的日志
a) NC-SI over MCTP发送Request
![]()
b) chip层写Request: (没有添加写Request的详细数据LOG)
![]()
c) chip和bus层读Response:bus层将网卡回应的数据全部读回了,chip层也从bus层全部拿到了Response。
d) 15秒后MCTP层报timeout:()
component_drivers主机libraries/mctp/mctp.cpp的mctp::request()函数中调用service->timeout_call()设置的超时是15秒
![]()
环境信息
-
操作系统:Ubuntu 24.04
-
软件版本:OpenUBMC2512,没有SP1。参考《南向适配网迅网卡经验分享》进行自己网卡的SMBus适配,使用的OpenUBMC master,网卡纯slave。MCTP over SMBus帧中“Command Code”是0x1F。
-
硬件配置:米尔3093开发板,使用I2C-8,网卡csr中driver和mctp相关配置:
“Unit”: {
“Type”: “PCIeNicCard”,
“Name”: “PCIeNicCard_1”,
“Compatible”: [“hisi_1822”, “hisi_182x”]
},
“Chip_SmbusChip”: {
“Address”: 100,
“AddrWidth”: 1,
“OffsetWidth”: 1,
“WriteTmout”: 1000,
“ReadTmout”: 1000,
“HealthStatus”: 0,
“ReadRetryTimes”: 3,
“DrvWriteDelay”: 255,
“WriteInterval”:255,
“ReadInterval”:255
},
“MctpBinding_1”: {
“BmcSMBusEid”: 8,
“BmcSMBusPhyAddr”: 16
},
“Endpoint_1”: {
“TargetEid”: “${Slot} |> expr($1 + 8)”,
“TargetPhyAddr”: 50,
“MessageType”: 2,
“MediumType”: 128,
“RefChip”: “#/Chip_SmbusChip”
},
重现步骤
-
网卡先启动,准备好SMBus总线上应答MCTP控制报文Request、NC-SI over MCTP 标准/OEM命令
-
启动MYIR 3093开发板,直到启动完成,导出app.log分析
期望结果
NC-SI over MCTP的命令与MCTP控制报文一样能够及时送达MCTPD。
实际结果
貌似MCTPD及时收到了控制报文(Set EID)的Response,而NC-SI over MCTP的Response超时了。
尝试过的解决方案
1、怀疑I2C总线读到的数据长度(129个)超过了Response的实际程度、造成上层解析出问题。修改网卡侧的I2C读响应处理、在没有数据时就不回应,结果造成总线挂死。观察《南向适配网迅网卡经验分享》中的tracmctp的截图,其SMBus_OEM Capture [RECV]中也是读取了129字节。 推测这个长度应该不影响MCTPD的解析。
2、怀疑网卡SMBus响应读Response时没有回送MCTP over SMBus的“Command Code” 0x1F;但修改后MCTP的Set EID Response就过不去,创建Endpoint失败。






