WebUI存储管理页面,RAID卡下 所有 物理盘的"协商速率"均显示为 2.5 Gbps,storcli显示22.5Gbps,疑似枚举映射冲突
环境信息
- 软件版本:[OpenUBMC2512]
数据链路:
固件 → storelib(闭源) → sl.c:GetPDInfo → sl_pd.c:FillPDInfo → Lua枚举表 → WebUI
固件通过 MR_DCMD_PD_GET_INFO 返回 MR_PD_INFO 结构, linkSpeed 字段注释为 negotiated link speed (MR_PD_SPEED)
内部枚举 SML_PD_SPEED_TYPE_E 定义如下(sml_physical_drive.h):
typedef enum _tag_pd_speed_type {
PD_SPEED_UNDEFINED = 0, // 0
PD_SPEED_1P5G, // 1 - SAS 1.5G
PD_SPEED_3G, // 2 - SAS 3G
PD_SPEED_6G, // 3 - SAS 6G
PD_SPEED_12G, // 4 - SAS 12G
PD_SPEED_2P5G, // 5 - 2.5G (PCIe Gen1) ← 这里!
PD_SPEED_5G, // 6 - 5G (PCIe Gen2)
PD_SPEED_8G, // 7
…
PD_SPEED_22P5G = 20, // 20 - SAS 22.5G
} SML_PD_SPEED_TYPE_E;
Lua 侧映射(common_def.lua):
PD_PHYSICAL_SPEED = {
[5] = “2.5 Gbps”,
…
[20] = “22.5 Gbps”
}
仓库自带的 mr.h中 MR_PD_SPEED 枚举只定义了 0~4(对应1.5G/3G/6G/12G):
typedef enum _MR_PD_SPEED {
MR_PD_SPEED_UNKNOWN = 0, // not defined
MR_PD_SPEED_1p5G = 1, // 1.5Gb/s - SATA 150
MR_PD_SPEED_3G = 2, // 3.0Gb/s
MR_PD_SPEED_6G = 3, // 6.0Gb/s
MR_PD_SPEED_12G = 4, // 12.0Gb/s
MR_PD_SPEED_PCIE_2_5GT = 0x80, // 2.5GT/s
MR_PD_SPEED_PCIE_5GT = 0x81, // 5GT/s
MR_PD_SPEED_PCIE_8GT = 0x82, // 8GT/s
MR_PD_SPEED_PCIE_16GT = 0x83 // 16GT/s
} MR_PD_SPEED;
尝试过的解决方案
根据枚举值主观判断返回的数据枚举值是5(5对应2.5G,符合WebUI显示),修改/home/workspace/storage/src/lualib/drive/drive_object.lua:
-- 支持获取物理盘的接口速率(最大速率)
self.CapableSpeedGbs = (pd_info.device_speed == 5) and 20 or pd_info.device_speed
-- 支持获取物理盘的连接速率(协商速率)
self.NegotiatedSpeedGbs =(pd_info.link_speed== 5) and 20 or pd_info.link_speed
编译升级后Web界面硬盘协商速率显示:22.5Gbps
想请教各位:
1.固件返回的协商速率枚举值值是 5吗? 我查了目前的 mr.h, MR_PD_SPEED 枚举只有 0~4(1.5G/3G/6G/12G)+ 0x80 起的 PCIe 速率,5 是保留值,没有 22.5G 定义(上面有代码)。
2.为什么 openUBMC 内部 SML 枚举把 5 定义为 2.5G? 这个枚举表看起来是 SAS 速率(0 4)和 PCIe/NVMe 速率(5 19)混在一张表里,5 被占给了 2.5G(PCIe Gen1),而 22.5G 被追加到 20。这样固件枚举和内部枚举在 5 上冲突,导致 SAS4.0 的 22.5G 被误映射成 2.5G。这个设计是否合理?有没有官方说明?
3.我的分析有没有什么问题?如何修改才符合社区规范?



