net/bnxt: add counters to xstats
[dpdk.git] / drivers / net / bnxt / bnxt_stats.c
index 21012e1..29628bd 100644 (file)
@@ -55,32 +55,100 @@ static const struct bnxt_xstats_name_off bnxt_rx_stats_strings[] = {
                                rx_pause_frames)},
        {"rx_pfc_frames", offsetof(struct rx_port_stats,
                                rx_pfc_frames)},
+       {"rx_unsupported_opcode_frames", offsetof(struct rx_port_stats,
+                               rx_unsupported_opcode_frames)},
+       {"rx_unsupported_da_pausepfc_frames", offsetof(struct rx_port_stats,
+                               rx_unsupported_da_pausepfc_frames)},
+       {"rx_wrong_sa_frames", offsetof(struct rx_port_stats,
+                               rx_wrong_sa_frames)},
        {"rx_align_err_frames", offsetof(struct rx_port_stats,
                                rx_align_err_frames)},
+       {"rx_oor_len_frames", offsetof(struct rx_port_stats,
+                               rx_oor_len_frames)},
+       {"rx_code_err_frames", offsetof(struct rx_port_stats,
+                               rx_code_err_frames)},
+       {"rx_false_carrier_frames", offsetof(struct rx_port_stats,
+                               rx_false_carrier_frames)},
        {"rx_ovrsz_frames", offsetof(struct rx_port_stats,
                                rx_ovrsz_frames)},
        {"rx_jbr_frames", offsetof(struct rx_port_stats,
                                rx_jbr_frames)},
        {"rx_mtu_err_frames", offsetof(struct rx_port_stats,
                                rx_mtu_err_frames)},
+       {"rx_match_crc_frames", offsetof(struct rx_port_stats,
+                               rx_match_crc_frames)},
+       {"rx_promiscuous_frames", offsetof(struct rx_port_stats,
+                               rx_promiscuous_frames)},
        {"rx_tagged_frames", offsetof(struct rx_port_stats,
                                rx_tagged_frames)},
        {"rx_double_tagged_frames", offsetof(struct rx_port_stats,
                                rx_double_tagged_frames)},
+       {"rx_trunc_frames", offsetof(struct rx_port_stats,
+                               rx_trunc_frames)},
        {"rx_good_frames", offsetof(struct rx_port_stats,
                                rx_good_frames)},
+       {"rx_sch_crc_err_frames", offsetof(struct rx_port_stats,
+                               rx_sch_crc_err_frames)},
        {"rx_undrsz_frames", offsetof(struct rx_port_stats,
                                rx_undrsz_frames)},
+       {"rx_frag_frames", offsetof(struct rx_port_stats,
+                               rx_frag_frames)},
        {"rx_eee_lpi_events", offsetof(struct rx_port_stats,
                                rx_eee_lpi_events)},
        {"rx_eee_lpi_duration", offsetof(struct rx_port_stats,
                                rx_eee_lpi_duration)},
+       {"rx_llfc_physical_msgs", offsetof(struct rx_port_stats,
+                               rx_llfc_physical_msgs)},
+       {"rx_llfc_logical_msgs", offsetof(struct rx_port_stats,
+                               rx_llfc_logical_msgs)},
+       {"rx_llfc_msgs_with_crc_err", offsetof(struct rx_port_stats,
+                               rx_llfc_msgs_with_crc_err)},
+       {"rx_hcfc_msgs", offsetof(struct rx_port_stats,
+                               rx_hcfc_msgs)},
+       {"rx_hcfc_msgs_with_crc_err", offsetof(struct rx_port_stats,
+                               rx_hcfc_msgs_with_crc_err)},
        {"rx_bytes", offsetof(struct rx_port_stats,
                                rx_bytes)},
        {"rx_runt_bytes", offsetof(struct rx_port_stats,
                                rx_runt_bytes)},
        {"rx_runt_frames", offsetof(struct rx_port_stats,
                                rx_runt_frames)},
