xref: /dpdk/drivers/net/bnxt/bnxt_stats.c (revision 68a03efeed657e6e05f281479b33b51102797e15)
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 		rc = bnxt_hwrm_ctx_qstats(bp, cpr->hw_stats_ctx_id, i,
532 				     bnxt_stats, 1);
533 		if (unlikely(rc))
534 			return rc;
535 		bnxt_stats->rx_nombuf +=
536 				rte_atomic64_read(&rxq->rx_mbuf_alloc_fail);
537 	}
538 
539 	num_q_stats = RTE_MIN(bp->tx_cp_nr_rings,
540 			      (unsigned int)RTE_ETHDEV_QUEUE_STAT_CNTRS);
541 
542 	for (i = 0; i < num_q_stats; i++) {
543 		struct bnxt_tx_queue *txq = bp->tx_queues[i];
544 		struct bnxt_cp_ring_info *cpr = txq->cp_ring;
545 
546 		rc = bnxt_hwrm_ctx_qstats(bp, cpr->hw_stats_ctx_id, i,
547 				     bnxt_stats, 0);
548 		if (unlikely(rc))
549 			return rc;
550 	}
551 
552 	rc = bnxt_hwrm_func_qstats(bp, 0xffff, bnxt_stats, NULL);
553 	return rc;
554 }
555 
556 int bnxt_stats_reset_op(struct rte_eth_dev *eth_dev)
557 {
558 	struct bnxt *bp = eth_dev->data->dev_private;
559 	unsigned int i;
560 	int ret;
561 
562 	ret = is_bnxt_in_error(bp);
563 	if (ret)
564 		return ret;
565 
566 	if (!eth_dev->data->dev_started) {
567 		PMD_DRV_LOG(ERR, "Device Initialization not complete!\n");
568 		return -EINVAL;
569 	}
570 
571 	ret = bnxt_clear_all_hwrm_stat_ctxs(bp);
572 	for (i = 0; i < bp->rx_cp_nr_rings; i++) {
573 		struct bnxt_rx_queue *rxq = bp->rx_queues[i];
574 
575 		rte_atomic64_clear(&rxq->rx_mbuf_alloc_fail);
576 	}
577 
578 	return ret;
579 }
580 
581 int bnxt_dev_xstats_get_op(struct rte_eth_dev *eth_dev,
582 			   struct rte_eth_xstat *xstats, unsigned int n)
583 {
584 	struct bnxt *bp = eth_dev->data->dev_private;
585 	unsigned int count, i;
586 	unsigned int rx_port_stats_ext_cnt;
587 	unsigned int tx_port_stats_ext_cnt;
588 	unsigned int stat_size = sizeof(uint64_t);
589 	struct hwrm_func_qstats_output func_qstats = {0};
590 	unsigned int stat_count;
591 	int rc;
592 
593 	rc = is_bnxt_in_error(bp);
594 	if (rc)
595 		return rc;
596 
597 	stat_count = RTE_DIM(bnxt_rx_stats_strings) +
598 		RTE_DIM(bnxt_tx_stats_strings) +
599 		RTE_DIM(bnxt_func_stats_strings) +
600 		RTE_DIM(bnxt_rx_ext_stats_strings) +
601 		RTE_DIM(bnxt_tx_ext_stats_strings) +
602 		bnxt_flow_stats_cnt(bp);
603 
604 	if (n < stat_count || xstats == NULL)
605 		return stat_count;
606 
607 	bnxt_hwrm_func_qstats(bp, 0xffff, NULL, &func_qstats);
608 	bnxt_hwrm_port_qstats(bp);
609 	bnxt_hwrm_ext_port_qstats(bp);
610 	rx_port_stats_ext_cnt = RTE_MIN(RTE_DIM(bnxt_rx_ext_stats_strings),
611 					(bp->fw_rx_port_stats_ext_size /
612 					 stat_size));
613 	tx_port_stats_ext_cnt = RTE_MIN(RTE_DIM(bnxt_tx_ext_stats_strings),
614 					(bp->fw_tx_port_stats_ext_size /
615 					 stat_size));
616 
617 	memset(xstats, 0, sizeof(*xstats));
618 
619 	count = 0;
620 	for (i = 0; i < RTE_DIM(bnxt_rx_stats_strings); i++) {
621 		uint64_t *rx_stats = (uint64_t *)bp->hw_rx_port_stats;
622 		xstats[count].id = count;
623 		xstats[count].value = rte_le_to_cpu_64(
624 				*(uint64_t *)((char *)rx_stats +
625 				bnxt_rx_stats_strings[i].offset));
626 		count++;
627 	}
628 
629 	for (i = 0; i < RTE_DIM(bnxt_tx_stats_strings); i++) {
630 		uint64_t *tx_stats = (uint64_t *)bp->hw_tx_port_stats;
631 		xstats[count].id = count;
632 		xstats[count].value = rte_le_to_cpu_64(
633 				 *(uint64_t *)((char *)tx_stats +
634 				bnxt_tx_stats_strings[i].offset));
635 		count++;
636 	}
637 
638 	for (i = 0; i < RTE_DIM(bnxt_func_stats_strings); i++) {
639 		xstats[count].id = count;
640 		xstats[count].value =
641 			rte_le_to_cpu_64(*(uint64_t *)((char *)&func_qstats +
642 					 bnxt_func_stats_strings[i].offset));
643 		count++;
644 	}
645 
646 
647 	for (i = 0; i < rx_port_stats_ext_cnt; i++) {
648 		uint64_t *rx_stats_ext = (uint64_t *)bp->hw_rx_port_stats_ext;
649 
650 		xstats[count].value = rte_le_to_cpu_64
651 					(*(uint64_t *)((char *)rx_stats_ext +
652 					 bnxt_rx_ext_stats_strings[i].offset));
653 
654 		count++;
655 	}
656 
657 	for (i = 0; i < tx_port_stats_ext_cnt; i++) {
658 		uint64_t *tx_stats_ext = (uint64_t *)bp->hw_tx_port_stats_ext;
659 
660 		xstats[count].value = rte_le_to_cpu_64
661 					(*(uint64_t *)((char *)tx_stats_ext +
662 					 bnxt_tx_ext_stats_strings[i].offset));
663 		count++;
664 	}
665 
666 	if (bp->fw_cap & BNXT_FW_CAP_ADV_FLOW_COUNTERS &&
667 	    bp->fw_cap & BNXT_FW_CAP_ADV_FLOW_MGMT &&
668 	    BNXT_FLOW_XSTATS_EN(bp)) {
669 		int j;
670 
671 		i = 0;
672 		for (j = 0; j < bp->max_vnics; j++) {
673 			struct bnxt_filter_info *filter;
674 			struct bnxt_vnic_info *vnic;
675 			struct rte_flow *flow;
676 
677 			vnic = &bp->vnic_info[j];
678 			if (vnic && vnic->fw_vnic_id == INVALID_VNIC_ID)
679 				continue;
680 
681 			if (STAILQ_EMPTY(&vnic->flow_list))
682 				continue;
683 
684 			STAILQ_FOREACH(flow, &vnic->flow_list, next) {
685 				if (!flow || !flow->filter)
686 					continue;
687 
688 				filter = flow->filter;
689 				xstats[count].id = count;
690 				xstats[count].value =
691 					filter->hw_stats.bytes;
692 				count++;
693 				xstats[count].id = count;
694 				xstats[count].value =
695 					filter->hw_stats.packets;
696 				count++;
697 				if (++i > bp->max_l2_ctx)
698 					break;
699 			}
700 			if (i > bp->max_l2_ctx)
701 				break;
702 		}
703 	}
704 
705 	return stat_count;
706 }
707 
708 int bnxt_flow_stats_cnt(struct bnxt *bp)
709 {
710 	if (bp->fw_cap & BNXT_FW_CAP_ADV_FLOW_COUNTERS &&
711 	    bp->fw_cap & BNXT_FW_CAP_ADV_FLOW_MGMT &&
712 	    BNXT_FLOW_XSTATS_EN(bp)) {
713 		struct bnxt_xstats_name_off flow_bytes[bp->max_l2_ctx];
714 		struct bnxt_xstats_name_off flow_pkts[bp->max_l2_ctx];
715 
716 		return RTE_DIM(flow_bytes) + RTE_DIM(flow_pkts);
717 	}
718 
719 	return 0;
720 }
721 
722 int bnxt_dev_xstats_get_names_op(struct rte_eth_dev *eth_dev,
723 		struct rte_eth_xstat_name *xstats_names,
724 		__rte_unused unsigned int limit)
725 {
726 	struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;
727 	const unsigned int stat_cnt = RTE_DIM(bnxt_rx_stats_strings) +
728 				RTE_DIM(bnxt_tx_stats_strings) +
729 				RTE_DIM(bnxt_func_stats_strings) +
730 				RTE_DIM(bnxt_rx_ext_stats_strings) +
731 				RTE_DIM(bnxt_tx_ext_stats_strings) +
732 				bnxt_flow_stats_cnt(bp);
733 	unsigned int i, count = 0;
734 	int rc;
735 
736 	rc = is_bnxt_in_error(bp);
737 	if (rc)
738 		return rc;
739 
740 	if (xstats_names != NULL) {
741 		count = 0;
742 
743 		for (i = 0; i < RTE_DIM(bnxt_rx_stats_strings); i++) {
744 			strlcpy(xstats_names[count].name,
745 				bnxt_rx_stats_strings[i].name,
746 				sizeof(xstats_names[count].name));
747 			count++;
748 		}
749 
750 		for (i = 0; i < RTE_DIM(bnxt_tx_stats_strings); i++) {
751 			strlcpy(xstats_names[count].name,
752 				bnxt_tx_stats_strings[i].name,
753 				sizeof(xstats_names[count].name));
754 			count++;
755 		}
756 
757 		for (i = 0; i < RTE_DIM(bnxt_func_stats_strings); i++) {
758 			strlcpy(xstats_names[count].name,
759 				bnxt_func_stats_strings[i].name,
760 				sizeof(xstats_names[count].name));
761 			count++;
762 		}
763 
764 		for (i = 0; i < RTE_DIM(bnxt_rx_ext_stats_strings); i++) {
765 			strlcpy(xstats_names[count].name,
766 				bnxt_rx_ext_stats_strings[i].name,
767 				sizeof(xstats_names[count].name));
768 
769 			count++;
770 		}
771 
772 		for (i = 0; i < RTE_DIM(bnxt_tx_ext_stats_strings); i++) {
773 			strlcpy(xstats_names[count].name,
774 				bnxt_tx_ext_stats_strings[i].name,
775 				sizeof(xstats_names[count].name));
776 
777 			count++;
778 		}
779 
780 		if (bp->fw_cap & BNXT_FW_CAP_ADV_FLOW_COUNTERS &&
781 		    bp->fw_cap & BNXT_FW_CAP_ADV_FLOW_MGMT &&
782 		    BNXT_FLOW_XSTATS_EN(bp)) {
783 			for (i = 0; i < bp->max_l2_ctx; i++) {
784 				char buf[RTE_ETH_XSTATS_NAME_SIZE];
785 
786 				sprintf(buf, "flow_%d_bytes", i);
787 				strlcpy(xstats_names[count].name, buf,
788 					sizeof(xstats_names[count].name));
789 				count++;
790 
791 				sprintf(buf, "flow_%d_packets", i);
792 				strlcpy(xstats_names[count].name, buf,
793 					sizeof(xstats_names[count].name));
794 
795 				count++;
796 			}
797 		}
798 	}
799 
800 	return stat_cnt;
801 }
802 
803 int bnxt_dev_xstats_reset_op(struct rte_eth_dev *eth_dev)
804 {
805 	struct bnxt *bp = eth_dev->data->dev_private;
806 	int ret;
807 
808 	ret = is_bnxt_in_error(bp);
809 	if (ret)
810 		return ret;
811 
812 	if (BNXT_VF(bp) || !BNXT_SINGLE_PF(bp) ||
813 	    !(bp->flags & BNXT_FLAG_PORT_STATS)) {
814 		PMD_DRV_LOG(ERR, "Operation not supported\n");
815 		return -ENOTSUP;
816 	}
817 
818 	ret = bnxt_hwrm_port_clr_stats(bp);
819 	if (ret != 0)
820 		PMD_DRV_LOG(ERR, "Failed to reset xstats: %s\n",
821 			    strerror(-ret));
822 
823 	return ret;
824 }
825 
826 /* Update the input context memory with the flow counter IDs
827  * of the flows that we are interested in.
828  * Also, update the output tables with the current local values
829  * since that is what will be used by FW to accumulate
830  */
831 static void bnxt_update_fc_pre_qstat(uint32_t *in_tbl,
832 				     uint64_t *out_tbl,
833 				     struct bnxt_filter_info *filter,
834 				     uint32_t *ptbl_cnt)
835 {
836 	uint32_t in_tbl_cnt = *ptbl_cnt;
837 
838 	in_tbl[in_tbl_cnt] = filter->flow_id;
839 	out_tbl[2 * in_tbl_cnt] = filter->hw_stats.packets;
840 	out_tbl[2 * in_tbl_cnt + 1] = filter->hw_stats.bytes;
841 	in_tbl_cnt++;
842 	*ptbl_cnt = in_tbl_cnt;
843 }
844 
845 /* Post issuing counter_qstats cmd, update the driver's local stat
846  * entries with the values DMA-ed by FW in the output table
847  */
848 static void bnxt_update_fc_post_qstat(struct bnxt_filter_info *filter,
849 				      uint64_t *out_tbl,
850 				      uint32_t out_tbl_idx)
851 {
852 	filter->hw_stats.packets = out_tbl[2 * out_tbl_idx];
853 	filter->hw_stats.bytes = out_tbl[(2 * out_tbl_idx) + 1];
854 }
855 
856 static int bnxt_update_fc_tbl(struct bnxt *bp, uint16_t ctr,
857 			      struct bnxt_filter_info *en_tbl[],
858 			      uint16_t in_flow_cnt)
859 {
860 	uint32_t *in_rx_tbl;
861 	uint64_t *out_rx_tbl;
862 	uint32_t in_rx_tbl_cnt = 0;
863 	uint32_t out_rx_tbl_cnt = 0;
864 	int i, rc = 0;
865 
866 	in_rx_tbl = (uint32_t *)bp->flow_stat->rx_fc_in_tbl.va;
867 	out_rx_tbl = (uint64_t *)bp->flow_stat->rx_fc_out_tbl.va;
868 
869 	for (i = 0; i < in_flow_cnt; i++) {
870 		if (!en_tbl[i])
871 			continue;
872 
873 		/* Currently only ingress/Rx flows are supported anyway. */
874 		bnxt_update_fc_pre_qstat(in_rx_tbl, out_rx_tbl,
875 					 en_tbl[i], &in_rx_tbl_cnt);
876 	}
877 
878 	/* Currently only ingress/Rx flows are supported */
879 	if (in_rx_tbl_cnt) {
880 		rc = bnxt_hwrm_cfa_counter_qstats(bp, BNXT_DIR_RX, ctr,
881 						  in_rx_tbl_cnt);
882 		if (rc)
883 			return rc;
884 	}
885 
886 	for (i = 0; i < in_flow_cnt; i++) {
887 		if (!en_tbl[i])
888 			continue;
889 
890 		/* Currently only ingress/Rx flows are supported */
891 		bnxt_update_fc_post_qstat(en_tbl[i], out_rx_tbl,
892 					  out_rx_tbl_cnt);
893 		out_rx_tbl_cnt++;
894 	}
895 
896 	return rc;
897 }
898 
899 /* Walks through the list which has all the flows
900  * requesting for explicit flow counters.
901  */
902 int bnxt_flow_stats_req(struct bnxt *bp)
903 {
904 	int i;
905 	int rc = 0;
906 	struct rte_flow *flow;
907 	uint16_t in_flow_tbl_cnt = 0;
908 	struct bnxt_vnic_info *vnic = NULL;
909 	struct bnxt_filter_info *valid_en_tbl[bp->flow_stat->max_fc];
910 	uint16_t counter_type = CFA_COUNTER_CFG_IN_COUNTER_TYPE_FC;
911 
912 	bnxt_acquire_flow_lock(bp);
913 	for (i = 0; i < bp->max_vnics; i++) {
914 		vnic = &bp->vnic_info[i];
915 		if (vnic && vnic->fw_vnic_id == INVALID_VNIC_ID)
916 			continue;
917 
918 		if (STAILQ_EMPTY(&vnic->flow_list))
919 			continue;
920 
921 		STAILQ_FOREACH(flow, &vnic->flow_list, next) {
922 			if (!flow || !flow->filter)
923 				continue;
924 
925 			valid_en_tbl[in_flow_tbl_cnt++] = flow->filter;
926 			if (in_flow_tbl_cnt >= bp->flow_stat->max_fc) {
927 				rc = bnxt_update_fc_tbl(bp, counter_type,
928 							valid_en_tbl,
929 							in_flow_tbl_cnt);
930 				if (rc)
931 					goto err;
932 				in_flow_tbl_cnt = 0;
933 				continue;
934 			}
935 		}
936 	}
937 
938 	if (!in_flow_tbl_cnt) {
939 		bnxt_release_flow_lock(bp);
940 		goto out;
941 	}
942 
943 	rc = bnxt_update_fc_tbl(bp, counter_type, valid_en_tbl,
944 				in_flow_tbl_cnt);
945 	if (!rc) {
946 		bnxt_release_flow_lock(bp);
947 		return 0;
948 	}
949 
950 err:
951 	/* If cmd fails once, no need of
952 	 * invoking again every second
953 	 */
954 	bnxt_release_flow_lock(bp);
955 	bnxt_cancel_fc_thread(bp);
956 out:
957 	return rc;
958 }
959