1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2014-2018 Broadcom
8 #include <rte_string_fns.h>
9 #include <rte_byteorder.h>
13 #include "bnxt_filter.h"
14 #include "bnxt_hwrm.h"
16 #include "bnxt_stats.h"
18 #include "bnxt_vnic.h"
19 #include "hsi_struct_def_dpdk.h"
21 static const struct bnxt_xstats_name_off bnxt_rx_stats_strings
[] = {
22 {"rx_64b_frames", offsetof(struct rx_port_stats
,
24 {"rx_65b_127b_frames", offsetof(struct rx_port_stats
,
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
,
46 {"rx_ucast_frames", offsetof(struct rx_port_stats
,
48 {"rx_mcast_frames", offsetof(struct rx_port_stats
,
50 {"rx_bcast_frames", offsetof(struct rx_port_stats
,
52 {"rx_fcs_err_frames", offsetof(struct rx_port_stats
,
54 {"rx_ctrl_frames", offsetof(struct rx_port_stats
,
56 {"rx_pause_frames", offsetof(struct rx_port_stats
,
58 {"rx_pfc_frames", offsetof(struct rx_port_stats
,
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
,
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
,
70 {"rx_code_err_frames", offsetof(struct rx_port_stats
,
72 {"rx_false_carrier_frames", offsetof(struct rx_port_stats
,
73 rx_false_carrier_frames
)},
74 {"rx_ovrsz_frames", offsetof(struct rx_port_stats
,
76 {"rx_jbr_frames", offsetof(struct rx_port_stats
,
78 {"rx_mtu_err_frames", offsetof(struct rx_port_stats
,
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
,
86 {"rx_double_tagged_frames", offsetof(struct rx_port_stats
,
87 rx_double_tagged_frames
)},
88 {"rx_trunc_frames", offsetof(struct rx_port_stats
,
90 {"rx_good_frames", offsetof(struct rx_port_stats
,
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
,
96 {"rx_frag_frames", offsetof(struct rx_port_stats
,
98 {"rx_eee_lpi_events", offsetof(struct rx_port_stats
,
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
,
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
,
114 {"rx_runt_bytes", offsetof(struct rx_port_stats
,
116 {"rx_runt_frames", offsetof(struct rx_port_stats
,
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
,
152 {"rx_stat_err", offsetof(struct rx_port_stats
,
156 static const struct bnxt_xstats_name_off bnxt_tx_stats_strings
[] = {
157 {"tx_64b_frames", offsetof(struct tx_port_stats
,
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
,
181 {"tx_total_frames", offsetof(struct tx_port_stats
,
183 {"tx_ucast_frames", offsetof(struct tx_port_stats
,
185 {"tx_mcast_frames", offsetof(struct tx_port_stats
,
187 {"tx_bcast_frames", offsetof(struct tx_port_stats
,
189 {"tx_pause_frames", offsetof(struct tx_port_stats
,
191 {"tx_pfc_frames", offsetof(struct tx_port_stats
,
193 {"tx_jabber_frames", offsetof(struct tx_port_stats
,
195 {"tx_fcs_err_frames", offsetof(struct tx_port_stats
,
197 {"tx_control_frames", offsetof(struct tx_port_stats
,
199 {"tx_oversz_frames", offsetof(struct tx_port_stats
,
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
,
215 {"tx_err", offsetof(struct tx_port_stats
,
217 {"tx_tagged_frames", offsetof(struct tx_port_stats
,
219 {"tx_dbl_tagged_frames", offsetof(struct tx_port_stats
,
220 tx_dbl_tagged_frames
)},
221 {"tx_runt_frames", offsetof(struct tx_port_stats
,
223 {"tx_fifo_underruns", offsetof(struct tx_port_stats
,
225 {"tx_eee_lpi_events", offsetof(struct tx_port_stats
,
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
,
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
,
253 {"tx_xthol_frames", offsetof(struct tx_port_stats
,
255 {"tx_stat_discard", offsetof(struct tx_port_stats
,
257 {"tx_stat_error", offsetof(struct tx_port_stats
,
261 static const struct bnxt_xstats_name_off bnxt_func_stats_strings
[] = {
262 {"tx_ucast_pkts", offsetof(struct hwrm_func_qstats_output
,
264 {"tx_mcast_pkts", offsetof(struct hwrm_func_qstats_output
,
266 {"tx_bcast_pkts", offsetof(struct hwrm_func_qstats_output
,
268 {"tx_discard_pkts", offsetof(struct hwrm_func_qstats_output
,
270 {"tx_drop_pkts", offsetof(struct hwrm_func_qstats_output
,
272 {"tx_ucast_bytes", offsetof(struct hwrm_func_qstats_output
,
274 {"tx_mcast_bytes", offsetof(struct hwrm_func_qstats_output
,
276 {"tx_bcast_bytes", offsetof(struct hwrm_func_qstats_output
,
278 {"rx_ucast_pkts", offsetof(struct hwrm_func_qstats_output
,
280 {"rx_mcast_pkts", offsetof(struct hwrm_func_qstats_output
,
282 {"rx_bcast_pkts", offsetof(struct hwrm_func_qstats_output
,
284 {"rx_discard_pkts", offsetof(struct hwrm_func_qstats_output
,
286 {"rx_drop_pkts", offsetof(struct hwrm_func_qstats_output
,
288 {"rx_ucast_bytes", offsetof(struct hwrm_func_qstats_output
,
290 {"rx_mcast_bytes", offsetof(struct hwrm_func_qstats_output
,
292 {"rx_bcast_bytes", offsetof(struct hwrm_func_qstats_output
,
294 {"rx_agg_pkts", offsetof(struct hwrm_func_qstats_output
,
296 {"rx_agg_bytes", offsetof(struct hwrm_func_qstats_output
,
298 {"rx_agg_events", offsetof(struct hwrm_func_qstats_output
,
300 {"rx_agg_aborts", offsetof(struct hwrm_func_qstats_output
,
305 static const struct bnxt_xstats_name_off bnxt_rx_ext_stats_strings
[] = {
306 {"link_down_events", offsetof(struct rx_port_stats_ext
,
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
,
318 {"rx_bytes_cos1", offsetof(struct rx_port_stats_ext
,
320 {"rx_bytes_cos2", offsetof(struct rx_port_stats_ext
,
322 {"rx_bytes_cos3", offsetof(struct rx_port_stats_ext
,
324 {"rx_bytes_cos4", offsetof(struct rx_port_stats_ext
,
326 {"rx_bytes_cos5", offsetof(struct rx_port_stats_ext
,
328 {"rx_bytes_cos6", offsetof(struct rx_port_stats_ext
,
330 {"rx_bytes_cos7", offsetof(struct rx_port_stats_ext
,
332 {"rx_packets_cos0", offsetof(struct rx_port_stats_ext
,
334 {"rx_packets_cos1", offsetof(struct rx_port_stats_ext
,
336 {"rx_packets_cos2", offsetof(struct rx_port_stats_ext
,
338 {"rx_packets_cos3", offsetof(struct rx_port_stats_ext
,
340 {"rx_packets_cos4", offsetof(struct rx_port_stats_ext
,
342 {"rx_packets_cos5", offsetof(struct rx_port_stats_ext
,
344 {"rx_packets_cos6", offsetof(struct rx_port_stats_ext
,
346 {"rx_packets_cos7", offsetof(struct rx_port_stats_ext
,
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
,
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
,
386 {"rx_corrected_bits", offsetof(struct rx_port_stats_ext
,
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
)},
422 static const struct bnxt_xstats_name_off bnxt_tx_ext_stats_strings
[] = {
423 {"tx_bytes_cos0", offsetof(struct tx_port_stats_ext
,
425 {"tx_bytes_cos1", offsetof(struct tx_port_stats_ext
,
427 {"tx_bytes_cos2", offsetof(struct tx_port_stats_ext
,
429 {"tx_bytes_cos3", offsetof(struct tx_port_stats_ext
,
431 {"tx_bytes_cos4", offsetof(struct tx_port_stats_ext
,
433 {"tx_bytes_cos5", offsetof(struct tx_port_stats_ext
,
435 {"tx_bytes_cos6", offsetof(struct tx_port_stats_ext
,
437 {"tx_bytes_cos7", offsetof(struct tx_port_stats_ext
,
439 {"tx_packets_cos0", offsetof(struct tx_port_stats_ext
,
441 {"tx_packets_cos1", offsetof(struct tx_port_stats_ext
,
443 {"tx_packets_cos2", offsetof(struct tx_port_stats_ext
,
445 {"tx_packets_cos3", offsetof(struct tx_port_stats_ext
,
447 {"tx_packets_cos4", offsetof(struct tx_port_stats_ext
,
449 {"tx_packets_cos5", offsetof(struct tx_port_stats_ext
,
451 {"tx_packets_cos6", offsetof(struct tx_port_stats_ext
,
453 {"tx_packets_cos7", offsetof(struct tx_port_stats_ext
,
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
)},
490 * Statistics functions
493 void bnxt_free_stats(struct bnxt
*bp
)
497 for (i
= 0; i
< (int)bp
->tx_cp_nr_rings
; i
++) {
498 struct bnxt_tx_queue
*txq
= bp
->tx_queues
[i
];
500 bnxt_free_txq_stats(txq
);
502 for (i
= 0; i
< (int)bp
->rx_cp_nr_rings
; i
++) {
503 struct bnxt_rx_queue
*rxq
= bp
->rx_queues
[i
];
505 bnxt_free_rxq_stats(rxq
);
509 int bnxt_stats_get_op(struct rte_eth_dev
*eth_dev
,
510 struct rte_eth_stats
*bnxt_stats
)
514 struct bnxt
*bp
= eth_dev
->data
->dev_private
;
515 unsigned int num_q_stats
;
517 rc
= is_bnxt_in_error(bp
);
521 if (!eth_dev
->data
->dev_started
)
524 num_q_stats
= RTE_MIN(bp
->rx_cp_nr_rings
,
525 (unsigned int)RTE_ETHDEV_QUEUE_STAT_CNTRS
);
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
;
531 rc
= bnxt_hwrm_ctx_qstats(bp
, cpr
->hw_stats_ctx_id
, i
,
535 bnxt_stats
->rx_nombuf
+=
536 rte_atomic64_read(&rxq
->rx_mbuf_alloc_fail
);
539 num_q_stats
= RTE_MIN(bp
->tx_cp_nr_rings
,
540 (unsigned int)RTE_ETHDEV_QUEUE_STAT_CNTRS
);
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
;
546 rc
= bnxt_hwrm_ctx_qstats(bp
, cpr
->hw_stats_ctx_id
, i
,
552 rc
= bnxt_hwrm_func_qstats(bp
, 0xffff, bnxt_stats
, NULL
);
556 int bnxt_stats_reset_op(struct rte_eth_dev
*eth_dev
)
558 struct bnxt
*bp
= eth_dev
->data
->dev_private
;
562 ret
= is_bnxt_in_error(bp
);
566 if (!eth_dev
->data
->dev_started
) {
567 PMD_DRV_LOG(ERR
, "Device Initialization not complete!\n");
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
];
575 rte_atomic64_clear(&rxq
->rx_mbuf_alloc_fail
);
581 int bnxt_dev_xstats_get_op(struct rte_eth_dev
*eth_dev
,
582 struct rte_eth_xstat
*xstats
, unsigned int n
)
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
;
593 rc
= is_bnxt_in_error(bp
);
600 memset(xstats
, 0, sizeof(*xstats
));
602 bnxt_hwrm_func_qstats(bp
, 0xffff, NULL
, &func_qstats
);
603 bnxt_hwrm_port_qstats(bp
);
604 bnxt_hwrm_ext_port_qstats(bp
);
605 rx_port_stats_ext_cnt
= RTE_MIN(RTE_DIM(bnxt_rx_ext_stats_strings
),
606 (bp
->fw_rx_port_stats_ext_size
/
608 tx_port_stats_ext_cnt
= RTE_MIN(RTE_DIM(bnxt_tx_ext_stats_strings
),
609 (bp
->fw_tx_port_stats_ext_size
/
612 count
= RTE_DIM(bnxt_rx_stats_strings
) +
613 RTE_DIM(bnxt_tx_stats_strings
) +
614 RTE_DIM(bnxt_func_stats_strings
) +
615 RTE_DIM(bnxt_rx_ext_stats_strings
) +
616 RTE_DIM(bnxt_tx_ext_stats_strings
) +
617 bnxt_flow_stats_cnt(bp
);
625 for (i
= 0; i
< RTE_DIM(bnxt_rx_stats_strings
); i
++) {
626 uint64_t *rx_stats
= (uint64_t *)bp
->hw_rx_port_stats
;
627 xstats
[count
].id
= count
;
628 xstats
[count
].value
= rte_le_to_cpu_64(
629 *(uint64_t *)((char *)rx_stats
+
630 bnxt_rx_stats_strings
[i
].offset
));
634 for (i
= 0; i
< RTE_DIM(bnxt_tx_stats_strings
); i
++) {
635 uint64_t *tx_stats
= (uint64_t *)bp
->hw_tx_port_stats
;
636 xstats
[count
].id
= count
;
637 xstats
[count
].value
= rte_le_to_cpu_64(
638 *(uint64_t *)((char *)tx_stats
+
639 bnxt_tx_stats_strings
[i
].offset
));
643 for (i
= 0; i
< RTE_DIM(bnxt_func_stats_strings
); i
++) {
644 xstats
[count
].id
= count
;
645 xstats
[count
].value
=
646 rte_le_to_cpu_64(((uint64_t *)&func_qstats
)[i
]);
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
;
654 xstats
[count
].value
= rte_le_to_cpu_64
655 (*(uint64_t *)((char *)rx_stats_ext
+
656 bnxt_rx_ext_stats_strings
[i
].offset
));
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
;
664 xstats
[count
].value
= rte_le_to_cpu_64
665 (*(uint64_t *)((char *)tx_stats_ext
+
666 bnxt_tx_ext_stats_strings
[i
].offset
));
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
)) {
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
;
681 vnic
= &bp
->vnic_info
[j
];
682 if (vnic
&& vnic
->fw_vnic_id
== INVALID_VNIC_ID
)
685 if (STAILQ_EMPTY(&vnic
->flow_list
))
688 STAILQ_FOREACH(flow
, &vnic
->flow_list
, next
) {
689 if (!flow
|| !flow
->filter
)
692 filter
= flow
->filter
;
693 xstats
[count
].id
= count
;
694 xstats
[count
].value
=
695 filter
->hw_stats
.bytes
;
697 xstats
[count
].id
= count
;
698 xstats
[count
].value
=
699 filter
->hw_stats
.packets
;
701 if (++i
> bp
->max_l2_ctx
)
704 if (i
> bp
->max_l2_ctx
)
712 int bnxt_flow_stats_cnt(struct bnxt
*bp
)
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
];
720 return RTE_DIM(flow_bytes
) + RTE_DIM(flow_pkts
);
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
)
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;
740 rc
= is_bnxt_in_error(bp
);
744 if (xstats_names
!= NULL
) {
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
));
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
));
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
));
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
));
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
));
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
];
790 sprintf(buf
, "flow_%d_bytes", i
);
791 strlcpy(xstats_names
[count
].name
, buf
,
792 sizeof(xstats_names
[count
].name
));
795 sprintf(buf
, "flow_%d_packets", i
);
796 strlcpy(xstats_names
[count
].name
, buf
,
797 sizeof(xstats_names
[count
].name
));
807 int bnxt_dev_xstats_reset_op(struct rte_eth_dev
*eth_dev
)
809 struct bnxt
*bp
= eth_dev
->data
->dev_private
;
812 ret
= is_bnxt_in_error(bp
);
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");
822 ret
= bnxt_hwrm_port_clr_stats(bp
);
824 PMD_DRV_LOG(ERR
, "Failed to reset xstats: %s\n",
830 int bnxt_dev_xstats_get_by_id_op(struct rte_eth_dev
*dev
, const uint64_t *ids
,
831 uint64_t *values
, unsigned int limit
)
833 struct bnxt
*bp
= dev
->data
->dev_private
;
834 const unsigned int stat_cnt
= RTE_DIM(bnxt_rx_stats_strings
) +
835 RTE_DIM(bnxt_tx_stats_strings
) +
836 RTE_DIM(bnxt_func_stats_strings
) +
837 RTE_DIM(bnxt_rx_ext_stats_strings
) +
838 RTE_DIM(bnxt_tx_ext_stats_strings
) +
839 bnxt_flow_stats_cnt(bp
);
840 struct rte_eth_xstat xstats
[stat_cnt
];
841 uint64_t values_copy
[stat_cnt
];
845 rc
= is_bnxt_in_error(bp
);
850 return bnxt_dev_xstats_get_op(dev
, xstats
, stat_cnt
);
852 bnxt_dev_xstats_get_by_id_op(dev
, NULL
, values_copy
, stat_cnt
);
853 for (i
= 0; i
< limit
; i
++) {
854 if (ids
[i
] >= stat_cnt
) {
855 PMD_DRV_LOG(ERR
, "id value isn't valid");
858 values
[i
] = values_copy
[ids
[i
]];
863 int bnxt_dev_xstats_get_names_by_id_op(struct rte_eth_dev
*dev
,
864 struct rte_eth_xstat_name
*xstats_names
,
865 const uint64_t *ids
, unsigned int limit
)
867 struct bnxt
*bp
= dev
->data
->dev_private
;
868 const unsigned int stat_cnt
= RTE_DIM(bnxt_rx_stats_strings
) +
869 RTE_DIM(bnxt_tx_stats_strings
) +
870 RTE_DIM(bnxt_func_stats_strings
) +
871 RTE_DIM(bnxt_rx_ext_stats_strings
) +
872 RTE_DIM(bnxt_tx_ext_stats_strings
) +
873 bnxt_flow_stats_cnt(bp
);
874 struct rte_eth_xstat_name xstats_names_copy
[stat_cnt
];
878 rc
= is_bnxt_in_error(bp
);
883 return bnxt_dev_xstats_get_names_op(dev
, xstats_names
,
885 bnxt_dev_xstats_get_names_by_id_op(dev
, xstats_names_copy
, NULL
,
888 for (i
= 0; i
< limit
; i
++) {
889 if (ids
[i
] >= stat_cnt
) {
890 PMD_DRV_LOG(ERR
, "id value isn't valid");
893 strcpy(xstats_names
[i
].name
,
894 xstats_names_copy
[ids
[i
]].name
);
899 /* Update the input context memory with the flow counter IDs
900 * of the flows that we are interested in.
901 * Also, update the output tables with the current local values
902 * since that is what will be used by FW to accumulate
904 static void bnxt_update_fc_pre_qstat(uint32_t *in_tbl
,
906 struct bnxt_filter_info
*filter
,
909 uint32_t in_tbl_cnt
= *ptbl_cnt
;
911 in_tbl
[in_tbl_cnt
] = filter
->flow_id
;
912 out_tbl
[2 * in_tbl_cnt
] = filter
->hw_stats
.packets
;
913 out_tbl
[2 * in_tbl_cnt
+ 1] = filter
->hw_stats
.bytes
;
915 *ptbl_cnt
= in_tbl_cnt
;
918 /* Post issuing counter_qstats cmd, update the driver's local stat
919 * entries with the values DMA-ed by FW in the output table
921 static void bnxt_update_fc_post_qstat(struct bnxt_filter_info
*filter
,
923 uint32_t out_tbl_idx
)
925 filter
->hw_stats
.packets
= out_tbl
[2 * out_tbl_idx
];
926 filter
->hw_stats
.bytes
= out_tbl
[(2 * out_tbl_idx
) + 1];
929 static int bnxt_update_fc_tbl(struct bnxt
*bp
, uint16_t ctr
,
930 struct bnxt_filter_info
*en_tbl
[],
931 uint16_t in_flow_cnt
)
934 uint64_t *out_rx_tbl
;
935 uint32_t in_rx_tbl_cnt
= 0;
936 uint32_t out_rx_tbl_cnt
= 0;
939 in_rx_tbl
= (uint32_t *)bp
->flow_stat
->rx_fc_in_tbl
.va
;
940 out_rx_tbl
= (uint64_t *)bp
->flow_stat
->rx_fc_out_tbl
.va
;
942 for (i
= 0; i
< in_flow_cnt
; i
++) {
946 /* Currently only ingress/Rx flows are supported anyway. */
947 bnxt_update_fc_pre_qstat(in_rx_tbl
, out_rx_tbl
,
948 en_tbl
[i
], &in_rx_tbl_cnt
);
951 /* Currently only ingress/Rx flows are supported */
953 rc
= bnxt_hwrm_cfa_counter_qstats(bp
, BNXT_DIR_RX
, ctr
,
959 for (i
= 0; i
< in_flow_cnt
; i
++) {
963 /* Currently only ingress/Rx flows are supported */
964 bnxt_update_fc_post_qstat(en_tbl
[i
], out_rx_tbl
,
972 /* Walks through the list which has all the flows
973 * requesting for explicit flow counters.
975 int bnxt_flow_stats_req(struct bnxt
*bp
)
979 struct rte_flow
*flow
;
980 uint16_t in_flow_tbl_cnt
= 0;
981 struct bnxt_vnic_info
*vnic
= NULL
;
982 struct bnxt_filter_info
*valid_en_tbl
[bp
->flow_stat
->max_fc
];
983 uint16_t counter_type
= CFA_COUNTER_CFG_IN_COUNTER_TYPE_FC
;
985 bnxt_acquire_flow_lock(bp
);
986 for (i
= 0; i
< bp
->max_vnics
; i
++) {
987 vnic
= &bp
->vnic_info
[i
];
988 if (vnic
&& vnic
->fw_vnic_id
== INVALID_VNIC_ID
)
991 if (STAILQ_EMPTY(&vnic
->flow_list
))
994 STAILQ_FOREACH(flow
, &vnic
->flow_list
, next
) {
995 if (!flow
|| !flow
->filter
)
998 valid_en_tbl
[in_flow_tbl_cnt
++] = flow
->filter
;
999 if (in_flow_tbl_cnt
>= bp
->flow_stat
->max_fc
) {
1000 rc
= bnxt_update_fc_tbl(bp
, counter_type
,
1005 in_flow_tbl_cnt
= 0;
1011 if (!in_flow_tbl_cnt
)
1014 rc
= bnxt_update_fc_tbl(bp
, counter_type
, valid_en_tbl
,
1017 bnxt_release_flow_lock(bp
);
1022 /* If cmd fails once, no need of
1023 * invoking again every second
1025 bnxt_release_flow_lock(bp
);
1026 bnxt_cancel_fc_thread(bp
);