xref: /dpdk/drivers/net/bnxt/bnxt_stats.c (revision 089e5ed727a15da2729cfee9b63533dd120bd04c)
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 void 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 
400 	if (!(bp->flags & BNXT_FLAG_INIT_DONE)) {
401 		PMD_DRV_LOG(ERR, "Device Initialization not complete!\n");
402 		return;
403 	}
404 
405 	bnxt_clear_all_hwrm_stat_ctxs(bp);
406 	for (i = 0; i < bp->rx_cp_nr_rings; i++) {
407 		struct bnxt_rx_queue *rxq = bp->rx_queues[i];
408 
409 		rte_atomic64_clear(&rxq->rx_mbuf_alloc_fail);
410 	}
411 }
412 
413 int bnxt_dev_xstats_get_op(struct rte_eth_dev *eth_dev,
414 			   struct rte_eth_xstat *xstats, unsigned int n)
415 {
416 	struct bnxt *bp = eth_dev->data->dev_private;
417 
418 	unsigned int count, i;
419 	uint64_t tx_drop_pkts;
420 	unsigned int rx_port_stats_ext_cnt;
421 	unsigned int tx_port_stats_ext_cnt;
422 	unsigned int stat_size = sizeof(uint64_t);
423 	unsigned int stat_count;
424 
425 	memset(xstats, 0, sizeof(*xstats));
426 
427 	bnxt_hwrm_port_qstats(bp);
428 	bnxt_hwrm_func_qstats_tx_drop(bp, 0xffff, &tx_drop_pkts);
429 	bnxt_hwrm_ext_port_qstats(bp);
430 	rx_port_stats_ext_cnt = RTE_MIN(RTE_DIM(bnxt_rx_ext_stats_strings),
431 					(bp->fw_rx_port_stats_ext_size /
432 					 stat_size));
433 	tx_port_stats_ext_cnt = RTE_MIN(RTE_DIM(bnxt_tx_ext_stats_strings),
434 					(bp->fw_tx_port_stats_ext_size /
435 					 stat_size));
436 
437 	count = RTE_DIM(bnxt_rx_stats_strings) +
438 		RTE_DIM(bnxt_tx_stats_strings) + 1/* For tx_drop_pkts */ +
439 		RTE_DIM(bnxt_rx_ext_stats_strings) +
440 		RTE_DIM(bnxt_tx_ext_stats_strings);
441 	stat_count = count;
442 
443 	if (n < count)
444 		return count;
445 
446 	count = 0;
447 	for (i = 0; i < RTE_DIM(bnxt_rx_stats_strings); i++) {
448 		uint64_t *rx_stats = (uint64_t *)bp->hw_rx_port_stats;
449 		xstats[count].id = count;
450 		xstats[count].value = rte_le_to_cpu_64(
451 				*(uint64_t *)((char *)rx_stats +
452 				bnxt_rx_stats_strings[i].offset));
453 		count++;
454 	}
455 
456 	for (i = 0; i < RTE_DIM(bnxt_tx_stats_strings); i++) {
457 		uint64_t *tx_stats = (uint64_t *)bp->hw_tx_port_stats;
458 		xstats[count].id = count;
459 		xstats[count].value = rte_le_to_cpu_64(
460 				 *(uint64_t *)((char *)tx_stats +
461 				bnxt_tx_stats_strings[i].offset));
462 		count++;
463 	}
464 
465 	/* The Tx drop pkts aka the Anti spoof coounter */
466 	xstats[count].id = count;
467 	xstats[count].value = rte_le_to_cpu_64(tx_drop_pkts);
468 	count++;
469 
470 	for (i = 0; i < rx_port_stats_ext_cnt; i++) {
471 		uint64_t *rx_stats_ext = (uint64_t *)bp->hw_rx_port_stats_ext;
472 
473 		xstats[count].value = rte_le_to_cpu_64
474 					(*(uint64_t *)((char *)rx_stats_ext +
475 					 bnxt_rx_ext_stats_strings[i].offset));
476 
477 		count++;
478 	}
479 
480 	for (i = 0; i < tx_port_stats_ext_cnt; i++) {
481 		uint64_t *tx_stats_ext = (uint64_t *)bp->hw_tx_port_stats_ext;
482 
483 		xstats[count].value = rte_le_to_cpu_64
484 					(*(uint64_t *)((char *)tx_stats_ext +
485 					 bnxt_tx_ext_stats_strings[i].offset));
486 
487 		count++;
488 	}
489 
490 	return stat_count;
491 }
492 
493 int bnxt_dev_xstats_get_names_op(__rte_unused struct rte_eth_dev *eth_dev,
494 	struct rte_eth_xstat_name *xstats_names,
495 	__rte_unused unsigned int limit)
496 {
497 	/* Account for the Tx drop pkts aka the Anti spoof counter */
498 	const unsigned int stat_cnt = RTE_DIM(bnxt_rx_stats_strings) +
499 				RTE_DIM(bnxt_tx_stats_strings) + 1 +
500 				RTE_DIM(bnxt_rx_ext_stats_strings) +
501 				RTE_DIM(bnxt_tx_ext_stats_strings);
502 	unsigned int i, count;
503 
504 	if (xstats_names != NULL) {
505 		count = 0;
506 
507 		for (i = 0; i < RTE_DIM(bnxt_rx_stats_strings); i++) {
508 			strlcpy(xstats_names[count].name,
509 				bnxt_rx_stats_strings[i].name,
510 				sizeof(xstats_names[count].name));
511 			count++;
512 		}
513 
514 		for (i = 0; i < RTE_DIM(bnxt_tx_stats_strings); i++) {
515 			strlcpy(xstats_names[count].name,
516 				bnxt_tx_stats_strings[i].name,
517 				sizeof(xstats_names[count].name));
518 			count++;
519 		}
520 
521 		strlcpy(xstats_names[count].name,
522 			bnxt_func_stats_strings[4].name,
523 			sizeof(xstats_names[count].name));
524 		count++;
525 
526 		for (i = 0; i < RTE_DIM(bnxt_rx_ext_stats_strings); i++) {
527 			strlcpy(xstats_names[count].name,
528 				bnxt_rx_ext_stats_strings[i].name,
529 				sizeof(xstats_names[count].name));
530 
531 			count++;
532 		}
533 
534 		for (i = 0; i < RTE_DIM(bnxt_tx_ext_stats_strings); i++) {
535 			strlcpy(xstats_names[count].name,
536 				bnxt_tx_ext_stats_strings[i].name,
537 				sizeof(xstats_names[count].name));
538 
539 			count++;
540 		}
541 
542 	}
543 	return stat_cnt;
544 }
545 
546 void bnxt_dev_xstats_reset_op(struct rte_eth_dev *eth_dev)
547 {
548 	struct bnxt *bp = eth_dev->data->dev_private;
549 
550 	if (bp->flags & BNXT_FLAG_PORT_STATS && BNXT_SINGLE_PF(bp))
551 		bnxt_hwrm_port_clr_stats(bp);
552 
553 	if (BNXT_VF(bp))
554 		PMD_DRV_LOG(ERR, "Operation not supported on a VF device\n");
555 	if (!BNXT_SINGLE_PF(bp))
556 		PMD_DRV_LOG(ERR, "Operation not supported on a MF device\n");
557 	if (!(bp->flags & BNXT_FLAG_PORT_STATS))
558 		PMD_DRV_LOG(ERR, "Operation not supported\n");
559 }
560 
561 int bnxt_dev_xstats_get_by_id_op(struct rte_eth_dev *dev, const uint64_t *ids,
562 		uint64_t *values, unsigned int limit)
563 {
564 	/* Account for the Tx drop pkts aka the Anti spoof counter */
565 	const unsigned int stat_cnt = RTE_DIM(bnxt_rx_stats_strings) +
566 				RTE_DIM(bnxt_tx_stats_strings) + 1 +
567 				RTE_DIM(bnxt_rx_ext_stats_strings) +
568 				RTE_DIM(bnxt_tx_ext_stats_strings);
569 	struct rte_eth_xstat xstats[stat_cnt];
570 	uint64_t values_copy[stat_cnt];
571 	uint16_t i;
572 
573 	if (!ids)
574 		return bnxt_dev_xstats_get_op(dev, xstats, stat_cnt);
575 
576 	bnxt_dev_xstats_get_by_id_op(dev, NULL, values_copy, stat_cnt);
577 	for (i = 0; i < limit; i++) {
578 		if (ids[i] >= stat_cnt) {
579 			PMD_DRV_LOG(ERR, "id value isn't valid");
580 			return -1;
581 		}
582 		values[i] = values_copy[ids[i]];
583 	}
584 	return stat_cnt;
585 }
586 
587 int bnxt_dev_xstats_get_names_by_id_op(struct rte_eth_dev *dev,
588 				struct rte_eth_xstat_name *xstats_names,
589 				const uint64_t *ids, unsigned int limit)
590 {
591 	/* Account for the Tx drop pkts aka the Anti spoof counter */
592 	const unsigned int stat_cnt = RTE_DIM(bnxt_rx_stats_strings) +
593 				RTE_DIM(bnxt_tx_stats_strings) + 1 +
594 				RTE_DIM(bnxt_rx_ext_stats_strings) +
595 				RTE_DIM(bnxt_tx_ext_stats_strings);
596 	struct rte_eth_xstat_name xstats_names_copy[stat_cnt];
597 	uint16_t i;
598 
599 	if (!ids)
600 		return bnxt_dev_xstats_get_names_op(dev, xstats_names,
601 						    stat_cnt);
602 	bnxt_dev_xstats_get_names_by_id_op(dev, xstats_names_copy, NULL,
603 			stat_cnt);
604 
605 	for (i = 0; i < limit; i++) {
606 		if (ids[i] >= stat_cnt) {
607 			PMD_DRV_LOG(ERR, "id value isn't valid");
608 			return -1;
609 		}
610 		strcpy(xstats_names[i].name,
611 				xstats_names_copy[ids[i]].name);
612 	}
613 	return stat_cnt;
614 }
615