[PATCH v1 17/17] net/hinic3: add mbox count telemetry support
Jiacheng Ye
yejiacheng4 at h-partners.com
Sat Oct 10 16:45:08 CEST 2026
Expose a telemetry command reporting per-function mbox send/ack counters so
mailbox activity can be observed for diagnosis.
Signed-off-by: Jiacheng Ye <yejiacheng4 at h-partners.com>
---
doc/guides/rel_notes/release_26_11.rst | 1 +
drivers/net/hinic3/hinic3_telemetry.c | 104 +++++++++++++++++++++++++
drivers/net/hinic3/hinic3_telemetry.h | 25 ++++++
drivers/net/hinic3/meson.build | 1 +
4 files changed, 131 insertions(+)
create mode 100644 drivers/net/hinic3/hinic3_telemetry.c
create mode 100644 drivers/net/hinic3/hinic3_telemetry.h
diff --git a/doc/guides/rel_notes/release_26_11.rst b/doc/guides/rel_notes/release_26_11.rst
index 216f2b297e..8280d24750 100644
--- a/doc/guides/rel_notes/release_26_11.rst
+++ b/doc/guides/rel_notes/release_26_11.rst
@@ -103,6 +103,7 @@ New Features
* Added a compact CQE receive data path.
* Extended TCP segmentation offload (TSO) to 255 segments.
* Added a compact CQE transmit data path.
+ * Added a mailbox count telemetry endpoint.
* **Updated Intel iavf driver.**
diff --git a/drivers/net/hinic3/hinic3_telemetry.c b/drivers/net/hinic3/hinic3_telemetry.c
new file mode 100644
index 0000000000..63180aaf85
--- /dev/null
+++ b/drivers/net/hinic3/hinic3_telemetry.c
@@ -0,0 +1,104 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright (c) 2025-2026 Huawei Technologies Co., Ltd
+ */
+
+#include <rte_os.h>
+#include <rte_telemetry.h>
+#include "base/hinic3_compat.h"
+#include "base/hinic3_mgmt.h"
+#include "base/hinic3_hwdev.h"
+#include "base/hinic3_mbox.h"
+#include "hinic3_ethdev.h"
+#include "hinic3_telemetry.h"
+
+static int
+hinic3_get_mbox_info(struct rte_eth_dev *eth_dev, struct mbox_cnt_info *mbox_cnt)
+{
+ struct rte_pci_device *pci_dev = RTE_CLASS_TO_BUS_DEVICE(eth_dev, *pci_dev);
+ struct hinic3_nic_dev *nic_dev = HINIC3_ETH_DEV_TO_PRIVATE_NIC_DEV(eth_dev);
+ uint32_t i;
+
+ if (pci_dev == NULL) {
+ PMD_DRV_LOG(ERR, "Get pci device failed.");
+ return -1;
+ }
+
+ if (nic_dev == NULL) {
+ PMD_DRV_LOG(ERR, "Get nic device failed.");
+ return -1;
+ }
+
+ i = mbox_cnt->func_num;
+ mbox_cnt->func_num++;
+ snprintf(mbox_cnt->func_info[i].bus_info,
+ sizeof(mbox_cnt->func_info[i].bus_info), "%.4x_%.2x_%.2x_%x",
+ pci_dev->addr.domain, pci_dev->addr.bus,
+ pci_dev->addr.devid, pci_dev->addr.function);
+
+ mbox_cnt->func_info[i].send_cnt = nic_dev->hwdev->func_to_func->mbox_send_cnt;
+ mbox_cnt->func_info[i].ack_cnt = nic_dev->hwdev->func_to_func->mbox_ack_cnt;
+
+ return 0;
+}
+
+static int
+hinic3_telemetry_info(const char *cmd __rte_unused, const char *params __rte_unused,
+ struct rte_tel_data *d)
+{
+ struct rte_eth_dev *eth_dev = NULL;
+ struct rte_tel_data *i_data = NULL;
+ struct rte_tel_data *func_data = NULL;
+ struct mbox_cnt_info mbox_cnt;
+ uint32_t i;
+ int err;
+
+ memset(&mbox_cnt, 0, sizeof(struct mbox_cnt_info));
+
+ for (i = 0; i < RTE_MAX_ETHPORTS; i++) {
+ /* Skip if port is unused */
+ if (!rte_eth_dev_is_valid_port(i))
+ continue;
+
+ eth_dev = &rte_eth_devices[i];
+ if (eth_dev) {
+ err = hinic3_get_mbox_info(eth_dev, &mbox_cnt);
+ if (err) {
+ PMD_DRV_LOG(ERR, "Get mbox info failed.");
+ return -1;
+ }
+ }
+ }
+
+ rte_tel_data_start_dict(d);
+ rte_tel_data_add_dict_int(d, "func_num", mbox_cnt.func_num);
+
+ i_data = rte_tel_data_alloc();
+ if (i_data == NULL)
+ return -ENOMEM;
+
+ rte_tel_data_start_dict(i_data);
+
+ for (i = 0; i < mbox_cnt.func_num; i++) {
+ func_data = rte_tel_data_alloc();
+ if (func_data == NULL) {
+ rte_tel_data_free(i_data);
+ return -ENOMEM;
+ }
+
+ rte_tel_data_start_dict(func_data);
+ rte_tel_data_add_dict_int(func_data, "send_cnt", mbox_cnt.func_info[i].send_cnt);
+ rte_tel_data_add_dict_int(func_data, "ack_cnt", mbox_cnt.func_info[i].ack_cnt);
+ rte_tel_data_add_dict_container(i_data, mbox_cnt.func_info[i].bus_info,
+ func_data, 0);
+ }
+
+ rte_tel_data_add_dict_container(d, "func_info", i_data, 0);
+
+ return 0;
+}
+
+RTE_INIT(hinic3_init_telemetry)
+{
+ rte_telemetry_register_cmd("/hinic3/mbox_cnt", hinic3_telemetry_info,
+ "Returns mbox send and ack count information");
+}
diff --git a/drivers/net/hinic3/hinic3_telemetry.h b/drivers/net/hinic3/hinic3_telemetry.h
new file mode 100644
index 0000000000..8751082061
--- /dev/null
+++ b/drivers/net/hinic3/hinic3_telemetry.h
@@ -0,0 +1,25 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright (c) 2025-2026 Huawei Technologies Co., Ltd
+ */
+
+#ifndef _HINIC3_TELEMETRY_H_
+#define _HINIC3_TELEMETRY_H_
+
+#include <stdint.h>
+
+#define HINIC_PF_MAX_SIZE 16
+#define HINIC_VF_MAX_SIZE 4096
+#define BUSINFO_LEN 32
+
+struct func_mbox_cnt_info {
+ char bus_info[BUSINFO_LEN];
+ uint64_t send_cnt;
+ uint64_t ack_cnt;
+};
+
+struct mbox_cnt_info {
+ struct func_mbox_cnt_info func_info[HINIC_PF_MAX_SIZE + HINIC_VF_MAX_SIZE];
+ uint32_t func_num;
+};
+
+#endif /* _HINIC3_TELEMETRY_H_ */
diff --git a/drivers/net/hinic3/meson.build b/drivers/net/hinic3/meson.build
index 3ce5a68fb2..400c4f1a53 100644
--- a/drivers/net/hinic3/meson.build
+++ b/drivers/net/hinic3/meson.build
@@ -23,6 +23,7 @@ sources = files(
'hinic3_flow.c',
'hinic3_rx.c',
'hinic3_tx.c',
+ 'hinic3_telemetry.c',
)
includes += include_directories('base')
--
2.33.0
More information about the dev
mailing list