1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2014-2018 Broadcom
8 #include <rte_string_fns.h>
9 #include <rte_byteorder.h>
13 #include "bnxt_hwrm.h"
15 #include "bnxt_stats.h"
17 #include "hsi_struct_def_dpdk.h"
19 static const struct bnxt_xstats_name_off bnxt_rx_stats_strings[] = {
20 {"rx_64b_frames", offsetof(struct rx_port_stats,
22 {"rx_65b_127b_frames", offsetof(struct rx_port_stats,
24 {"rx_128b_255b_frames", offsetof(struct rx_port_stats,
25 rx_128b_255b_frames)},
26 {"rx_256b_511b_frames", offsetof(struct rx_port_stats,
27 rx_256b_511b_frames)},
28 {"rx_512b_1023b_frames", offsetof(struct rx_port_stats,
29 rx_512b_1023b_frames)},
30 {"rx_1024b_1518b_frames", offsetof(struct rx_port_stats,
31 rx_1024b_1518b_frames)},
32 {"rx_good_vlan_frames", offsetof(struct rx_port_stats,
33 rx_good_vlan_frames)},
34 {"rx_1519b_2047b_frames", offsetof(struct rx_port_stats,
35 rx_1519b_2047b_frames)},
36 {"rx_2048b_4095b_frames", offsetof(struct rx_port_stats,
37 rx_2048b_4095b_frames)},
38 {"rx_4096b_9216b_frames", offsetof(struct rx_port_stats,
39 rx_4096b_9216b_frames)},
40 {"rx_9217b_16383b_frames", offsetof(struct rx_port_stats,
41 rx_9217b_16383b_frames)},
42 {"rx_total_frames", offsetof(struct rx_port_stats,
44 {"rx_ucast_frames", offsetof(struct rx_port_stats,
46 {"rx_mcast_frames", offsetof(struct rx_port_stats,
48 {"rx_bcast_frames", offsetof(struct rx_port_stats,
50 {"rx_fcs_err_frames", offsetof(struct rx_port_stats,
52 {"rx_ctrl_frames", offsetof(struct rx_port_stats,
54 {"rx_pause_frames", offsetof(struct rx_port_stats,
56 {"rx_pfc_frames", offsetof(struct rx_port_stats,
58 {"rx_align_err_frames", offsetof(struct rx_port_stats,
59 rx_align_err_frames)},
60 {"rx_ovrsz_frames", offsetof(struct rx_port_stats,
62 {"rx_jbr_frames", offsetof(struct rx_port_stats,
64 {"rx_mtu_err_frames", offsetof(struct rx_port_stats,
66 {"rx_tagged_frames", offsetof(struct rx_port_stats,
68 {"rx_double_tagged_frames", offsetof(struct rx_port_stats,
69 rx_double_tagged_frames)},
70 {"rx_good_frames", offsetof(struct rx_port_stats,
72 {"rx_undrsz_frames", offsetof(struct rx_port_stats,
74 {"rx_eee_lpi_events", offsetof(struct rx_port_stats,
76 {"rx_eee_lpi_duration", offsetof(struct rx_port_stats,
77 rx_eee_lpi_duration)},
78 {"rx_bytes", offsetof(struct rx_port_stats,
80 {"rx_runt_bytes", offsetof(struct rx_port_stats,
82 {"rx_runt_frames", offsetof(struct rx_port_stats,
86 static const struct bnxt_xstats_name_off bnxt_tx_stats_strings[] = {
87 {"tx_64b_frames", offsetof(struct tx_port_stats,
89 {"tx_65b_127b_frames", offsetof(struct tx_port_stats,
91 {"tx_128b_255b_frames", offsetof(struct tx_port_stats,
92 tx_128b_255b_frames)},
93 {"tx_256b_511b_frames", offsetof(struct tx_port_stats,
94 tx_256b_511b_frames)},
95 {"tx_512b_1023b_frames", offsetof(struct tx_port_stats,
96 tx_512b_1023b_frames)},
97 {"tx_1024b_1518b_frames", offsetof(struct tx_port_stats,
98 tx_1024b_1518b_frames)},
99 {"tx_good_vlan_frames", offsetof(struct tx_port_stats,
100 tx_good_vlan_frames)},
101 {"tx_1519b_2047b_frames", offsetof(struct tx_port_stats,
102 tx_1519b_2047b_frames)},
103 {"tx_2048b_4095b_frames", offsetof(struct tx_port_stats,
104 tx_2048b_4095b_frames)},
105 {"tx_4096b_9216b_frames", offsetof(struct tx_port_stats,
106 tx_4096b_9216b_frames)},
107 {"tx_9217b_16383b_frames", offsetof(struct tx_port_stats,
108 tx_9217b_16383b_frames)},
109 {"tx_good_frames", offsetof(struct tx_port_stats,
111 {"tx_total_frames", offsetof(struct tx_port_stats,
113 {"tx_ucast_frames", offsetof(struct tx_port_stats,
115 {"tx_mcast_frames", offsetof(struct tx_port_stats,
117 {"tx_bcast_frames", offsetof(struct tx_port_stats,
119 {"tx_pause_frames", offsetof(struct tx_port_stats,
121 {"tx_pfc_frames", offsetof(struct tx_port_stats,
123 {"tx_jabber_frames", offsetof(struct tx_port_stats,
125 {"tx_fcs_err_frames", offsetof(struct tx_port_stats,
127 {"tx_err", offsetof(struct tx_port_stats,
129 {"tx_fifo_underruns", offsetof(struct tx_port_stats,
131 {"tx_eee_lpi_events", offsetof(struct tx_port_stats,
133 {"tx_eee_lpi_duration", offsetof(struct tx_port_stats,
134 tx_eee_lpi_duration)},
135 {"tx_total_collisions", offsetof(struct tx_port_stats,
136 tx_total_collisions)},
137 {"tx_bytes", offsetof(struct tx_port_stats,
141 static const struct bnxt_xstats_name_off bnxt_func_stats_strings[] = {
142 {"tx_ucast_pkts", offsetof(struct hwrm_func_qstats_output,
144 {"tx_mcast_pkts", offsetof(struct hwrm_func_qstats_output,
146 {"tx_bcast_pkts", offsetof(struct hwrm_func_qstats_output,
148 {"tx_discard_pkts", offsetof(struct hwrm_func_qstats_output,
150 {"tx_drop_pkts", offsetof(struct hwrm_func_qstats_output,
152 {"tx_ucast_bytes", offsetof(struct hwrm_func_qstats_output,
154 {"tx_mcast_bytes", offsetof(struct hwrm_func_qstats_output,
156 {"tx_bcast_bytes", offsetof(struct hwrm_func_qstats_output,
158 {"rx_ucast_pkts", offsetof(struct hwrm_func_qstats_output,
160 {"rx_mcast_pkts", offsetof(struct hwrm_func_qstats_output,
162 {"rx_bcast_pkts", offsetof(struct hwrm_func_qstats_output,
164 {"rx_discard_pkts", offsetof(struct hwrm_func_qstats_output,
166 {"rx_drop_pkts", offsetof(struct hwrm_func_qstats_output,
168 {"rx_ucast_bytes", offsetof(struct hwrm_func_qstats_output,
170 {"rx_mcast_bytes", offsetof(struct hwrm_func_qstats_output,
172 {"rx_bcast_bytes", offsetof(struct hwrm_func_qstats_output,
174 {"rx_agg_pkts", offsetof(struct hwrm_func_qstats_output,
176 {"rx_agg_bytes", offsetof(struct hwrm_func_qstats_output,
178 {"rx_agg_events", offsetof(struct hwrm_func_qstats_output,
180 {"rx_agg_aborts", offsetof(struct hwrm_func_qstats_output,
184 static const struct bnxt_xstats_name_off bnxt_rx_ext_stats_strings[] = {
185 {"link_down_events", offsetof(struct rx_port_stats_ext,
187 {"continuous_pause_events", offsetof(struct rx_port_stats_ext,
188 continuous_pause_events)},
189 {"resume_pause_events", offsetof(struct rx_port_stats_ext,
190 resume_pause_events)},
191 {"continuous_roce_pause_events", offsetof(struct rx_port_stats_ext,
192 continuous_roce_pause_events)},
193 {"resume_roce_pause_events", offsetof(struct rx_port_stats_ext,
194 resume_roce_pause_events)},
195 {"rx_bytes_cos0", offsetof(struct rx_port_stats_ext,
197 {"rx_bytes_cos1", offsetof(struct rx_port_stats_ext,
199 {"rx_bytes_cos2", offsetof(struct rx_port_stats_ext,
201 {"rx_bytes_cos3", offsetof(struct rx_port_stats_ext,
203 {"rx_bytes_cos4", offsetof(struct rx_port_stats_ext,
205 {"rx_bytes_cos5", offsetof(struct rx_port_stats_ext,
207 {"rx_bytes_cos6", offsetof(struct rx_port_stats_ext,
209 {"rx_bytes_cos7", offsetof(struct rx_port_stats_ext,
211 {"rx_packets_cos0", offsetof(struct rx_port_stats_ext,
213 {"rx_packets_cos1", offsetof(struct rx_port_stats_ext,
215 {"rx_packets_cos2", offsetof(struct rx_port_stats_ext,
217 {"rx_packets_cos3", offsetof(struct rx_port_stats_ext,
219 {"rx_packets_cos4", offsetof(struct rx_port_stats_ext,
221 {"rx_packets_cos5", offsetof(struct rx_port_stats_ext,
223 {"rx_packets_cos6", offsetof(struct rx_port_stats_ext,
225 {"rx_packets_cos7", offsetof(struct rx_port_stats_ext,
227 {"pfc_pri0_rx_duration_us", offsetof(struct rx_port_stats_ext,
228 pfc_pri0_rx_duration_us)},
229 {"pfc_pri0_rx_transitions", offsetof(struct rx_port_stats_ext,
230 pfc_pri0_rx_transitions)},
231 {"pfc_pri1_rx_duration_us", offsetof(struct rx_port_stats_ext,
232 pfc_pri1_rx_duration_us)},
233 {"pfc_pri1_rx_transitions", offsetof(struct rx_port_stats_ext,
234 pfc_pri1_rx_transitions)},
235 {"pfc_pri2_rx_duration_us", offsetof(struct rx_port_stats_ext,
236 pfc_pri2_rx_duration_us)},
237 {"pfc_pri2_rx_transitions", offsetof(struct rx_port_stats_ext,
238 pfc_pri2_rx_transitions)},
239 {"pfc_pri3_rx_duration_us", offsetof(struct rx_port_stats_ext,
240 pfc_pri3_rx_duration_us)},
241 {"pfc_pri3_rx_transitions", offsetof(struct rx_port_stats_ext,
242 pfc_pri3_rx_transitions)},
243 {"pfc_pri4_rx_duration_us", offsetof(struct rx_port_stats_ext,
244 pfc_pri4_rx_duration_us)},
245 {"pfc_pri4_rx_transitions", offsetof(struct rx_port_stats_ext,
246 pfc_pri4_rx_transitions)},
247 {"pfc_pri5_rx_duration_us", offsetof(struct rx_port_stats_ext,
248 pfc_pri5_rx_duration_us)},
249 {"pfc_pri5_rx_transitions", offsetof(struct rx_port_stats_ext,
250 pfc_pri5_rx_transitions)},
251 {"pfc_pri6_rx_duration_us", offsetof(struct rx_port_stats_ext,
252 pfc_pri6_rx_duration_us)},
253 {"pfc_pri6_rx_transitions", offsetof(struct rx_port_stats_ext,
254 pfc_pri6_rx_transitions)},
255 {"pfc_pri7_rx_duration_us", offsetof(struct rx_port_stats_ext,
256 pfc_pri7_rx_duration_us)},
257 {"pfc_pri7_rx_transitions", offsetof(struct rx_port_stats_ext,
258 pfc_pri7_rx_transitions)},
261 static const struct bnxt_xstats_name_off bnxt_tx_ext_stats_strings[] = {
262 {"tx_bytes_cos0", offsetof(struct tx_port_stats_ext,
264 {"tx_bytes_cos1", offsetof(struct tx_port_stats_ext,
266 {"tx_bytes_cos2", offsetof(struct tx_port_stats_ext,
268 {"tx_bytes_cos3", offsetof(struct tx_port_stats_ext,
270 {"tx_bytes_cos4", offsetof(struct tx_port_stats_ext,
272 {"tx_bytes_cos5", offsetof(struct tx_port_stats_ext,
274 {"tx_bytes_cos6", offsetof(struct tx_port_stats_ext,
276 {"tx_bytes_cos7", offsetof(struct tx_port_stats_ext,
278 {"tx_packets_cos0", offsetof(struct tx_port_stats_ext,
280 {"tx_packets_cos1", offsetof(struct tx_port_stats_ext,
282 {"tx_packets_cos2", offsetof(struct tx_port_stats_ext,
284 {"tx_packets_cos3", offsetof(struct tx_port_stats_ext,
286 {"tx_packets_cos4", offsetof(struct tx_port_stats_ext,
288 {"tx_packets_cos5", offsetof(struct tx_port_stats_ext,
290 {"tx_packets_cos6", offsetof(struct tx_port_stats_ext,
292 {"tx_packets_cos7", offsetof(struct tx_port_stats_ext,
294 {"pfc_pri0_tx_duration_us", offsetof(struct tx_port_stats_ext,
295 pfc_pri0_tx_duration_us)},
296 {"pfc_pri0_tx_transitions", offsetof(struct tx_port_stats_ext,
297 pfc_pri0_tx_transitions)},
298 {"pfc_pri1_tx_duration_us", offsetof(struct tx_port_stats_ext,
299 pfc_pri1_tx_duration_us)},
300 {"pfc_pri1_tx_transitions", offsetof(struct tx_port_stats_ext,
301 pfc_pri1_tx_transitions)},
302 {"pfc_pri2_tx_duration_us", offsetof(struct tx_port_stats_ext,
303 pfc_pri2_tx_duration_us)},
304 {"pfc_pri2_tx_transitions", offsetof(struct tx_port_stats_ext,
305 pfc_pri2_tx_transitions)},
306 {"pfc_pri3_tx_duration_us", offsetof(struct tx_port_stats_ext,
307 pfc_pri3_tx_duration_us)},
308 {"pfc_pri3_tx_transitions", offsetof(struct tx_port_stats_ext,
309 pfc_pri3_tx_transitions)},
310 {"pfc_pri4_tx_duration_us", offsetof(struct tx_port_stats_ext,
311 pfc_pri4_tx_duration_us)},
312 {"pfc_pri4_tx_transitions", offsetof(struct tx_port_stats_ext,
313 pfc_pri4_tx_transitions)},
314 {"pfc_pri5_tx_duration_us", offsetof(struct tx_port_stats_ext,
315 pfc_pri5_tx_duration_us)},
316 {"pfc_pri5_tx_transitions", offsetof(struct tx_port_stats_ext,
317 pfc_pri5_tx_transitions)},
318 {"pfc_pri6_tx_duration_us", offsetof(struct tx_port_stats_ext,
319 pfc_pri6_tx_duration_us)},
320 {"pfc_pri6_tx_transitions", offsetof(struct tx_port_stats_ext,
321 pfc_pri6_tx_transitions)},
322 {"pfc_pri7_tx_duration_us", offsetof(struct tx_port_stats_ext,
323 pfc_pri7_tx_duration_us)},
324 {"pfc_pri7_tx_transitions", offsetof(struct tx_port_stats_ext,
325 pfc_pri7_tx_transitions)},
329 * Statistics functions
332 void bnxt_free_stats(struct bnxt *bp)
336 for (i = 0; i < (int)bp->tx_cp_nr_rings; i++) {
337 struct bnxt_tx_queue *txq = bp->tx_queues[i];
339 bnxt_free_txq_stats(txq);
341 for (i = 0; i < (int)bp->rx_cp_nr_rings; i++) {
342 struct bnxt_rx_queue *rxq = bp->rx_queues[i];
344 bnxt_free_rxq_stats(rxq);
348 int bnxt_stats_get_op(struct rte_eth_dev *eth_dev,
349 struct rte_eth_stats *bnxt_stats)
353 struct bnxt *bp = eth_dev->data->dev_private;
355 memset(bnxt_stats, 0, sizeof(*bnxt_stats));
356 if (!(bp->flags & BNXT_FLAG_INIT_DONE)) {
357 PMD_DRV_LOG(ERR, "Device Initialization not complete!\n");
361 for (i = 0; i < bp->rx_cp_nr_rings; i++) {
362 struct bnxt_rx_queue *rxq = bp->rx_queues[i];
363 struct bnxt_cp_ring_info *cpr = rxq->cp_ring;
365 rc = bnxt_hwrm_ctx_qstats(bp, cpr->hw_stats_ctx_id, i,
369 bnxt_stats->rx_nombuf +=
370 rte_atomic64_read(&rxq->rx_mbuf_alloc_fail);
373 for (i = 0; i < bp->tx_cp_nr_rings; i++) {
374 struct bnxt_tx_queue *txq = bp->tx_queues[i];
375 struct bnxt_cp_ring_info *cpr = txq->cp_ring;
377 rc = bnxt_hwrm_ctx_qstats(bp, cpr->hw_stats_ctx_id, i,
382 rc = bnxt_hwrm_func_qstats(bp, 0xffff, bnxt_stats);
388 void bnxt_stats_reset_op(struct rte_eth_dev *eth_dev)
390 struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;
393 if (!(bp->flags & BNXT_FLAG_INIT_DONE)) {
394 PMD_DRV_LOG(ERR, "Device Initialization not complete!\n");
398 bnxt_clear_all_hwrm_stat_ctxs(bp);
399 for (i = 0; i < bp->rx_cp_nr_rings; i++) {
400 struct bnxt_rx_queue *rxq = bp->rx_queues[i];
402 rte_atomic64_clear(&rxq->rx_mbuf_alloc_fail);
406 int bnxt_dev_xstats_get_op(struct rte_eth_dev *eth_dev,
407 struct rte_eth_xstat *xstats, unsigned int n)
409 struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;
411 unsigned int count, i;
412 uint64_t tx_drop_pkts;
413 unsigned int rx_port_stats_ext_cnt;
414 unsigned int tx_port_stats_ext_cnt;
415 unsigned int stat_size = sizeof(uint64_t);
416 unsigned int stat_count;
418 bnxt_hwrm_port_qstats(bp);
419 bnxt_hwrm_func_qstats_tx_drop(bp, 0xffff, &tx_drop_pkts);
420 bnxt_hwrm_ext_port_qstats(bp);
421 rx_port_stats_ext_cnt = bp->fw_rx_port_stats_ext_size / stat_size;
422 tx_port_stats_ext_cnt = bp->fw_tx_port_stats_ext_size / stat_size;
424 count = RTE_DIM(bnxt_rx_stats_strings) +
425 RTE_DIM(bnxt_tx_stats_strings) + 1/* For tx_drop_pkts */ +
426 RTE_DIM(bnxt_rx_ext_stats_strings) +
427 RTE_DIM(bnxt_tx_ext_stats_strings);
434 for (i = 0; i < RTE_DIM(bnxt_rx_stats_strings); i++) {
435 uint64_t *rx_stats = (uint64_t *)bp->hw_rx_port_stats;
436 xstats[count].id = count;
437 xstats[count].value = rte_le_to_cpu_64(
438 *(uint64_t *)((char *)rx_stats +
439 bnxt_rx_stats_strings[i].offset));
443 for (i = 0; i < RTE_DIM(bnxt_tx_stats_strings); i++) {
444 uint64_t *tx_stats = (uint64_t *)bp->hw_tx_port_stats;
445 xstats[count].id = count;
446 xstats[count].value = rte_le_to_cpu_64(
447 *(uint64_t *)((char *)tx_stats +
448 bnxt_tx_stats_strings[i].offset));
452 /* The Tx drop pkts aka the Anti spoof coounter */
453 xstats[count].id = count;
454 xstats[count].value = rte_le_to_cpu_64(tx_drop_pkts);
457 for (i = 0; i < tx_port_stats_ext_cnt; i++) {
458 uint64_t *tx_stats_ext = (uint64_t *)bp->hw_tx_port_stats_ext;
460 xstats[count].value = rte_le_to_cpu_64
461 (*(uint64_t *)((char *)tx_stats_ext +
462 bnxt_tx_ext_stats_strings[i].offset));
467 for (i = 0; i < rx_port_stats_ext_cnt; i++) {
468 uint64_t *rx_stats_ext = (uint64_t *)bp->hw_rx_port_stats_ext;
470 xstats[count].value = rte_le_to_cpu_64
471 (*(uint64_t *)((char *)rx_stats_ext +
472 bnxt_rx_ext_stats_strings[i].offset));
480 int bnxt_dev_xstats_get_names_op(__rte_unused struct rte_eth_dev *eth_dev,
481 struct rte_eth_xstat_name *xstats_names,
482 __rte_unused unsigned int limit)
484 /* Account for the Tx drop pkts aka the Anti spoof counter */
485 const unsigned int stat_cnt = RTE_DIM(bnxt_rx_stats_strings) +
486 RTE_DIM(bnxt_tx_stats_strings) + 1 +
487 RTE_DIM(bnxt_rx_ext_stats_strings) +
488 RTE_DIM(bnxt_tx_ext_stats_strings);
489 unsigned int i, count;
491 if (xstats_names != NULL) {
494 for (i = 0; i < RTE_DIM(bnxt_rx_stats_strings); i++) {
495 strlcpy(xstats_names[count].name,
496 bnxt_rx_stats_strings[i].name,
497 sizeof(xstats_names[count].name));
501 for (i = 0; i < RTE_DIM(bnxt_tx_stats_strings); i++) {
502 strlcpy(xstats_names[count].name,
503 bnxt_tx_stats_strings[i].name,
504 sizeof(xstats_names[count].name));
508 strlcpy(xstats_names[count].name,
509 bnxt_func_stats_strings[4].name,
510 sizeof(xstats_names[count].name));
513 for (i = 0; i < RTE_DIM(bnxt_rx_ext_stats_strings); i++) {
514 strlcpy(xstats_names[count].name,
515 bnxt_rx_ext_stats_strings[i].name,
516 sizeof(xstats_names[count].name));
521 for (i = 0; i < RTE_DIM(bnxt_tx_ext_stats_strings); i++) {
522 strlcpy(xstats_names[count].name,
523 bnxt_tx_ext_stats_strings[i].name,
524 sizeof(xstats_names[count].name));
533 void bnxt_dev_xstats_reset_op(struct rte_eth_dev *eth_dev)
535 struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;
537 if (bp->flags & BNXT_FLAG_PORT_STATS && BNXT_SINGLE_PF(bp))
538 bnxt_hwrm_port_clr_stats(bp);
541 PMD_DRV_LOG(ERR, "Operation not supported on a VF device\n");
542 if (!BNXT_SINGLE_PF(bp))
543 PMD_DRV_LOG(ERR, "Operation not supported on a MF device\n");
544 if (!(bp->flags & BNXT_FLAG_PORT_STATS))
545 PMD_DRV_LOG(ERR, "Operation not supported\n");
548 int bnxt_dev_xstats_get_by_id_op(struct rte_eth_dev *dev, const uint64_t *ids,
549 uint64_t *values, unsigned int limit)
551 /* Account for the Tx drop pkts aka the Anti spoof counter */
552 const unsigned int stat_cnt = RTE_DIM(bnxt_rx_stats_strings) +
553 RTE_DIM(bnxt_tx_stats_strings) + 1 +
554 RTE_DIM(bnxt_rx_ext_stats_strings) +
555 RTE_DIM(bnxt_tx_ext_stats_strings);
556 struct rte_eth_xstat xstats[stat_cnt];
557 uint64_t values_copy[stat_cnt];
561 return bnxt_dev_xstats_get_op(dev, xstats, stat_cnt);
563 bnxt_dev_xstats_get_by_id_op(dev, NULL, values_copy, stat_cnt);
564 for (i = 0; i < limit; i++) {
565 if (ids[i] >= stat_cnt) {
566 PMD_DRV_LOG(ERR, "id value isn't valid");
569 values[i] = values_copy[ids[i]];
574 int bnxt_dev_xstats_get_names_by_id_op(struct rte_eth_dev *dev,
575 struct rte_eth_xstat_name *xstats_names,
576 const uint64_t *ids, unsigned int limit)
578 /* Account for the Tx drop pkts aka the Anti spoof counter */
579 const unsigned int stat_cnt = RTE_DIM(bnxt_rx_stats_strings) +
580 RTE_DIM(bnxt_tx_stats_strings) + 1 +
581 RTE_DIM(bnxt_rx_ext_stats_strings) +
582 RTE_DIM(bnxt_tx_ext_stats_strings);
583 struct rte_eth_xstat_name xstats_names_copy[stat_cnt];
587 return bnxt_dev_xstats_get_names_op(dev, xstats_names,
589 bnxt_dev_xstats_get_names_by_id_op(dev, xstats_names_copy, NULL,
592 for (i = 0; i < limit; i++) {
593 if (ids[i] >= stat_cnt) {
594 PMD_DRV_LOG(ERR, "id value isn't valid");
597 strcpy(xstats_names[i].name,
598 xstats_names_copy[ids[i]].name);