xref: /dpdk/drivers/net/bnxt/bnxt_stats.c (revision b19f366c)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2014-2021 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_filter.h"
14 #include "bnxt_hwrm.h"
15 #include "bnxt_rxq.h"
16 #include "bnxt_stats.h"
17 #include "bnxt_txq.h"
18 #include "bnxt_vnic.h"
19 #include "hsi_struct_def_dpdk.h"
20 
21 static const struct bnxt_xstats_name_off bnxt_rx_stats_strings[] = {
22 	{"rx_64b_frames", offsetof(struct rx_port_stats,
23 				rx_64b_frames)},
24 	{"rx_65b_127b_frames", offsetof(struct rx_port_stats,
25 				rx_65b_127b_frames)},
26 	{"rx_128b_255b_frames", offsetof(struct rx_port_stats,
27 				rx_128b_255b_frames)},
28 	{"rx_256b_511b_frames", offsetof(struct rx_port_stats,
29 				rx_256b_511b_frames)},
30 	{"rx_512b_1023b_frames", offsetof(struct rx_port_stats,
31 				rx_512b_1023b_frames)},
32 	{"rx_1024b_1518b_frames", offsetof(struct rx_port_stats,
33 				rx_1024b_1518b_frames)},
34 	{"rx_good_vlan_frames", offsetof(struct rx_port_stats,
35 				rx_good_vlan_frames)},
36 	{"rx_1519b_2047b_frames", offsetof(struct rx_port_stats,
37 				rx_1519b_2047b_frames)},
38 	{"rx_2048b_4095b_frames", offsetof(struct rx_port_stats,
39 				rx_2048b_4095b_frames)},
40 	{"rx_4096b_9216b_frames", offsetof(struct rx_port_stats,
41 				rx_4096b_9216b_frames)},
42 	{"rx_9217b_16383b_frames", offsetof(struct rx_port_stats,
43 				rx_9217b_16383b_frames)},
44 	{"rx_total_frames", offsetof(struct rx_port_stats,
45 				rx_total_frames)},
46 	{"rx_ucast_frames", offsetof(struct rx_port_stats,
47 				rx_ucast_frames)},
48 	{"rx_mcast_frames", offsetof(struct rx_port_stats,
49 				rx_mcast_frames)},
50 	{"rx_bcast_frames", offsetof(struct rx_port_stats,
51 				rx_bcast_frames)},
52 	{"rx_fcs_err_frames", offsetof(struct rx_port_stats,
53 				rx_fcs_err_frames)},
54 	{"rx_ctrl_frames", offsetof(struct rx_port_stats,
55 				rx_ctrl_frames)},
56 	{"rx_pause_frames", offsetof(struct rx_port_stats,
57 				rx_pause_frames)},
58 	{"rx_pfc_frames", offsetof(struct rx_port_stats,
59 				rx_pfc_frames)},
60 	{"rx_unsupported_opcode_frames", offsetof(struct rx_port_stats,
61 				rx_unsupported_opcode_frames)},
62 	{"rx_unsupported_da_pausepfc_frames", offsetof(struct rx_port_stats,
63 				rx_unsupported_da_pausepfc_frames)},
64 	{"rx_wrong_sa_frames", offsetof(struct rx_port_stats,
65 				rx_wrong_sa_frames)},
66 	{"rx_align_err_frames", offsetof(struct rx_port_stats,
67 				rx_align_err_frames)},
68 	{"rx_oor_len_frames", offsetof(struct rx_port_stats,
69 				rx_oor_len_frames)},
70 	{"rx_code_err_frames", offsetof(struct rx_port_stats,
71 				rx_code_err_frames)},
72 	{"rx_false_carrier_frames", offsetof(struct rx_port_stats,
73 				rx_false_carrier_frames)},
74 	{"rx_ovrsz_frames", offsetof(struct rx_port_stats,
75 				rx_ovrsz_frames)},
76 	{"rx_jbr_frames", offsetof(struct rx_port_stats,
77 				rx_jbr_frames)},
78 	{"rx_mtu_err_frames", offsetof(struct rx_port_stats,
79 				rx_mtu_err_frames)},
80 	{"rx_match_crc_frames", offsetof(struct rx_port_stats,
81 				rx_match_crc_frames)},
82 	{"rx_promiscuous_frames", offsetof(struct rx_port_stats,
83 				rx_promiscuous_frames)},
84 	{"rx_tagged_frames", offsetof(struct rx_port_stats,
85 				rx_tagged_frames)},
86 	{"rx_double_tagged_frames", offsetof(struct rx_port_stats,
87 				rx_double_tagged_frames)},
88 	{"rx_trunc_frames", offsetof(struct rx_port_stats,
89 				rx_trunc_frames)},
90 	{"rx_good_frames", offsetof(struct rx_port_stats,
91 				rx_good_frames)},
92 	{"rx_sch_crc_err_frames", offsetof(struct rx_port_stats,
93 				rx_sch_crc_err_frames)},
94 	{"rx_undrsz_frames", offsetof(struct rx_port_stats,
95 				rx_undrsz_frames)},
96 	{"rx_frag_frames", offsetof(struct rx_port_stats,
97 				rx_frag_frames)},
98 	{"rx_eee_lpi_events", offsetof(struct rx_port_stats,
99 				rx_eee_lpi_events)},
100 	{"rx_eee_lpi_duration", offsetof(struct rx_port_stats,
101 				rx_eee_lpi_duration)},
102 	{"rx_llfc_physical_msgs", offsetof(struct rx_port_stats,
103 				rx_llfc_physical_msgs)},
104 	{"rx_llfc_logical_msgs", offsetof(struct rx_port_stats,
105 				rx_llfc_logical_msgs)},
106 	{"rx_llfc_msgs_with_crc_err", offsetof(struct rx_port_stats,
107 				rx_llfc_msgs_with_crc_err)},
108 	{"rx_hcfc_msgs", offsetof(struct rx_port_stats,
109 				rx_hcfc_msgs)},
110 	{"rx_hcfc_msgs_with_crc_err", offsetof(struct rx_port_stats,
111 				rx_hcfc_msgs_with_crc_err)},
112 	{"rx_bytes", offsetof(struct rx_port_stats,
113 				rx_bytes)},
114 	{"rx_runt_bytes", offsetof(struct rx_port_stats,
115 				rx_runt_bytes)},
116 	{"rx_runt_frames", offsetof(struct rx_port_stats,
117 				rx_runt_frames)},
118 	{"rx_pfc_xon2xoff_frames_pri0", offsetof(struct rx_port_stats,
119 				rx_pfc_xon2xoff_frames_pri0)},
120 	{"rx_pfc_xon2xoff_frames_pri1", offsetof(struct rx_port_stats,
121 				rx_pfc_xon2xoff_frames_pri1)},
122 	{"rx_pfc_xon2xoff_frames_pri2", offsetof(struct rx_port_stats,
123 				rx_pfc_xon2xoff_frames_pri2)},
124 	{"rx_pfc_xon2xoff_frames_pri3", offsetof(struct rx_port_stats,
125 				rx_pfc_xon2xoff_frames_pri3)},
126 	{"rx_pfc_xon2xoff_frames_pri4", offsetof(struct rx_port_stats,
127 				rx_pfc_xon2xoff_frames_pri4)},
128 	{"rx_pfc_xon2xoff_frames_pri5", offsetof(struct rx_port_stats,
129 				rx_pfc_xon2xoff_frames_pri5)},
130 	{"rx_pfc_xon2xoff_frames_pri6", offsetof(struct rx_port_stats,
131 				rx_pfc_xon2xoff_frames_pri6)},
132 	{"rx_pfc_xon2xoff_frames_pri7", offsetof(struct rx_port_stats,
133 				rx_pfc_xon2xoff_frames_pri7)},
134 	{"rx_pfc_ena_frames_pri0", offsetof(struct rx_port_stats,
135 				rx_pfc_ena_frames_pri0)},
136 	{"rx_pfc_ena_frames_pri1", offsetof(struct rx_port_stats,
137 				rx_pfc_ena_frames_pri1)},
138 	{"rx_pfc_ena_frames_pri2", offsetof(struct rx_port_stats,
139 				rx_pfc_ena_frames_pri2)},
140 	{"rx_pfc_ena_frames_pri3", offsetof(struct rx_port_stats,
141 				rx_pfc_ena_frames_pri3)},
142 	{"rx_pfc_ena_frames_pri4", offsetof(struct rx_port_stats,
143 				rx_pfc_ena_frames_pri4)},
144 	{"rx_pfc_ena_frames_pri5", offsetof(struct rx_port_stats,
145 				rx_pfc_ena_frames_pri5)},
146 	{"rx_pfc_ena_frames_pri6", offsetof(struct rx_port_stats,
147 				rx_pfc_ena_frames_pri6)},
148 	{"rx_pfc_ena_frames_pri7", offsetof(struct rx_port_stats,
149 				rx_pfc_ena_frames_pri7)},
150 	{"rx_stat_discard", offsetof(struct rx_port_stats,
151 				rx_stat_discard)},
152 	{"rx_stat_err", offsetof(struct rx_port_stats,
153 				rx_stat_err)},
154 };
155 
156 static const struct bnxt_xstats_name_off bnxt_tx_stats_strings[] = {
157 	{"tx_64b_frames", offsetof(struct tx_port_stats,
158 				tx_64b_frames)},
159 	{"tx_65b_127b_frames", offsetof(struct tx_port_stats,
160 				tx_65b_127b_frames)},
161 	{"tx_128b_255b_frames", offsetof(struct tx_port_stats,
162 				tx_128b_255b_frames)},
163 	{"tx_256b_511b_frames", offsetof(struct tx_port_stats,
164 				tx_256b_511b_frames)},
165 	{"tx_512b_1023b_frames", offsetof(struct tx_port_stats,
166 				tx_512b_1023b_frames)},
167 	{"tx_1024b_1518b_frames", offsetof(struct tx_port_stats,
168 				tx_1024b_1518b_frames)},
169 	{"tx_good_vlan_frames", offsetof(struct tx_port_stats,
170 				tx_good_vlan_frames)},
171 	{"tx_1519b_2047b_frames", offsetof(struct tx_port_stats,
172 				tx_1519b_2047b_frames)},
173 	{"tx_2048b_4095b_frames", offsetof(struct tx_port_stats,
174 				tx_2048b_4095b_frames)},
175 	{"tx_4096b_9216b_frames", offsetof(struct tx_port_stats,
176 				tx_4096b_9216b_frames)},
177 	{"tx_9217b_16383b_frames", offsetof(struct tx_port_stats,
178 				tx_9217b_16383b_frames)},
179 	{"tx_good_frames", offsetof(struct tx_port_stats,
180 				tx_good_frames)},
181 	{"tx_total_frames", offsetof(struct tx_port_stats,
182 				tx_total_frames)},
183 	{"tx_ucast_frames", offsetof(struct tx_port_stats,
184 				tx_ucast_frames)},
185 	{"tx_mcast_frames", offsetof(struct tx_port_stats,
186 				tx_mcast_frames)},
187 	{"tx_bcast_frames", offsetof(struct tx_port_stats,
188 				tx_bcast_frames)},
189 	{"tx_pause_frames", offsetof(struct tx_port_stats,
190 				tx_pause_frames)},
191 	{"tx_pfc_frames", offsetof(struct tx_port_stats,
192 				tx_pfc_frames)},
193 	{"tx_jabber_frames", offsetof(struct tx_port_stats,
194 				tx_jabber_frames)},
195 	{"tx_fcs_err_frames", offsetof(struct tx_port_stats,
196 				tx_fcs_err_frames)},
197 	{"tx_control_frames", offsetof(struct tx_port_stats,
198 				tx_control_frames)},
199 	{"tx_oversz_frames", offsetof(struct tx_port_stats,
200 				tx_oversz_frames)},
201 	{"tx_single_dfrl_frames", offsetof(struct tx_port_stats,
202 				tx_single_dfrl_frames)},
203 	{"tx_multi_dfrl_frames", offsetof(struct tx_port_stats,
204 				tx_multi_dfrl_frames)},
205 	{"tx_single_coll_frames", offsetof(struct tx_port_stats,
206 				tx_single_coll_frames)},
207 	{"tx_multi_coll_frames", offsetof(struct tx_port_stats,
208 				tx_multi_coll_frames)},
209 	{"tx_late_coll_frames", offsetof(struct tx_port_stats,
210 				tx_late_coll_frames)},
211 	{"tx_excessive_coll_frames", offsetof(struct tx_port_stats,
212 				tx_excessive_coll_frames)},
213 	{"tx_frag_frames", offsetof(struct tx_port_stats,
214 				tx_frag_frames)},
215 	{"tx_err", offsetof(struct tx_port_stats,
216 				tx_err)},
217 	{"tx_tagged_frames", offsetof(struct tx_port_stats,
218 				tx_tagged_frames)},
219 	{"tx_dbl_tagged_frames", offsetof(struct tx_port_stats,
220 				tx_dbl_tagged_frames)},
221 	{"tx_runt_frames", offsetof(struct tx_port_stats,
222 				tx_runt_frames)},
223 	{"tx_fifo_underruns", offsetof(struct tx_port_stats,
224 				tx_fifo_underruns)},
225 	{"tx_eee_lpi_events", offsetof(struct tx_port_stats,
226 				tx_eee_lpi_events)},
227 	{"tx_eee_lpi_duration", offsetof(struct tx_port_stats,
228 				tx_eee_lpi_duration)},
229 	{"tx_total_collisions", offsetof(struct tx_port_stats,
230 				tx_total_collisions)},
231 	{"tx_bytes", offsetof(struct tx_port_stats,
232 				tx_bytes)},
233 	{"tx_pfc_ena_frames_pri0", offsetof(struct tx_port_stats,
234 				tx_pfc_ena_frames_pri0)},
235 	{"tx_pfc_ena_frames_pri1", offsetof(struct tx_port_stats,
236 				tx_pfc_ena_frames_pri1)},
237 	{"tx_pfc_ena_frames_pri2", offsetof(struct tx_port_stats,
238 				tx_pfc_ena_frames_pri2)},
239 	{"tx_pfc_ena_frames_pri3", offsetof(struct tx_port_stats,
240 				tx_pfc_ena_frames_pri3)},
241 	{"tx_pfc_ena_frames_pri4", offsetof(struct tx_port_stats,
242 				tx_pfc_ena_frames_pri4)},
243 	{"tx_pfc_ena_frames_pri5", offsetof(struct tx_port_stats,
244 				tx_pfc_ena_frames_pri5)},
245 	{"tx_pfc_ena_frames_pri6", offsetof(struct tx_port_stats,
246 				tx_pfc_ena_frames_pri6)},
247 	{"tx_pfc_ena_frames_pri7", offsetof(struct tx_port_stats,
248 				tx_pfc_ena_frames_pri7)},
249 	{"tx_llfc_logical_msgs", offsetof(struct tx_port_stats,
250 				tx_llfc_logical_msgs)},
251 	{"tx_hcfc_msgs", offsetof(struct tx_port_stats,
252 				tx_hcfc_msgs)},
253 	{"tx_xthol_frames", offsetof(struct tx_port_stats,
254 				tx_xthol_frames)},
255 	{"tx_stat_discard", offsetof(struct tx_port_stats,
256 				tx_stat_discard)},
257 	{"tx_stat_error", offsetof(struct tx_port_stats,
258 				tx_stat_error)},
259 };
260 
261 static const struct bnxt_xstats_name_off bnxt_func_stats_strings[] = {
262 	{"tx_ucast_pkts", offsetof(struct hwrm_func_qstats_output,
263 				tx_ucast_pkts)},
264 	{"tx_mcast_pkts", offsetof(struct hwrm_func_qstats_output,
265 				tx_mcast_pkts)},
266 	{"tx_bcast_pkts", offsetof(struct hwrm_func_qstats_output,
267 				tx_bcast_pkts)},
268 	{"tx_discard_pkts", offsetof(struct hwrm_func_qstats_output,
269 				tx_discard_pkts)},
270 	{"tx_drop_pkts", offsetof(struct hwrm_func_qstats_output,
271 				tx_drop_pkts)},
272 	{"tx_ucast_bytes", offsetof(struct hwrm_func_qstats_output,
273 				tx_ucast_bytes)},
274 	{"tx_mcast_bytes", offsetof(struct hwrm_func_qstats_output,
275 				tx_mcast_bytes)},
276 	{"tx_bcast_bytes", offsetof(struct hwrm_func_qstats_output,
277 				tx_bcast_bytes)},
278 	{"rx_ucast_pkts", offsetof(struct hwrm_func_qstats_output,
279 				rx_ucast_pkts)},
280 	{"rx_mcast_pkts", offsetof(struct hwrm_func_qstats_output,
281 				rx_mcast_pkts)},
282 	{"rx_bcast_pkts", offsetof(struct hwrm_func_qstats_output,
283 				rx_bcast_pkts)},
284 	{"rx_discard_pkts", offsetof(struct hwrm_func_qstats_output,
285 				rx_discard_pkts)},
286 	{"rx_drop_pkts", offsetof(struct hwrm_func_qstats_output,
287 				rx_drop_pkts)},
288 	{"rx_ucast_bytes", offsetof(struct hwrm_func_qstats_output,
289 				rx_ucast_bytes)},
290 	{"rx_mcast_bytes", offsetof(struct hwrm_func_qstats_output,
291 				rx_mcast_bytes)},
292 	{"rx_bcast_bytes", offsetof(struct hwrm_func_qstats_output,
293 				rx_bcast_bytes)},
294 	{"rx_agg_pkts", offsetof(struct hwrm_func_qstats_output,
295 				rx_agg_pkts)},
296 	{"rx_agg_bytes", offsetof(struct hwrm_func_qstats_output,
297 				rx_agg_bytes)},
298 	{"rx_agg_events", offsetof(struct hwrm_func_qstats_output,
299 				rx_agg_events)},
300 	{"rx_agg_aborts", offsetof(struct hwrm_func_qstats_output,
301 				rx_agg_aborts)},
302 };
303 
304 
305 static const struct bnxt_xstats_name_off bnxt_rx_ext_stats_strings[] = {
306 	{"link_down_events", offsetof(struct rx_port_stats_ext,
307 				link_down_events)},
308 	{"continuous_pause_events", offsetof(struct rx_port_stats_ext,
309 				continuous_pause_events)},
310 	{"resume_pause_events", offsetof(struct rx_port_stats_ext,
311 				resume_pause_events)},
312 	{"continuous_roce_pause_events", offsetof(struct rx_port_stats_ext,
313 				continuous_roce_pause_events)},
314 	{"resume_roce_pause_events", offsetof(struct rx_port_stats_ext,
315 				resume_roce_pause_events)},
316 	{"rx_bytes_cos0", offsetof(struct rx_port_stats_ext,
317 				rx_bytes_cos0)},
318 	{"rx_bytes_cos1", offsetof(struct rx_port_stats_ext,
319 				rx_bytes_cos1)},
320 	{"rx_bytes_cos2", offsetof(struct rx_port_stats_ext,
321 				rx_bytes_cos2)},
322 	{"rx_bytes_cos3", offsetof(struct rx_port_stats_ext,
323 				rx_bytes_cos3)},
324 	{"rx_bytes_cos4", offsetof(struct rx_port_stats_ext,
325 				rx_bytes_cos4)},
326 	{"rx_bytes_cos5", offsetof(struct rx_port_stats_ext,
327 				rx_bytes_cos5)},
328 	{"rx_bytes_cos6", offsetof(struct rx_port_stats_ext,
329 				rx_bytes_cos6)},
330 	{"rx_bytes_cos7", offsetof(struct rx_port_stats_ext,
331 				rx_bytes_cos7)},
332 	{"rx_packets_cos0", offsetof(struct rx_port_stats_ext,
333 				rx_packets_cos0)},
334 	{"rx_packets_cos1", offsetof(struct rx_port_stats_ext,
335 				rx_packets_cos1)},
336 	{"rx_packets_cos2", offsetof(struct rx_port_stats_ext,
337 				rx_packets_cos2)},
338 	{"rx_packets_cos3", offsetof(struct rx_port_stats_ext,
339 				rx_packets_cos3)},
340 	{"rx_packets_cos4", offsetof(struct rx_port_stats_ext,
341 				rx_packets_cos4)},
342 	{"rx_packets_cos5", offsetof(struct rx_port_stats_ext,
343 				rx_packets_cos5)},
344 	{"rx_packets_cos6", offsetof(struct rx_port_stats_ext,
345 				rx_packets_cos6)},
346 	{"rx_packets_cos7", offsetof(struct rx_port_stats_ext,
347 				rx_packets_cos7)},
348 	{"pfc_pri0_rx_duration_us", offsetof(struct rx_port_stats_ext,
349 				pfc_pri0_rx_duration_us)},
350 	{"pfc_pri0_rx_transitions", offsetof(struct rx_port_stats_ext,
351 				pfc_pri0_rx_transitions)},
352 	{"pfc_pri1_rx_duration_us", offsetof(struct rx_port_stats_ext,
353 				pfc_pri1_rx_duration_us)},
354 	{"pfc_pri1_rx_transitions", offsetof(struct rx_port_stats_ext,
355 				pfc_pri1_rx_transitions)},
356 	{"pfc_pri2_rx_duration_us", offsetof(struct rx_port_stats_ext,
357 				pfc_pri2_rx_duration_us)},
358 	{"pfc_pri2_rx_transitions", offsetof(struct rx_port_stats_ext,
359 				pfc_pri2_rx_transitions)},
360 	{"pfc_pri3_rx_duration_us", offsetof(struct rx_port_stats_ext,
361 				pfc_pri3_rx_duration_us)},
362 	{"pfc_pri3_rx_transitions", offsetof(struct rx_port_stats_ext,
363 				pfc_pri3_rx_transitions)},
364 	{"pfc_pri4_rx_duration_us", offsetof(struct rx_port_stats_ext,
365 				pfc_pri4_rx_duration_us)},
366 	{"pfc_pri4_rx_transitions", offsetof(struct rx_port_stats_ext,
367 				pfc_pri4_rx_transitions)},
368 	{"pfc_pri5_rx_duration_us", offsetof(struct rx_port_stats_ext,
369 				pfc_pri5_rx_duration_us)},
370 	{"pfc_pri5_rx_transitions", offsetof(struct rx_port_stats_ext,
371 				pfc_pri5_rx_transitions)},
372 	{"pfc_pri6_rx_duration_us", offsetof(struct rx_port_stats_ext,
373 				pfc_pri6_rx_duration_us)},
374 	{"pfc_pri6_rx_transitions", offsetof(struct rx_port_stats_ext,
375 				pfc_pri6_rx_transitions)},
376 	{"pfc_pri7_rx_duration_us", offsetof(struct rx_port_stats_ext,
377 				pfc_pri7_rx_duration_us)},
378 	{"pfc_pri7_rx_transitions", offsetof(struct rx_port_stats_ext,
379 				pfc_pri7_rx_transitions)},
380 	{"rx_bits",		offsetof(struct rx_port_stats_ext,
381 				rx_bits)},
382 	{"rx_buffer_passed_threshold", offsetof(struct rx_port_stats_ext,
383 				rx_buffer_passed_threshold)},
384 	{"rx_pcs_symbol_err",	offsetof(struct rx_port_stats_ext,
385 				rx_pcs_symbol_err)},
386 	{"rx_corrected_bits",	offsetof(struct rx_port_stats_ext,
387 				rx_corrected_bits)},
388 	{"rx_discard_bytes_cos0", offsetof(struct rx_port_stats_ext,
389 				rx_discard_bytes_cos0)},
390 	{"rx_discard_bytes_cos1", offsetof(struct rx_port_stats_ext,
391 				rx_discard_bytes_cos1)},
392 	{"rx_discard_bytes_cos2", offsetof(struct rx_port_stats_ext,
393 				rx_discard_bytes_cos2)},
394 	{"rx_discard_bytes_cos3", offsetof(struct rx_port_stats_ext,
395 				rx_discard_bytes_cos3)},
396 	{"rx_discard_bytes_cos4", offsetof(struct rx_port_stats_ext,
397 				rx_discard_bytes_cos4)},
398 	{"rx_discard_bytes_cos5", offsetof(struct rx_port_stats_ext,
399 				rx_discard_bytes_cos5)},
400 	{"rx_discard_bytes_cos6", offsetof(struct rx_port_stats_ext,
401 				rx_discard_bytes_cos6)},
402 	{"rx_discard_bytes_cos7", offsetof(struct rx_port_stats_ext,
403 				rx_discard_bytes_cos7)},
404 	{"rx_discard_packets_cos0", offsetof(struct rx_port_stats_ext,
405 				rx_discard_packets_cos0)},
406 	{"rx_discard_packets_cos1", offsetof(struct rx_port_stats_ext,
407 				rx_discard_packets_cos1)},
408 	{"rx_discard_packets_cos2", offsetof(struct rx_port_stats_ext,
409 				rx_discard_packets_cos2)},
410 	{"rx_discard_packets_cos3", offsetof(struct rx_port_stats_ext,
411 				rx_discard_packets_cos3)},
412 	{"rx_discard_packets_cos4", offsetof(struct rx_port_stats_ext,
413 				rx_discard_packets_cos4)},
414 	{"rx_discard_packets_cos5", offsetof(struct rx_port_stats_ext,
415 				rx_discard_packets_cos5)},
416 	{"rx_discard_packets_cos6", offsetof(struct rx_port_stats_ext,
417 				rx_discard_packets_cos6)},
418 	{"rx_discard_packets_cos7", offsetof(struct rx_port_stats_ext,
419 				rx_discard_packets_cos7)},
420 };
421 
422 static const struct bnxt_xstats_name_off bnxt_tx_ext_stats_strings[] = {
423 	{"tx_bytes_cos0", offsetof(struct tx_port_stats_ext,
424 				tx_bytes_cos0)},
425 	{"tx_bytes_cos1", offsetof(struct tx_port_stats_ext,
426 				tx_bytes_cos1)},
427 	{"tx_bytes_cos2", offsetof(struct tx_port_stats_ext,
428 				tx_bytes_cos2)},
429 	{"tx_bytes_cos3", offsetof(struct tx_port_stats_ext,
430 				tx_bytes_cos3)},
431 	{"tx_bytes_cos4", offsetof(struct tx_port_stats_ext,
432 				tx_bytes_cos4)},
433 	{"tx_bytes_cos5", offsetof(struct tx_port_stats_ext,
434 				tx_bytes_cos5)},
435 	{"tx_bytes_cos6", offsetof(struct tx_port_stats_ext,
436 				tx_bytes_cos6)},
437 	{"tx_bytes_cos7", offsetof(struct tx_port_stats_ext,
438 				tx_bytes_cos7)},
439 	{"tx_packets_cos0", offsetof(struct tx_port_stats_ext,
440 				tx_packets_cos0)},
441 	{"tx_packets_cos1", offsetof(struct tx_port_stats_ext,
442 				tx_packets_cos1)},
443 	{"tx_packets_cos2", offsetof(struct tx_port_stats_ext,
444 				tx_packets_cos2)},
445 	{"tx_packets_cos3", offsetof(struct tx_port_stats_ext,
446 				tx_packets_cos3)},
447 	{"tx_packets_cos4", offsetof(struct tx_port_stats_ext,
448 				tx_packets_cos4)},
449 	{"tx_packets_cos5", offsetof(struct tx_port_stats_ext,
450 				tx_packets_cos5)},
451 	{"tx_packets_cos6", offsetof(struct tx_port_stats_ext,
452 				tx_packets_cos6)},
453 	{"tx_packets_cos7", offsetof(struct tx_port_stats_ext,
454 				tx_packets_cos7)},
455 	{"pfc_pri0_tx_duration_us", offsetof(struct tx_port_stats_ext,
456 				pfc_pri0_tx_duration_us)},
457 	{"pfc_pri0_tx_transitions", offsetof(struct tx_port_stats_ext,
458 				pfc_pri0_tx_transitions)},
459 	{"pfc_pri1_tx_duration_us", offsetof(struct tx_port_stats_ext,
460 				pfc_pri1_tx_duration_us)},
461 	{"pfc_pri1_tx_transitions", offsetof(struct tx_port_stats_ext,
462 				pfc_pri1_tx_transitions)},
463 	{"pfc_pri2_tx_duration_us", offsetof(struct tx_port_stats_ext,
464 				pfc_pri2_tx_duration_us)},
465 	{"pfc_pri2_tx_transitions", offsetof(struct tx_port_stats_ext,
466 				pfc_pri2_tx_transitions)},
467 	{"pfc_pri3_tx_duration_us", offsetof(struct tx_port_stats_ext,
468 				pfc_pri3_tx_duration_us)},
469 	{"pfc_pri3_tx_transitions", offsetof(struct tx_port_stats_ext,
470 				pfc_pri3_tx_transitions)},
471 	{"pfc_pri4_tx_duration_us", offsetof(struct tx_port_stats_ext,
472 				pfc_pri4_tx_duration_us)},
473 	{"pfc_pri4_tx_transitions", offsetof(struct tx_port_stats_ext,
474 				pfc_pri4_tx_transitions)},
475 	{"pfc_pri5_tx_duration_us", offsetof(struct tx_port_stats_ext,
476 				pfc_pri5_tx_duration_us)},
477 	{"pfc_pri5_tx_transitions", offsetof(struct tx_port_stats_ext,
478 				pfc_pri5_tx_transitions)},
479 	{"pfc_pri6_tx_duration_us", offsetof(struct tx_port_stats_ext,
480 				pfc_pri6_tx_duration_us)},
481 	{"pfc_pri6_tx_transitions", offsetof(struct tx_port_stats_ext,
482 				pfc_pri6_tx_transitions)},
483 	{"pfc_pri7_tx_duration_us", offsetof(struct tx_port_stats_ext,
484 				pfc_pri7_tx_duration_us)},
485 	{"pfc_pri7_tx_transitions", offsetof(struct tx_port_stats_ext,
486 				pfc_pri7_tx_transitions)},
487 };
488 
489 /*
490  * Statistics functions
491  */
492 
493 void bnxt_free_stats(struct bnxt *bp)
494 {
495 	int i;
496 
497 	for (i = 0; i < (int)bp->tx_cp_nr_rings; i++) {
498 		struct bnxt_tx_queue *txq = bp->tx_queues[i];
499 
500 		bnxt_free_txq_stats(txq);
501 	}
502 	for (i = 0; i < (int)bp->rx_cp_nr_rings; i++) {
503 		struct bnxt_rx_queue *rxq = bp->rx_queues[i];
504 
505 		bnxt_free_rxq_stats(rxq);
506 	}
507 }
508 
509 int bnxt_stats_get_op(struct rte_eth_dev *eth_dev,
510 			   struct rte_eth_stats *bnxt_stats)
511 {
512 	int rc = 0;
513 	unsigned int i;
514 	struct bnxt *bp = eth_dev->data->dev_private;
515 	unsigned int num_q_stats;
516 
517 	rc = is_bnxt_in_error(bp);
518 	if (rc)
519 		return rc;
520 
521 	if (!eth_dev->data->dev_started)
522 		return -EIO;
523 
524 	num_q_stats = RTE_MIN(bp->rx_cp_nr_rings,
525 			      (unsigned int)RTE_ETHDEV_QUEUE_STAT_CNTRS);
526 
527 	for (i = 0; i < num_q_stats; i++) {
528 		struct bnxt_rx_queue *rxq = bp->rx_queues[i];
529 		struct bnxt_cp_ring_info *cpr = rxq->cp_ring;
530 
531 		if (!rxq->rx_started)
532 			continue;
533 		rc = bnxt_hwrm_ctx_qstats(bp, cpr->hw_stats_ctx_id, i,
534 				     bnxt_stats, 1);
535 		if (unlikely(rc))
536 			return rc;
537 		bnxt_stats->rx_nombuf +=
538 				rte_atomic64_read(&rxq->rx_mbuf_alloc_fail);
539 	}
540 
541 	num_q_stats = RTE_MIN(bp->tx_cp_nr_rings,
542 			      (unsigned int)RTE_ETHDEV_QUEUE_STAT_CNTRS);
543 
544 	for (i = 0; i < num_q_stats; i++) {
545 		struct bnxt_tx_queue *txq = bp->tx_queues[i];
546 		struct bnxt_cp_ring_info *cpr = txq->cp_ring;
547 
548 		if (!txq->tx_started)
549 			continue;
550 		rc = bnxt_hwrm_ctx_qstats(bp, cpr->hw_stats_ctx_id, i,
551 				     bnxt_stats, 0);
552 		if (unlikely(rc))
553 			return rc;
554 	}
555 
556 	rc = bnxt_hwrm_func_qstats(bp, 0xffff, bnxt_stats, NULL);
557 	return rc;
558 }
559 
560 int bnxt_stats_reset_op(struct rte_eth_dev *eth_dev)
561 {
562 	struct bnxt *bp = eth_dev->data->dev_private;
563 	unsigned int i;
564 	int ret;
565 
566 	ret = is_bnxt_in_error(bp);
567 	if (ret)
568 		return ret;
569 
570 	if (!eth_dev->data->dev_started) {
571 		PMD_DRV_LOG(ERR, "Device Initialization not complete!\n");
572 		return -EINVAL;
573 	}
574 
575 	ret = bnxt_clear_all_hwrm_stat_ctxs(bp);
576 	for (i = 0; i < bp->rx_cp_nr_rings; i++) {
577 		struct bnxt_rx_queue *rxq = bp->rx_queues[i];
578 
579 		rte_atomic64_clear(&rxq->rx_mbuf_alloc_fail);
580 	}
581 
582 	return ret;
583 }
584 
585 int bnxt_dev_xstats_get_op(struct rte_eth_dev *eth_dev,
586 			   struct rte_eth_xstat *xstats, unsigned int n)
587 {
588 	struct bnxt *bp = eth_dev->data->dev_private;
589 	unsigned int count, i;
590 	unsigned int rx_port_stats_ext_cnt;
591 	unsigned int tx_port_stats_ext_cnt;
592 	unsigned int stat_size = sizeof(uint64_t);
593 	struct hwrm_func_qstats_output func_qstats = {0};
594 	unsigned int stat_count;
595 	int rc;
596 
597 	rc = is_bnxt_in_error(bp);
598 	if (rc)
599 		return rc;
600 
601 	stat_count = RTE_DIM(bnxt_rx_stats_strings) +
602 		RTE_DIM(bnxt_tx_stats_strings) +
603 		RTE_DIM(bnxt_func_stats_strings) +
604 		RTE_DIM(bnxt_rx_ext_stats_strings) +
605 		RTE_DIM(bnxt_tx_ext_stats_strings) +
606 		bnxt_flow_stats_cnt(bp);
607 
608 	if (n < stat_count || xstats == NULL)
609 		return stat_count;
610 
611 	bnxt_hwrm_func_qstats(bp, 0xffff, NULL, &func_qstats);
612 	bnxt_hwrm_port_qstats(bp);
613 	bnxt_hwrm_ext_port_qstats(bp);
614 	rx_port_stats_ext_cnt = RTE_MIN(RTE_DIM(bnxt_rx_ext_stats_strings),
615 					(bp->fw_rx_port_stats_ext_size /
616 					 stat_size));
617 	tx_port_stats_ext_cnt = RTE_MIN(RTE_DIM(bnxt_tx_ext_stats_strings),
618 					(bp->fw_tx_port_stats_ext_size /
619 					 stat_size));
620 
621 	memset(xstats, 0, sizeof(*xstats));
622 
623 	count = 0;
624 	for (i = 0; i < RTE_DIM(bnxt_rx_stats_strings); i++) {
625 		uint64_t *rx_stats = (uint64_t *)bp->hw_rx_port_stats;
626 		xstats[count].id = count;
627 		xstats[count].value = rte_le_to_cpu_64(
628 				*(uint64_t *)((char *)rx_stats +
629 				bnxt_rx_stats_strings[i].offset));
630 		count++;
631 	}
632 
633 	for (i = 0; i < RTE_DIM(bnxt_tx_stats_strings); i++) {
634 		uint64_t *tx_stats = (uint64_t *)bp->hw_tx_port_stats;
635 		xstats[count].id = count;
636 		xstats[count].value = rte_le_to_cpu_64(
637 				 *(uint64_t *)((char *)tx_stats +
638 				bnxt_tx_stats_strings[i].offset));
639 		count++;
640 	}
641 
642 	for (i = 0; i < RTE_DIM(bnxt_func_stats_strings); i++) {
643 		xstats[count].id = count;
644 		xstats[count].value =
645 			rte_le_to_cpu_64(*(uint64_t *)((char *)&func_qstats +
646 					 bnxt_func_stats_strings[i].offset));
647 		count++;
648 	}
649 
650 
651 	for (i = 0; i < rx_port_stats_ext_cnt; i++) {
652 		uint64_t *rx_stats_ext = (uint64_t *)bp->hw_rx_port_stats_ext;
653 
654 		xstats[count].value = rte_le_to_cpu_64
655 					(*(uint64_t *)((char *)rx_stats_ext +
656 					 bnxt_rx_ext_stats_strings[i].offset));
657 
658 		count++;
659 	}
660 
661 	for (i = 0; i < tx_port_stats_ext_cnt; i++) {
662 		uint64_t *tx_stats_ext = (uint64_t *)bp->hw_tx_port_stats_ext;
663 
664 		xstats[count].value = rte_le_to_cpu_64
665 					(*(uint64_t *)((char *)tx_stats_ext +
666 					 bnxt_tx_ext_stats_strings[i].offset));
667 		count++;
668 	}
669 
670 	if (bp->fw_cap & BNXT_FW_CAP_ADV_FLOW_COUNTERS &&
671 	    bp->fw_cap & BNXT_FW_CAP_ADV_FLOW_MGMT &&
672 	    BNXT_FLOW_XSTATS_EN(bp)) {
673 		int j;
674 
675 		i = 0;
676 		for (j = 0; j < bp->max_vnics; j++) {
677 			struct bnxt_filter_info *filter;
678 			struct bnxt_vnic_info *vnic;
679 			struct rte_flow *flow;
680 
681 			vnic = &bp->vnic_info[j];
682 			if (vnic && vnic->fw_vnic_id == INVALID_VNIC_ID)
683 				continue;
684 
685 			if (STAILQ_EMPTY(&vnic->flow_list))
686 				continue;
687 
688 			STAILQ_FOREACH(flow, &vnic->flow_list, next) {
689 				if (!flow || !flow->filter)
690 					continue;
691 
692 				filter = flow->filter;
693 				xstats[count].id = count;
694 				xstats[count].value =
695 					filter->hw_stats.bytes;
696 				count++;
697 				xstats[count].id = count;
698 				xstats[count].value =
699 					filter->hw_stats.packets;
700 				count++;
701 				if (++i > bp->max_l2_ctx)
702 					break;
703 			}
704 			if (i > bp->max_l2_ctx)
705 				break;
706 		}
707 	}
708 
709 	return stat_count;
710 }
711 
712 int bnxt_flow_stats_cnt(struct bnxt *bp)
713 {
714 	if (bp->fw_cap & BNXT_FW_CAP_ADV_FLOW_COUNTERS &&
715 	    bp->fw_cap & BNXT_FW_CAP_ADV_FLOW_MGMT &&
716 	    BNXT_FLOW_XSTATS_EN(bp)) {
717 		struct bnxt_xstats_name_off flow_bytes[bp->max_l2_ctx];
718 		struct bnxt_xstats_name_off flow_pkts[bp->max_l2_ctx];
719 
720 		return RTE_DIM(flow_bytes) + RTE_DIM(flow_pkts);
721 	}
722 
723 	return 0;
724 }
725 
726 int bnxt_dev_xstats_get_names_op(struct rte_eth_dev *eth_dev,
727 		struct rte_eth_xstat_name *xstats_names,
728 		__rte_unused unsigned int limit)
729 {
730 	struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;
731 	const unsigned int stat_cnt = RTE_DIM(bnxt_rx_stats_strings) +
732 				RTE_DIM(bnxt_tx_stats_strings) +
733 				RTE_DIM(bnxt_func_stats_strings) +
734 				RTE_DIM(bnxt_rx_ext_stats_strings) +
735 				RTE_DIM(bnxt_tx_ext_stats_strings) +
736 				bnxt_flow_stats_cnt(bp);
737 	unsigned int i, count = 0;
738 	int rc;
739 
740 	rc = is_bnxt_in_error(bp);
741 	if (rc)
742 		return rc;
743 
744 	if (xstats_names != NULL) {
745 		count = 0;
746 
747 		for (i = 0; i < RTE_DIM(bnxt_rx_stats_strings); i++) {
748 			strlcpy(xstats_names[count].name,
749 				bnxt_rx_stats_strings[i].name,
750 				sizeof(xstats_names[count].name));
751 			count++;
752 		}
753 
754 		for (i = 0; i < RTE_DIM(bnxt_tx_stats_strings); i++) {
755 			strlcpy(xstats_names[count].name,
756 				bnxt_tx_stats_strings[i].name,
757 				sizeof(xstats_names[count].name));
758 			count++;
759 		}
760 
761 		for (i = 0; i < RTE_DIM(bnxt_func_stats_strings); i++) {
762 			strlcpy(xstats_names[count].name,
763 				bnxt_func_stats_strings[i].name,
764 				sizeof(xstats_names[count].name));
765 			count++;
766 		}
767 
768 		for (i = 0; i < RTE_DIM(bnxt_rx_ext_stats_strings); i++) {
769 			strlcpy(xstats_names[count].name,
770 				bnxt_rx_ext_stats_strings[i].name,
771 				sizeof(xstats_names[count].name));
772 
773 			count++;
774 		}
775 
776 		for (i = 0; i < RTE_DIM(bnxt_tx_ext_stats_strings); i++) {
777 			strlcpy(xstats_names[count].name,
778 				bnxt_tx_ext_stats_strings[i].name,
779 				sizeof(xstats_names[count].name));
780 
781 			count++;
782 		}
783 
784 		if (bp->fw_cap & BNXT_FW_CAP_ADV_FLOW_COUNTERS &&
785 		    bp->fw_cap & BNXT_FW_CAP_ADV_FLOW_MGMT &&
786 		    BNXT_FLOW_XSTATS_EN(bp)) {
787 			for (i = 0; i < bp->max_l2_ctx; i++) {
788 				char buf[RTE_ETH_XSTATS_NAME_SIZE];
789 
790 				sprintf(buf, "flow_%d_bytes", i);
791 				strlcpy(xstats_names[count].name, buf,
792 					sizeof(xstats_names[count].name));
793 				count++;
794 
795 				sprintf(buf, "flow_%d_packets", i);
796 				strlcpy(xstats_names[count].name, buf,
797 					sizeof(xstats_names[count].name));
798 
799 				count++;
800 			}
801 		}
802 	}
803 
804 	return stat_cnt;
805 }
806 
807 int bnxt_dev_xstats_reset_op(struct rte_eth_dev *eth_dev)
808 {
809 	struct bnxt *bp = eth_dev->data->dev_private;
810 	int ret;
811 
812 	ret = is_bnxt_in_error(bp);
813 	if (ret)
814 		return ret;
815 
816 	if (BNXT_VF(bp) || !BNXT_SINGLE_PF(bp) ||
817 	    !(bp->flags & BNXT_FLAG_PORT_STATS)) {
818 		PMD_DRV_LOG(ERR, "Operation not supported\n");
819 		return -ENOTSUP;
820 	}
821 
822 	ret = bnxt_hwrm_port_clr_stats(bp);
823 	if (ret != 0)
824 		PMD_DRV_LOG(ERR, "Failed to reset xstats: %s\n",
825 			    strerror(-ret));
826 
827 	return ret;
828 }
829 
830 /* Update the input context memory with the flow counter IDs
831  * of the flows that we are interested in.
832  * Also, update the output tables with the current local values
833  * since that is what will be used by FW to accumulate
834  */
835 static void bnxt_update_fc_pre_qstat(uint32_t *in_tbl,
836 				     uint64_t *out_tbl,
837 				     struct bnxt_filter_info *filter,
838 				     uint32_t *ptbl_cnt)
839 {
840 	uint32_t in_tbl_cnt = *ptbl_cnt;
841 
842 	in_tbl[in_tbl_cnt] = filter->flow_id;
843 	out_tbl[2 * in_tbl_cnt] = filter->hw_stats.packets;
844 	out_tbl[2 * in_tbl_cnt + 1] = filter->hw_stats.bytes;
845 	in_tbl_cnt++;
846 	*ptbl_cnt = in_tbl_cnt;
847 }
848 
849 /* Post issuing counter_qstats cmd, update the driver's local stat
850  * entries with the values DMA-ed by FW in the output table
851  */
852 static void bnxt_update_fc_post_qstat(struct bnxt_filter_info *filter,
853 				      uint64_t *out_tbl,
854 				      uint32_t out_tbl_idx)
855 {
856 	filter->hw_stats.packets = out_tbl[2 * out_tbl_idx];
857 	filter->hw_stats.bytes = out_tbl[(2 * out_tbl_idx) + 1];
858 }
859 
860 static int bnxt_update_fc_tbl(struct bnxt *bp, uint16_t ctr,
861 			      struct bnxt_filter_info *en_tbl[],
862 			      uint16_t in_flow_cnt)
863 {
864 	uint32_t *in_rx_tbl;
865 	uint64_t *out_rx_tbl;
866 	uint32_t in_rx_tbl_cnt = 0;
867 	uint32_t out_rx_tbl_cnt = 0;
868 	int i, rc = 0;
869 
870 	in_rx_tbl = (uint32_t *)bp->flow_stat->rx_fc_in_tbl.va;
871 	out_rx_tbl = (uint64_t *)bp->flow_stat->rx_fc_out_tbl.va;
872 
873 	for (i = 0; i < in_flow_cnt; i++) {
874 		if (!en_tbl[i])
875 			continue;
876 
877 		/* Currently only ingress/Rx flows are supported anyway. */
878 		bnxt_update_fc_pre_qstat(in_rx_tbl, out_rx_tbl,
879 					 en_tbl[i], &in_rx_tbl_cnt);
880 	}
881 
882 	/* Currently only ingress/Rx flows are supported */
883 	if (in_rx_tbl_cnt) {
884 		rc = bnxt_hwrm_cfa_counter_qstats(bp, BNXT_DIR_RX, ctr,
885 						  in_rx_tbl_cnt);
886 		if (rc)
887 			return rc;
888 	}
889 
890 	for (i = 0; i < in_flow_cnt; i++) {
891 		if (!en_tbl[i])
892 			continue;
893 
894 		/* Currently only ingress/Rx flows are supported */
895 		bnxt_update_fc_post_qstat(en_tbl[i], out_rx_tbl,
896 					  out_rx_tbl_cnt);
897 		out_rx_tbl_cnt++;
898 	}
899 
900 	return rc;
901 }
902 
903 /* Walks through the list which has all the flows
904  * requesting for explicit flow counters.
905  */
906 int bnxt_flow_stats_req(struct bnxt *bp)
907 {
908 	int i;
909 	int rc = 0;
910 	struct rte_flow *flow;
911 	uint16_t in_flow_tbl_cnt = 0;
912 	struct bnxt_vnic_info *vnic = NULL;
913 	struct bnxt_filter_info *valid_en_tbl[bp->flow_stat->max_fc];
914 	uint16_t counter_type = CFA_COUNTER_CFG_IN_COUNTER_TYPE_FC;
915 
916 	bnxt_acquire_flow_lock(bp);
917 	for (i = 0; i < bp->max_vnics; i++) {
918 		vnic = &bp->vnic_info[i];
919 		if (vnic && vnic->fw_vnic_id == INVALID_VNIC_ID)
920 			continue;
921 
922 		if (STAILQ_EMPTY(&vnic->flow_list))
923 			continue;
924 
925 		STAILQ_FOREACH(flow, &vnic->flow_list, next) {
926 			if (!flow || !flow->filter)
927 				continue;
928 
929 			valid_en_tbl[in_flow_tbl_cnt++] = flow->filter;
930 			if (in_flow_tbl_cnt >= bp->flow_stat->max_fc) {
931 				rc = bnxt_update_fc_tbl(bp, counter_type,
932 							valid_en_tbl,
933 							in_flow_tbl_cnt);
934 				if (rc)
935 					goto err;
936 				in_flow_tbl_cnt = 0;
937 				continue;
938 			}
939 		}
940 	}
941 
942 	if (!in_flow_tbl_cnt) {
943 		bnxt_release_flow_lock(bp);
944 		goto out;
945 	}
946 
947 	rc = bnxt_update_fc_tbl(bp, counter_type, valid_en_tbl,
948 				in_flow_tbl_cnt);
949 	if (!rc) {
950 		bnxt_release_flow_lock(bp);
951 		return 0;
952 	}
953 
954 err:
955 	/* If cmd fails once, no need of
956 	 * invoking again every second
957 	 */
958 	bnxt_release_flow_lock(bp);
959 	bnxt_cancel_fc_thread(bp);
960 out:
961 	return rc;
962 }
963