1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2014-2018 Broadcom
8 #include <rte_byteorder.h>
12 #include "bnxt_hwrm.h"
14 #include "bnxt_stats.h"
16 #include "hsi_struct_def_dpdk.h"
18 static const struct bnxt_xstats_name_off bnxt_rx_stats_strings[] = {
19 {"rx_64b_frames", offsetof(struct rx_port_stats,
21 {"rx_65b_127b_frames", offsetof(struct rx_port_stats,
23 {"rx_128b_255b_frames", offsetof(struct rx_port_stats,
24 rx_128b_255b_frames)},
25 {"rx_256b_511b_frames", offsetof(struct rx_port_stats,
26 rx_256b_511b_frames)},
27 {"rx_512b_1023b_frames", offsetof(struct rx_port_stats,
28 rx_512b_1023b_frames)},
29 {"rx_1024b_1518b_frames", offsetof(struct rx_port_stats,
30 rx_1024b_1518b_frames)},
31 {"rx_good_vlan_frames", offsetof(struct rx_port_stats,
32 rx_good_vlan_frames)},
33 {"rx_1519b_2047b_frames", offsetof(struct rx_port_stats,
34 rx_1519b_2047b_frames)},
35 {"rx_2048b_4095b_frames", offsetof(struct rx_port_stats,
36 rx_2048b_4095b_frames)},
37 {"rx_4096b_9216b_frames", offsetof(struct rx_port_stats,
38 rx_4096b_9216b_frames)},
39 {"rx_9217b_16383b_frames", offsetof(struct rx_port_stats,
40 rx_9217b_16383b_frames)},
41 {"rx_total_frames", offsetof(struct rx_port_stats,
43 {"rx_ucast_frames", offsetof(struct rx_port_stats,
45 {"rx_mcast_frames", offsetof(struct rx_port_stats,
47 {"rx_bcast_frames", offsetof(struct rx_port_stats,
49 {"rx_fcs_err_frames", offsetof(struct rx_port_stats,
51 {"rx_ctrl_frames", offsetof(struct rx_port_stats,
53 {"rx_pause_frames", offsetof(struct rx_port_stats,
55 {"rx_pfc_frames", offsetof(struct rx_port_stats,
57 {"rx_align_err_frames", offsetof(struct rx_port_stats,
58 rx_align_err_frames)},
59 {"rx_ovrsz_frames", offsetof(struct rx_port_stats,
61 {"rx_jbr_frames", offsetof(struct rx_port_stats,
63 {"rx_mtu_err_frames", offsetof(struct rx_port_stats,
65 {"rx_tagged_frames", offsetof(struct rx_port_stats,
67 {"rx_double_tagged_frames", offsetof(struct rx_port_stats,
68 rx_double_tagged_frames)},
69 {"rx_good_frames", offsetof(struct rx_port_stats,
71 {"rx_undrsz_frames", offsetof(struct rx_port_stats,
73 {"rx_eee_lpi_events", offsetof(struct rx_port_stats,
75 {"rx_eee_lpi_duration", offsetof(struct rx_port_stats,
76 rx_eee_lpi_duration)},
77 {"rx_bytes", offsetof(struct rx_port_stats,
79 {"rx_runt_bytes", offsetof(struct rx_port_stats,
81 {"rx_runt_frames", offsetof(struct rx_port_stats,
85 static const struct bnxt_xstats_name_off bnxt_tx_stats_strings[] = {
86 {"tx_64b_frames", offsetof(struct tx_port_stats,
88 {"tx_65b_127b_frames", offsetof(struct tx_port_stats,
90 {"tx_128b_255b_frames", offsetof(struct tx_port_stats,
91 tx_128b_255b_frames)},
92 {"tx_256b_511b_frames", offsetof(struct tx_port_stats,
93 tx_256b_511b_frames)},
94 {"tx_512b_1023b_frames", offsetof(struct tx_port_stats,
95 tx_512b_1023b_frames)},
96 {"tx_1024b_1518b_frames", offsetof(struct tx_port_stats,
97 tx_1024b_1518b_frames)},
98 {"tx_good_vlan_frames", offsetof(struct tx_port_stats,
99 tx_good_vlan_frames)},
100 {"tx_1519b_2047b_frames", offsetof(struct tx_port_stats,
101 tx_1519b_2047b_frames)},
102 {"tx_2048b_4095b_frames", offsetof(struct tx_port_stats,
103 tx_2048b_4095b_frames)},
104 {"tx_4096b_9216b_frames", offsetof(struct tx_port_stats,
105 tx_4096b_9216b_frames)},
106 {"tx_9217b_16383b_frames", offsetof(struct tx_port_stats,
107 tx_9217b_16383b_frames)},
108 {"tx_good_frames", offsetof(struct tx_port_stats,
110 {"tx_total_frames", offsetof(struct tx_port_stats,
112 {"tx_ucast_frames", offsetof(struct tx_port_stats,
114 {"tx_mcast_frames", offsetof(struct tx_port_stats,
116 {"tx_bcast_frames", offsetof(struct tx_port_stats,
118 {"tx_pause_frames", offsetof(struct tx_port_stats,
120 {"tx_pfc_frames", offsetof(struct tx_port_stats,
122 {"tx_jabber_frames", offsetof(struct tx_port_stats,
124 {"tx_fcs_err_frames", offsetof(struct tx_port_stats,
126 {"tx_err", offsetof(struct tx_port_stats,
128 {"tx_fifo_underruns", offsetof(struct tx_port_stats,
130 {"tx_eee_lpi_events", offsetof(struct tx_port_stats,
132 {"tx_eee_lpi_duration", offsetof(struct tx_port_stats,
133 tx_eee_lpi_duration)},
134 {"tx_total_collisions", offsetof(struct tx_port_stats,
135 tx_total_collisions)},
136 {"tx_bytes", offsetof(struct tx_port_stats,
140 static const struct bnxt_xstats_name_off bnxt_func_stats_strings[] = {
141 {"tx_ucast_pkts", offsetof(struct hwrm_func_qstats_output,
143 {"tx_mcast_pkts", offsetof(struct hwrm_func_qstats_output,
145 {"tx_bcast_pkts", offsetof(struct hwrm_func_qstats_output,
147 {"tx_discard_pkts", offsetof(struct hwrm_func_qstats_output,
149 {"tx_drop_pkts", offsetof(struct hwrm_func_qstats_output,
151 {"tx_ucast_bytes", offsetof(struct hwrm_func_qstats_output,
153 {"tx_mcast_bytes", offsetof(struct hwrm_func_qstats_output,
155 {"tx_bcast_bytes", offsetof(struct hwrm_func_qstats_output,
157 {"rx_ucast_pkts", offsetof(struct hwrm_func_qstats_output,
159 {"rx_mcast_pkts", offsetof(struct hwrm_func_qstats_output,
161 {"rx_bcast_pkts", offsetof(struct hwrm_func_qstats_output,
163 {"rx_discard_pkts", offsetof(struct hwrm_func_qstats_output,
165 {"rx_drop_pkts", offsetof(struct hwrm_func_qstats_output,
167 {"rx_ucast_bytes", offsetof(struct hwrm_func_qstats_output,
169 {"rx_mcast_bytes", offsetof(struct hwrm_func_qstats_output,
171 {"rx_bcast_bytes", offsetof(struct hwrm_func_qstats_output,
173 {"rx_agg_pkts", offsetof(struct hwrm_func_qstats_output,
175 {"rx_agg_bytes", offsetof(struct hwrm_func_qstats_output,
177 {"rx_agg_events", offsetof(struct hwrm_func_qstats_output,
179 {"rx_agg_aborts", offsetof(struct hwrm_func_qstats_output,
183 static const struct bnxt_xstats_name_off bnxt_rx_ext_stats_strings[] = {
184 {"link_down_events", offsetof(struct rx_port_stats_ext,
186 {"continuous_pause_events", offsetof(struct rx_port_stats_ext,
187 continuous_pause_events)},
188 {"resume_pause_events", offsetof(struct rx_port_stats_ext,
189 resume_pause_events)},
190 {"continuous_roce_pause_events", offsetof(struct rx_port_stats_ext,
191 continuous_roce_pause_events)},
192 {"resume_roce_pause_events", offsetof(struct rx_port_stats_ext,
193 resume_roce_pause_events)},
194 {"rx_bytes_cos0", offsetof(struct rx_port_stats_ext,
196 {"rx_bytes_cos1", offsetof(struct rx_port_stats_ext,
198 {"rx_bytes_cos2", offsetof(struct rx_port_stats_ext,
200 {"rx_bytes_cos3", offsetof(struct rx_port_stats_ext,
202 {"rx_bytes_cos4", offsetof(struct rx_port_stats_ext,
204 {"rx_bytes_cos5", offsetof(struct rx_port_stats_ext,
206 {"rx_bytes_cos6", offsetof(struct rx_port_stats_ext,
208 {"rx_bytes_cos7", offsetof(struct rx_port_stats_ext,
210 {"rx_packets_cos0", offsetof(struct rx_port_stats_ext,
212 {"rx_packets_cos1", offsetof(struct rx_port_stats_ext,
214 {"rx_packets_cos2", offsetof(struct rx_port_stats_ext,
216 {"rx_packets_cos3", offsetof(struct rx_port_stats_ext,
218 {"rx_packets_cos4", offsetof(struct rx_port_stats_ext,
220 {"rx_packets_cos5", offsetof(struct rx_port_stats_ext,
222 {"rx_packets_cos6", offsetof(struct rx_port_stats_ext,
224 {"rx_packets_cos7", offsetof(struct rx_port_stats_ext,
226 {"pfc_pri0_rx_duration_us", offsetof(struct rx_port_stats_ext,
227 pfc_pri0_rx_duration_us)},
228 {"pfc_pri0_rx_transitions", offsetof(struct rx_port_stats_ext,
229 pfc_pri0_rx_transitions)},
230 {"pfc_pri1_rx_duration_us", offsetof(struct rx_port_stats_ext,
231 pfc_pri1_rx_duration_us)},
232 {"pfc_pri1_rx_transitions", offsetof(struct rx_port_stats_ext,
233 pfc_pri1_rx_transitions)},
234 {"pfc_pri2_rx_duration_us", offsetof(struct rx_port_stats_ext,
235 pfc_pri2_rx_duration_us)},
236 {"pfc_pri2_rx_transitions", offsetof(struct rx_port_stats_ext,
237 pfc_pri2_rx_transitions)},
238 {"pfc_pri3_rx_duration_us", offsetof(struct rx_port_stats_ext,
239 pfc_pri3_rx_duration_us)},
240 {"pfc_pri3_rx_transitions", offsetof(struct rx_port_stats_ext,
241 pfc_pri3_rx_transitions)},
242 {"pfc_pri4_rx_duration_us", offsetof(struct rx_port_stats_ext,
243 pfc_pri4_rx_duration_us)},
244 {"pfc_pri4_rx_transitions", offsetof(struct rx_port_stats_ext,
245 pfc_pri4_rx_transitions)},
246 {"pfc_pri5_rx_duration_us", offsetof(struct rx_port_stats_ext,
247 pfc_pri5_rx_duration_us)},
248 {"pfc_pri5_rx_transitions", offsetof(struct rx_port_stats_ext,
249 pfc_pri5_rx_transitions)},
250 {"pfc_pri6_rx_duration_us", offsetof(struct rx_port_stats_ext,
251 pfc_pri6_rx_duration_us)},
252 {"pfc_pri6_rx_transitions", offsetof(struct rx_port_stats_ext,
253 pfc_pri6_rx_transitions)},
254 {"pfc_pri7_rx_duration_us", offsetof(struct rx_port_stats_ext,
255 pfc_pri7_rx_duration_us)},
256 {"pfc_pri7_rx_transitions", offsetof(struct rx_port_stats_ext,
257 pfc_pri7_rx_transitions)},
260 static const struct bnxt_xstats_name_off bnxt_tx_ext_stats_strings[] = {
261 {"tx_bytes_cos0", offsetof(struct tx_port_stats_ext,
263 {"tx_bytes_cos1", offsetof(struct tx_port_stats_ext,
265 {"tx_bytes_cos2", offsetof(struct tx_port_stats_ext,
267 {"tx_bytes_cos3", offsetof(struct tx_port_stats_ext,
269 {"tx_bytes_cos4", offsetof(struct tx_port_stats_ext,
271 {"tx_bytes_cos5", offsetof(struct tx_port_stats_ext,
273 {"tx_bytes_cos6", offsetof(struct tx_port_stats_ext,
275 {"tx_bytes_cos7", offsetof(struct tx_port_stats_ext,
277 {"tx_packets_cos0", offsetof(struct tx_port_stats_ext,
279 {"tx_packets_cos1", offsetof(struct tx_port_stats_ext,
281 {"tx_packets_cos2", offsetof(struct tx_port_stats_ext,
283 {"tx_packets_cos3", offsetof(struct tx_port_stats_ext,
285 {"tx_packets_cos4", offsetof(struct tx_port_stats_ext,
287 {"tx_packets_cos5", offsetof(struct tx_port_stats_ext,
289 {"tx_packets_cos6", offsetof(struct tx_port_stats_ext,
291 {"tx_packets_cos7", offsetof(struct tx_port_stats_ext,
293 {"pfc_pri0_tx_duration_us", offsetof(struct tx_port_stats_ext,
294 pfc_pri0_tx_duration_us)},
295 {"pfc_pri0_tx_transitions", offsetof(struct tx_port_stats_ext,
296 pfc_pri0_tx_transitions)},
297 {"pfc_pri1_tx_duration_us", offsetof(struct tx_port_stats_ext,
298 pfc_pri1_tx_duration_us)},
299 {"pfc_pri1_tx_transitions", offsetof(struct tx_port_stats_ext,
300 pfc_pri1_tx_transitions)},
301 {"pfc_pri2_tx_duration_us", offsetof(struct tx_port_stats_ext,
302 pfc_pri2_tx_duration_us)},
303 {"pfc_pri2_tx_transitions", offsetof(struct tx_port_stats_ext,
304 pfc_pri2_tx_transitions)},
305 {"pfc_pri3_tx_duration_us", offsetof(struct tx_port_stats_ext,
306 pfc_pri3_tx_duration_us)},
307 {"pfc_pri3_tx_transitions", offsetof(struct tx_port_stats_ext,
308 pfc_pri3_tx_transitions)},
309 {"pfc_pri4_tx_duration_us", offsetof(struct tx_port_stats_ext,
310 pfc_pri4_tx_duration_us)},
311 {"pfc_pri4_tx_transitions", offsetof(struct tx_port_stats_ext,
312 pfc_pri4_tx_transitions)},
313 {"pfc_pri5_tx_duration_us", offsetof(struct tx_port_stats_ext,
314 pfc_pri5_tx_duration_us)},
315 {"pfc_pri5_tx_transitions", offsetof(struct tx_port_stats_ext,
316 pfc_pri5_tx_transitions)},
317 {"pfc_pri6_tx_duration_us", offsetof(struct tx_port_stats_ext,
318 pfc_pri6_tx_duration_us)},
319 {"pfc_pri6_tx_transitions", offsetof(struct tx_port_stats_ext,
320 pfc_pri6_tx_transitions)},
321 {"pfc_pri7_tx_duration_us", offsetof(struct tx_port_stats_ext,
322 pfc_pri7_tx_duration_us)},
323 {"pfc_pri7_tx_transitions", offsetof(struct tx_port_stats_ext,
324 pfc_pri7_tx_transitions)},
328 * Statistics functions
331 void bnxt_free_stats(struct bnxt *bp)
335 for (i = 0; i < (int)bp->tx_cp_nr_rings; i++) {
336 struct bnxt_tx_queue *txq = bp->tx_queues[i];
338 bnxt_free_txq_stats(txq);
340 for (i = 0; i < (int)bp->rx_cp_nr_rings; i++) {
341 struct bnxt_rx_queue *rxq = bp->rx_queues[i];
343 bnxt_free_rxq_stats(rxq);
347 int bnxt_stats_get_op(struct rte_eth_dev *eth_dev,
348 struct rte_eth_stats *bnxt_stats)
352 struct bnxt *bp = eth_dev->data->dev_private;
354 memset(bnxt_stats, 0, sizeof(*bnxt_stats));
355 if (!(bp->flags & BNXT_FLAG_INIT_DONE)) {
356 PMD_DRV_LOG(ERR, "Device Initialization not complete!\n");
360 for (i = 0; i < bp->rx_cp_nr_rings; i++) {
361 struct bnxt_rx_queue *rxq = bp->rx_queues[i];
362 struct bnxt_cp_ring_info *cpr = rxq->cp_ring;
364 rc = bnxt_hwrm_ctx_qstats(bp, cpr->hw_stats_ctx_id, i,
368 bnxt_stats->rx_nombuf +=
369 rte_atomic64_read(&rxq->rx_mbuf_alloc_fail);
372 for (i = 0; i < bp->tx_cp_nr_rings; i++) {
373 struct bnxt_tx_queue *txq = bp->tx_queues[i];
374 struct bnxt_cp_ring_info *cpr = txq->cp_ring;
376 rc = bnxt_hwrm_ctx_qstats(bp, cpr->hw_stats_ctx_id, i,
381 rc = bnxt_hwrm_func_qstats(bp, 0xffff, bnxt_stats);
387 void bnxt_stats_reset_op(struct rte_eth_dev *eth_dev)
389 struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;
392 if (!(bp->flags & BNXT_FLAG_INIT_DONE)) {
393 PMD_DRV_LOG(ERR, "Device Initialization not complete!\n");
397 bnxt_clear_all_hwrm_stat_ctxs(bp);
398 for (i = 0; i < bp->rx_cp_nr_rings; i++) {
399 struct bnxt_rx_queue *rxq = bp->rx_queues[i];
401 rte_atomic64_clear(&rxq->rx_mbuf_alloc_fail);
405 int bnxt_dev_xstats_get_op(struct rte_eth_dev *eth_dev,
406 struct rte_eth_xstat *xstats, unsigned int n)
408 struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;
410 unsigned int count, i;
411 uint64_t tx_drop_pkts;
412 unsigned int rx_port_stats_ext_cnt;
413 unsigned int tx_port_stats_ext_cnt;
414 unsigned int stat_size = sizeof(uint64_t);
415 unsigned int stat_count;
417 bnxt_hwrm_port_qstats(bp);
418 bnxt_hwrm_func_qstats_tx_drop(bp, 0xffff, &tx_drop_pkts);
419 bnxt_hwrm_ext_port_qstats(bp);
420 rx_port_stats_ext_cnt = bp->fw_rx_port_stats_ext_size / stat_size;
421 tx_port_stats_ext_cnt = bp->fw_tx_port_stats_ext_size / stat_size;
423 count = RTE_DIM(bnxt_rx_stats_strings) +
424 RTE_DIM(bnxt_tx_stats_strings) + 1/* For tx_drop_pkts */ +
425 RTE_DIM(bnxt_rx_ext_stats_strings) +
426 RTE_DIM(bnxt_tx_ext_stats_strings);
433 for (i = 0; i < RTE_DIM(bnxt_rx_stats_strings); i++) {
434 uint64_t *rx_stats = (uint64_t *)bp->hw_rx_port_stats;
435 xstats[count].id = count;
436 xstats[count].value = rte_le_to_cpu_64(
437 *(uint64_t *)((char *)rx_stats +
438 bnxt_rx_stats_strings[i].offset));
442 for (i = 0; i < RTE_DIM(bnxt_tx_stats_strings); i++) {
443 uint64_t *tx_stats = (uint64_t *)bp->hw_tx_port_stats;
444 xstats[count].id = count;
445 xstats[count].value = rte_le_to_cpu_64(
446 *(uint64_t *)((char *)tx_stats +
447 bnxt_tx_stats_strings[i].offset));
451 /* The Tx drop pkts aka the Anti spoof coounter */
452 xstats[count].id = count;
453 xstats[count].value = rte_le_to_cpu_64(tx_drop_pkts);
456 for (i = 0; i < tx_port_stats_ext_cnt; i++) {
457 uint64_t *tx_stats_ext = (uint64_t *)bp->hw_tx_port_stats_ext;
459 xstats[count].value = rte_le_to_cpu_64
460 (*(uint64_t *)((char *)tx_stats_ext +
461 bnxt_tx_ext_stats_strings[i].offset));
466 for (i = 0; i < rx_port_stats_ext_cnt; i++) {
467 uint64_t *rx_stats_ext = (uint64_t *)bp->hw_rx_port_stats_ext;
469 xstats[count].value = rte_le_to_cpu_64
470 (*(uint64_t *)((char *)rx_stats_ext +
471 bnxt_rx_ext_stats_strings[i].offset));
479 int bnxt_dev_xstats_get_names_op(__rte_unused struct rte_eth_dev *eth_dev,
480 struct rte_eth_xstat_name *xstats_names,
481 __rte_unused unsigned int limit)
483 /* Account for the Tx drop pkts aka the Anti spoof counter */
484 const unsigned int stat_cnt = RTE_DIM(bnxt_rx_stats_strings) +
485 RTE_DIM(bnxt_tx_stats_strings) + 1 +
486 RTE_DIM(bnxt_rx_ext_stats_strings) +
487 RTE_DIM(bnxt_tx_ext_stats_strings);
488 unsigned int i, count;
490 if (xstats_names != NULL) {
493 for (i = 0; i < RTE_DIM(bnxt_rx_stats_strings); i++) {
494 snprintf(xstats_names[count].name,
495 sizeof(xstats_names[count].name),
497 bnxt_rx_stats_strings[i].name);
501 for (i = 0; i < RTE_DIM(bnxt_tx_stats_strings); i++) {
502 snprintf(xstats_names[count].name,
503 sizeof(xstats_names[count].name),
505 bnxt_tx_stats_strings[i].name);
509 snprintf(xstats_names[count].name,
510 sizeof(xstats_names[count].name),
512 bnxt_func_stats_strings[4].name);
515 for (i = 0; i < RTE_DIM(bnxt_rx_ext_stats_strings); i++) {
516 snprintf(xstats_names[count].name,
517 sizeof(xstats_names[count].name),
519 bnxt_rx_ext_stats_strings[i].name);
524 for (i = 0; i < RTE_DIM(bnxt_tx_ext_stats_strings); i++) {
525 snprintf(xstats_names[count].name,
526 sizeof(xstats_names[count].name),
528 bnxt_tx_ext_stats_strings[i].name);
537 void bnxt_dev_xstats_reset_op(struct rte_eth_dev *eth_dev)
539 struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;
541 if (bp->flags & BNXT_FLAG_PORT_STATS && BNXT_SINGLE_PF(bp))
542 bnxt_hwrm_port_clr_stats(bp);
545 PMD_DRV_LOG(ERR, "Operation not supported on a VF device\n");
546 if (!BNXT_SINGLE_PF(bp))
547 PMD_DRV_LOG(ERR, "Operation not supported on a MF device\n");
548 if (!(bp->flags & BNXT_FLAG_PORT_STATS))
549 PMD_DRV_LOG(ERR, "Operation not supported\n");
552 int bnxt_dev_xstats_get_by_id_op(struct rte_eth_dev *dev, const uint64_t *ids,
553 uint64_t *values, unsigned int limit)
555 /* Account for the Tx drop pkts aka the Anti spoof counter */
556 const unsigned int stat_cnt = RTE_DIM(bnxt_rx_stats_strings) +
557 RTE_DIM(bnxt_tx_stats_strings) + 1 +
558 RTE_DIM(bnxt_rx_ext_stats_strings) +
559 RTE_DIM(bnxt_tx_ext_stats_strings);
560 struct rte_eth_xstat xstats[stat_cnt];
561 uint64_t values_copy[stat_cnt];
565 return bnxt_dev_xstats_get_op(dev, xstats, stat_cnt);
567 bnxt_dev_xstats_get_by_id_op(dev, NULL, values_copy, stat_cnt);
568 for (i = 0; i < limit; i++) {
569 if (ids[i] >= stat_cnt) {
570 PMD_DRV_LOG(ERR, "id value isn't valid");
573 values[i] = values_copy[ids[i]];
578 int bnxt_dev_xstats_get_names_by_id_op(struct rte_eth_dev *dev,
579 struct rte_eth_xstat_name *xstats_names,
580 const uint64_t *ids, unsigned int limit)
582 /* Account for the Tx drop pkts aka the Anti spoof counter */
583 const unsigned int stat_cnt = RTE_DIM(bnxt_rx_stats_strings) +
584 RTE_DIM(bnxt_tx_stats_strings) + 1 +
585 RTE_DIM(bnxt_rx_ext_stats_strings) +
586 RTE_DIM(bnxt_tx_ext_stats_strings);
587 struct rte_eth_xstat_name xstats_names_copy[stat_cnt];
591 return bnxt_dev_xstats_get_names_op(dev, xstats_names,
593 bnxt_dev_xstats_get_names_by_id_op(dev, xstats_names_copy, NULL,
596 for (i = 0; i < limit; i++) {
597 if (ids[i] >= stat_cnt) {
598 PMD_DRV_LOG(ERR, "id value isn't valid");
601 strcpy(xstats_names[i].name,
602 xstats_names_copy[ids[i]].name);