+       {"rx_pfc_xon2xoff_frames_pri0", offsetof(struct rx_port_stats,
+                               rx_pfc_xon2xoff_frames_pri0)},
+       {"rx_pfc_xon2xoff_frames_pri1", offsetof(struct rx_port_stats,
+                               rx_pfc_xon2xoff_frames_pri1)},
+       {"rx_pfc_xon2xoff_frames_pri2", offsetof(struct rx_port_stats,
+                               rx_pfc_xon2xoff_frames_pri2)},
+       {"rx_pfc_xon2xoff_frames_pri3", offsetof(struct rx_port_stats,
+                               rx_pfc_xon2xoff_frames_pri3)},
+       {"rx_pfc_xon2xoff_frames_pri4", offsetof(struct rx_port_stats,
+                               rx_pfc_xon2xoff_frames_pri4)},
+       {"rx_pfc_xon2xoff_frames_pri5", offsetof(struct rx_port_stats,
+                               rx_pfc_xon2xoff_frames_pri5)},
+       {"rx_pfc_xon2xoff_frames_pri6", offsetof(struct rx_port_stats,
+                               rx_pfc_xon2xoff_frames_pri6)},
+       {"rx_pfc_xon2xoff_frames_pri7", offsetof(struct rx_port_stats,
+                               rx_pfc_xon2xoff_frames_pri7)},
+       {"rx_pfc_ena_frames_pri0", offsetof(struct rx_port_stats,
+                               rx_pfc_ena_frames_pri0)},
+       {"rx_pfc_ena_frames_pri1", offsetof(struct rx_port_stats,
+                               rx_pfc_ena_frames_pri1)},
+       {"rx_pfc_ena_frames_pri2", offsetof(struct rx_port_stats,
+                               rx_pfc_ena_frames_pri2)},
+       {"rx_pfc_ena_frames_pri3", offsetof(struct rx_port_stats,
+                               rx_pfc_ena_frames_pri3)},
+       {"rx_pfc_ena_frames_pri4", offsetof(struct rx_port_stats,
+                               rx_pfc_ena_frames_pri4)},
+       {"rx_pfc_ena_frames_pri5", offsetof(struct rx_port_stats,
+                               rx_pfc_ena_frames_pri5)},
+       {"rx_pfc_ena_frames_pri6", offsetof(struct rx_port_stats,
+                               rx_pfc_ena_frames_pri6)},
+       {"rx_pfc_ena_frames_pri7", offsetof(struct rx_port_stats,
+                               rx_pfc_ena_frames_pri7)},
+       {"rx_stat_discard", offsetof(struct rx_port_stats,
+                               rx_stat_discard)},
+       {"rx_stat_err", offsetof(struct rx_port_stats,
+                               rx_stat_err)},
 };
 
 static const struct bnxt_xstats_name_off bnxt_tx_stats_strings[] = {
@@ -124,8 +192,32 @@ static const struct bnxt_xstats_name_off bnxt_tx_stats_strings[] = {
                                tx_jabber_frames)},
        {"tx_fcs_err_frames", offsetof(struct tx_port_stats,
                                tx_fcs_err_frames)},
+       {"tx_control_frames", offsetof(struct tx_port_stats,
+                               tx_control_frames)},
+       {"tx_oversz_frames", offsetof(struct tx_port_stats,
+                               tx_oversz_frames)},
+       {"tx_single_dfrl_frames", offsetof(struct tx_port_stats,
+                               tx_single_dfrl_frames)},
+       {"tx_multi_dfrl_frames", offsetof(struct tx_port_stats,
+                               tx_multi_dfrl_frames)},
+       {"tx_single_coll_frames", offsetof(struct tx_port_stats,
+                               tx_single_coll_frames)},
+       {"tx_multi_coll_frames", offsetof(struct tx_port_stats,
+                               tx_multi_coll_frames)},
+       {"tx_late_coll_frames", offsetof(struct tx_port_stats,
+                               tx_late_coll_frames)},
+       {"tx_excessive_coll_frames", offsetof(struct tx_port_stats,
+                               tx_excessive_coll_frames)},
+       {"tx_frag_frames", offsetof(struct tx_port_stats,
+                               tx_frag_frames)},
        {"tx_err", offsetof(struct tx_port_stats,
                                tx_err)},
