If the port contains CDRs, the nic_port command displays the hardware information of the CDRs, which helps locate port link setup faults.
Signed-off-by: veega zhuweijia@huawei.com --- net/nic/nic_mac/hikp_mac_cmd.h | 1 + net/nic/nic_mac/hikp_nic_port.c | 72 ++++++++++++++++++++++++++++++++- net/nic/nic_mac/hikp_nic_port.h | 49 +++++++++++++++++++--- 3 files changed, 116 insertions(+), 6 deletions(-)
diff --git a/net/nic/nic_mac/hikp_mac_cmd.h b/net/nic/nic_mac/hikp_mac_cmd.h index 5f0450a..adaadf4 100644 --- a/net/nic/nic_mac/hikp_mac_cmd.h +++ b/net/nic/nic_mac/hikp_mac_cmd.h @@ -30,6 +30,7 @@ enum mac_port_sub_cmd { QUERY_PORT_ADAPT_DFX, QUERY_PORT_PHY_DFX, QUERY_HOT_PLUG_CARD_DFX, + QUERY_PORT_CDR_DFX, };
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 22a6467..c9f46fc 100644 --- a/net/nic/nic_mac/hikp_nic_port.c +++ b/net/nic/nic_mac/hikp_nic_port.c @@ -405,6 +405,73 @@ static void mac_cmd_show_hot_plug_card(struct major_cmd_ctrl *self) free(cmd_ret); }
+static void mac_cmd_print_cdr_dfx(struct mac_cmd_cdr_dfx *cdr_dfx, struct mac_port_cdr_dfx *info) +{ + struct mac_item type_table[] = { + {PORT_CDR_SD5902, "sd5902"}, {PORT_CDR_SD5901, "sd5901"}, + }; + struct mac_item sd5902_mode[] = { + {SD5902_MODE_2PLL, "2pll"}, {SD5902_MODE_FASTPI, "fastpi"}, + }; + struct mac_item sd5901_mode[] = { + {SD5901_MODE_PCS, "pcs"}, {SD5901_MODE_CDR, "cdr"}, + }; + struct mac_item status_table[] = { + {CDR_STATUS_NORMAL, "normal"}, {CDR_STATUS_ERROR, "error"}, + }; + const char *type_str = mac_get_str(cdr_dfx->cdr_type, + type_table, HIKP_ARRAY_SIZE(type_table), "unknown"); + const char *mode_str = "NA"; + + for (uint32_t i = 0; i < cdr_dfx->cdr_num; i++) { + if (cdr_dfx->cdr_type == PORT_CDR_SD5902) { + mode_str = mac_get_str(info->dfx[i].cdr_mode, sd5902_mode, + HIKP_ARRAY_SIZE(sd5902_mode), "unknown"); + } else if (cdr_dfx->cdr_type == PORT_CDR_SD5901) { + mode_str = mac_get_str(info->dfx[i].cdr_mode, sd5901_mode, + HIKP_ARRAY_SIZE(sd5901_mode), "unknown"); + } + printf("\t|0x%-8x%-9u%-10s%-10s%-10s\n", info->dfx[i].cdr_addr, + info->dfx[i].cdr_start_lane, type_str, mode_str, + mac_get_str(info->dfx[i].cdr_err, + status_table, HIKP_ARRAY_SIZE(status_table), "unknown")); + } +} + +static void mac_cmd_disp_cdr_info(struct mac_cmd_cdr_dfx *cdr_dfx) +{ + if (!cdr_dfx->cdr_num) + return; + + printf("\n======================== PORT CDR INFO =======================\n"); + printf("direct\t|addr |lane |type |mode |status \n"); + printf("----------------------------------------------------------------------------\n"); + + printf("WIRE"); + mac_cmd_print_cdr_dfx(cdr_dfx, &cdr_dfx->wire_cdr); + + printf("HOST"); + mac_cmd_print_cdr_dfx(cdr_dfx, &cdr_dfx->host_cdr); +} + +static void mac_cmd_show_cdr(struct major_cmd_ctrl *self) +{ + struct mac_cmd_cdr_dfx *cdr_dfx = NULL; + struct hikp_cmd_ret *cmd_ret = NULL; + int ret; + + ret = mac_cmd_get_dfx_cfg(QUERY_PORT_CDR_DFX, &cmd_ret); + if (ret != 0) { + self->err_no = -ENOSPC; + snprintf(self->err_str, sizeof(self->err_str), "mac get cdr dfx failed."); + return; + } + + cdr_dfx = (struct mac_cmd_cdr_dfx *)(cmd_ret->rsp_data); + mac_cmd_disp_cdr_info(cdr_dfx); + free(cmd_ret); +} + static void mac_cmd_show_port_dfx(struct major_cmd_ctrl *self, uint32_t mask) { struct mac_cmd_dfx_callback dfx_cb[] = { @@ -413,6 +480,7 @@ static void mac_cmd_show_port_dfx(struct major_cmd_ctrl *self, uint32_t mask) {MAC_LSPORT_PHY, mac_cmd_show_phy}, {MAC_LSPORT_ARB, mac_cmd_show_arb}, {MAC_HOT_PLUG_CARD, mac_cmd_show_hot_plug_card}, + {MAC_LSPORT_CDR, mac_cmd_show_cdr} }; size_t size = HIKP_ARRAY_SIZE(dfx_cb); size_t i; @@ -425,9 +493,9 @@ 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) { - uint32_t mask = MAC_LSPORT_LINK | MAC_LSPORT_MAC | MAC_LSPORT_ARB | MAC_HOT_PLUG_CARD; struct mac_cmd_port_hardware *port_hw = NULL; struct hikp_cmd_ret *hw_cmd_ret = NULL; + uint32_t mask; int ret;
if (!g_port_info.port_flag) { @@ -443,6 +511,8 @@ static void mac_cmd_port_execute(struct major_cmd_ctrl *self) return; }
+ mask = 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) diff --git a/net/nic/nic_mac/hikp_nic_port.h b/net/nic/nic_mac/hikp_nic_port.h index f6334d0..42ab3f9 100644 --- a/net/nic/nic_mac/hikp_nic_port.h +++ b/net/nic/nic_mac/hikp_nic_port.h @@ -16,11 +16,12 @@
#include "hikp_net_lib.h"
-#define MAC_LSPORT_LINK HI_BIT(0) -#define MAC_LSPORT_MAC HI_BIT(1) -#define MAC_LSPORT_PHY HI_BIT(2) -#define MAC_LSPORT_ARB HI_BIT(3) -#define MAC_HOT_PLUG_CARD HI_BIT(4) +#define MAC_LSPORT_LINK HI_BIT(0) +#define MAC_LSPORT_MAC HI_BIT(1) +#define MAC_LSPORT_PHY HI_BIT(2) +#define MAC_LSPORT_ARB HI_BIT(3) +#define MAC_HOT_PLUG_CARD HI_BIT(4) +#define MAC_LSPORT_CDR HI_BIT(5)
enum { PORT_CFG_NOT_SET = 0, @@ -186,6 +187,44 @@ struct mac_cmd_phy_info { struct mac_cmd_phy_dfx phy_dfx; };
+enum { + PORT_CDR_SD5902 = 0, + PORT_CDR_SD5901, +}; + +enum { + SD5902_MODE_2PLL = 0, + SD5902_MODE_FASTPI, +}; + +enum { + SD5901_MODE_PCS = 0, + SD5901_MODE_CDR, +}; + +enum { + CDR_STATUS_NORMAL = 0, + CDR_STATUS_ERROR, +}; + +struct cdr_dfx_info { + uint8_t cdr_mode; + uint8_t cdr_addr; + uint8_t cdr_start_lane; + uint8_t cdr_err; /* 0:normal, 1:error */ +}; + +struct mac_port_cdr_dfx { + struct cdr_dfx_info dfx[2]; /* one side reserved max 2 cdr */ +}; + +struct mac_cmd_cdr_dfx { + uint8_t cdr_num; + uint8_t cdr_type; + struct mac_port_cdr_dfx wire_cdr; + struct mac_port_cdr_dfx host_cdr; +}; + struct mac_cmd_dfx_callback { uint32_t mask; void (*show_dfx)(struct major_cmd_ctrl *self);