ethdev: make stats and xstats reset callbacks return int
[dpdk.git] / drivers / net / bnxt / bnxt_stats.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2014-2018 Broadcom
3  * All rights reserved.
4  */
5
6 #include <inttypes.h>
7
8 #include <rte_string_fns.h>
9 #include <rte_byteorder.h>
10
11 #include "bnxt.h"
12 #include "bnxt_cpr.h"
13 #include "bnxt_hwrm.h"
14 #include "bnxt_rxq.h"
15 #include "bnxt_stats.h"
16 #include "bnxt_txq.h"
17 #include "hsi_struct_def_dpdk.h"
18
19 static const struct bnxt_xstats_name_off bnxt_rx_stats_strings[] = {
20         {"rx_64b_frames", offsetof(struct rx_port_stats,
21                                 rx_64b_frames)},
22         {"rx_65b_127b_frames", offsetof(struct rx_port_stats,
23                                 rx_65b_127b_frames)},
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,
43                                 rx_total_frames)},
44         {"rx_ucast_frames", offsetof(struct rx_port_stats,
45                                 rx_ucast_frames)},
46         {"rx_mcast_frames", offsetof(struct rx_port_stats,
47                                 rx_mcast_frames)},
48         {"rx_bcast_frames", offsetof(struct rx_port_stats,
49                                 rx_bcast_frames)},
50         {"rx_fcs_err_frames", offsetof(struct rx_port_stats,
51                                 rx_fcs_err_frames)},
52         {"rx_ctrl_frames", offsetof(struct rx_port_stats,
53                                 rx_ctrl_frames)},
54         {"rx_pause_frames", offsetof(struct rx_port_stats,
55                                 rx_pause_frames)},
56         {"rx_pfc_frames", offsetof(struct rx_port_stats,
57                                 rx_pfc_frames)},
58         {"rx_align_err_frames", offsetof(struct rx_port_stats,
59                                 rx_align_err_frames)},
60         {"rx_ovrsz_frames", offsetof(struct rx_port_stats,
61                                 rx_ovrsz_frames)},
62         {"rx_jbr_frames", offsetof(struct rx_port_stats,
63                                 rx_jbr_frames)},
64         {"rx_mtu_err_frames", offsetof(struct rx_port_stats,
65                                 rx_mtu_err_frames)},
66         {"rx_tagged_frames", offsetof(struct rx_port_stats,
67                                 rx_tagged_frames)},
68         {"rx_double_tagged_frames", offsetof(struct rx_port_stats,
69                                 rx_double_tagged_frames)},
70         {"rx_good_frames", offsetof(struct rx_port_stats,
71                                 rx_good_frames)},
72         {"rx_undrsz_frames", offsetof(struct rx_port_stats,
73                                 rx_undrsz_frames)},
74         {"rx_eee_lpi_events", offsetof(struct rx_port_stats,
75                                 rx_eee_lpi_events)},
76         {"rx_eee_lpi_duration", offsetof(struct rx_port_stats,
77                                 rx_eee_lpi_duration)},
78         {"rx_bytes", offsetof(struct rx_port_stats,
79                                 rx_bytes)},
80         {"rx_runt_bytes", offsetof(struct rx_port_stats,
81                                 rx_runt_bytes)},
82         {"rx_runt_frames", offsetof(struct rx_port_stats,
83                                 rx_runt_frames)},
84 };
85
86 static const struct bnxt_xstats_name_off bnxt_tx_stats_strings[] = {
87         {"tx_64b_frames", offsetof(struct tx_port_stats,
88                                 tx_64b_frames)},
89         {"tx_65b_127b_frames", offsetof(struct tx_port_stats,
90                                 tx_65b_127b_frames)},
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,
110                                 tx_good_frames)},
111         {"tx_total_frames", offsetof(struct tx_port_stats,
112                                 tx_total_frames)},
113         {"tx_ucast_frames", offsetof(struct tx_port_stats,
114                                 tx_ucast_frames)},
115         {"tx_mcast_frames", offsetof(struct tx_port_stats,
116                                 tx_mcast_frames)},
117         {"tx_bcast_frames", offsetof(struct tx_port_stats,
118                                 tx_bcast_frames)},
119         {"tx_pause_frames", offsetof(struct tx_port_stats,
120                                 tx_pause_frames)},
121         {"tx_pfc_frames", offsetof(struct tx_port_stats,
122                                 tx_pfc_frames)},
123         {"tx_jabber_frames", offsetof(struct tx_port_stats,
124                                 tx_jabber_frames)},
125         {"tx_fcs_err_frames", offsetof(struct tx_port_stats,
126                                 tx_fcs_err_frames)},
127         {"tx_err", offsetof(struct tx_port_stats,
128                                 tx_err)},
129         {"tx_fifo_underruns", offsetof(struct tx_port_stats,
130                                 tx_fifo_underruns)},
131         {"tx_eee_lpi_events", offsetof(struct tx_port_stats,
132                                 tx_eee_lpi_events)},
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,
138                                 tx_bytes)},
139 };
140
141 static const struct bnxt_xstats_name_off bnxt_func_stats_strings[] = {
142         {"tx_ucast_pkts", offsetof(struct hwrm_func_qstats_output,
143                                 tx_ucast_pkts)},
144         {"tx_mcast_pkts", offsetof(struct hwrm_func_qstats_output,
145                                 tx_mcast_pkts)},
146         {"tx_bcast_pkts", offsetof(struct hwrm_func_qstats_output,
147                                 tx_bcast_pkts)},
148         {"tx_discard_pkts", offsetof(struct hwrm_func_qstats_output,
149                                 tx_discard_pkts)},
150         {"tx_drop_pkts", offsetof(struct hwrm_func_qstats_output,
151                                 tx_drop_pkts)},
152         {"tx_ucast_bytes", offsetof(struct hwrm_func_qstats_output,
153                                 tx_ucast_bytes)},
154         {"tx_mcast_bytes", offsetof(struct hwrm_func_qstats_output,
155                                 tx_mcast_bytes)},
156         {"tx_bcast_bytes", offsetof(struct hwrm_func_qstats_output,
157                                 tx_bcast_bytes)},
158         {"rx_ucast_pkts", offsetof(struct hwrm_func_qstats_output,
159                                 rx_ucast_pkts)},
160         {"rx_mcast_pkts", offsetof(struct hwrm_func_qstats_output,
161                                 rx_mcast_pkts)},
162         {"rx_bcast_pkts", offsetof(struct hwrm_func_qstats_output,
163                                 rx_bcast_pkts)},
164         {"rx_discard_pkts", offsetof(struct hwrm_func_qstats_output,
165                                 rx_discard_pkts)},
166         {"rx_drop_pkts", offsetof(struct hwrm_func_qstats_output,
167                                 rx_drop_pkts)},
168         {"rx_ucast_bytes", offsetof(struct hwrm_func_qstats_output,
169                                 rx_ucast_bytes)},
170         {"rx_mcast_bytes", offsetof(struct hwrm_func_qstats_output,
171                                 rx_mcast_bytes)},
172         {"rx_bcast_bytes", offsetof(struct hwrm_func_qstats_output,
173                                 rx_bcast_bytes)},
174         {"rx_agg_pkts", offsetof(struct hwrm_func_qstats_output,
175                                 rx_agg_pkts)},
176         {"rx_agg_bytes", offsetof(struct hwrm_func_qstats_output,
177                                 rx_agg_bytes)},
178         {"rx_agg_events", offsetof(struct hwrm_func_qstats_output,
179                                 rx_agg_events)},
180         {"rx_agg_aborts", offsetof(struct hwrm_func_qstats_output,
181                                 rx_agg_aborts)},
182 };
183
184 static const struct bnxt_xstats_name_off bnxt_rx_ext_stats_strings[] = {
185         {"link_down_events", offsetof(struct rx_port_stats_ext,
186                                 link_down_events)},
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,
196                                 rx_bytes_cos0)},
197         {"rx_bytes_cos1", offsetof(struct rx_port_stats_ext,
198                                 rx_bytes_cos1)},
199         {"rx_bytes_cos2", offsetof(struct rx_port_stats_ext,
200                                 rx_bytes_cos2)},
201         {"rx_bytes_cos3", offsetof(struct rx_port_stats_ext,
202                                 rx_bytes_cos3)},
203         {"rx_bytes_cos4", offsetof(struct rx_port_stats_ext,
204                                 rx_bytes_cos4)},
205         {"rx_bytes_cos5", offsetof(struct rx_port_stats_ext,
206                                 rx_bytes_cos5)},
207         {"rx_bytes_cos6", offsetof(struct rx_port_stats_ext,
208                                 rx_bytes_cos6)},
209         {"rx_bytes_cos7", offsetof(struct rx_port_stats_ext,
210                                 rx_bytes_cos7)},
211         {"rx_packets_cos0", offsetof(struct rx_port_stats_ext,
212                                 rx_packets_cos0)},
213         {"rx_packets_cos1", offsetof(struct rx_port_stats_ext,
214                                 rx_packets_cos1)},
215         {"rx_packets_cos2", offsetof(struct rx_port_stats_ext,
216                                 rx_packets_cos2)},
217         {"rx_packets_cos3", offsetof(struct rx_port_stats_ext,
218                                 rx_packets_cos3)},
219         {"rx_packets_cos4", offsetof(struct rx_port_stats_ext,
220                                 rx_packets_cos4)},
221         {"rx_packets_cos5", offsetof(struct rx_port_stats_ext,
222                                 rx_packets_cos5)},
223         {"rx_packets_cos6", offsetof(struct rx_port_stats_ext,
224                                 rx_packets_cos6)},
225         {"rx_packets_cos7", offsetof(struct rx_port_stats_ext,
226                                 rx_packets_cos7)},
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)},
259 };
260
261 static const struct bnxt_xstats_name_off bnxt_tx_ext_stats_strings[] = {
262         {"tx_bytes_cos0", offsetof(struct tx_port_stats_ext,
263                                 tx_bytes_cos0)},
264         {"tx_bytes_cos1", offsetof(struct tx_port_stats_ext,
265                                 tx_bytes_cos1)},
266         {"tx_bytes_cos2", offsetof(struct tx_port_stats_ext,
267                                 tx_bytes_cos2)},
268         {"tx_bytes_cos3", offsetof(struct tx_port_stats_ext,
269                                 tx_bytes_cos3)},
270         {"tx_bytes_cos4", offsetof(struct tx_port_stats_ext,
271                                 tx_bytes_cos4)},
272         {"tx_bytes_cos5", offsetof(struct tx_port_stats_ext,
273                                 tx_bytes_cos5)},
274         {"tx_bytes_cos6", offsetof(struct tx_port_stats_ext,
275                                 tx_bytes_cos6)},
276         {"tx_bytes_cos7", offsetof(struct tx_port_stats_ext,
277                                 tx_bytes_cos7)},
278         {"tx_packets_cos0", offsetof(struct tx_port_stats_ext,
279                                 tx_packets_cos0)},
280         {"tx_packets_cos1", offsetof(struct tx_port_stats_ext,
281                                 tx_packets_cos1)},
282         {"tx_packets_cos2", offsetof(struct tx_port_stats_ext,
283                                 tx_packets_cos2)},
284         {"tx_packets_cos3", offsetof(struct tx_port_stats_ext,
285                                 tx_packets_cos3)},
286         {"tx_packets_cos4", offsetof(struct tx_port_stats_ext,
287                                 tx_packets_cos4)},
288         {"tx_packets_cos5", offsetof(struct tx_port_stats_ext,
289                                 tx_packets_cos5)},
290         {"tx_packets_cos6", offsetof(struct tx_port_stats_ext,
291                                 tx_packets_cos6)},
292         {"tx_packets_cos7", offsetof(struct tx_port_stats_ext,
293                                 tx_packets_cos7)},
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)},
326 };
327
328 /*
329  * Statistics functions
330  */
331
332 void bnxt_free_stats(struct bnxt *bp)
333 {
334         int i;
335
336         for (i = 0; i < (int)bp->tx_cp_nr_rings; i++) {
337                 struct bnxt_tx_queue *txq = bp->tx_queues[i];
338
339                 bnxt_free_txq_stats(txq);
340         }
341         for (i = 0; i < (int)bp->rx_cp_nr_rings; i++) {
342                 struct bnxt_rx_queue *rxq = bp->rx_queues[i];
343
344                 bnxt_free_rxq_stats(rxq);
345         }
346 }
347
348 int bnxt_stats_get_op(struct rte_eth_dev *eth_dev,
349                            struct rte_eth_stats *bnxt_stats)
350 {
351         int rc = 0;
352         unsigned int i;
353         struct bnxt *bp = eth_dev->data->dev_private;
354         unsigned int num_q_stats;
355
356         memset(bnxt_stats, 0, sizeof(*bnxt_stats));
357         if (!(bp->flags & BNXT_FLAG_INIT_DONE)) {
358                 PMD_DRV_LOG(ERR, "Device Initialization not complete!\n");
359                 return -1;
360         }
361
362         num_q_stats = RTE_MIN(bp->rx_cp_nr_rings,
363                               (unsigned int)RTE_ETHDEV_QUEUE_STAT_CNTRS);
364
365         for (i = 0; i < num_q_stats; i++) {
366                 struct bnxt_rx_queue *rxq = bp->rx_queues[i];
367                 struct bnxt_cp_ring_info *cpr = rxq->cp_ring;
368
369                 rc = bnxt_hwrm_ctx_qstats(bp, cpr->hw_stats_ctx_id, i,
370                                      bnxt_stats, 1);
371                 if (unlikely(rc))
372                         return rc;
373                 bnxt_stats->rx_nombuf +=
374                                 rte_atomic64_read(&rxq->rx_mbuf_alloc_fail);
375         }
376
377         num_q_stats = RTE_MIN(bp->tx_cp_nr_rings,
378                               (unsigned int)RTE_ETHDEV_QUEUE_STAT_CNTRS);
379
380         for (i = 0; i < num_q_stats; i++) {
381                 struct bnxt_tx_queue *txq = bp->tx_queues[i];
382                 struct bnxt_cp_ring_info *cpr = txq->cp_ring;
383
384                 rc = bnxt_hwrm_ctx_qstats(bp, cpr->hw_stats_ctx_id, i,
385                                      bnxt_stats, 0);
386                 if (unlikely(rc))
387                         return rc;
388         }
389         rc = bnxt_hwrm_func_qstats(bp, 0xffff, bnxt_stats);
390         if (unlikely(rc))
391                 return rc;
392         return rc;
393 }
394
395 int bnxt_stats_reset_op(struct rte_eth_dev *eth_dev)
396 {
397         struct bnxt *bp = eth_dev->data->dev_private;
398         unsigned int i;
399         int ret;
400
401         if (!(bp->flags & BNXT_FLAG_INIT_DONE)) {
402                 PMD_DRV_LOG(ERR, "Device Initialization not complete!\n");
403                 return -EINVAL;
404         }
405
406         ret = bnxt_clear_all_hwrm_stat_ctxs(bp);
407         for (i = 0; i < bp->rx_cp_nr_rings; i++) {
408                 struct bnxt_rx_queue *rxq = bp->rx_queues[i];
409
410                 rte_atomic64_clear(&rxq->rx_mbuf_alloc_fail);
411         }
412
413         return ret;
414 }
415
416 int bnxt_dev_xstats_get_op(struct rte_eth_dev *eth_dev,
417                            struct rte_eth_xstat *xstats, unsigned int n)
418 {
419         struct bnxt *bp = eth_dev->data->dev_private;
420
421         unsigned int count, i;
422         uint64_t tx_drop_pkts;
423         unsigned int rx_port_stats_ext_cnt;
424         unsigned int tx_port_stats_ext_cnt;
425         unsigned int stat_size = sizeof(uint64_t);
426         unsigned int stat_count;
427
428         memset(xstats, 0, sizeof(*xstats));
429
430         bnxt_hwrm_port_qstats(bp);
431         bnxt_hwrm_func_qstats_tx_drop(bp, 0xffff, &tx_drop_pkts);
432         bnxt_hwrm_ext_port_qstats(bp);
433         rx_port_stats_ext_cnt = RTE_MIN(RTE_DIM(bnxt_rx_ext_stats_strings),
434                                         (bp->fw_rx_port_stats_ext_size /
435                                          stat_size));
436         tx_port_stats_ext_cnt = RTE_MIN(RTE_DIM(bnxt_tx_ext_stats_strings),
437                                         (bp->fw_tx_port_stats_ext_size /
438                                          stat_size));
439
440         count = RTE_DIM(bnxt_rx_stats_strings) +
441                 RTE_DIM(bnxt_tx_stats_strings) + 1/* For tx_drop_pkts */ +
442                 RTE_DIM(bnxt_rx_ext_stats_strings) +
443                 RTE_DIM(bnxt_tx_ext_stats_strings);
444         stat_count = count;
445
446         if (n < count)
447                 return count;
448
449         count = 0;
450         for (i = 0; i < RTE_DIM(bnxt_rx_stats_strings); i++) {
451                 uint64_t *rx_stats = (uint64_t *)bp->hw_rx_port_stats;
452                 xstats[count].id = count;
453                 xstats[count].value = rte_le_to_cpu_64(
454                                 *(uint64_t *)((char *)rx_stats +
455                                 bnxt_rx_stats_strings[i].offset));
456                 count++;
457         }
458
459         for (i = 0; i < RTE_DIM(bnxt_tx_stats_strings); i++) {
460                 uint64_t *tx_stats = (uint64_t *)bp->hw_tx_port_stats;
461                 xstats[count].id = count;
462                 xstats[count].value = rte_le_to_cpu_64(
463                                  *(uint64_t *)((char *)tx_stats +
464                                 bnxt_tx_stats_strings[i].offset));
465                 count++;
466         }
467
468         /* The Tx drop pkts aka the Anti spoof coounter */
469         xstats[count].id = count;
470         xstats[count].value = rte_le_to_cpu_64(tx_drop_pkts);
471         count++;
472
473         for (i = 0; i < rx_port_stats_ext_cnt; i++) {
474                 uint64_t *rx_stats_ext = (uint64_t *)bp->hw_rx_port_stats_ext;
475
476                 xstats[count].value = rte_le_to_cpu_64
477                                         (*(uint64_t *)((char *)rx_stats_ext +
478                                          bnxt_rx_ext_stats_strings[i].offset));
479
480                 count++;
481         }
482
483         for (i = 0; i < tx_port_stats_ext_cnt; i++) {
484                 uint64_t *tx_stats_ext = (uint64_t *)bp->hw_tx_port_stats_ext;
485
486                 xstats[count].value = rte_le_to_cpu_64
487                                         (*(uint64_t *)((char *)tx_stats_ext +
488                                          bnxt_tx_ext_stats_strings[i].offset));
489
490                 count++;
491         }
492
493         return stat_count;
494 }
495
496 int bnxt_dev_xstats_get_names_op(__rte_unused struct rte_eth_dev *eth_dev,
497         struct rte_eth_xstat_name *xstats_names,
498         __rte_unused unsigned int limit)
499 {
500         /* Account for the Tx drop pkts aka the Anti spoof counter */
501         const unsigned int stat_cnt = RTE_DIM(bnxt_rx_stats_strings) +
502                                 RTE_DIM(bnxt_tx_stats_strings) + 1 +
503                                 RTE_DIM(bnxt_rx_ext_stats_strings) +
504                                 RTE_DIM(bnxt_tx_ext_stats_strings);
505         unsigned int i, count;
506
507         if (xstats_names != NULL) {
508                 count = 0;
509
510                 for (i = 0; i < RTE_DIM(bnxt_rx_stats_strings); i++) {
511                         strlcpy(xstats_names[count].name,
512                                 bnxt_rx_stats_strings[i].name,
513                                 sizeof(xstats_names[count].name));
514                         count++;
515                 }
516
517                 for (i = 0; i < RTE_DIM(bnxt_tx_stats_strings); i++) {
518                         strlcpy(xstats_names[count].name,
519                                 bnxt_tx_stats_strings[i].name,
520                                 sizeof(xstats_names[count].name));
521                         count++;
522                 }
523
524                 strlcpy(xstats_names[count].name,
525                         bnxt_func_stats_strings[4].name,
526                         sizeof(xstats_names[count].name));
527                 count++;
528
529                 for (i = 0; i < RTE_DIM(bnxt_rx_ext_stats_strings); i++) {
530                         strlcpy(xstats_names[count].name,
531                                 bnxt_rx_ext_stats_strings[i].name,
532                                 sizeof(xstats_names[count].name));
533
534                         count++;
535                 }
536
537                 for (i = 0; i < RTE_DIM(bnxt_tx_ext_stats_strings); i++) {
538                         strlcpy(xstats_names[count].name,
539                                 bnxt_tx_ext_stats_strings[i].name,
540                                 sizeof(xstats_names[count].name));
541
542                         count++;
543                 }
544
545         }
546         return stat_cnt;
547 }
548
549 int bnxt_dev_xstats_reset_op(struct rte_eth_dev *eth_dev)
550 {
551         struct bnxt *bp = eth_dev->data->dev_private;
552         int ret;
553
554         if (bp->flags & BNXT_FLAG_PORT_STATS && BNXT_SINGLE_PF(bp)) {
555                 ret = bnxt_hwrm_port_clr_stats(bp);
556                 if (ret != 0) {
557                         PMD_DRV_LOG(ERR, "Operation failed: %s\n",
558                                     strerror(-ret));
559                         return ret;
560                 }
561         }
562
563         ret = 0;
564
565         if (BNXT_VF(bp)) {
566                 PMD_DRV_LOG(ERR, "Operation not supported on a VF device\n");
567                 ret = -ENOTSUP;
568         }
569         if (!BNXT_SINGLE_PF(bp)) {
570                 PMD_DRV_LOG(ERR, "Operation not supported on a MF device\n");
571                 ret = -ENOTSUP;
572         }
573         if (!(bp->flags & BNXT_FLAG_PORT_STATS)) {
574                 PMD_DRV_LOG(ERR, "Operation not supported\n");
575                 ret = -ENOTSUP;
576         }
577
578         return ret;
579 }
580
581 int bnxt_dev_xstats_get_by_id_op(struct rte_eth_dev *dev, const uint64_t *ids,
582                 uint64_t *values, unsigned int limit)
583 {
584         /* Account for the Tx drop pkts aka the Anti spoof counter */
585         const unsigned int stat_cnt = RTE_DIM(bnxt_rx_stats_strings) +
586                                 RTE_DIM(bnxt_tx_stats_strings) + 1 +
587                                 RTE_DIM(bnxt_rx_ext_stats_strings) +
588                                 RTE_DIM(bnxt_tx_ext_stats_strings);
589         struct rte_eth_xstat xstats[stat_cnt];
590         uint64_t values_copy[stat_cnt];
591         uint16_t i;
592
593         if (!ids)
594                 return bnxt_dev_xstats_get_op(dev, xstats, stat_cnt);
595
596         bnxt_dev_xstats_get_by_id_op(dev, NULL, values_copy, stat_cnt);
597         for (i = 0; i < limit; i++) {
598                 if (ids[i] >= stat_cnt) {
599                         PMD_DRV_LOG(ERR, "id value isn't valid");
600                         return -1;
601                 }
602                 values[i] = values_copy[ids[i]];
603         }
604         return stat_cnt;
605 }
606
607 int bnxt_dev_xstats_get_names_by_id_op(struct rte_eth_dev *dev,
608                                 struct rte_eth_xstat_name *xstats_names,
609                                 const uint64_t *ids, unsigned int limit)
610 {
611         /* Account for the Tx drop pkts aka the Anti spoof counter */
612         const unsigned int stat_cnt = RTE_DIM(bnxt_rx_stats_strings) +
613                                 RTE_DIM(bnxt_tx_stats_strings) + 1 +
614                                 RTE_DIM(bnxt_rx_ext_stats_strings) +
615                                 RTE_DIM(bnxt_tx_ext_stats_strings);
616         struct rte_eth_xstat_name xstats_names_copy[stat_cnt];
617         uint16_t i;
618
619         if (!ids)
620                 return bnxt_dev_xstats_get_names_op(dev, xstats_names,
621                                                     stat_cnt);
622         bnxt_dev_xstats_get_names_by_id_op(dev, xstats_names_copy, NULL,
623                         stat_cnt);
624
625         for (i = 0; i < limit; i++) {
626                 if (ids[i] >= stat_cnt) {
627                         PMD_DRV_LOG(ERR, "id value isn't valid");
628                         return -1;
629                 }
630                 strcpy(xstats_names[i].name,
631                                 xstats_names_copy[ids[i]].name);
632         }
633         return stat_cnt;
634 }