+       {"tx_tagged_frames", offsetof(struct tx_port_stats,
+                               tx_tagged_frames)},
+       {"tx_dbl_tagged_frames", offsetof(struct tx_port_stats,
+                               tx_dbl_tagged_frames)},
+       {"tx_runt_frames", offsetof(struct tx_port_stats,
+                               tx_runt_frames)},
        {"tx_fifo_underruns", offsetof(struct tx_port_stats,
                                tx_fifo_underruns)},
        {"tx_eee_lpi_events", offsetof(struct tx_port_stats,
@@ -136,6 +228,32 @@ static const struct bnxt_xstats_name_off bnxt_tx_stats_strings[] = {
                                tx_total_collisions)},
        {"tx_bytes", offsetof(struct tx_port_stats,
                                tx_bytes)},
+       {"tx_pfc_ena_frames_pri0", offsetof(struct tx_port_stats,
+                               tx_pfc_ena_frames_pri0)},
+       {"tx_pfc_ena_frames_pri1", offsetof(struct tx_port_stats,
+                               tx_pfc_ena_frames_pri1)},
+       {"tx_pfc_ena_frames_pri2", offsetof(struct tx_port_stats,
+                               tx_pfc_ena_frames_pri2)},
+       {"tx_pfc_ena_frames_pri3", offsetof(struct tx_port_stats,
+                               tx_pfc_ena_frames_pri3)},
+       {"tx_pfc_ena_frames_pri4", offsetof(struct tx_port_stats,
+                               tx_pfc_ena_frames_pri4)},
+       {"tx_pfc_ena_frames_pri5", offsetof(struct tx_port_stats,
+                               tx_pfc_ena_frames_pri5)},
+       {"tx_pfc_ena_frames_pri6", offsetof(struct tx_port_stats,
+                               tx_pfc_ena_frames_pri6)},
+       {"tx_pfc_ena_frames_pri7", offsetof(struct tx_port_stats,
+                               tx_pfc_ena_frames_pri7)},
+       {"tx_llfc_logical_msgs", offsetof(struct tx_port_stats,
+                               tx_llfc_logical_msgs)},
+       {"tx_hcfc_msgs", offsetof(struct tx_port_stats,
+                               tx_hcfc_msgs)},
+       {"tx_xthol_frames", offsetof(struct tx_port_stats,
+                               tx_xthol_frames)},
+       {"tx_stat_discard", offsetof(struct tx_port_stats,
+                               tx_stat_discard)},
+       {"tx_stat_error", offsetof(struct tx_port_stats,
+                               tx_stat_error)},
 };
 
 static const struct bnxt_xstats_name_off bnxt_func_stats_strings[] = {
@@ -181,6 +299,7 @@ static const struct bnxt_xstats_name_off bnxt_func_stats_strings[] = {
                                rx_agg_aborts)},
 };
 
+
 static const struct bnxt_xstats_name_off bnxt_rx_ext_stats_strings[] = {
        {"link_down_events", offsetof(struct rx_port_stats_ext,
                                link_down_events)},
@@ -256,6 +375,46 @@ static const struct bnxt_xstats_name_off bnxt_rx_ext_stats_strings[] = {
                                pfc_pri7_rx_duration_us)},
        {"pfc_pri7_rx_transitions", offsetof(struct rx_port_stats_ext,
                                pfc_pri7_rx_transitions)},
