Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright(c) 2014-2023 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_ext_strings[] = {
262 : : {"tx_ucast_pkts", offsetof(struct hwrm_func_qstats_ext_output,
263 : : tx_ucast_pkts)},
264 : : {"tx_mcast_pkts", offsetof(struct hwrm_func_qstats_ext_output,
265 : : tx_mcast_pkts)},
266 : : {"tx_bcast_pkts", offsetof(struct hwrm_func_qstats_ext_output,
267 : : tx_bcast_pkts)},
268 : : {"tx_discard_pkts", offsetof(struct hwrm_func_qstats_ext_output,
269 : : tx_discard_pkts)},
270 : : {"tx_drop_pkts", offsetof(struct hwrm_func_qstats_ext_output,
271 : : tx_error_pkts)},
272 : : {"tx_ucast_bytes", offsetof(struct hwrm_func_qstats_ext_output,
273 : : tx_ucast_bytes)},
274 : : {"tx_mcast_bytes", offsetof(struct hwrm_func_qstats_ext_output,
275 : : tx_mcast_bytes)},
276 : : {"tx_bcast_bytes", offsetof(struct hwrm_func_qstats_ext_output,
277 : : tx_bcast_bytes)},
278 : : {"rx_ucast_pkts", offsetof(struct hwrm_func_qstats_ext_output,
279 : : rx_ucast_pkts)},
280 : : {"rx_mcast_pkts", offsetof(struct hwrm_func_qstats_ext_output,
281 : : rx_mcast_pkts)},
282 : : {"rx_bcast_pkts", offsetof(struct hwrm_func_qstats_ext_output,
283 : : rx_bcast_pkts)},
284 : : {"rx_discard_pkts", offsetof(struct hwrm_func_qstats_ext_output,
285 : : rx_discard_pkts)},
286 : : {"rx_drop_pkts", offsetof(struct hwrm_func_qstats_ext_output,
287 : : rx_error_pkts)},
288 : : {"rx_ucast_bytes", offsetof(struct hwrm_func_qstats_ext_output,
289 : : rx_ucast_bytes)},
290 : : {"rx_mcast_bytes", offsetof(struct hwrm_func_qstats_ext_output,
291 : : rx_mcast_bytes)},
292 : : {"rx_bcast_bytes", offsetof(struct hwrm_func_qstats_ext_output,
293 : : rx_bcast_bytes)},
294 : : {"rx_tpa_eligible_pkt", offsetof(struct hwrm_func_qstats_ext_output,
295 : : rx_tpa_eligible_pkt)},
296 : : {"rx_tpa_eligible_bytes", offsetof(struct hwrm_func_qstats_ext_output,
297 : : rx_tpa_eligible_bytes)},
298 : : {"rx_tpa_pkt", offsetof(struct hwrm_func_qstats_ext_output,
299 : : rx_tpa_pkt)},
300 : : {"rx_tpa_bytes", offsetof(struct hwrm_func_qstats_ext_output,
301 : : rx_tpa_bytes)},
302 : : {"rx_tpa_errors", offsetof(struct hwrm_func_qstats_ext_output,
303 : : rx_tpa_errors)},
304 : : {"rx_tpa_events", offsetof(struct hwrm_func_qstats_ext_output,
305 : : rx_tpa_events)},
306 : : };
307 : :
308 : : static const struct bnxt_xstats_name_off bnxt_func_stats_strings[] = {
309 : : {"tx_ucast_pkts", offsetof(struct hwrm_func_qstats_output,
310 : : tx_ucast_pkts)},
311 : : {"tx_mcast_pkts", offsetof(struct hwrm_func_qstats_output,
312 : : tx_mcast_pkts)},
313 : : {"tx_bcast_pkts", offsetof(struct hwrm_func_qstats_output,
314 : : tx_bcast_pkts)},
315 : : {"tx_discard_pkts", offsetof(struct hwrm_func_qstats_output,
316 : : tx_discard_pkts)},
317 : : {"tx_drop_pkts", offsetof(struct hwrm_func_qstats_output,
318 : : tx_drop_pkts)},
319 : : {"tx_ucast_bytes", offsetof(struct hwrm_func_qstats_output,
320 : : tx_ucast_bytes)},
321 : : {"tx_mcast_bytes", offsetof(struct hwrm_func_qstats_output,
322 : : tx_mcast_bytes)},
323 : : {"tx_bcast_bytes", offsetof(struct hwrm_func_qstats_output,
324 : : tx_bcast_bytes)},
325 : : {"rx_ucast_pkts", offsetof(struct hwrm_func_qstats_output,
326 : : rx_ucast_pkts)},
327 : : {"rx_mcast_pkts", offsetof(struct hwrm_func_qstats_output,
328 : : rx_mcast_pkts)},
329 : : {"rx_bcast_pkts", offsetof(struct hwrm_func_qstats_output,
330 : : rx_bcast_pkts)},
331 : : {"rx_discard_pkts", offsetof(struct hwrm_func_qstats_output,
332 : : rx_discard_pkts)},
333 : : {"rx_drop_pkts", offsetof(struct hwrm_func_qstats_output,
334 : : rx_drop_pkts)},
335 : : {"rx_ucast_bytes", offsetof(struct hwrm_func_qstats_output,
336 : : rx_ucast_bytes)},
337 : : {"rx_mcast_bytes", offsetof(struct hwrm_func_qstats_output,
338 : : rx_mcast_bytes)},
339 : : {"rx_bcast_bytes", offsetof(struct hwrm_func_qstats_output,
340 : : rx_bcast_bytes)},
341 : : {"rx_agg_pkts", offsetof(struct hwrm_func_qstats_output,
342 : : rx_agg_pkts)},
343 : : {"rx_agg_bytes", offsetof(struct hwrm_func_qstats_output,
344 : : rx_agg_bytes)},
345 : : {"rx_agg_events", offsetof(struct hwrm_func_qstats_output,
346 : : rx_agg_events)},
347 : : {"rx_agg_aborts", offsetof(struct hwrm_func_qstats_output,
348 : : rx_agg_aborts)},
349 : : };
350 : :
351 : :
352 : : static const struct bnxt_xstats_name_off bnxt_rx_ext_stats_strings[] = {
353 : : {"link_down_events", offsetof(struct rx_port_stats_ext,
354 : : link_down_events)},
355 : : {"continuous_pause_events", offsetof(struct rx_port_stats_ext,
356 : : continuous_pause_events)},
357 : : {"resume_pause_events", offsetof(struct rx_port_stats_ext,
358 : : resume_pause_events)},
359 : : {"continuous_roce_pause_events", offsetof(struct rx_port_stats_ext,
360 : : continuous_roce_pause_events)},
361 : : {"resume_roce_pause_events", offsetof(struct rx_port_stats_ext,
362 : : resume_roce_pause_events)},
363 : : {"rx_bytes_cos0", offsetof(struct rx_port_stats_ext,
364 : : rx_bytes_cos0)},
365 : : {"rx_bytes_cos1", offsetof(struct rx_port_stats_ext,
366 : : rx_bytes_cos1)},
367 : : {"rx_bytes_cos2", offsetof(struct rx_port_stats_ext,
368 : : rx_bytes_cos2)},
369 : : {"rx_bytes_cos3", offsetof(struct rx_port_stats_ext,
370 : : rx_bytes_cos3)},
371 : : {"rx_bytes_cos4", offsetof(struct rx_port_stats_ext,
372 : : rx_bytes_cos4)},
373 : : {"rx_bytes_cos5", offsetof(struct rx_port_stats_ext,
374 : : rx_bytes_cos5)},
375 : : {"rx_bytes_cos6", offsetof(struct rx_port_stats_ext,
376 : : rx_bytes_cos6)},
377 : : {"rx_bytes_cos7", offsetof(struct rx_port_stats_ext,
378 : : rx_bytes_cos7)},
379 : : {"rx_packets_cos0", offsetof(struct rx_port_stats_ext,
380 : : rx_packets_cos0)},
381 : : {"rx_packets_cos1", offsetof(struct rx_port_stats_ext,
382 : : rx_packets_cos1)},
383 : : {"rx_packets_cos2", offsetof(struct rx_port_stats_ext,
384 : : rx_packets_cos2)},
385 : : {"rx_packets_cos3", offsetof(struct rx_port_stats_ext,
386 : : rx_packets_cos3)},
387 : : {"rx_packets_cos4", offsetof(struct rx_port_stats_ext,
388 : : rx_packets_cos4)},
389 : : {"rx_packets_cos5", offsetof(struct rx_port_stats_ext,
390 : : rx_packets_cos5)},
391 : : {"rx_packets_cos6", offsetof(struct rx_port_stats_ext,
392 : : rx_packets_cos6)},
393 : : {"rx_packets_cos7", offsetof(struct rx_port_stats_ext,
394 : : rx_packets_cos7)},
395 : : {"pfc_pri0_rx_duration_us", offsetof(struct rx_port_stats_ext,
396 : : pfc_pri0_rx_duration_us)},
397 : : {"pfc_pri0_rx_transitions", offsetof(struct rx_port_stats_ext,
398 : : pfc_pri0_rx_transitions)},
399 : : {"pfc_pri1_rx_duration_us", offsetof(struct rx_port_stats_ext,
400 : : pfc_pri1_rx_duration_us)},
401 : : {"pfc_pri1_rx_transitions", offsetof(struct rx_port_stats_ext,
402 : : pfc_pri1_rx_transitions)},
403 : : {"pfc_pri2_rx_duration_us", offsetof(struct rx_port_stats_ext,
404 : : pfc_pri2_rx_duration_us)},
405 : : {"pfc_pri2_rx_transitions", offsetof(struct rx_port_stats_ext,
406 : : pfc_pri2_rx_transitions)},
407 : : {"pfc_pri3_rx_duration_us", offsetof(struct rx_port_stats_ext,
408 : : pfc_pri3_rx_duration_us)},
409 : : {"pfc_pri3_rx_transitions", offsetof(struct rx_port_stats_ext,
410 : : pfc_pri3_rx_transitions)},
411 : : {"pfc_pri4_rx_duration_us", offsetof(struct rx_port_stats_ext,
412 : : pfc_pri4_rx_duration_us)},
413 : : {"pfc_pri4_rx_transitions", offsetof(struct rx_port_stats_ext,
414 : : pfc_pri4_rx_transitions)},
415 : : {"pfc_pri5_rx_duration_us", offsetof(struct rx_port_stats_ext,
416 : : pfc_pri5_rx_duration_us)},
417 : : {"pfc_pri5_rx_transitions", offsetof(struct rx_port_stats_ext,
418 : : pfc_pri5_rx_transitions)},
419 : : {"pfc_pri6_rx_duration_us", offsetof(struct rx_port_stats_ext,
420 : : pfc_pri6_rx_duration_us)},
421 : : {"pfc_pri6_rx_transitions", offsetof(struct rx_port_stats_ext,
422 : : pfc_pri6_rx_transitions)},
423 : : {"pfc_pri7_rx_duration_us", offsetof(struct rx_port_stats_ext,
424 : : pfc_pri7_rx_duration_us)},
425 : : {"pfc_pri7_rx_transitions", offsetof(struct rx_port_stats_ext,
426 : : pfc_pri7_rx_transitions)},
427 : : {"rx_bits", offsetof(struct rx_port_stats_ext,
428 : : rx_bits)},
429 : : {"rx_buffer_passed_threshold", offsetof(struct rx_port_stats_ext,
430 : : rx_buffer_passed_threshold)},
431 : : {"rx_pcs_symbol_err", offsetof(struct rx_port_stats_ext,
432 : : rx_pcs_symbol_err)},
433 : : {"rx_corrected_bits", offsetof(struct rx_port_stats_ext,
434 : : rx_corrected_bits)},
435 : : {"rx_discard_bytes_cos0", offsetof(struct rx_port_stats_ext,
436 : : rx_discard_bytes_cos0)},
437 : : {"rx_discard_bytes_cos1", offsetof(struct rx_port_stats_ext,
438 : : rx_discard_bytes_cos1)},
439 : : {"rx_discard_bytes_cos2", offsetof(struct rx_port_stats_ext,
440 : : rx_discard_bytes_cos2)},
441 : : {"rx_discard_bytes_cos3", offsetof(struct rx_port_stats_ext,
442 : : rx_discard_bytes_cos3)},
443 : : {"rx_discard_bytes_cos4", offsetof(struct rx_port_stats_ext,
444 : : rx_discard_bytes_cos4)},
445 : : {"rx_discard_bytes_cos5", offsetof(struct rx_port_stats_ext,
446 : : rx_discard_bytes_cos5)},
447 : : {"rx_discard_bytes_cos6", offsetof(struct rx_port_stats_ext,
448 : : rx_discard_bytes_cos6)},
449 : : {"rx_discard_bytes_cos7", offsetof(struct rx_port_stats_ext,
450 : : rx_discard_bytes_cos7)},
451 : : {"rx_discard_packets_cos0", offsetof(struct rx_port_stats_ext,
452 : : rx_discard_packets_cos0)},
453 : : {"rx_discard_packets_cos1", offsetof(struct rx_port_stats_ext,
454 : : rx_discard_packets_cos1)},
455 : : {"rx_discard_packets_cos2", offsetof(struct rx_port_stats_ext,
456 : : rx_discard_packets_cos2)},
457 : : {"rx_discard_packets_cos3", offsetof(struct rx_port_stats_ext,
458 : : rx_discard_packets_cos3)},
459 : : {"rx_discard_packets_cos4", offsetof(struct rx_port_stats_ext,
460 : : rx_discard_packets_cos4)},
461 : : {"rx_discard_packets_cos5", offsetof(struct rx_port_stats_ext,
462 : : rx_discard_packets_cos5)},
463 : : {"rx_discard_packets_cos6", offsetof(struct rx_port_stats_ext,
464 : : rx_discard_packets_cos6)},
465 : : {"rx_discard_packets_cos7", offsetof(struct rx_port_stats_ext,
466 : : rx_discard_packets_cos7)},
467 : : {"rx_fec_corrected_blocks", offsetof(struct rx_port_stats_ext,
468 : : rx_fec_corrected_blocks)},
469 : : {"rx_fec_uncorrectable_blocks", offsetof(struct rx_port_stats_ext,
470 : : rx_fec_uncorrectable_blocks)},
471 : : {"rx_filter_miss", offsetof(struct rx_port_stats_ext,
472 : : rx_filter_miss)},
473 : : };
474 : :
475 : : static const struct bnxt_xstats_name_off bnxt_tx_ext_stats_strings[] = {
476 : : {"tx_bytes_cos0", offsetof(struct tx_port_stats_ext,
477 : : tx_bytes_cos0)},
478 : : {"tx_bytes_cos1", offsetof(struct tx_port_stats_ext,
479 : : tx_bytes_cos1)},
480 : : {"tx_bytes_cos2", offsetof(struct tx_port_stats_ext,
481 : : tx_bytes_cos2)},
482 : : {"tx_bytes_cos3", offsetof(struct tx_port_stats_ext,
483 : : tx_bytes_cos3)},
484 : : {"tx_bytes_cos4", offsetof(struct tx_port_stats_ext,
485 : : tx_bytes_cos4)},
486 : : {"tx_bytes_cos5", offsetof(struct tx_port_stats_ext,
487 : : tx_bytes_cos5)},
488 : : {"tx_bytes_cos6", offsetof(struct tx_port_stats_ext,
489 : : tx_bytes_cos6)},
490 : : {"tx_bytes_cos7", offsetof(struct tx_port_stats_ext,
491 : : tx_bytes_cos7)},
492 : : {"tx_packets_cos0", offsetof(struct tx_port_stats_ext,
493 : : tx_packets_cos0)},
494 : : {"tx_packets_cos1", offsetof(struct tx_port_stats_ext,
495 : : tx_packets_cos1)},
496 : : {"tx_packets_cos2", offsetof(struct tx_port_stats_ext,
497 : : tx_packets_cos2)},
498 : : {"tx_packets_cos3", offsetof(struct tx_port_stats_ext,
499 : : tx_packets_cos3)},
500 : : {"tx_packets_cos4", offsetof(struct tx_port_stats_ext,
501 : : tx_packets_cos4)},
502 : : {"tx_packets_cos5", offsetof(struct tx_port_stats_ext,
503 : : tx_packets_cos5)},
504 : : {"tx_packets_cos6", offsetof(struct tx_port_stats_ext,
505 : : tx_packets_cos6)},
506 : : {"tx_packets_cos7", offsetof(struct tx_port_stats_ext,
507 : : tx_packets_cos7)},
508 : : {"pfc_pri0_tx_duration_us", offsetof(struct tx_port_stats_ext,
509 : : pfc_pri0_tx_duration_us)},
510 : : {"pfc_pri0_tx_transitions", offsetof(struct tx_port_stats_ext,
511 : : pfc_pri0_tx_transitions)},
512 : : {"pfc_pri1_tx_duration_us", offsetof(struct tx_port_stats_ext,
513 : : pfc_pri1_tx_duration_us)},
514 : : {"pfc_pri1_tx_transitions", offsetof(struct tx_port_stats_ext,
515 : : pfc_pri1_tx_transitions)},
516 : : {"pfc_pri2_tx_duration_us", offsetof(struct tx_port_stats_ext,
517 : : pfc_pri2_tx_duration_us)},
518 : : {"pfc_pri2_tx_transitions", offsetof(struct tx_port_stats_ext,
519 : : pfc_pri2_tx_transitions)},
520 : : {"pfc_pri3_tx_duration_us", offsetof(struct tx_port_stats_ext,
521 : : pfc_pri3_tx_duration_us)},
522 : : {"pfc_pri3_tx_transitions", offsetof(struct tx_port_stats_ext,
523 : : pfc_pri3_tx_transitions)},
524 : : {"pfc_pri4_tx_duration_us", offsetof(struct tx_port_stats_ext,
525 : : pfc_pri4_tx_duration_us)},
526 : : {"pfc_pri4_tx_transitions", offsetof(struct tx_port_stats_ext,
527 : : pfc_pri4_tx_transitions)},
528 : : {"pfc_pri5_tx_duration_us", offsetof(struct tx_port_stats_ext,
529 : : pfc_pri5_tx_duration_us)},
530 : : {"pfc_pri5_tx_transitions", offsetof(struct tx_port_stats_ext,
531 : : pfc_pri5_tx_transitions)},
532 : : {"pfc_pri6_tx_duration_us", offsetof(struct tx_port_stats_ext,
533 : : pfc_pri6_tx_duration_us)},
534 : : {"pfc_pri6_tx_transitions", offsetof(struct tx_port_stats_ext,
535 : : pfc_pri6_tx_transitions)},
536 : : {"pfc_pri7_tx_duration_us", offsetof(struct tx_port_stats_ext,
537 : : pfc_pri7_tx_duration_us)},
538 : : {"pfc_pri7_tx_transitions", offsetof(struct tx_port_stats_ext,
539 : : pfc_pri7_tx_transitions)},
540 : : };
541 : :
542 : : /*
543 : : * Statistics functions
544 : : */
545 : :
546 : 0 : void bnxt_free_stats(struct bnxt *bp)
547 : : {
548 : : int i;
549 : :
550 [ # # # # ]: 0 : if (bp->tx_queues && bp->eth_dev->data->tx_queues) {
551 [ # # ]: 0 : for (i = 0; i < (int)bp->tx_cp_nr_rings; i++) {
552 : 0 : struct bnxt_tx_queue *txq = bp->tx_queues[i];
553 : :
554 : 0 : bnxt_free_txq_stats(txq);
555 : : }
556 : : }
557 : :
558 [ # # # # ]: 0 : if (bp->rx_queues && bp->eth_dev->data->rx_queues) {
559 [ # # ]: 0 : for (i = 0; i < (int)bp->rx_cp_nr_rings; i++) {
560 : 0 : struct bnxt_rx_queue *rxq = bp->rx_queues[i];
561 : :
562 : 0 : bnxt_free_rxq_stats(rxq);
563 : : }
564 : : }
565 : 0 : }
566 : :
567 : 0 : static void bnxt_fill_rte_eth_stats_ext(struct rte_eth_stats *stats,
568 : : struct bnxt_ring_stats_ext *ring_stats,
569 : : struct eth_queue_stats *qstats,
570 : : unsigned int i, bool rx)
571 : : {
572 [ # # ]: 0 : if (rx) {
573 : 0 : uint64_t ipackets = ring_stats->rx_ucast_pkts +
574 : 0 : ring_stats->rx_mcast_pkts +
575 : 0 : ring_stats->rx_bcast_pkts;
576 : 0 : uint64_t ibytes = ring_stats->rx_ucast_bytes +
577 : 0 : ring_stats->rx_mcast_bytes +
578 : 0 : ring_stats->rx_bcast_bytes;
579 : 0 : uint64_t ierrors = ring_stats->rx_discard_pkts +
580 : 0 : ring_stats->rx_error_pkts;
581 : :
582 : 0 : stats->ipackets += ipackets;
583 : 0 : stats->ibytes += ibytes;
584 : 0 : stats->imissed += ring_stats->rx_discard_pkts;
585 : 0 : stats->ierrors += ring_stats->rx_error_pkts;
586 : :
587 [ # # ]: 0 : if (qstats) {
588 : 0 : qstats->q_ipackets[i] = ipackets;
589 : 0 : qstats->q_ibytes[i] = ibytes;
590 : 0 : qstats->q_errors[i] = ierrors;
591 : : }
592 : : } else {
593 : 0 : uint64_t opackets = ring_stats->tx_ucast_pkts +
594 : 0 : ring_stats->tx_mcast_pkts +
595 : 0 : ring_stats->tx_bcast_pkts;
596 : 0 : uint64_t obytes = ring_stats->tx_ucast_bytes +
597 : 0 : ring_stats->tx_mcast_bytes +
598 : 0 : ring_stats->tx_bcast_bytes;
599 : :
600 : 0 : stats->opackets += opackets;
601 : 0 : stats->obytes += obytes;
602 : 0 : stats->oerrors += ring_stats->tx_discard_pkts;
603 : :
604 [ # # ]: 0 : if (qstats) {
605 : 0 : qstats->q_opackets[i] = opackets;
606 : 0 : qstats->q_obytes[i] = obytes;
607 : : }
608 : : }
609 : 0 : }
610 : :
611 : 0 : static void bnxt_fill_rte_eth_stats(struct rte_eth_stats *stats,
612 : : struct bnxt_ring_stats *ring_stats,
613 : : struct eth_queue_stats *qstats,
614 : : unsigned int i, bool rx)
615 : : {
616 [ # # ]: 0 : if (rx) {
617 : 0 : uint64_t ipackets = ring_stats->rx_ucast_pkts +
618 : 0 : ring_stats->rx_mcast_pkts +
619 : 0 : ring_stats->rx_bcast_pkts;
620 : 0 : uint64_t ibytes = ring_stats->rx_ucast_bytes +
621 : 0 : ring_stats->rx_mcast_bytes +
622 : 0 : ring_stats->rx_bcast_bytes;
623 : 0 : uint64_t ierrors = ring_stats->rx_discard_pkts +
624 : 0 : ring_stats->rx_error_pkts;
625 : :
626 : 0 : stats->ipackets += ipackets;
627 : 0 : stats->ibytes += ibytes;
628 : 0 : stats->imissed += ring_stats->rx_discard_pkts;
629 : 0 : stats->ierrors += ring_stats->rx_error_pkts;
630 : :
631 [ # # ]: 0 : if (qstats) {
632 : 0 : qstats->q_ipackets[i] = ipackets;
633 : 0 : qstats->q_ibytes[i] = ibytes;
634 : 0 : qstats->q_errors[i] = ierrors;
635 : : }
636 : : } else {
637 : 0 : uint64_t opackets = ring_stats->tx_ucast_pkts +
638 : 0 : ring_stats->tx_mcast_pkts +
639 : 0 : ring_stats->tx_bcast_pkts;
640 : 0 : uint64_t obytes = ring_stats->tx_ucast_bytes +
641 : 0 : ring_stats->tx_mcast_bytes +
642 : 0 : ring_stats->tx_bcast_bytes;
643 : :
644 : 0 : stats->opackets += opackets;
645 : 0 : stats->obytes += obytes;
646 : 0 : stats->oerrors += ring_stats->tx_discard_pkts;
647 : :
648 [ # # ]: 0 : if (qstats) {
649 : 0 : qstats->q_opackets[i] = opackets;
650 : 0 : qstats->q_obytes[i] = obytes;
651 : : }
652 : : }
653 : 0 : }
654 : :
655 : 0 : static int bnxt_stats_get_ext(struct rte_eth_dev *eth_dev,
656 : : struct rte_eth_stats *bnxt_stats,
657 : : struct eth_queue_stats *qstats)
658 : : {
659 : : int rc = 0;
660 : : unsigned int i;
661 : 0 : struct bnxt *bp = eth_dev->data->dev_private;
662 : : unsigned int num_q_stats;
663 : :
664 : 0 : num_q_stats = RTE_MIN(bp->rx_cp_nr_rings,
665 : : (unsigned int)RTE_ETHDEV_QUEUE_STAT_CNTRS);
666 : :
667 [ # # ]: 0 : for (i = 0; i < bp->rx_cp_nr_rings; i++) {
668 : 0 : struct bnxt_rx_queue *rxq = bp->rx_queues[i];
669 : 0 : struct bnxt_cp_ring_info *cpr = rxq->cp_ring;
670 : 0 : struct bnxt_ring_stats_ext ring_stats = {0};
671 : :
672 [ # # ]: 0 : if (!rxq->rx_started)
673 : 0 : continue;
674 : :
675 [ # # ]: 0 : if (cpr->hw_stats_ctx_id == HWRM_NA_SIGNATURE)
676 : 0 : continue;
677 : :
678 : 0 : rc = bnxt_hwrm_ring_stats_ext(bp, cpr->hw_stats_ctx_id, i,
679 : : &ring_stats, true);
680 [ # # ]: 0 : if (unlikely(rc))
681 : 0 : return rc;
682 : :
683 [ # # ]: 0 : bnxt_fill_rte_eth_stats_ext(bnxt_stats, &ring_stats,
684 : : i < num_q_stats ? qstats : NULL, i, true);
685 : 0 : bnxt_stats->rx_nombuf +=
686 : 0 : rte_atomic_load_explicit(&rxq->rx_mbuf_alloc_fail,
687 : : rte_memory_order_relaxed);
688 : : }
689 : :
690 : 0 : num_q_stats = RTE_MIN(bp->tx_cp_nr_rings,
691 : : (unsigned int)RTE_ETHDEV_QUEUE_STAT_CNTRS);
692 : :
693 [ # # ]: 0 : for (i = 0; i < bp->tx_cp_nr_rings; i++) {
694 : 0 : struct bnxt_tx_queue *txq = bp->tx_queues[i];
695 : 0 : struct bnxt_cp_ring_info *cpr = txq->cp_ring;
696 : 0 : struct bnxt_ring_stats_ext ring_stats = {0};
697 : :
698 : 0 : bnxt_stats->oerrors += rte_atomic_load_explicit(&txq->tx_mbuf_drop,
699 : : rte_memory_order_relaxed);
700 : :
701 [ # # ]: 0 : if (!txq->tx_started)
702 : 0 : continue;
703 : :
704 : 0 : rc = bnxt_hwrm_ring_stats_ext(bp, cpr->hw_stats_ctx_id, i,
705 : : &ring_stats, false);
706 [ # # ]: 0 : if (unlikely(rc))
707 : 0 : return rc;
708 : :
709 [ # # ]: 0 : bnxt_fill_rte_eth_stats_ext(bnxt_stats, &ring_stats,
710 : : i < num_q_stats ? qstats : NULL, i, false);
711 : : }
712 : :
713 : : return rc;
714 : : }
715 : :
716 : 0 : int bnxt_stats_get_op(struct rte_eth_dev *eth_dev,
717 : : struct rte_eth_stats *bnxt_stats, struct eth_queue_stats *qstats)
718 : : {
719 : : int rc = 0;
720 : : unsigned int i;
721 : 0 : struct bnxt *bp = eth_dev->data->dev_private;
722 : : unsigned int num_q_stats;
723 : :
724 : 0 : rc = is_bnxt_in_error(bp);
725 [ # # ]: 0 : if (rc)
726 : : return rc;
727 : :
728 [ # # # # ]: 0 : if (BNXT_TPA_V2_P7(bp))
729 : 0 : return bnxt_stats_get_ext(eth_dev, bnxt_stats, qstats);
730 : :
731 : 0 : num_q_stats = RTE_MIN(bp->rx_cp_nr_rings,
732 : : (unsigned int)RTE_ETHDEV_QUEUE_STAT_CNTRS);
733 : :
734 [ # # ]: 0 : for (i = 0; i < bp->rx_cp_nr_rings; i++) {
735 : 0 : struct bnxt_rx_queue *rxq = bp->rx_queues[i];
736 : 0 : struct bnxt_cp_ring_info *cpr = rxq->cp_ring;
737 : 0 : struct bnxt_ring_stats ring_stats = {0};
738 : :
739 [ # # ]: 0 : if (!rxq->rx_started)
740 : 0 : continue;
741 [ # # ]: 0 : if (cpr->hw_stats_ctx_id == HWRM_NA_SIGNATURE)
742 : 0 : continue;
743 : :
744 : 0 : rc = bnxt_hwrm_ring_stats(bp, cpr->hw_stats_ctx_id, i,
745 : : &ring_stats, true);
746 [ # # ]: 0 : if (unlikely(rc))
747 : 0 : return rc;
748 : :
749 [ # # ]: 0 : bnxt_fill_rte_eth_stats(bnxt_stats, &ring_stats,
750 : : i < num_q_stats ? qstats : NULL, i, true);
751 : 0 : bnxt_stats->rx_nombuf +=
752 : 0 : rte_atomic_load_explicit(&rxq->rx_mbuf_alloc_fail,
753 : : rte_memory_order_relaxed);
754 : : }
755 : :
756 : 0 : num_q_stats = RTE_MIN(bp->tx_cp_nr_rings,
757 : : (unsigned int)RTE_ETHDEV_QUEUE_STAT_CNTRS);
758 : :
759 [ # # ]: 0 : for (i = 0; i < bp->tx_cp_nr_rings; i++) {
760 : 0 : struct bnxt_tx_queue *txq = bp->tx_queues[i];
761 : 0 : struct bnxt_cp_ring_info *cpr = txq->cp_ring;
762 : 0 : struct bnxt_ring_stats ring_stats = {0};
763 : :
764 [ # # ]: 0 : if (!txq->tx_started)
765 : 0 : continue;
766 : :
767 : 0 : rc = bnxt_hwrm_ring_stats(bp, cpr->hw_stats_ctx_id, i,
768 : : &ring_stats, false);
769 [ # # ]: 0 : if (unlikely(rc))
770 : 0 : return rc;
771 : :
772 [ # # ]: 0 : bnxt_fill_rte_eth_stats(bnxt_stats, &ring_stats,
773 : : i < num_q_stats ? qstats : NULL, i, false);
774 : 0 : bnxt_stats->oerrors +=
775 : 0 : rte_atomic_load_explicit(&txq->tx_mbuf_drop,
776 : : rte_memory_order_relaxed);
777 : : }
778 : :
779 : : return rc;
780 : : }
781 : :
782 : 0 : static void bnxt_clear_prev_stat(struct bnxt *bp)
783 : : {
784 : : /*
785 : : * Clear the cached values of stats returned by HW in the previous
786 : : * get operation.
787 : : */
788 [ # # # # ]: 0 : if (BNXT_TPA_V2_P7(bp)) {
789 : 0 : memset(bp->prev_rx_ring_stats_ext, 0,
790 : 0 : sizeof(struct bnxt_ring_stats_ext) * bp->rx_cp_nr_rings);
791 : 0 : memset(bp->prev_tx_ring_stats_ext, 0,
792 : 0 : sizeof(struct bnxt_ring_stats_ext) * bp->tx_cp_nr_rings);
793 : : } else {
794 : 0 : memset(bp->prev_rx_ring_stats, 0,
795 : 0 : sizeof(struct bnxt_ring_stats) * bp->rx_cp_nr_rings);
796 : 0 : memset(bp->prev_tx_ring_stats, 0,
797 : 0 : sizeof(struct bnxt_ring_stats) * bp->tx_cp_nr_rings);
798 : : }
799 : 0 : }
800 : :
801 : 0 : int bnxt_stats_reset_op(struct rte_eth_dev *eth_dev)
802 : : {
803 : 0 : struct bnxt *bp = eth_dev->data->dev_private;
804 : : unsigned int i;
805 : : int ret;
806 : :
807 : 0 : ret = is_bnxt_in_error(bp);
808 [ # # ]: 0 : if (ret)
809 : : return ret;
810 : :
811 [ # # ]: 0 : if (!eth_dev->data->dev_started) {
812 : 0 : PMD_DRV_LOG_LINE(ERR, "Device Initialization not complete!");
813 : 0 : return -EINVAL;
814 : : }
815 : :
816 : 0 : ret = bnxt_clear_all_hwrm_stat_ctxs(bp);
817 [ # # ]: 0 : for (i = 0; i < bp->rx_cp_nr_rings; i++) {
818 : 0 : struct bnxt_rx_queue *rxq = bp->rx_queues[i];
819 : :
820 : 0 : rxq->rx_mbuf_alloc_fail = 0;
821 : : }
822 : :
823 [ # # ]: 0 : for (i = 0; i < bp->tx_cp_nr_rings; i++) {
824 : 0 : struct bnxt_tx_queue *txq = bp->tx_queues[i];
825 : :
826 : 0 : txq->tx_mbuf_drop = 0;
827 : : }
828 : :
829 : 0 : bnxt_clear_prev_stat(bp);
830 : :
831 : 0 : return ret;
832 : : }
833 : :
834 : 0 : static void bnxt_fill_func_qstats_ext(struct hwrm_func_qstats_ext_output *func_qstats,
835 : : struct bnxt_ring_stats_ext *ring_stats,
836 : : bool rx)
837 : : {
838 [ # # ]: 0 : if (rx) {
839 : 0 : func_qstats->rx_ucast_pkts += ring_stats->rx_ucast_pkts;
840 : 0 : func_qstats->rx_mcast_pkts += ring_stats->rx_mcast_pkts;
841 : 0 : func_qstats->rx_bcast_pkts += ring_stats->rx_bcast_pkts;
842 : :
843 : 0 : func_qstats->rx_ucast_bytes += ring_stats->rx_ucast_bytes;
844 : 0 : func_qstats->rx_mcast_bytes += ring_stats->rx_mcast_bytes;
845 : 0 : func_qstats->rx_bcast_bytes += ring_stats->rx_bcast_bytes;
846 : :
847 : 0 : func_qstats->rx_discard_pkts += ring_stats->rx_discard_pkts;
848 : 0 : func_qstats->rx_error_pkts += ring_stats->rx_error_pkts;
849 : :
850 : 0 : func_qstats->rx_tpa_eligible_pkt += ring_stats->rx_tpa_eligible_pkt;
851 : 0 : func_qstats->rx_tpa_eligible_bytes += ring_stats->rx_tpa_eligible_bytes;
852 : 0 : func_qstats->rx_tpa_pkt += ring_stats->rx_tpa_pkt;
853 : 0 : func_qstats->rx_tpa_bytes += ring_stats->rx_tpa_bytes;
854 : 0 : func_qstats->rx_tpa_errors += ring_stats->rx_tpa_errors;
855 : 0 : func_qstats->rx_tpa_events += ring_stats->rx_tpa_events;
856 : : } else {
857 : 0 : func_qstats->tx_ucast_pkts += ring_stats->tx_ucast_pkts;
858 : 0 : func_qstats->tx_mcast_pkts += ring_stats->tx_mcast_pkts;
859 : 0 : func_qstats->tx_bcast_pkts += ring_stats->tx_bcast_pkts;
860 : :
861 : 0 : func_qstats->tx_ucast_bytes += ring_stats->tx_ucast_bytes;
862 : 0 : func_qstats->tx_mcast_bytes += ring_stats->tx_mcast_bytes;
863 : 0 : func_qstats->tx_bcast_bytes += ring_stats->tx_bcast_bytes;
864 : :
865 : 0 : func_qstats->tx_error_pkts += ring_stats->tx_error_pkts;
866 : 0 : func_qstats->tx_discard_pkts += ring_stats->tx_discard_pkts;
867 : : }
868 : 0 : }
869 : :
870 : 0 : static void bnxt_fill_func_qstats(struct hwrm_func_qstats_output *func_qstats,
871 : : struct bnxt_ring_stats *ring_stats,
872 : : bool rx)
873 : : {
874 [ # # ]: 0 : if (rx) {
875 : 0 : func_qstats->rx_ucast_pkts += ring_stats->rx_ucast_pkts;
876 : 0 : func_qstats->rx_mcast_pkts += ring_stats->rx_mcast_pkts;
877 : 0 : func_qstats->rx_bcast_pkts += ring_stats->rx_bcast_pkts;
878 : :
879 : 0 : func_qstats->rx_ucast_bytes += ring_stats->rx_ucast_bytes;
880 : 0 : func_qstats->rx_mcast_bytes += ring_stats->rx_mcast_bytes;
881 : 0 : func_qstats->rx_bcast_bytes += ring_stats->rx_bcast_bytes;
882 : :
883 : 0 : func_qstats->rx_discard_pkts += ring_stats->rx_discard_pkts;
884 : 0 : func_qstats->rx_drop_pkts += ring_stats->rx_error_pkts;
885 : :
886 : 0 : func_qstats->rx_agg_pkts += ring_stats->rx_agg_pkts;
887 : 0 : func_qstats->rx_agg_bytes += ring_stats->rx_agg_bytes;
888 : 0 : func_qstats->rx_agg_events += ring_stats->rx_agg_events;
889 : 0 : func_qstats->rx_agg_aborts += ring_stats->rx_agg_aborts;
890 : : } else {
891 : 0 : func_qstats->tx_ucast_pkts += ring_stats->tx_ucast_pkts;
892 : 0 : func_qstats->tx_mcast_pkts += ring_stats->tx_mcast_pkts;
893 : 0 : func_qstats->tx_bcast_pkts += ring_stats->tx_bcast_pkts;
894 : :
895 : 0 : func_qstats->tx_ucast_bytes += ring_stats->tx_ucast_bytes;
896 : 0 : func_qstats->tx_mcast_bytes += ring_stats->tx_mcast_bytes;
897 : 0 : func_qstats->tx_bcast_bytes += ring_stats->tx_bcast_bytes;
898 : :
899 : 0 : func_qstats->tx_drop_pkts += ring_stats->tx_error_pkts;
900 : 0 : func_qstats->tx_discard_pkts += ring_stats->tx_discard_pkts;
901 : : }
902 : 0 : }
903 : :
904 : 0 : int bnxt_dev_xstats_get_op(struct rte_eth_dev *eth_dev,
905 : : struct rte_eth_xstat *xstats, unsigned int n)
906 : : {
907 : 0 : struct bnxt *bp = eth_dev->data->dev_private;
908 : : unsigned int count, i;
909 : : unsigned int rx_port_stats_ext_cnt;
910 : : unsigned int tx_port_stats_ext_cnt;
911 : : unsigned int stat_size = sizeof(uint64_t);
912 : 0 : struct hwrm_func_qstats_output func_qstats = {0};
913 : 0 : struct hwrm_func_qstats_ext_output func_qstats_ext = {0};
914 : : unsigned int stat_count, sz;
915 : : int rc;
916 : :
917 : 0 : rc = is_bnxt_in_error(bp);
918 [ # # ]: 0 : if (rc)
919 : : return rc;
920 : :
921 [ # # # # ]: 0 : if (BNXT_TPA_V2_P7(bp))
922 : : sz = RTE_DIM(bnxt_func_stats_ext_strings);
923 : : else
924 : : sz = RTE_DIM(bnxt_func_stats_strings);
925 : :
926 : 0 : stat_count = RTE_DIM(bnxt_rx_stats_strings) +
927 : : RTE_DIM(bnxt_tx_stats_strings) + sz +
928 : : RTE_DIM(bnxt_rx_ext_stats_strings) +
929 : 0 : RTE_DIM(bnxt_tx_ext_stats_strings) +
930 : 0 : bnxt_flow_stats_cnt(bp);
931 : :
932 [ # # ]: 0 : if (n < stat_count || xstats == NULL)
933 : 0 : return stat_count;
934 : :
935 [ # # ]: 0 : for (i = 0; i < bp->rx_cp_nr_rings; i++) {
936 : 0 : struct bnxt_rx_queue *rxq = bp->rx_queues[i];
937 : 0 : struct bnxt_cp_ring_info *cpr = rxq->cp_ring;
938 : 0 : struct bnxt_ring_stats ring_stats = {0};
939 : 0 : struct bnxt_ring_stats_ext ring_stats_ext = {0};
940 : :
941 [ # # ]: 0 : if (!rxq->rx_started)
942 : 0 : continue;
943 : :
944 [ # # # # ]: 0 : if (BNXT_TPA_V2_P7(bp))
945 : 0 : rc = bnxt_hwrm_ring_stats_ext(bp, cpr->hw_stats_ctx_id, i,
946 : : &ring_stats_ext, true);
947 : : else
948 : 0 : rc = bnxt_hwrm_ring_stats(bp, cpr->hw_stats_ctx_id, i,
949 : : &ring_stats, true);
950 : :
951 [ # # ]: 0 : if (unlikely(rc))
952 : 0 : return rc;
953 : :
954 [ # # # # ]: 0 : if (BNXT_TPA_V2_P7(bp))
955 : 0 : bnxt_fill_func_qstats_ext(&func_qstats_ext,
956 : : &ring_stats_ext, true);
957 : : else
958 : 0 : bnxt_fill_func_qstats(&func_qstats, &ring_stats, true);
959 : : }
960 : :
961 [ # # ]: 0 : for (i = 0; i < bp->tx_cp_nr_rings; i++) {
962 : 0 : struct bnxt_tx_queue *txq = bp->tx_queues[i];
963 : 0 : struct bnxt_cp_ring_info *cpr = txq->cp_ring;
964 : 0 : struct bnxt_ring_stats ring_stats = {0};
965 : 0 : struct bnxt_ring_stats_ext ring_stats_ext = {0};
966 : :
967 [ # # ]: 0 : if (!txq->tx_started)
968 : 0 : continue;
969 : :
970 [ # # # # ]: 0 : if (BNXT_TPA_V2_P7(bp))
971 : 0 : rc = bnxt_hwrm_ring_stats_ext(bp, cpr->hw_stats_ctx_id, i,
972 : : &ring_stats_ext, false);
973 : : else
974 : 0 : rc = bnxt_hwrm_ring_stats(bp, cpr->hw_stats_ctx_id, i,
975 : : &ring_stats, false);
976 [ # # ]: 0 : if (unlikely(rc))
977 : 0 : return rc;
978 : :
979 [ # # # # ]: 0 : if (BNXT_TPA_V2_P7(bp))
980 : 0 : bnxt_fill_func_qstats_ext(&func_qstats_ext,
981 : : &ring_stats_ext, false);
982 : : else
983 : 0 : bnxt_fill_func_qstats(&func_qstats, &ring_stats, false);
984 : : }
985 : :
986 : 0 : bnxt_hwrm_port_qstats(bp);
987 : 0 : bnxt_hwrm_ext_port_qstats(bp);
988 : 0 : rx_port_stats_ext_cnt = RTE_MIN(RTE_DIM(bnxt_rx_ext_stats_strings),
989 : : (bp->fw_rx_port_stats_ext_size /
990 : : stat_size));
991 : 0 : tx_port_stats_ext_cnt = RTE_MIN(RTE_DIM(bnxt_tx_ext_stats_strings),
992 : : (bp->fw_tx_port_stats_ext_size /
993 : : stat_size));
994 : :
995 : 0 : memset(xstats, 0, sizeof(*xstats) * n);
996 : :
997 : : count = 0;
998 [ # # ]: 0 : for (i = 0; i < RTE_DIM(bnxt_rx_stats_strings); i++) {
999 : 0 : uint64_t *rx_stats = (uint64_t *)bp->hw_rx_port_stats;
1000 : 0 : xstats[count].id = count;
1001 : 0 : xstats[count].value = rte_le_to_cpu_64(
1002 : : *(uint64_t *)((char *)rx_stats +
1003 : : bnxt_rx_stats_strings[i].offset));
1004 : 0 : count++;
1005 : : }
1006 : :
1007 [ # # ]: 0 : for (i = 0; i < RTE_DIM(bnxt_tx_stats_strings); i++) {
1008 : 0 : uint64_t *tx_stats = (uint64_t *)bp->hw_tx_port_stats;
1009 : 0 : xstats[count].id = count;
1010 : 0 : xstats[count].value = rte_le_to_cpu_64(
1011 : : *(uint64_t *)((char *)tx_stats +
1012 : : bnxt_tx_stats_strings[i].offset));
1013 : 0 : count++;
1014 : : }
1015 : :
1016 [ # # # # ]: 0 : if (BNXT_TPA_V2_P7(bp)) {
1017 [ # # ]: 0 : for (i = 0; i < RTE_DIM(bnxt_func_stats_ext_strings); i++) {
1018 : 0 : xstats[count].id = count;
1019 : 0 : xstats[count].value = *(uint64_t *)((char *)&func_qstats_ext +
1020 : 0 : bnxt_func_stats_ext_strings[i].offset);
1021 : 0 : count++;
1022 : : }
1023 : 0 : goto skip_func_stats;
1024 : : }
1025 [ # # ]: 0 : for (i = 0; i < RTE_DIM(bnxt_func_stats_strings); i++) {
1026 : 0 : xstats[count].id = count;
1027 : 0 : xstats[count].value = *(uint64_t *)((char *)&func_qstats +
1028 : 0 : bnxt_func_stats_strings[i].offset);
1029 : 0 : count++;
1030 : : }
1031 : :
1032 : 0 : skip_func_stats:
1033 [ # # ]: 0 : for (i = 0; i < rx_port_stats_ext_cnt; i++) {
1034 : 0 : uint64_t *rx_stats_ext = (uint64_t *)bp->hw_rx_port_stats_ext;
1035 : :
1036 : 0 : xstats[count].value = rte_le_to_cpu_64
1037 : : (*(uint64_t *)((char *)rx_stats_ext +
1038 : : bnxt_rx_ext_stats_strings[i].offset));
1039 : :
1040 : 0 : count++;
1041 : : }
1042 : :
1043 [ # # ]: 0 : for (i = 0; i < tx_port_stats_ext_cnt; i++) {
1044 : 0 : uint64_t *tx_stats_ext = (uint64_t *)bp->hw_tx_port_stats_ext;
1045 : :
1046 : 0 : xstats[count].value = rte_le_to_cpu_64
1047 : : (*(uint64_t *)((char *)tx_stats_ext +
1048 : : bnxt_tx_ext_stats_strings[i].offset));
1049 : 0 : count++;
1050 : : }
1051 : :
1052 [ # # ]: 0 : if (bp->fw_cap & BNXT_FW_CAP_ADV_FLOW_COUNTERS &&
1053 : 0 : bp->fw_cap & BNXT_FW_CAP_ADV_FLOW_MGMT &&
1054 [ # # ]: 0 : BNXT_FLOW_XSTATS_EN(bp)) {
1055 : : int j;
1056 : :
1057 : : i = 0;
1058 [ # # ]: 0 : for (j = 0; j < bp->max_vnics; j++) {
1059 : : struct bnxt_filter_info *filter;
1060 : : struct bnxt_vnic_info *vnic;
1061 : : struct rte_flow *flow;
1062 : :
1063 : 0 : vnic = &bp->vnic_info[j];
1064 [ # # # # ]: 0 : if (vnic && vnic->fw_vnic_id == INVALID_VNIC_ID)
1065 : 0 : continue;
1066 : :
1067 [ # # ]: 0 : if (STAILQ_EMPTY(&vnic->flow_list))
1068 : 0 : continue;
1069 : :
1070 [ # # ]: 0 : STAILQ_FOREACH(flow, &vnic->flow_list, next) {
1071 [ # # ]: 0 : if (!flow || !flow->filter)
1072 : 0 : continue;
1073 : :
1074 : : filter = flow->filter;
1075 : 0 : xstats[count].id = count;
1076 : 0 : xstats[count].value =
1077 : 0 : filter->hw_stats.bytes;
1078 : 0 : count++;
1079 : 0 : xstats[count].id = count;
1080 : 0 : xstats[count].value =
1081 : 0 : filter->hw_stats.packets;
1082 : 0 : count++;
1083 [ # # ]: 0 : if (++i > bp->max_l2_ctx)
1084 : : break;
1085 : : }
1086 [ # # ]: 0 : if (i > bp->max_l2_ctx)
1087 : : break;
1088 : : }
1089 : : }
1090 : :
1091 : 0 : return stat_count;
1092 : : }
1093 : :
1094 : 0 : int bnxt_flow_stats_cnt(struct bnxt *bp)
1095 : : {
1096 [ # # ]: 0 : if (bp->fw_cap & BNXT_FW_CAP_ADV_FLOW_COUNTERS &&
1097 : 0 : bp->fw_cap & BNXT_FW_CAP_ADV_FLOW_MGMT &&
1098 [ # # ]: 0 : BNXT_FLOW_XSTATS_EN(bp)) {
1099 : 0 : struct bnxt_xstats_name_off flow_bytes[bp->max_l2_ctx];
1100 : : struct bnxt_xstats_name_off flow_pkts[bp->max_l2_ctx];
1101 : :
1102 : 0 : return RTE_DIM(flow_bytes) + RTE_DIM(flow_pkts);
1103 : : }
1104 : :
1105 : : return 0;
1106 : : }
1107 : :
1108 : 0 : int bnxt_dev_xstats_get_names_op(struct rte_eth_dev *eth_dev,
1109 : : struct rte_eth_xstat_name *xstats_names,
1110 : : unsigned int size)
1111 : : {
1112 : 0 : struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;
1113 : : unsigned int stat_cnt;
1114 : : unsigned int i, count = 0, sz;
1115 : : int rc;
1116 : :
1117 : 0 : rc = is_bnxt_in_error(bp);
1118 [ # # ]: 0 : if (rc)
1119 : : return rc;
1120 : :
1121 [ # # # # ]: 0 : if (BNXT_TPA_V2_P7(bp))
1122 : : sz = RTE_DIM(bnxt_func_stats_ext_strings);
1123 : : else
1124 : : sz = RTE_DIM(bnxt_func_stats_strings);
1125 : :
1126 : 0 : stat_cnt = RTE_DIM(bnxt_rx_stats_strings) +
1127 : : RTE_DIM(bnxt_tx_stats_strings) +
1128 : : sz +
1129 : : RTE_DIM(bnxt_rx_ext_stats_strings) +
1130 : 0 : RTE_DIM(bnxt_tx_ext_stats_strings) +
1131 : 0 : bnxt_flow_stats_cnt(bp);
1132 : :
1133 [ # # ]: 0 : if (xstats_names == NULL || size < stat_cnt)
1134 : 0 : return stat_cnt;
1135 : :
1136 [ # # ]: 0 : for (i = 0; i < RTE_DIM(bnxt_rx_stats_strings); i++) {
1137 : 0 : strlcpy(xstats_names[count].name,
1138 : : bnxt_rx_stats_strings[i].name,
1139 : : sizeof(xstats_names[count].name));
1140 : 0 : count++;
1141 : : }
1142 : :
1143 [ # # ]: 0 : for (i = 0; i < RTE_DIM(bnxt_tx_stats_strings); i++) {
1144 : 0 : strlcpy(xstats_names[count].name,
1145 : : bnxt_tx_stats_strings[i].name,
1146 : : sizeof(xstats_names[count].name));
1147 : 0 : count++;
1148 : : }
1149 : :
1150 [ # # # # ]: 0 : if (BNXT_TPA_V2_P7(bp)) {
1151 [ # # ]: 0 : for (i = 0; i < RTE_DIM(bnxt_func_stats_ext_strings); i++) {
1152 : 0 : strlcpy(xstats_names[count].name,
1153 : : bnxt_func_stats_ext_strings[i].name,
1154 : : sizeof(xstats_names[count].name));
1155 : 0 : count++;
1156 : : }
1157 : 0 : goto skip_func_stats;
1158 : : }
1159 : :
1160 [ # # ]: 0 : for (i = 0; i < RTE_DIM(bnxt_func_stats_strings); i++) {
1161 : 0 : strlcpy(xstats_names[count].name,
1162 : : bnxt_func_stats_strings[i].name,
1163 : : sizeof(xstats_names[count].name));
1164 : 0 : count++;
1165 : : }
1166 : :
1167 : 0 : skip_func_stats:
1168 [ # # ]: 0 : for (i = 0; i < RTE_DIM(bnxt_rx_ext_stats_strings); i++) {
1169 : 0 : strlcpy(xstats_names[count].name,
1170 : : bnxt_rx_ext_stats_strings[i].name,
1171 : : sizeof(xstats_names[count].name));
1172 : :
1173 : 0 : count++;
1174 : : }
1175 : :
1176 [ # # ]: 0 : for (i = 0; i < RTE_DIM(bnxt_tx_ext_stats_strings); i++) {
1177 : 0 : strlcpy(xstats_names[count].name,
1178 : : bnxt_tx_ext_stats_strings[i].name,
1179 : : sizeof(xstats_names[count].name));
1180 : :
1181 : 0 : count++;
1182 : : }
1183 : :
1184 [ # # ]: 0 : if (bp->fw_cap & BNXT_FW_CAP_ADV_FLOW_COUNTERS &&
1185 : 0 : bp->fw_cap & BNXT_FW_CAP_ADV_FLOW_MGMT &&
1186 [ # # ]: 0 : BNXT_FLOW_XSTATS_EN(bp)) {
1187 [ # # ]: 0 : for (i = 0; i < bp->max_l2_ctx; i++) {
1188 : : char buf[RTE_ETH_XSTATS_NAME_SIZE];
1189 : :
1190 : : sprintf(buf, "flow_%d_bytes", i);
1191 : 0 : strlcpy(xstats_names[count].name, buf,
1192 : : sizeof(xstats_names[count].name));
1193 : 0 : count++;
1194 : :
1195 : : sprintf(buf, "flow_%d_packets", i);
1196 : 0 : strlcpy(xstats_names[count].name, buf,
1197 : : sizeof(xstats_names[count].name));
1198 : :
1199 : 0 : count++;
1200 : : }
1201 : : }
1202 : :
1203 : 0 : return stat_cnt;
1204 : : }
1205 : :
1206 : 0 : int bnxt_dev_xstats_reset_op(struct rte_eth_dev *eth_dev)
1207 : : {
1208 : 0 : struct bnxt *bp = eth_dev->data->dev_private;
1209 : : int ret;
1210 : :
1211 : 0 : ret = is_bnxt_in_error(bp);
1212 [ # # ]: 0 : if (ret)
1213 : : return ret;
1214 : :
1215 [ # # ]: 0 : if (BNXT_VF(bp) || !BNXT_SINGLE_PF(bp) ||
1216 : : !(bp->flags & BNXT_FLAG_PORT_STATS)) {
1217 : 0 : PMD_DRV_LOG_LINE(ERR, "Operation not supported");
1218 : 0 : return -ENOTSUP;
1219 : : }
1220 : :
1221 : 0 : ret = bnxt_hwrm_port_clr_stats(bp);
1222 [ # # ]: 0 : if (ret != 0)
1223 : 0 : PMD_DRV_LOG_LINE(ERR, "Failed to reset xstats: %s",
1224 : : strerror(-ret));
1225 : :
1226 : 0 : bnxt_clear_prev_stat(bp);
1227 : :
1228 : 0 : return ret;
1229 : : }
1230 : :
1231 : : /* Update the input context memory with the flow counter IDs
1232 : : * of the flows that we are interested in.
1233 : : * Also, update the output tables with the current local values
1234 : : * since that is what will be used by FW to accumulate
1235 : : */
1236 : : static void bnxt_update_fc_pre_qstat(uint32_t *in_tbl,
1237 : : uint64_t *out_tbl,
1238 : : struct bnxt_filter_info *filter,
1239 : : uint32_t *ptbl_cnt)
1240 : : {
1241 : : uint32_t in_tbl_cnt = *ptbl_cnt;
1242 : :
1243 : 0 : in_tbl[in_tbl_cnt] = filter->flow_id;
1244 : 0 : out_tbl[2 * in_tbl_cnt] = filter->hw_stats.packets;
1245 : 0 : out_tbl[2 * in_tbl_cnt + 1] = filter->hw_stats.bytes;
1246 : 0 : in_tbl_cnt++;
1247 : : *ptbl_cnt = in_tbl_cnt;
1248 : 0 : }
1249 : :
1250 : : /* Post issuing counter_qstats cmd, update the driver's local stat
1251 : : * entries with the values DMA-ed by FW in the output table
1252 : : */
1253 : : static void bnxt_update_fc_post_qstat(struct bnxt_filter_info *filter,
1254 : : uint64_t *out_tbl,
1255 : : uint32_t out_tbl_idx)
1256 : : {
1257 : 0 : filter->hw_stats.packets = out_tbl[2 * out_tbl_idx];
1258 : 0 : filter->hw_stats.bytes = out_tbl[(2 * out_tbl_idx) + 1];
1259 : : }
1260 : :
1261 : 0 : static int bnxt_update_fc_tbl(struct bnxt *bp, uint16_t ctr,
1262 : : struct bnxt_filter_info *en_tbl[],
1263 : : uint16_t in_flow_cnt)
1264 : : {
1265 : : uint32_t *in_rx_tbl;
1266 : : uint64_t *out_rx_tbl;
1267 : : uint32_t in_rx_tbl_cnt = 0;
1268 : : uint32_t out_rx_tbl_cnt = 0;
1269 : : int i, rc = 0;
1270 : :
1271 : 0 : in_rx_tbl = (uint32_t *)bp->flow_stat->rx_fc_in_tbl.va;
1272 : 0 : out_rx_tbl = (uint64_t *)bp->flow_stat->rx_fc_out_tbl.va;
1273 : :
1274 [ # # ]: 0 : for (i = 0; i < in_flow_cnt; i++) {
1275 [ # # ]: 0 : if (!en_tbl[i])
1276 : 0 : continue;
1277 : :
1278 : : /* Currently only ingress/Rx flows are supported anyway. */
1279 : : bnxt_update_fc_pre_qstat(in_rx_tbl, out_rx_tbl,
1280 : : en_tbl[i], &in_rx_tbl_cnt);
1281 : : }
1282 : :
1283 : : /* Currently only ingress/Rx flows are supported */
1284 [ # # ]: 0 : if (in_rx_tbl_cnt) {
1285 : 0 : rc = bnxt_hwrm_cfa_counter_qstats(bp, BNXT_DIR_RX, ctr,
1286 : : in_rx_tbl_cnt);
1287 [ # # ]: 0 : if (rc)
1288 : : return rc;
1289 : : }
1290 : :
1291 [ # # ]: 0 : for (i = 0; i < in_flow_cnt; i++) {
1292 [ # # ]: 0 : if (!en_tbl[i])
1293 : 0 : continue;
1294 : :
1295 : : /* Currently only ingress/Rx flows are supported */
1296 : : bnxt_update_fc_post_qstat(en_tbl[i], out_rx_tbl,
1297 : : out_rx_tbl_cnt);
1298 : 0 : out_rx_tbl_cnt++;
1299 : : }
1300 : :
1301 : : return rc;
1302 : : }
1303 : :
1304 : : /* Walks through the list which has all the flows
1305 : : * requesting for explicit flow counters.
1306 : : */
1307 : 0 : int bnxt_flow_stats_req(struct bnxt *bp)
1308 : 0 : {
1309 : : int i;
1310 : : int rc = 0;
1311 : : struct rte_flow *flow;
1312 : : uint16_t in_flow_tbl_cnt = 0;
1313 : : struct bnxt_vnic_info *vnic = NULL;
1314 : 0 : struct bnxt_filter_info *valid_en_tbl[bp->flow_stat->max_fc];
1315 : : uint16_t counter_type = CFA_COUNTER_CFG_IN_COUNTER_TYPE_FC;
1316 : :
1317 : 0 : bnxt_acquire_flow_lock(bp);
1318 [ # # ]: 0 : for (i = 0; i < bp->max_vnics; i++) {
1319 : 0 : vnic = &bp->vnic_info[i];
1320 [ # # # # ]: 0 : if (vnic && vnic->fw_vnic_id == INVALID_VNIC_ID)
1321 : 0 : continue;
1322 : :
1323 [ # # ]: 0 : if (STAILQ_EMPTY(&vnic->flow_list))
1324 : 0 : continue;
1325 : :
1326 [ # # ]: 0 : STAILQ_FOREACH(flow, &vnic->flow_list, next) {
1327 [ # # ]: 0 : if (!flow || !flow->filter)
1328 : 0 : continue;
1329 : :
1330 : 0 : valid_en_tbl[in_flow_tbl_cnt++] = flow->filter;
1331 [ # # ]: 0 : if (in_flow_tbl_cnt >= bp->flow_stat->max_fc) {
1332 : 0 : rc = bnxt_update_fc_tbl(bp, counter_type,
1333 : : valid_en_tbl,
1334 : : in_flow_tbl_cnt);
1335 [ # # ]: 0 : if (rc)
1336 : 0 : goto err;
1337 : : in_flow_tbl_cnt = 0;
1338 : 0 : continue;
1339 : : }
1340 : : }
1341 : : }
1342 : :
1343 [ # # ]: 0 : if (!in_flow_tbl_cnt) {
1344 : 0 : bnxt_release_flow_lock(bp);
1345 : 0 : goto out;
1346 : : }
1347 : :
1348 : 0 : rc = bnxt_update_fc_tbl(bp, counter_type, valid_en_tbl,
1349 : : in_flow_tbl_cnt);
1350 [ # # ]: 0 : if (!rc) {
1351 : 0 : bnxt_release_flow_lock(bp);
1352 : 0 : return 0;
1353 : : }
1354 : :
1355 : 0 : err:
1356 : : /* If cmd fails once, no need of
1357 : : * invoking again every second
1358 : : */
1359 : 0 : bnxt_release_flow_lock(bp);
1360 : 0 : bnxt_cancel_fc_thread(bp);
1361 : : out:
1362 : : return rc;
1363 : : }
|