[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