+       {"rx_bits",             offsetof(struct rx_port_stats_ext,
+                               rx_bits)},
+       {"rx_buffer_passed_threshold", offsetof(struct rx_port_stats_ext,
+                               rx_buffer_passed_threshold)},
+       {"rx_pcs_symbol_err",   offsetof(struct rx_port_stats_ext,
+                               rx_pcs_symbol_err)},
+       {"rx_corrected_bits",   offsetof(struct rx_port_stats_ext,
+                               rx_corrected_bits)},
+       {"rx_discard_bytes_cos0", offsetof(struct rx_port_stats_ext,
+                               rx_discard_bytes_cos0)},
+       {"rx_discard_bytes_cos1", offsetof(struct rx_port_stats_ext,
+                               rx_discard_bytes_cos1)},
+       {"rx_discard_bytes_cos2", offsetof(struct rx_port_stats_ext,
+                               rx_discard_bytes_cos2)},
+       {"rx_discard_bytes_cos3", offsetof(struct rx_port_stats_ext,
+                               rx_discard_bytes_cos3)},
+       {"rx_discard_bytes_cos4", offsetof(struct rx_port_stats_ext,
+                               rx_discard_bytes_cos4)},
+       {"rx_discard_bytes_cos5", offsetof(struct rx_port_stats_ext,
+                               rx_discard_bytes_cos5)},
+       {"rx_discard_bytes_cos6", offsetof(struct rx_port_stats_ext,
+                               rx_discard_bytes_cos6)},
+       {"rx_discard_bytes_cos7", offsetof(struct rx_port_stats_ext,
+                               rx_discard_bytes_cos7)},
+       {"rx_discard_packets_cos0", offsetof(struct rx_port_stats_ext,
+                               rx_discard_packets_cos0)},
+       {"rx_discard_packets_cos1", offsetof(struct rx_port_stats_ext,
+                               rx_discard_packets_cos1)},
+       {"rx_discard_packets_cos2", offsetof(struct rx_port_stats_ext,
+                               rx_discard_packets_cos2)},
+       {"rx_discard_packets_cos3", offsetof(struct rx_port_stats_ext,
+                               rx_discard_packets_cos3)},
+       {"rx_discard_packets_cos4", offsetof(struct rx_port_stats_ext,
+                               rx_discard_packets_cos4)},
+       {"rx_discard_packets_cos5", offsetof(struct rx_port_stats_ext,
+                               rx_discard_packets_cos5)},
+       {"rx_discard_packets_cos6", offsetof(struct rx_port_stats_ext,
+                               rx_discard_packets_cos6)},
+       {"rx_discard_packets_cos7", offsetof(struct rx_port_stats_ext,
+                               rx_discard_packets_cos7)},
 };
 
 static const struct bnxt_xstats_name_off bnxt_tx_ext_stats_strings[] = {
@@ -357,11 +516,8 @@ int bnxt_stats_get_op(struct rte_eth_dev *eth_dev,
        if (rc)
                return rc;
 
-       memset(bnxt_stats, 0, sizeof(*bnxt_stats));
-       if (!(bp->flags & BNXT_FLAG_INIT_DONE)) {
-               PMD_DRV_LOG(ERR, "Device Initialization not complete!\n");
-               return -1;
-       }
+       if (!eth_dev->data->dev_started)
+               return -EIO;
 
        num_q_stats = RTE_MIN(bp->rx_cp_nr_rings,
                              (unsigned int)RTE_ETHDEV_QUEUE_STAT_CNTRS);
@@ -390,9 +546,8 @@ int bnxt_stats_get_op(struct rte_eth_dev *eth_dev,
                if (unlikely(rc))
                        return rc;
        }
+
        rc = bnxt_hwrm_func_qstats(bp, 0xffff, bnxt_stats);
-       if (unlikely(rc))
-               return rc;
        return rc;
 }
 
@@ -406,7 +561,7 @@ int bnxt_stats_reset_op(struct rte_eth_dev *eth_dev)
        if (ret)
                return ret;
 
-       if (!(bp->flags & BNXT_FLAG_INIT_DONE)) {
+       if (!eth_dev->data->dev_started) {
                PMD_DRV_LOG(ERR, "Device Initialization not complete!\n");
                return -EINVAL;
        }
@@ -437,6 +592,9 @@ int bnxt_dev_xstats_get_op(struct rte_eth_dev *eth_dev,
        if (rc)
                return rc;
 
+       if (xstats == NULL)
+               return 0;
+
        memset(xstats, 0, sizeof(*xstats));
 
        bnxt_hwrm_port_qstats(bp);
@@ -505,9 +663,9 @@ int bnxt_dev_xstats_get_op(struct rte_eth_dev *eth_dev,
        return stat_count;
 }
 
-int bnxt_dev_xstats_get_names_op(__rte_unused struct rte_eth_dev *eth_dev,
-       struct rte_eth_xstat_name *xstats_names,
-       __rte_unused unsigned int limit)
+int bnxt_dev_xstats_get_names_op(struct rte_eth_dev *eth_dev,
+                                struct rte_eth_xstat_name *xstats_names,
+                                __rte_unused unsigned int limit)
 {
        /* Account for the Tx drop pkts aka the Anti spoof counter */
        const unsigned int stat_cnt = RTE_DIM(bnxt_rx_stats_strings) +
@@ -573,30 +731,17 @@ int bnxt_dev_xstats_reset_op(struct rte_eth_dev *eth_dev)
        if (ret)
                return ret;
 
-       if (bp->flags & BNXT_FLAG_PORT_STATS && BNXT_SINGLE_PF(bp)) {
-               ret = bnxt_hwrm_port_clr_stats(bp);
-               if (ret != 0) {
-                       PMD_DRV_LOG(ERR, "Operation failed: %s\n",
-                                   strerror(-ret));
-                       return ret;
-               }
-       }
-
-       ret = 0;
-
-       if (BNXT_VF(bp)) {
-               PMD_DRV_LOG(ERR, "Operation not supported on a VF device\n");
-               ret = -ENOTSUP;
-       }
-       if (!BNXT_SINGLE_PF(bp)) {
-               PMD_DRV_LOG(ERR, "Operation not supported on a MF device\n");
-               ret = -ENOTSUP;
-       }
-       if (!(bp->flags & BNXT_FLAG_PORT_STATS)) {
+       if (BNXT_VF(bp) || !BNXT_SINGLE_PF(bp) ||
+           !(bp->flags & BNXT_FLAG_PORT_STATS)) {
                PMD_DRV_LOG(ERR, "Operation not supported\n");
-               ret = -ENOTSUP;
+               return -ENOTSUP;
        }
 
+       ret = bnxt_hwrm_port_clr_stats(bp);
+       if (ret != 0)
+               PMD_DRV_LOG(ERR, "Failed to reset xstats: %s\n",
+                           strerror(-ret));
+
        return ret;
 }
 
@@ -625,7 +770,7 @@ int bnxt_dev_xstats_get_by_id_op(struct rte_eth_dev *dev, const uint64_t *ids,
        for (i = 0; i < limit; i++) {
                if (ids[i] >= stat_cnt) {
                        PMD_DRV_LOG(ERR, "id value isn't valid");
-                       return -1;
+                       return -EINVAL;
                }
                values[i] = values_copy[ids[i]];
        }
@@ -659,7 +804,7 @@ int bnxt_dev_xstats_get_names_by_id_op(struct rte_eth_dev *dev,
        for (i = 0; i < limit; i++) {
                if (ids[i] >= stat_cnt) {
                        PMD_DRV_LOG(ERR, "id value isn't valid");
-                       return -1;
+                       return -EINVAL;
                }
                strcpy(xstats_names[i].name,
                                xstats_names_copy[ids[i]].name);