fa29f9de19dbdc8ca1bbbb2e95248641e0ae9814
[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         rc = is_bnxt_in_error(bp);
357         if (rc)
358                 return rc;
359
360         memset(bnxt_stats, 0, sizeof(*bnxt_stats));
361         if (!(bp->flags & BNXT_FLAG_INIT_DONE)) {
362                 PMD_DRV_LOG(ERR, "Device Initialization not complete!\n");
363                 return -EIO;
364         }
365
366         num_q_stats = RTE_MIN(bp->rx_cp_nr_rings,
367                               (unsigned int)RTE_ETHDEV_QUEUE_STAT_CNTRS);
368
369         for (i = 0; i < num_q_stats; i++) {
370                 struct bnxt_rx_queue *rxq = bp->rx_queues[i];
371                 struct bnxt_cp_ring_info *cpr = rxq->cp_ring;
372
373                 rc = bnxt_hwrm_ctx_qstats(bp, cpr->hw_stats_ctx_id, i,
374                                      bnxt_stats, 1);
375                 if (unlikely(rc))
376                         return rc;
377                 bnxt_stats->rx_nombuf +=
378                                 rte_atomic64_read(&rxq->rx_mbuf_alloc_fail);
379         }
380
381         num_q_stats = RTE_MIN(bp->tx_cp_nr_rings,
382                               (unsigned int)RTE_ETHDEV_QUEUE_STAT_CNTRS);
383
384         for (i = 0; i < num_q_stats; i++) {
385                 struct bnxt_tx_queue *txq = bp->tx_queues[i];
386                 struct bnxt_cp_ring_info *cpr = txq->cp_ring;
387
388                 rc = bnxt_hwrm_ctx_qstats(bp, cpr->hw_stats_ctx_id, i,
389                                      bnxt_stats, 0);
390                 if (unlikely(rc))
391                         return rc;
392         }
393
394         rc = bnxt_hwrm_func_qstats(bp, 0xffff, bnxt_stats);
395         return rc;
396 }
397
398 int bnxt_stats_reset_op(struct rte_eth_dev *eth_dev)
399 {
400         struct bnxt *bp = eth_dev->data->dev_private;
401         unsigned int i;
402         int ret;
403
404         ret = is_bnxt_in_error(bp);
405         if (ret)
406                 return ret;
407
408         if (!(bp->flags & BNXT_FLAG_INIT_DONE)) {
409                 PMD_DRV_LOG(ERR, "Device Initialization not complete!\n");
410                 return -EINVAL;
411         }
412
413         ret = bnxt_clear_all_hwrm_stat_ctxs(bp);
414         for (i = 0; i < bp->rx_cp_nr_rings; i++) {
415                 struct bnxt_rx_queue *rxq = bp->rx_queues[i];
416
417                 rte_atomic64_clear(&rxq->rx_mbuf_alloc_fail);
418         }
419
420         return ret;
421 }
422
423 int bnxt_dev_xstats_get_op(struct rte_eth_dev *eth_dev,
424                            struct rte_eth_xstat *xstats, unsigned int n)
425 {
426         struct bnxt *bp = eth_dev->data->dev_private;
427         unsigned int count, i;
428         uint64_t tx_drop_pkts;
429         unsigned int rx_port_stats_ext_cnt;
430         unsigned int tx_port_stats_ext_cnt;
431         unsigned int stat_size = sizeof(uint64_t);
432         unsigned int stat_count;
433         int rc;
434
435         rc = is_bnxt_in_error(bp);
436         if (rc)
437                 return rc;
438
439         memset(xstats, 0, sizeof(*xstats));
440
441         bnxt_hwrm_port_qstats(bp);
442         bnxt_hwrm_func_qstats_tx_drop(bp, 0xffff, &tx_drop_pkts);
443         bnxt_hwrm_ext_port_qstats(bp);
444         rx_port_stats_ext_cnt = RTE_MIN(RTE_DIM(bnxt_rx_ext_stats_strings),
445                                         (bp->fw_rx_port_stats_ext_size /
446                                          stat_size));
447         tx_port_stats_ext_cnt = RTE_MIN(RTE_DIM(bnxt_tx_ext_stats_strings),
448                                         (bp->fw_tx_port_stats_ext_size /
449                                          stat_size));
450
451         count = RTE_DIM(bnxt_rx_stats_strings) +
452                 RTE_DIM(bnxt_tx_stats_strings) + 1/* For tx_drop_pkts */ +
453                 RTE_DIM(bnxt_rx_ext_stats_strings) +
454                 RTE_DIM(bnxt_tx_ext_stats_strings);
455         stat_count = count;
456
457         if (n < count)
458                 return count;
459
460         count = 0;
461         for (i = 0; i < RTE_DIM(bnxt_rx_stats_strings); i++) {
462                 uint64_t *rx_stats = (uint64_t *)bp->hw_rx_port_stats;
463                 xstats[count].id = count;
464                 xstats[count].value = rte_le_to_cpu_64(
465                                 *(uint64_t *)((char *)rx_stats +
466                                 bnxt_rx_stats_strings[i].offset));
467                 count++;
468         }
469
470         for (i = 0; i < RTE_DIM(bnxt_tx_stats_strings); i++) {
471                 uint64_t *tx_stats = (uint64_t *)bp->hw_tx_port_stats;
472                 xstats[count].id = count;
473                 xstats[count].value = rte_le_to_cpu_64(
474                                  *(uint64_t *)((char *)tx_stats +
475                                 bnxt_tx_stats_strings[i].offset));
476                 count++;
477         }
478
479         /* The Tx drop pkts aka the Anti spoof coounter */
480         xstats[count].id = count;
481         xstats[count].value = rte_le_to_cpu_64(tx_drop_pkts);
482         count++;
483
484         for (i = 0; i < rx_port_stats_ext_cnt; i++) {
485                 uint64_t *rx_stats_ext = (uint64_t *)bp->hw_rx_port_stats_ext;
486
487                 xstats[count].value = rte_le_to_cpu_64
488                                         (*(uint64_t *)((char *)rx_stats_ext +
489                                          bnxt_rx_ext_stats_strings[i].offset));
490
491                 count++;
492         }
493
494         for (i = 0; i < tx_port_stats_ext_cnt; i++) {
495                 uint64_t *tx_stats_ext = (uint64_t *)bp->hw_tx_port_stats_ext;
496
497                 xstats[count].value = rte_le_to_cpu_64
498                                         (*(uint64_t *)((char *)tx_stats_ext +
499                                          bnxt_tx_ext_stats_strings[i].offset));
500
501                 count++;
502         }
503
504         return stat_count;
505 }
506
507 int bnxt_dev_xstats_get_names_op(__rte_unused struct rte_eth_dev *eth_dev,
508         struct rte_eth_xstat_name *xstats_names,
509         __rte_unused unsigned int limit)
510 {
511         /* Account for the Tx drop pkts aka the Anti spoof counter */
512         const unsigned int stat_cnt = RTE_DIM(bnxt_rx_stats_strings) +
513                                 RTE_DIM(bnxt_tx_stats_strings) + 1 +
514                                 RTE_DIM(bnxt_rx_ext_stats_strings) +
515                                 RTE_DIM(bnxt_tx_ext_stats_strings);
516         struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;
517         unsigned int i, count;
518         int rc;
519
520         rc = is_bnxt_in_error(bp);
521         if (rc)
522                 return rc;
523
524         if (xstats_names != NULL) {
525                 count = 0;
526
527                 for (i = 0; i < RTE_DIM(bnxt_rx_stats_strings); i++) {
528                         strlcpy(xstats_names[count].name,
529                                 bnxt_rx_stats_strings[i].name,
530                                 sizeof(xstats_names[count].name));
531                         count++;
532                 }
533
534                 for (i = 0; i < RTE_DIM(bnxt_tx_stats_strings); i++) {
535                         strlcpy(xstats_names[count].name,
536                                 bnxt_tx_stats_strings[i].name,
537                                 sizeof(xstats_names[count].name));
538                         count++;
539                 }
540
541                 strlcpy(xstats_names[count].name,
542                         bnxt_func_stats_strings[4].name,
543                         sizeof(xstats_names[count].name));
544                 count++;
545
546                 for (i = 0; i < RTE_DIM(bnxt_rx_ext_stats_strings); i++) {
547                         strlcpy(xstats_names[count].name,
548                                 bnxt_rx_ext_stats_strings[i].name,
549                                 sizeof(xstats_names[count].name));
550
551                         count++;
552                 }
553
554                 for (i = 0; i < RTE_DIM(bnxt_tx_ext_stats_strings); i++) {
555                         strlcpy(xstats_names[count].name,
556                                 bnxt_tx_ext_stats_strings[i].name,
557                                 sizeof(xstats_names[count].name));
558
559                         count++;
560                 }
561
562         }
563         return stat_cnt;
564 }
565
566 int bnxt_dev_xstats_reset_op(struct rte_eth_dev *eth_dev)
567 {
568         struct bnxt *bp = eth_dev->data->dev_private;
569         int ret;
570
571         ret = is_bnxt_in_error(bp);
572         if (ret)
573                 return ret;
574
575         if (BNXT_VF(bp) || !BNXT_SINGLE_PF(bp) ||
576             !(bp->flags & BNXT_FLAG_PORT_STATS)) {
577                 PMD_DRV_LOG(ERR, "Operation not supported\n");
578                 return -ENOTSUP;
579         }
580
581         ret = bnxt_hwrm_port_clr_stats(bp);
582         if (ret != 0)
583                 PMD_DRV_LOG(ERR, "Failed to reset xstats: %s\n",
584                             strerror(-ret));
585
586         return ret;
587 }
588
589 int bnxt_dev_xstats_get_by_id_op(struct rte_eth_dev *dev, const uint64_t *ids,
590                 uint64_t *values, unsigned int limit)
591 {
592         /* Account for the Tx drop pkts aka the Anti spoof counter */
593         const unsigned int stat_cnt = RTE_DIM(bnxt_rx_stats_strings) +
594                                 RTE_DIM(bnxt_tx_stats_strings) + 1 +
595                                 RTE_DIM(bnxt_rx_ext_stats_strings) +
596                                 RTE_DIM(bnxt_tx_ext_stats_strings);
597         struct bnxt *bp = dev->data->dev_private;
598         struct rte_eth_xstat xstats[stat_cnt];
599         uint64_t values_copy[stat_cnt];
600         uint16_t i;
601         int rc;
602
603         rc = is_bnxt_in_error(bp);
604         if (rc)
605                 return rc;
606
607         if (!ids)
608                 return bnxt_dev_xstats_get_op(dev, xstats, stat_cnt);
609
610         bnxt_dev_xstats_get_by_id_op(dev, NULL, values_copy, stat_cnt);
611         for (i = 0; i < limit; i++) {
612                 if (ids[i] >= stat_cnt) {
613                         PMD_DRV_LOG(ERR, "id value isn't valid");
614                         return -EINVAL;
615                 }
616                 values[i] = values_copy[ids[i]];
617         }
618         return stat_cnt;
619 }
620
621 int bnxt_dev_xstats_get_names_by_id_op(struct rte_eth_dev *dev,
622                                 struct rte_eth_xstat_name *xstats_names,
623                                 const uint64_t *ids, unsigned int limit)
624 {
625         /* Account for the Tx drop pkts aka the Anti spoof counter */
626         const unsigned int stat_cnt = RTE_DIM(bnxt_rx_stats_strings) +
627                                 RTE_DIM(bnxt_tx_stats_strings) + 1 +
628                                 RTE_DIM(bnxt_rx_ext_stats_strings) +
629                                 RTE_DIM(bnxt_tx_ext_stats_strings);
630         struct rte_eth_xstat_name xstats_names_copy[stat_cnt];
631         struct bnxt *bp = dev->data->dev_private;
632         uint16_t i;
633         int rc;
634
635         rc = is_bnxt_in_error(bp);
636         if (rc)
637                 return rc;
638
639         if (!ids)
640                 return bnxt_dev_xstats_get_names_op(dev, xstats_names,
641                                                     stat_cnt);
642         bnxt_dev_xstats_get_names_by_id_op(dev, xstats_names_copy, NULL,
643                         stat_cnt);
644
645         for (i = 0; i < limit; i++) {
646                 if (ids[i] >= stat_cnt) {
647                         PMD_DRV_LOG(ERR, "id value isn't valid");
648                         return -EINVAL;
649                 }
650                 strcpy(xstats_names[i].name,
651                                 xstats_names_copy[ids[i]].name);
652         }
653         return stat_cnt;
654 }