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[] = {
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,
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[] = {
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)},
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[] = {
struct bnxt *bp = eth_dev->data->dev_private;
unsigned int num_q_stats;
- 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;
- }
+ rc = is_bnxt_in_error(bp);
+ if (rc)
+ return rc;
+
+ 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);
if (unlikely(rc))
return rc;
}
+
rc = bnxt_hwrm_func_qstats(bp, 0xffff, bnxt_stats);
- if (unlikely(rc))
- return rc;
return rc;
}
-void bnxt_stats_reset_op(struct rte_eth_dev *eth_dev)
+int bnxt_stats_reset_op(struct rte_eth_dev *eth_dev)
{
struct bnxt *bp = eth_dev->data->dev_private;
unsigned int i;
+ int ret;
+
+ ret = is_bnxt_in_error(bp);
+ 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;
+ return -EINVAL;
}
- bnxt_clear_all_hwrm_stat_ctxs(bp);
+ ret = bnxt_clear_all_hwrm_stat_ctxs(bp);
for (i = 0; i < bp->rx_cp_nr_rings; i++) {
struct bnxt_rx_queue *rxq = bp->rx_queues[i];
rte_atomic64_clear(&rxq->rx_mbuf_alloc_fail);
}
+
+ return ret;
}
int bnxt_dev_xstats_get_op(struct rte_eth_dev *eth_dev,
struct rte_eth_xstat *xstats, unsigned int n)
{
struct bnxt *bp = eth_dev->data->dev_private;
-
unsigned int count, i;
uint64_t tx_drop_pkts;
unsigned int rx_port_stats_ext_cnt;
unsigned int tx_port_stats_ext_cnt;
unsigned int stat_size = sizeof(uint64_t);
unsigned int stat_count;
+ int rc;
+
+ rc = is_bnxt_in_error(bp);
+ if (rc)
+ return rc;
+
+ if (xstats == NULL)
+ return 0;
memset(xstats, 0, sizeof(*xstats));
bnxt_hwrm_port_qstats(bp);
bnxt_hwrm_func_qstats_tx_drop(bp, 0xffff, &tx_drop_pkts);
bnxt_hwrm_ext_port_qstats(bp);
- rx_port_stats_ext_cnt = bp->fw_rx_port_stats_ext_size / stat_size;
- tx_port_stats_ext_cnt = bp->fw_tx_port_stats_ext_size / stat_size;
+ rx_port_stats_ext_cnt = RTE_MIN(RTE_DIM(bnxt_rx_ext_stats_strings),
+ (bp->fw_rx_port_stats_ext_size /
+ stat_size));
+ tx_port_stats_ext_cnt = RTE_MIN(RTE_DIM(bnxt_tx_ext_stats_strings),
+ (bp->fw_tx_port_stats_ext_size /
+ stat_size));
count = RTE_DIM(bnxt_rx_stats_strings) +
RTE_DIM(bnxt_tx_stats_strings) + 1/* For tx_drop_pkts */ +
xstats[count].value = rte_le_to_cpu_64(tx_drop_pkts);
count++;
- for (i = 0; i < tx_port_stats_ext_cnt; i++) {
- uint64_t *tx_stats_ext = (uint64_t *)bp->hw_tx_port_stats_ext;
+ for (i = 0; i < rx_port_stats_ext_cnt; i++) {
+ uint64_t *rx_stats_ext = (uint64_t *)bp->hw_rx_port_stats_ext;
xstats[count].value = rte_le_to_cpu_64
- (*(uint64_t *)((char *)tx_stats_ext +
- bnxt_tx_ext_stats_strings[i].offset));
+ (*(uint64_t *)((char *)rx_stats_ext +
+ bnxt_rx_ext_stats_strings[i].offset));
count++;
}
- for (i = 0; i < rx_port_stats_ext_cnt; i++) {
- uint64_t *rx_stats_ext = (uint64_t *)bp->hw_rx_port_stats_ext;
+ for (i = 0; i < tx_port_stats_ext_cnt; i++) {
+ uint64_t *tx_stats_ext = (uint64_t *)bp->hw_tx_port_stats_ext;
xstats[count].value = rte_le_to_cpu_64
- (*(uint64_t *)((char *)rx_stats_ext +
- bnxt_rx_ext_stats_strings[i].offset));
+ (*(uint64_t *)((char *)tx_stats_ext +
+ bnxt_tx_ext_stats_strings[i].offset));
count++;
}
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) +
RTE_DIM(bnxt_tx_stats_strings) + 1 +
RTE_DIM(bnxt_rx_ext_stats_strings) +
RTE_DIM(bnxt_tx_ext_stats_strings);
+ struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;
unsigned int i, count;
+ int rc;
+
+ rc = is_bnxt_in_error(bp);
+ if (rc)
+ return rc;
if (xstats_names != NULL) {
count = 0;
return stat_cnt;
}
-void bnxt_dev_xstats_reset_op(struct rte_eth_dev *eth_dev)
+int bnxt_dev_xstats_reset_op(struct rte_eth_dev *eth_dev)
{
struct bnxt *bp = eth_dev->data->dev_private;
+ int ret;
- if (bp->flags & BNXT_FLAG_PORT_STATS && BNXT_SINGLE_PF(bp))
- bnxt_hwrm_port_clr_stats(bp);
+ ret = is_bnxt_in_error(bp);
+ if (ret)
+ return ret;
- if (BNXT_VF(bp))
- PMD_DRV_LOG(ERR, "Operation not supported on a VF device\n");
- if (!BNXT_SINGLE_PF(bp))
- PMD_DRV_LOG(ERR, "Operation not supported on a MF device\n");
- 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");
+ 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;
}
int bnxt_dev_xstats_get_by_id_op(struct rte_eth_dev *dev, const uint64_t *ids,
RTE_DIM(bnxt_tx_stats_strings) + 1 +
RTE_DIM(bnxt_rx_ext_stats_strings) +
RTE_DIM(bnxt_tx_ext_stats_strings);
+ struct bnxt *bp = dev->data->dev_private;
struct rte_eth_xstat xstats[stat_cnt];
uint64_t values_copy[stat_cnt];
uint16_t i;
+ int rc;
+
+ rc = is_bnxt_in_error(bp);
+ if (rc)
+ return rc;
if (!ids)
return bnxt_dev_xstats_get_op(dev, xstats, stat_cnt);
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]];
}
RTE_DIM(bnxt_rx_ext_stats_strings) +
RTE_DIM(bnxt_tx_ext_stats_strings);
struct rte_eth_xstat_name xstats_names_copy[stat_cnt];
+ struct bnxt *bp = dev->data->dev_private;
uint16_t i;
+ int rc;
+
+ rc = is_bnxt_in_error(bp);
+ if (rc)
+ return rc;
if (!ids)
return bnxt_dev_xstats_get_names_op(dev, xstats_names,
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);