From 16154c431d5c694707b12cdb3ab3b52207d9c44d Mon Sep 17 00:00:00 2001
From: veega <zhuweijia@huawei.com>
Date: Fri, 15 Sep 2023 09:32:33 +0800
Subject: [PATCH] hikptool: optimized display the hot-plug card info in
 nic_port cmd

A command word was added to query the port information display capability.
If a port does not support a flexible card, the card information is not displayed.

Signed-off-by: veega <zhuweijia@huawei.com>
---
 net/nic/nic_mac/hikp_mac_cmd.h  |  1 +
 net/nic/nic_mac/hikp_nic_port.c | 81 +++++++++++++++++++++------------
 net/nic/nic_mac/hikp_nic_port.h | 17 ++++---
 3 files changed, 65 insertions(+), 34 deletions(-)

diff --git a/net/nic/nic_mac/hikp_mac_cmd.h b/net/nic/nic_mac/hikp_mac_cmd.h
index adaadf4..f74fd2a 100644
--- a/net/nic/nic_mac/hikp_mac_cmd.h
+++ b/net/nic/nic_mac/hikp_mac_cmd.h
@@ -31,6 +31,7 @@ enum mac_port_sub_cmd {
 	QUERY_PORT_PHY_DFX,
 	QUERY_HOT_PLUG_CARD_DFX,
 	QUERY_PORT_CDR_DFX,
+	QUERY_PORT_INFO_DFX_CAP,
 };

 enum mac_dump_reg_sub_cmd {
diff --git a/net/nic/nic_mac/hikp_nic_port.c b/net/nic/nic_mac/hikp_nic_port.c
index c9f46fc..5ba6927 100644
--- a/net/nic/nic_mac/hikp_nic_port.c
+++ b/net/nic/nic_mac/hikp_nic_port.c
@@ -361,11 +361,12 @@ static void mac_cmd_disp_arb_info(const struct mac_cmd_arb_dfx *arb_dfx)

 static void mac_cmd_disp_hot_plug_card_info(const struct cmd_hot_plug_card_info *hpc_dfx)
 {
-	printf("\n======================== HOT PLUG CARD INFO =======================\n");
+	printf("\n===================== HOT PLUG CARD INFO =====================\n");

 	printf("hot plug card in position: 0x%x\n", hpc_dfx->in_pos);
 	printf("support type: 0x%x\n", hpc_dfx->support_type);
-	printf("current type: 0x%x\n", hpc_dfx->cur_type);
+	if (hpc_dfx->in_pos)
+		printf("current type: 0x%x\n", hpc_dfx->cur_type);
 	printf("----------------------------------------------------------------------------\n");
 }

@@ -491,35 +492,59 @@ static void mac_cmd_show_port_dfx(struct major_cmd_ctrl *self, uint32_t mask)
 	}
 }

-static void mac_cmd_port_execute(struct major_cmd_ctrl *self)
+static int mac_cmd_get_port_dfx_cap(uint32_t *cap)
 {
 	struct mac_cmd_port_hardware *port_hw = NULL;
+	struct mac_cmd_port_dfx_cap *dfx_cap = NULL;
+	struct hikp_cmd_ret *dfx_cap_resp = NULL;
 	struct hikp_cmd_ret *hw_cmd_ret = NULL;
-	uint32_t mask;
 	int ret;

-	if (!g_port_info.port_flag) {
-		self->err_no = -EINVAL;
-		snprintf(self->err_str, sizeof(self->err_str), "Need port id.");
-		return;
+	ret = mac_cmd_get_dfx_cfg(QUERY_PORT_INFO_DFX_CAP, &dfx_cap_resp);
+	if (ret == 0) {
+		dfx_cap = (struct mac_cmd_port_dfx_cap *)dfx_cap_resp->rsp_data;
+		*cap = dfx_cap->cap_bit_map;
+		free(dfx_cap_resp);
+		dfx_cap_resp = NULL;
+		return ret;
 	}

+	/* not support get capability, so use old process */
 	ret = mac_cmd_get_dfx_cfg(QUERY_PORT_HARDWARE, &hw_cmd_ret);
-	if (ret != 0) {
-		printf("hikp_data_proc get port hw failed.\n");
-		self->err_no = -ENOSPC;
-		return;
-	}
+	if (ret)
+		return ret;

-	mask = MAC_LSPORT_LINK | MAC_LSPORT_MAC |
-	       MAC_LSPORT_ARB | MAC_HOT_PLUG_CARD | MAC_LSPORT_CDR;
+	*cap = MAC_LSPORT_LINK | MAC_LSPORT_MAC | MAC_LSPORT_ARB |
+	       MAC_HOT_PLUG_CARD | MAC_LSPORT_CDR;
 	port_hw = (struct mac_cmd_port_hardware *)(hw_cmd_ret->rsp_data);
 	if (port_hw->port_type == HIKP_PORT_TYPE_PHY ||
 	    port_hw->port_type == HIKP_PORT_TYPE_PHY_SDS)
-		mask |= MAC_LSPORT_PHY;
+		*cap |= MAC_LSPORT_PHY;

-	mac_cmd_show_port_dfx(self, mask);
 	free(hw_cmd_ret);
+	hw_cmd_ret = NULL;
+	return ret;
+}
+
+static void mac_cmd_port_execute(struct major_cmd_ctrl *self)
+{
+	uint32_t dfx_cap;
+	int ret;
+
+	if (!g_port_info.port_flag) {
+		self->err_no = -EINVAL;
+		snprintf(self->err_str, sizeof(self->err_str), "Need port id.");
+		return;
+	}
+
+	ret = mac_cmd_get_port_dfx_cap(&dfx_cap);
+	if (ret) {
+		self->err_no = ret;
+		snprintf(self->err_str, sizeof(self->err_str), "Get DFX capability failed.");
+		return;
+	}
+
+	mac_cmd_show_port_dfx(self, dfx_cap);
 }

 static int mac_cmd_get_port_target(struct major_cmd_ctrl *self, const char *argv)
diff --git a/net/nic/nic_mac/hikp_nic_port.h b/net/nic/nic_mac/hikp_nic_port.h
index 42ab3f9..78928b3 100644
--- a/net/nic/nic_mac/hikp_nic_port.h
+++ b/net/nic/nic_mac/hikp_nic_port.h
@@ -225,6 +225,11 @@ struct mac_cmd_cdr_dfx {
 	struct mac_port_cdr_dfx host_cdr;
 };

+struct mac_cmd_port_dfx_cap {
+	uint32_t cap_bit_map;
+	uint32_t rsvd[3];
+};
+
 struct mac_cmd_dfx_callback {
 	uint32_t mask;
 	void (*show_dfx)(struct major_cmd_ctrl *self);
--
2.36.1.windows.1
