xref: /dpdk/drivers/net/bnxt/bnxt_stats.c (revision 6cc5dfa69a0335849fc0903d3ada943acb33c7ce)
1fd710bb1SScott Branden /* SPDX-License-Identifier: BSD-3-Clause
2e6e8f03eSRandy Schacher  * Copyright(c) 2014-2023 Broadcom
357d5e5bcSAjit Khaparde  * All rights reserved.
457d5e5bcSAjit Khaparde  */
557d5e5bcSAjit Khaparde 
657d5e5bcSAjit Khaparde #include <inttypes.h>
757d5e5bcSAjit Khaparde 
86723c0fcSBruce Richardson #include <rte_string_fns.h>
957d5e5bcSAjit Khaparde #include <rte_byteorder.h>
1057d5e5bcSAjit Khaparde 
1157d5e5bcSAjit Khaparde #include "bnxt.h"
1257d5e5bcSAjit Khaparde #include "bnxt_cpr.h"
1302a95625SSomnath Kotur #include "bnxt_filter.h"
1457d5e5bcSAjit Khaparde #include "bnxt_hwrm.h"
1557d5e5bcSAjit Khaparde #include "bnxt_rxq.h"
1657d5e5bcSAjit Khaparde #include "bnxt_stats.h"
1757d5e5bcSAjit Khaparde #include "bnxt_txq.h"
1802a95625SSomnath Kotur #include "bnxt_vnic.h"
1957d5e5bcSAjit Khaparde #include "hsi_struct_def_dpdk.h"
2057d5e5bcSAjit Khaparde 
21bfb9c226SAjit Khaparde static const struct bnxt_xstats_name_off bnxt_rx_stats_strings[] = {
22bfb9c226SAjit Khaparde 	{"rx_64b_frames", offsetof(struct rx_port_stats,
23bfb9c226SAjit Khaparde 				rx_64b_frames)},
24bfb9c226SAjit Khaparde 	{"rx_65b_127b_frames", offsetof(struct rx_port_stats,
25bfb9c226SAjit Khaparde 				rx_65b_127b_frames)},
26bfb9c226SAjit Khaparde 	{"rx_128b_255b_frames", offsetof(struct rx_port_stats,
27bfb9c226SAjit Khaparde 				rx_128b_255b_frames)},
28bfb9c226SAjit Khaparde 	{"rx_256b_511b_frames", offsetof(struct rx_port_stats,
29bfb9c226SAjit Khaparde 				rx_256b_511b_frames)},
30bfb9c226SAjit Khaparde 	{"rx_512b_1023b_frames", offsetof(struct rx_port_stats,
31bfb9c226SAjit Khaparde 				rx_512b_1023b_frames)},
32757d6f6bSAjit Khaparde 	{"rx_1024b_1518b_frames", offsetof(struct rx_port_stats,
33757d6f6bSAjit Khaparde 				rx_1024b_1518b_frames)},
34bfb9c226SAjit Khaparde 	{"rx_good_vlan_frames", offsetof(struct rx_port_stats,
35bfb9c226SAjit Khaparde 				rx_good_vlan_frames)},
36bfb9c226SAjit Khaparde 	{"rx_1519b_2047b_frames", offsetof(struct rx_port_stats,
37bfb9c226SAjit Khaparde 				rx_1519b_2047b_frames)},
38bfb9c226SAjit Khaparde 	{"rx_2048b_4095b_frames", offsetof(struct rx_port_stats,
39bfb9c226SAjit Khaparde 				rx_2048b_4095b_frames)},
40bfb9c226SAjit Khaparde 	{"rx_4096b_9216b_frames", offsetof(struct rx_port_stats,
41bfb9c226SAjit Khaparde 				rx_4096b_9216b_frames)},
42bfb9c226SAjit Khaparde 	{"rx_9217b_16383b_frames", offsetof(struct rx_port_stats,
43bfb9c226SAjit Khaparde 				rx_9217b_16383b_frames)},
44bfb9c226SAjit Khaparde 	{"rx_total_frames", offsetof(struct rx_port_stats,
45bfb9c226SAjit Khaparde 				rx_total_frames)},
46bfb9c226SAjit Khaparde 	{"rx_ucast_frames", offsetof(struct rx_port_stats,
47bfb9c226SAjit Khaparde 				rx_ucast_frames)},
48bfb9c226SAjit Khaparde 	{"rx_mcast_frames", offsetof(struct rx_port_stats,
49bfb9c226SAjit Khaparde 				rx_mcast_frames)},
50bfb9c226SAjit Khaparde 	{"rx_bcast_frames", offsetof(struct rx_port_stats,
51bfb9c226SAjit Khaparde 				rx_bcast_frames)},
52bfb9c226SAjit Khaparde 	{"rx_fcs_err_frames", offsetof(struct rx_port_stats,
53bfb9c226SAjit Khaparde 				rx_fcs_err_frames)},
54bfb9c226SAjit Khaparde 	{"rx_ctrl_frames", offsetof(struct rx_port_stats,
55bfb9c226SAjit Khaparde 				rx_ctrl_frames)},
56bfb9c226SAjit Khaparde 	{"rx_pause_frames", offsetof(struct rx_port_stats,
57bfb9c226SAjit Khaparde 				rx_pause_frames)},
58bfb9c226SAjit Khaparde 	{"rx_pfc_frames", offsetof(struct rx_port_stats,
59bfb9c226SAjit Khaparde 				rx_pfc_frames)},
6064261910SChristos Ricudis 	{"rx_unsupported_opcode_frames", offsetof(struct rx_port_stats,
6164261910SChristos Ricudis 				rx_unsupported_opcode_frames)},
6264261910SChristos Ricudis 	{"rx_unsupported_da_pausepfc_frames", offsetof(struct rx_port_stats,
6364261910SChristos Ricudis 				rx_unsupported_da_pausepfc_frames)},
6464261910SChristos Ricudis 	{"rx_wrong_sa_frames", offsetof(struct rx_port_stats,
6564261910SChristos Ricudis 				rx_wrong_sa_frames)},
66bfb9c226SAjit Khaparde 	{"rx_align_err_frames", offsetof(struct rx_port_stats,
67bfb9c226SAjit Khaparde 				rx_align_err_frames)},
6864261910SChristos Ricudis 	{"rx_oor_len_frames", offsetof(struct rx_port_stats,
6964261910SChristos Ricudis 				rx_oor_len_frames)},
7064261910SChristos Ricudis 	{"rx_code_err_frames", offsetof(struct rx_port_stats,
7164261910SChristos Ricudis 				rx_code_err_frames)},
7264261910SChristos Ricudis 	{"rx_false_carrier_frames", offsetof(struct rx_port_stats,
7364261910SChristos Ricudis 				rx_false_carrier_frames)},
74bfb9c226SAjit Khaparde 	{"rx_ovrsz_frames", offsetof(struct rx_port_stats,
75bfb9c226SAjit Khaparde 				rx_ovrsz_frames)},
76bfb9c226SAjit Khaparde 	{"rx_jbr_frames", offsetof(struct rx_port_stats,
77bfb9c226SAjit Khaparde 				rx_jbr_frames)},
78bfb9c226SAjit Khaparde 	{"rx_mtu_err_frames", offsetof(struct rx_port_stats,
79bfb9c226SAjit Khaparde 				rx_mtu_err_frames)},
8064261910SChristos Ricudis 	{"rx_match_crc_frames", offsetof(struct rx_port_stats,
8164261910SChristos Ricudis 				rx_match_crc_frames)},
8264261910SChristos Ricudis 	{"rx_promiscuous_frames", offsetof(struct rx_port_stats,
8364261910SChristos Ricudis 				rx_promiscuous_frames)},
84bfb9c226SAjit Khaparde 	{"rx_tagged_frames", offsetof(struct rx_port_stats,
85bfb9c226SAjit Khaparde 				rx_tagged_frames)},
86bfb9c226SAjit Khaparde 	{"rx_double_tagged_frames", offsetof(struct rx_port_stats,
87bfb9c226SAjit Khaparde 				rx_double_tagged_frames)},
8864261910SChristos Ricudis 	{"rx_trunc_frames", offsetof(struct rx_port_stats,
8964261910SChristos Ricudis 				rx_trunc_frames)},
90bfb9c226SAjit Khaparde 	{"rx_good_frames", offsetof(struct rx_port_stats,
91bfb9c226SAjit Khaparde 				rx_good_frames)},
9264261910SChristos Ricudis 	{"rx_sch_crc_err_frames", offsetof(struct rx_port_stats,
9364261910SChristos Ricudis 				rx_sch_crc_err_frames)},
94bfb9c226SAjit Khaparde 	{"rx_undrsz_frames", offsetof(struct rx_port_stats,
95bfb9c226SAjit Khaparde 				rx_undrsz_frames)},
9664261910SChristos Ricudis 	{"rx_frag_frames", offsetof(struct rx_port_stats,
9764261910SChristos Ricudis 				rx_frag_frames)},
98bfb9c226SAjit Khaparde 	{"rx_eee_lpi_events", offsetof(struct rx_port_stats,
99bfb9c226SAjit Khaparde 				rx_eee_lpi_events)},
100bfb9c226SAjit Khaparde 	{"rx_eee_lpi_duration", offsetof(struct rx_port_stats,
101bfb9c226SAjit Khaparde 				rx_eee_lpi_duration)},
10264261910SChristos Ricudis 	{"rx_llfc_physical_msgs", offsetof(struct rx_port_stats,
10364261910SChristos Ricudis 				rx_llfc_physical_msgs)},
10464261910SChristos Ricudis 	{"rx_llfc_logical_msgs", offsetof(struct rx_port_stats,
10564261910SChristos Ricudis 				rx_llfc_logical_msgs)},
10664261910SChristos Ricudis 	{"rx_llfc_msgs_with_crc_err", offsetof(struct rx_port_stats,
10764261910SChristos Ricudis 				rx_llfc_msgs_with_crc_err)},
10864261910SChristos Ricudis 	{"rx_hcfc_msgs", offsetof(struct rx_port_stats,
10964261910SChristos Ricudis 				rx_hcfc_msgs)},
11064261910SChristos Ricudis 	{"rx_hcfc_msgs_with_crc_err", offsetof(struct rx_port_stats,
11164261910SChristos Ricudis 				rx_hcfc_msgs_with_crc_err)},
112bfb9c226SAjit Khaparde 	{"rx_bytes", offsetof(struct rx_port_stats,
113bfb9c226SAjit Khaparde 				rx_bytes)},
114bfb9c226SAjit Khaparde 	{"rx_runt_bytes", offsetof(struct rx_port_stats,
115bfb9c226SAjit Khaparde 				rx_runt_bytes)},
116bfb9c226SAjit Khaparde 	{"rx_runt_frames", offsetof(struct rx_port_stats,
117bfb9c226SAjit Khaparde 				rx_runt_frames)},
11864261910SChristos Ricudis 	{"rx_pfc_xon2xoff_frames_pri0", offsetof(struct rx_port_stats,
11964261910SChristos Ricudis 				rx_pfc_xon2xoff_frames_pri0)},
12064261910SChristos Ricudis 	{"rx_pfc_xon2xoff_frames_pri1", offsetof(struct rx_port_stats,
12164261910SChristos Ricudis 				rx_pfc_xon2xoff_frames_pri1)},
12264261910SChristos Ricudis 	{"rx_pfc_xon2xoff_frames_pri2", offsetof(struct rx_port_stats,
12364261910SChristos Ricudis 				rx_pfc_xon2xoff_frames_pri2)},
12464261910SChristos Ricudis 	{"rx_pfc_xon2xoff_frames_pri3", offsetof(struct rx_port_stats,
12564261910SChristos Ricudis 				rx_pfc_xon2xoff_frames_pri3)},
12664261910SChristos Ricudis 	{"rx_pfc_xon2xoff_frames_pri4", offsetof(struct rx_port_stats,
12764261910SChristos Ricudis 				rx_pfc_xon2xoff_frames_pri4)},
12864261910SChristos Ricudis 	{"rx_pfc_xon2xoff_frames_pri5", offsetof(struct rx_port_stats,
12964261910SChristos Ricudis 				rx_pfc_xon2xoff_frames_pri5)},
13064261910SChristos Ricudis 	{"rx_pfc_xon2xoff_frames_pri6", offsetof(struct rx_port_stats,
13164261910SChristos Ricudis 				rx_pfc_xon2xoff_frames_pri6)},
13264261910SChristos Ricudis 	{"rx_pfc_xon2xoff_frames_pri7", offsetof(struct rx_port_stats,
13364261910SChristos Ricudis 				rx_pfc_xon2xoff_frames_pri7)},
134bd94753fSSomnath Kotur 	{"rx_pfc_ena_frames_pri0", offsetof(struct rx_port_stats,
135bd94753fSSomnath Kotur 				rx_pfc_ena_frames_pri0)},
136bd94753fSSomnath Kotur 	{"rx_pfc_ena_frames_pri1", offsetof(struct rx_port_stats,
137bd94753fSSomnath Kotur 				rx_pfc_ena_frames_pri1)},
138bd94753fSSomnath Kotur 	{"rx_pfc_ena_frames_pri2", offsetof(struct rx_port_stats,
139bd94753fSSomnath Kotur 				rx_pfc_ena_frames_pri2)},
140bd94753fSSomnath Kotur 	{"rx_pfc_ena_frames_pri3", offsetof(struct rx_port_stats,
141bd94753fSSomnath Kotur 				rx_pfc_ena_frames_pri3)},
142bd94753fSSomnath Kotur 	{"rx_pfc_ena_frames_pri4", offsetof(struct rx_port_stats,
143bd94753fSSomnath Kotur 				rx_pfc_ena_frames_pri4)},
144bd94753fSSomnath Kotur 	{"rx_pfc_ena_frames_pri5", offsetof(struct rx_port_stats,
145bd94753fSSomnath Kotur 				rx_pfc_ena_frames_pri5)},
146bd94753fSSomnath Kotur 	{"rx_pfc_ena_frames_pri6", offsetof(struct rx_port_stats,
147bd94753fSSomnath Kotur 				rx_pfc_ena_frames_pri6)},
148bd94753fSSomnath Kotur 	{"rx_pfc_ena_frames_pri7", offsetof(struct rx_port_stats,
149bd94753fSSomnath Kotur 				rx_pfc_ena_frames_pri7)},
15064261910SChristos Ricudis 	{"rx_stat_discard", offsetof(struct rx_port_stats,
15164261910SChristos Ricudis 				rx_stat_discard)},
15264261910SChristos Ricudis 	{"rx_stat_err", offsetof(struct rx_port_stats,
15364261910SChristos Ricudis 				rx_stat_err)},
154bfb9c226SAjit Khaparde };
155bfb9c226SAjit Khaparde 
156bfb9c226SAjit Khaparde static const struct bnxt_xstats_name_off bnxt_tx_stats_strings[] = {
157bfb9c226SAjit Khaparde 	{"tx_64b_frames", offsetof(struct tx_port_stats,
158bfb9c226SAjit Khaparde 				tx_64b_frames)},
159bfb9c226SAjit Khaparde 	{"tx_65b_127b_frames", offsetof(struct tx_port_stats,
160bfb9c226SAjit Khaparde 				tx_65b_127b_frames)},
161bfb9c226SAjit Khaparde 	{"tx_128b_255b_frames", offsetof(struct tx_port_stats,
162bfb9c226SAjit Khaparde 				tx_128b_255b_frames)},
163bfb9c226SAjit Khaparde 	{"tx_256b_511b_frames", offsetof(struct tx_port_stats,
164bfb9c226SAjit Khaparde 				tx_256b_511b_frames)},
165bfb9c226SAjit Khaparde 	{"tx_512b_1023b_frames", offsetof(struct tx_port_stats,
166bfb9c226SAjit Khaparde 				tx_512b_1023b_frames)},
167757d6f6bSAjit Khaparde 	{"tx_1024b_1518b_frames", offsetof(struct tx_port_stats,
168757d6f6bSAjit Khaparde 				tx_1024b_1518b_frames)},
169bfb9c226SAjit Khaparde 	{"tx_good_vlan_frames", offsetof(struct tx_port_stats,
170bfb9c226SAjit Khaparde 				tx_good_vlan_frames)},
171757d6f6bSAjit Khaparde 	{"tx_1519b_2047b_frames", offsetof(struct tx_port_stats,
172757d6f6bSAjit Khaparde 				tx_1519b_2047b_frames)},
173bfb9c226SAjit Khaparde 	{"tx_2048b_4095b_frames", offsetof(struct tx_port_stats,
174bfb9c226SAjit Khaparde 				tx_2048b_4095b_frames)},
175bfb9c226SAjit Khaparde 	{"tx_4096b_9216b_frames", offsetof(struct tx_port_stats,
176bfb9c226SAjit Khaparde 				tx_4096b_9216b_frames)},
177bfb9c226SAjit Khaparde 	{"tx_9217b_16383b_frames", offsetof(struct tx_port_stats,
178bfb9c226SAjit Khaparde 				tx_9217b_16383b_frames)},
179bfb9c226SAjit Khaparde 	{"tx_good_frames", offsetof(struct tx_port_stats,
180bfb9c226SAjit Khaparde 				tx_good_frames)},
181bfb9c226SAjit Khaparde 	{"tx_total_frames", offsetof(struct tx_port_stats,
182bfb9c226SAjit Khaparde 				tx_total_frames)},
183bfb9c226SAjit Khaparde 	{"tx_ucast_frames", offsetof(struct tx_port_stats,
184bfb9c226SAjit Khaparde 				tx_ucast_frames)},
185bfb9c226SAjit Khaparde 	{"tx_mcast_frames", offsetof(struct tx_port_stats,
186bfb9c226SAjit Khaparde 				tx_mcast_frames)},
187bfb9c226SAjit Khaparde 	{"tx_bcast_frames", offsetof(struct tx_port_stats,
188bfb9c226SAjit Khaparde 				tx_bcast_frames)},
189bfb9c226SAjit Khaparde 	{"tx_pause_frames", offsetof(struct tx_port_stats,
190bfb9c226SAjit Khaparde 				tx_pause_frames)},
191bfb9c226SAjit Khaparde 	{"tx_pfc_frames", offsetof(struct tx_port_stats,
192bfb9c226SAjit Khaparde 				tx_pfc_frames)},
193bfb9c226SAjit Khaparde 	{"tx_jabber_frames", offsetof(struct tx_port_stats,
194bfb9c226SAjit Khaparde 				tx_jabber_frames)},
195bfb9c226SAjit Khaparde 	{"tx_fcs_err_frames", offsetof(struct tx_port_stats,
196bfb9c226SAjit Khaparde 				tx_fcs_err_frames)},
19764261910SChristos Ricudis 	{"tx_control_frames", offsetof(struct tx_port_stats,
19864261910SChristos Ricudis 				tx_control_frames)},
19964261910SChristos Ricudis 	{"tx_oversz_frames", offsetof(struct tx_port_stats,
20064261910SChristos Ricudis 				tx_oversz_frames)},
20164261910SChristos Ricudis 	{"tx_single_dfrl_frames", offsetof(struct tx_port_stats,
20264261910SChristos Ricudis 				tx_single_dfrl_frames)},
20364261910SChristos Ricudis 	{"tx_multi_dfrl_frames", offsetof(struct tx_port_stats,
20464261910SChristos Ricudis 				tx_multi_dfrl_frames)},
20564261910SChristos Ricudis 	{"tx_single_coll_frames", offsetof(struct tx_port_stats,
20664261910SChristos Ricudis 				tx_single_coll_frames)},
20764261910SChristos Ricudis 	{"tx_multi_coll_frames", offsetof(struct tx_port_stats,
20864261910SChristos Ricudis 				tx_multi_coll_frames)},
20964261910SChristos Ricudis 	{"tx_late_coll_frames", offsetof(struct tx_port_stats,
21064261910SChristos Ricudis 				tx_late_coll_frames)},
21164261910SChristos Ricudis 	{"tx_excessive_coll_frames", offsetof(struct tx_port_stats,
21264261910SChristos Ricudis 				tx_excessive_coll_frames)},
21364261910SChristos Ricudis 	{"tx_frag_frames", offsetof(struct tx_port_stats,
21464261910SChristos Ricudis 				tx_frag_frames)},
215bfb9c226SAjit Khaparde 	{"tx_err", offsetof(struct tx_port_stats,
216bfb9c226SAjit Khaparde 				tx_err)},
21764261910SChristos Ricudis 	{"tx_tagged_frames", offsetof(struct tx_port_stats,
21864261910SChristos Ricudis 				tx_tagged_frames)},
21964261910SChristos Ricudis 	{"tx_dbl_tagged_frames", offsetof(struct tx_port_stats,
22064261910SChristos Ricudis 				tx_dbl_tagged_frames)},
22164261910SChristos Ricudis 	{"tx_runt_frames", offsetof(struct tx_port_stats,
22264261910SChristos Ricudis 				tx_runt_frames)},
223bfb9c226SAjit Khaparde 	{"tx_fifo_underruns", offsetof(struct tx_port_stats,
224bfb9c226SAjit Khaparde 				tx_fifo_underruns)},
225bfb9c226SAjit Khaparde 	{"tx_eee_lpi_events", offsetof(struct tx_port_stats,
226bfb9c226SAjit Khaparde 				tx_eee_lpi_events)},
227bfb9c226SAjit Khaparde 	{"tx_eee_lpi_duration", offsetof(struct tx_port_stats,
228bfb9c226SAjit Khaparde 				tx_eee_lpi_duration)},
229bfb9c226SAjit Khaparde 	{"tx_total_collisions", offsetof(struct tx_port_stats,
230bfb9c226SAjit Khaparde 				tx_total_collisions)},
231bfb9c226SAjit Khaparde 	{"tx_bytes", offsetof(struct tx_port_stats,
232bfb9c226SAjit Khaparde 				tx_bytes)},
233bd94753fSSomnath Kotur 	{"tx_pfc_ena_frames_pri0", offsetof(struct tx_port_stats,
234bd94753fSSomnath Kotur 				tx_pfc_ena_frames_pri0)},
235bd94753fSSomnath Kotur 	{"tx_pfc_ena_frames_pri1", offsetof(struct tx_port_stats,
236bd94753fSSomnath Kotur 				tx_pfc_ena_frames_pri1)},
237bd94753fSSomnath Kotur 	{"tx_pfc_ena_frames_pri2", offsetof(struct tx_port_stats,
238bd94753fSSomnath Kotur 				tx_pfc_ena_frames_pri2)},
239bd94753fSSomnath Kotur 	{"tx_pfc_ena_frames_pri3", offsetof(struct tx_port_stats,
240bd94753fSSomnath Kotur 				tx_pfc_ena_frames_pri3)},
241bd94753fSSomnath Kotur 	{"tx_pfc_ena_frames_pri4", offsetof(struct tx_port_stats,
242bd94753fSSomnath Kotur 				tx_pfc_ena_frames_pri4)},
243bd94753fSSomnath Kotur 	{"tx_pfc_ena_frames_pri5", offsetof(struct tx_port_stats,
244bd94753fSSomnath Kotur 				tx_pfc_ena_frames_pri5)},
245bd94753fSSomnath Kotur 	{"tx_pfc_ena_frames_pri6", offsetof(struct tx_port_stats,
246bd94753fSSomnath Kotur 				tx_pfc_ena_frames_pri6)},
247bd94753fSSomnath Kotur 	{"tx_pfc_ena_frames_pri7", offsetof(struct tx_port_stats,
248bd94753fSSomnath Kotur 				tx_pfc_ena_frames_pri7)},
24964261910SChristos Ricudis 	{"tx_llfc_logical_msgs", offsetof(struct tx_port_stats,
25064261910SChristos Ricudis 				tx_llfc_logical_msgs)},
25164261910SChristos Ricudis 	{"tx_hcfc_msgs", offsetof(struct tx_port_stats,
25264261910SChristos Ricudis 				tx_hcfc_msgs)},
25364261910SChristos Ricudis 	{"tx_xthol_frames", offsetof(struct tx_port_stats,
25464261910SChristos Ricudis 				tx_xthol_frames)},
25564261910SChristos Ricudis 	{"tx_stat_discard", offsetof(struct tx_port_stats,
25664261910SChristos Ricudis 				tx_stat_discard)},
25764261910SChristos Ricudis 	{"tx_stat_error", offsetof(struct tx_port_stats,
25864261910SChristos Ricudis 				tx_stat_error)},
259bfb9c226SAjit Khaparde };
260bfb9c226SAjit Khaparde 
26127c32143SDamodharam Ammepalli static const struct bnxt_xstats_name_off bnxt_func_stats_ext_strings[] = {
26227c32143SDamodharam Ammepalli 	{"tx_ucast_pkts", offsetof(struct hwrm_func_qstats_ext_output,
26327c32143SDamodharam Ammepalli 				tx_ucast_pkts)},
26427c32143SDamodharam Ammepalli 	{"tx_mcast_pkts", offsetof(struct hwrm_func_qstats_ext_output,
26527c32143SDamodharam Ammepalli 				tx_mcast_pkts)},
26627c32143SDamodharam Ammepalli 	{"tx_bcast_pkts", offsetof(struct hwrm_func_qstats_ext_output,
26727c32143SDamodharam Ammepalli 				tx_bcast_pkts)},
26827c32143SDamodharam Ammepalli 	{"tx_discard_pkts", offsetof(struct hwrm_func_qstats_ext_output,
26927c32143SDamodharam Ammepalli 				tx_discard_pkts)},
27027c32143SDamodharam Ammepalli 	{"tx_drop_pkts", offsetof(struct hwrm_func_qstats_ext_output,
27127c32143SDamodharam Ammepalli 				tx_error_pkts)},
27227c32143SDamodharam Ammepalli 	{"tx_ucast_bytes", offsetof(struct hwrm_func_qstats_ext_output,
27327c32143SDamodharam Ammepalli 				tx_ucast_bytes)},
27427c32143SDamodharam Ammepalli 	{"tx_mcast_bytes", offsetof(struct hwrm_func_qstats_ext_output,
27527c32143SDamodharam Ammepalli 				tx_mcast_bytes)},
27627c32143SDamodharam Ammepalli 	{"tx_bcast_bytes", offsetof(struct hwrm_func_qstats_ext_output,
27727c32143SDamodharam Ammepalli 				tx_bcast_bytes)},
27827c32143SDamodharam Ammepalli 	{"rx_ucast_pkts", offsetof(struct hwrm_func_qstats_ext_output,
27927c32143SDamodharam Ammepalli 				rx_ucast_pkts)},
28027c32143SDamodharam Ammepalli 	{"rx_mcast_pkts", offsetof(struct hwrm_func_qstats_ext_output,
28127c32143SDamodharam Ammepalli 				rx_mcast_pkts)},
28227c32143SDamodharam Ammepalli 	{"rx_bcast_pkts", offsetof(struct hwrm_func_qstats_ext_output,
28327c32143SDamodharam Ammepalli 				rx_bcast_pkts)},
28427c32143SDamodharam Ammepalli 	{"rx_discard_pkts", offsetof(struct hwrm_func_qstats_ext_output,
28527c32143SDamodharam Ammepalli 				rx_discard_pkts)},
28627c32143SDamodharam Ammepalli 	{"rx_drop_pkts", offsetof(struct hwrm_func_qstats_ext_output,
28727c32143SDamodharam Ammepalli 				rx_error_pkts)},
28827c32143SDamodharam Ammepalli 	{"rx_ucast_bytes", offsetof(struct hwrm_func_qstats_ext_output,
28927c32143SDamodharam Ammepalli 				rx_ucast_bytes)},
29027c32143SDamodharam Ammepalli 	{"rx_mcast_bytes", offsetof(struct hwrm_func_qstats_ext_output,
29127c32143SDamodharam Ammepalli 				rx_mcast_bytes)},
29227c32143SDamodharam Ammepalli 	{"rx_bcast_bytes", offsetof(struct hwrm_func_qstats_ext_output,
29327c32143SDamodharam Ammepalli 				rx_bcast_bytes)},
29427c32143SDamodharam Ammepalli 	{"rx_tpa_eligible_pkt", offsetof(struct hwrm_func_qstats_ext_output,
29527c32143SDamodharam Ammepalli 				rx_tpa_eligible_pkt)},
29627c32143SDamodharam Ammepalli 	{"rx_tpa_eligible_bytes", offsetof(struct hwrm_func_qstats_ext_output,
29727c32143SDamodharam Ammepalli 				rx_tpa_eligible_bytes)},
29827c32143SDamodharam Ammepalli 	{"rx_tpa_pkt", offsetof(struct hwrm_func_qstats_ext_output,
29927c32143SDamodharam Ammepalli 				rx_tpa_pkt)},
30027c32143SDamodharam Ammepalli 	{"rx_tpa_bytes", offsetof(struct hwrm_func_qstats_ext_output,
30127c32143SDamodharam Ammepalli 				rx_tpa_bytes)},
30227c32143SDamodharam Ammepalli 	{"rx_tpa_errors", offsetof(struct hwrm_func_qstats_ext_output,
30327c32143SDamodharam Ammepalli 				rx_tpa_errors)},
30427c32143SDamodharam Ammepalli 	{"rx_tpa_events", offsetof(struct hwrm_func_qstats_ext_output,
30527c32143SDamodharam Ammepalli 				rx_tpa_events)},
30627c32143SDamodharam Ammepalli };
30727c32143SDamodharam Ammepalli 
308dd46c6bbSAjit Khaparde static const struct bnxt_xstats_name_off bnxt_func_stats_strings[] = {
309dd46c6bbSAjit Khaparde 	{"tx_ucast_pkts", offsetof(struct hwrm_func_qstats_output,
310dd46c6bbSAjit Khaparde 				tx_ucast_pkts)},
311dd46c6bbSAjit Khaparde 	{"tx_mcast_pkts", offsetof(struct hwrm_func_qstats_output,
312dd46c6bbSAjit Khaparde 				tx_mcast_pkts)},
313dd46c6bbSAjit Khaparde 	{"tx_bcast_pkts", offsetof(struct hwrm_func_qstats_output,
314dd46c6bbSAjit Khaparde 				tx_bcast_pkts)},
3159a891c17SAjit Khaparde 	{"tx_discard_pkts", offsetof(struct hwrm_func_qstats_output,
3169a891c17SAjit Khaparde 				tx_discard_pkts)},
317dd46c6bbSAjit Khaparde 	{"tx_drop_pkts", offsetof(struct hwrm_func_qstats_output,
318dd46c6bbSAjit Khaparde 				tx_drop_pkts)},
319dd46c6bbSAjit Khaparde 	{"tx_ucast_bytes", offsetof(struct hwrm_func_qstats_output,
320dd46c6bbSAjit Khaparde 				tx_ucast_bytes)},
321dd46c6bbSAjit Khaparde 	{"tx_mcast_bytes", offsetof(struct hwrm_func_qstats_output,
322dd46c6bbSAjit Khaparde 				tx_mcast_bytes)},
323dd46c6bbSAjit Khaparde 	{"tx_bcast_bytes", offsetof(struct hwrm_func_qstats_output,
324dd46c6bbSAjit Khaparde 				tx_bcast_bytes)},
325dd46c6bbSAjit Khaparde 	{"rx_ucast_pkts", offsetof(struct hwrm_func_qstats_output,
326dd46c6bbSAjit Khaparde 				rx_ucast_pkts)},
327dd46c6bbSAjit Khaparde 	{"rx_mcast_pkts", offsetof(struct hwrm_func_qstats_output,
328dd46c6bbSAjit Khaparde 				rx_mcast_pkts)},
329dd46c6bbSAjit Khaparde 	{"rx_bcast_pkts", offsetof(struct hwrm_func_qstats_output,
330dd46c6bbSAjit Khaparde 				rx_bcast_pkts)},
3319a891c17SAjit Khaparde 	{"rx_discard_pkts", offsetof(struct hwrm_func_qstats_output,
3329a891c17SAjit Khaparde 				rx_discard_pkts)},
333dd46c6bbSAjit Khaparde 	{"rx_drop_pkts", offsetof(struct hwrm_func_qstats_output,
334dd46c6bbSAjit Khaparde 				rx_drop_pkts)},
335dd46c6bbSAjit Khaparde 	{"rx_ucast_bytes", offsetof(struct hwrm_func_qstats_output,
336dd46c6bbSAjit Khaparde 				rx_ucast_bytes)},
337dd46c6bbSAjit Khaparde 	{"rx_mcast_bytes", offsetof(struct hwrm_func_qstats_output,
338dd46c6bbSAjit Khaparde 				rx_mcast_bytes)},
339dd46c6bbSAjit Khaparde 	{"rx_bcast_bytes", offsetof(struct hwrm_func_qstats_output,
340dd46c6bbSAjit Khaparde 				rx_bcast_bytes)},
341dd46c6bbSAjit Khaparde 	{"rx_agg_pkts", offsetof(struct hwrm_func_qstats_output,
342dd46c6bbSAjit Khaparde 				rx_agg_pkts)},
343dd46c6bbSAjit Khaparde 	{"rx_agg_bytes", offsetof(struct hwrm_func_qstats_output,
344dd46c6bbSAjit Khaparde 				rx_agg_bytes)},
345dd46c6bbSAjit Khaparde 	{"rx_agg_events", offsetof(struct hwrm_func_qstats_output,
346dd46c6bbSAjit Khaparde 				rx_agg_events)},
347dd46c6bbSAjit Khaparde 	{"rx_agg_aborts", offsetof(struct hwrm_func_qstats_output,
348dd46c6bbSAjit Khaparde 				rx_agg_aborts)},
349dd46c6bbSAjit Khaparde };
350dd46c6bbSAjit Khaparde 
35164261910SChristos Ricudis 
352f55e12f3SAjit Khaparde static const struct bnxt_xstats_name_off bnxt_rx_ext_stats_strings[] = {
353f55e12f3SAjit Khaparde 	{"link_down_events", offsetof(struct rx_port_stats_ext,
354f55e12f3SAjit Khaparde 				link_down_events)},
355f55e12f3SAjit Khaparde 	{"continuous_pause_events", offsetof(struct rx_port_stats_ext,
356f55e12f3SAjit Khaparde 				continuous_pause_events)},
357f55e12f3SAjit Khaparde 	{"resume_pause_events", offsetof(struct rx_port_stats_ext,
358f55e12f3SAjit Khaparde 				resume_pause_events)},
359f55e12f3SAjit Khaparde 	{"continuous_roce_pause_events", offsetof(struct rx_port_stats_ext,
360f55e12f3SAjit Khaparde 				continuous_roce_pause_events)},
361f55e12f3SAjit Khaparde 	{"resume_roce_pause_events", offsetof(struct rx_port_stats_ext,
362f55e12f3SAjit Khaparde 				resume_roce_pause_events)},
363f55e12f3SAjit Khaparde 	{"rx_bytes_cos0", offsetof(struct rx_port_stats_ext,
364f55e12f3SAjit Khaparde 				rx_bytes_cos0)},
365f55e12f3SAjit Khaparde 	{"rx_bytes_cos1", offsetof(struct rx_port_stats_ext,
366f55e12f3SAjit Khaparde 				rx_bytes_cos1)},
367f55e12f3SAjit Khaparde 	{"rx_bytes_cos2", offsetof(struct rx_port_stats_ext,
368f55e12f3SAjit Khaparde 				rx_bytes_cos2)},
369f55e12f3SAjit Khaparde 	{"rx_bytes_cos3", offsetof(struct rx_port_stats_ext,
370f55e12f3SAjit Khaparde 				rx_bytes_cos3)},
371f55e12f3SAjit Khaparde 	{"rx_bytes_cos4", offsetof(struct rx_port_stats_ext,
372f55e12f3SAjit Khaparde 				rx_bytes_cos4)},
373f55e12f3SAjit Khaparde 	{"rx_bytes_cos5", offsetof(struct rx_port_stats_ext,
374f55e12f3SAjit Khaparde 				rx_bytes_cos5)},
375f55e12f3SAjit Khaparde 	{"rx_bytes_cos6", offsetof(struct rx_port_stats_ext,
376f55e12f3SAjit Khaparde 				rx_bytes_cos6)},
377f55e12f3SAjit Khaparde 	{"rx_bytes_cos7", offsetof(struct rx_port_stats_ext,
378f55e12f3SAjit Khaparde 				rx_bytes_cos7)},
379f55e12f3SAjit Khaparde 	{"rx_packets_cos0", offsetof(struct rx_port_stats_ext,
380f55e12f3SAjit Khaparde 				rx_packets_cos0)},
381f55e12f3SAjit Khaparde 	{"rx_packets_cos1", offsetof(struct rx_port_stats_ext,
382f55e12f3SAjit Khaparde 				rx_packets_cos1)},
383f55e12f3SAjit Khaparde 	{"rx_packets_cos2", offsetof(struct rx_port_stats_ext,
384f55e12f3SAjit Khaparde 				rx_packets_cos2)},
385f55e12f3SAjit Khaparde 	{"rx_packets_cos3", offsetof(struct rx_port_stats_ext,
386f55e12f3SAjit Khaparde 				rx_packets_cos3)},
387f55e12f3SAjit Khaparde 	{"rx_packets_cos4", offsetof(struct rx_port_stats_ext,
388f55e12f3SAjit Khaparde 				rx_packets_cos4)},
389f55e12f3SAjit Khaparde 	{"rx_packets_cos5", offsetof(struct rx_port_stats_ext,
390f55e12f3SAjit Khaparde 				rx_packets_cos5)},
391f55e12f3SAjit Khaparde 	{"rx_packets_cos6", offsetof(struct rx_port_stats_ext,
392f55e12f3SAjit Khaparde 				rx_packets_cos6)},
393f55e12f3SAjit Khaparde 	{"rx_packets_cos7", offsetof(struct rx_port_stats_ext,
394f55e12f3SAjit Khaparde 				rx_packets_cos7)},
395f55e12f3SAjit Khaparde 	{"pfc_pri0_rx_duration_us", offsetof(struct rx_port_stats_ext,
396f55e12f3SAjit Khaparde 				pfc_pri0_rx_duration_us)},
397f55e12f3SAjit Khaparde 	{"pfc_pri0_rx_transitions", offsetof(struct rx_port_stats_ext,
398f55e12f3SAjit Khaparde 				pfc_pri0_rx_transitions)},
399f55e12f3SAjit Khaparde 	{"pfc_pri1_rx_duration_us", offsetof(struct rx_port_stats_ext,
400f55e12f3SAjit Khaparde 				pfc_pri1_rx_duration_us)},
401f55e12f3SAjit Khaparde 	{"pfc_pri1_rx_transitions", offsetof(struct rx_port_stats_ext,
402f55e12f3SAjit Khaparde 				pfc_pri1_rx_transitions)},
403f55e12f3SAjit Khaparde 	{"pfc_pri2_rx_duration_us", offsetof(struct rx_port_stats_ext,
404f55e12f3SAjit Khaparde 				pfc_pri2_rx_duration_us)},
405f55e12f3SAjit Khaparde 	{"pfc_pri2_rx_transitions", offsetof(struct rx_port_stats_ext,
406f55e12f3SAjit Khaparde 				pfc_pri2_rx_transitions)},
407f55e12f3SAjit Khaparde 	{"pfc_pri3_rx_duration_us", offsetof(struct rx_port_stats_ext,
408f55e12f3SAjit Khaparde 				pfc_pri3_rx_duration_us)},
409f55e12f3SAjit Khaparde 	{"pfc_pri3_rx_transitions", offsetof(struct rx_port_stats_ext,
410f55e12f3SAjit Khaparde 				pfc_pri3_rx_transitions)},
411f55e12f3SAjit Khaparde 	{"pfc_pri4_rx_duration_us", offsetof(struct rx_port_stats_ext,
412f55e12f3SAjit Khaparde 				pfc_pri4_rx_duration_us)},
413f55e12f3SAjit Khaparde 	{"pfc_pri4_rx_transitions", offsetof(struct rx_port_stats_ext,
414f55e12f3SAjit Khaparde 				pfc_pri4_rx_transitions)},
415f55e12f3SAjit Khaparde 	{"pfc_pri5_rx_duration_us", offsetof(struct rx_port_stats_ext,
416f55e12f3SAjit Khaparde 				pfc_pri5_rx_duration_us)},
417f55e12f3SAjit Khaparde 	{"pfc_pri5_rx_transitions", offsetof(struct rx_port_stats_ext,
418f55e12f3SAjit Khaparde 				pfc_pri5_rx_transitions)},
419f55e12f3SAjit Khaparde 	{"pfc_pri6_rx_duration_us", offsetof(struct rx_port_stats_ext,
420f55e12f3SAjit Khaparde 				pfc_pri6_rx_duration_us)},
421f55e12f3SAjit Khaparde 	{"pfc_pri6_rx_transitions", offsetof(struct rx_port_stats_ext,
422f55e12f3SAjit Khaparde 				pfc_pri6_rx_transitions)},
423f55e12f3SAjit Khaparde 	{"pfc_pri7_rx_duration_us", offsetof(struct rx_port_stats_ext,
424f55e12f3SAjit Khaparde 				pfc_pri7_rx_duration_us)},
425f55e12f3SAjit Khaparde 	{"pfc_pri7_rx_transitions", offsetof(struct rx_port_stats_ext,
426f55e12f3SAjit Khaparde 				pfc_pri7_rx_transitions)},
42764261910SChristos Ricudis 	{"rx_bits",		offsetof(struct rx_port_stats_ext,
42864261910SChristos Ricudis 				rx_bits)},
42964261910SChristos Ricudis 	{"rx_buffer_passed_threshold", offsetof(struct rx_port_stats_ext,
43064261910SChristos Ricudis 				rx_buffer_passed_threshold)},
43164261910SChristos Ricudis 	{"rx_pcs_symbol_err",	offsetof(struct rx_port_stats_ext,
43264261910SChristos Ricudis 				rx_pcs_symbol_err)},
43364261910SChristos Ricudis 	{"rx_corrected_bits",	offsetof(struct rx_port_stats_ext,
43464261910SChristos Ricudis 				rx_corrected_bits)},
43564261910SChristos Ricudis 	{"rx_discard_bytes_cos0", offsetof(struct rx_port_stats_ext,
43664261910SChristos Ricudis 				rx_discard_bytes_cos0)},
43764261910SChristos Ricudis 	{"rx_discard_bytes_cos1", offsetof(struct rx_port_stats_ext,
43864261910SChristos Ricudis 				rx_discard_bytes_cos1)},
43964261910SChristos Ricudis 	{"rx_discard_bytes_cos2", offsetof(struct rx_port_stats_ext,
44064261910SChristos Ricudis 				rx_discard_bytes_cos2)},
44164261910SChristos Ricudis 	{"rx_discard_bytes_cos3", offsetof(struct rx_port_stats_ext,
44264261910SChristos Ricudis 				rx_discard_bytes_cos3)},
44364261910SChristos Ricudis 	{"rx_discard_bytes_cos4", offsetof(struct rx_port_stats_ext,
44464261910SChristos Ricudis 				rx_discard_bytes_cos4)},
44564261910SChristos Ricudis 	{"rx_discard_bytes_cos5", offsetof(struct rx_port_stats_ext,
44664261910SChristos Ricudis 				rx_discard_bytes_cos5)},
44764261910SChristos Ricudis 	{"rx_discard_bytes_cos6", offsetof(struct rx_port_stats_ext,
44864261910SChristos Ricudis 				rx_discard_bytes_cos6)},
44964261910SChristos Ricudis 	{"rx_discard_bytes_cos7", offsetof(struct rx_port_stats_ext,
45064261910SChristos Ricudis 				rx_discard_bytes_cos7)},
45164261910SChristos Ricudis 	{"rx_discard_packets_cos0", offsetof(struct rx_port_stats_ext,
45264261910SChristos Ricudis 				rx_discard_packets_cos0)},
45364261910SChristos Ricudis 	{"rx_discard_packets_cos1", offsetof(struct rx_port_stats_ext,
45464261910SChristos Ricudis 				rx_discard_packets_cos1)},
45564261910SChristos Ricudis 	{"rx_discard_packets_cos2", offsetof(struct rx_port_stats_ext,
45664261910SChristos Ricudis 				rx_discard_packets_cos2)},
45764261910SChristos Ricudis 	{"rx_discard_packets_cos3", offsetof(struct rx_port_stats_ext,
45864261910SChristos Ricudis 				rx_discard_packets_cos3)},
45964261910SChristos Ricudis 	{"rx_discard_packets_cos4", offsetof(struct rx_port_stats_ext,
46064261910SChristos Ricudis 				rx_discard_packets_cos4)},
46164261910SChristos Ricudis 	{"rx_discard_packets_cos5", offsetof(struct rx_port_stats_ext,
46264261910SChristos Ricudis 				rx_discard_packets_cos5)},
46364261910SChristos Ricudis 	{"rx_discard_packets_cos6", offsetof(struct rx_port_stats_ext,
46464261910SChristos Ricudis 				rx_discard_packets_cos6)},
46564261910SChristos Ricudis 	{"rx_discard_packets_cos7", offsetof(struct rx_port_stats_ext,
46664261910SChristos Ricudis 				rx_discard_packets_cos7)},
46727c32143SDamodharam Ammepalli 	{"rx_fec_corrected_blocks", offsetof(struct rx_port_stats_ext,
46827c32143SDamodharam Ammepalli 				rx_fec_corrected_blocks)},
46927c32143SDamodharam Ammepalli 	{"rx_fec_uncorrectable_blocks", offsetof(struct rx_port_stats_ext,
47027c32143SDamodharam Ammepalli 				rx_fec_uncorrectable_blocks)},
47127c32143SDamodharam Ammepalli 	{"rx_filter_miss", offsetof(struct rx_port_stats_ext,
47227c32143SDamodharam Ammepalli 				rx_filter_miss)},
473f55e12f3SAjit Khaparde };
474f55e12f3SAjit Khaparde 
475f55e12f3SAjit Khaparde static const struct bnxt_xstats_name_off bnxt_tx_ext_stats_strings[] = {
476f55e12f3SAjit Khaparde 	{"tx_bytes_cos0", offsetof(struct tx_port_stats_ext,
477f55e12f3SAjit Khaparde 				tx_bytes_cos0)},
478f55e12f3SAjit Khaparde 	{"tx_bytes_cos1", offsetof(struct tx_port_stats_ext,
479f55e12f3SAjit Khaparde 				tx_bytes_cos1)},
480f55e12f3SAjit Khaparde 	{"tx_bytes_cos2", offsetof(struct tx_port_stats_ext,
481f55e12f3SAjit Khaparde 				tx_bytes_cos2)},
482f55e12f3SAjit Khaparde 	{"tx_bytes_cos3", offsetof(struct tx_port_stats_ext,
483f55e12f3SAjit Khaparde 				tx_bytes_cos3)},
484f55e12f3SAjit Khaparde 	{"tx_bytes_cos4", offsetof(struct tx_port_stats_ext,
485f55e12f3SAjit Khaparde 				tx_bytes_cos4)},
486f55e12f3SAjit Khaparde 	{"tx_bytes_cos5", offsetof(struct tx_port_stats_ext,
487f55e12f3SAjit Khaparde 				tx_bytes_cos5)},
488f55e12f3SAjit Khaparde 	{"tx_bytes_cos6", offsetof(struct tx_port_stats_ext,
489f55e12f3SAjit Khaparde 				tx_bytes_cos6)},
490f55e12f3SAjit Khaparde 	{"tx_bytes_cos7", offsetof(struct tx_port_stats_ext,
491f55e12f3SAjit Khaparde 				tx_bytes_cos7)},
492f55e12f3SAjit Khaparde 	{"tx_packets_cos0", offsetof(struct tx_port_stats_ext,
493f55e12f3SAjit Khaparde 				tx_packets_cos0)},
494f55e12f3SAjit Khaparde 	{"tx_packets_cos1", offsetof(struct tx_port_stats_ext,
495f55e12f3SAjit Khaparde 				tx_packets_cos1)},
496f55e12f3SAjit Khaparde 	{"tx_packets_cos2", offsetof(struct tx_port_stats_ext,
497f55e12f3SAjit Khaparde 				tx_packets_cos2)},
498f55e12f3SAjit Khaparde 	{"tx_packets_cos3", offsetof(struct tx_port_stats_ext,
499f55e12f3SAjit Khaparde 				tx_packets_cos3)},
500f55e12f3SAjit Khaparde 	{"tx_packets_cos4", offsetof(struct tx_port_stats_ext,
501f55e12f3SAjit Khaparde 				tx_packets_cos4)},
502f55e12f3SAjit Khaparde 	{"tx_packets_cos5", offsetof(struct tx_port_stats_ext,
503f55e12f3SAjit Khaparde 				tx_packets_cos5)},
504f55e12f3SAjit Khaparde 	{"tx_packets_cos6", offsetof(struct tx_port_stats_ext,
505f55e12f3SAjit Khaparde 				tx_packets_cos6)},
506f55e12f3SAjit Khaparde 	{"tx_packets_cos7", offsetof(struct tx_port_stats_ext,
507f55e12f3SAjit Khaparde 				tx_packets_cos7)},
508f55e12f3SAjit Khaparde 	{"pfc_pri0_tx_duration_us", offsetof(struct tx_port_stats_ext,
509f55e12f3SAjit Khaparde 				pfc_pri0_tx_duration_us)},
510f55e12f3SAjit Khaparde 	{"pfc_pri0_tx_transitions", offsetof(struct tx_port_stats_ext,
511f55e12f3SAjit Khaparde 				pfc_pri0_tx_transitions)},
512f55e12f3SAjit Khaparde 	{"pfc_pri1_tx_duration_us", offsetof(struct tx_port_stats_ext,
513f55e12f3SAjit Khaparde 				pfc_pri1_tx_duration_us)},
514f55e12f3SAjit Khaparde 	{"pfc_pri1_tx_transitions", offsetof(struct tx_port_stats_ext,
515f55e12f3SAjit Khaparde 				pfc_pri1_tx_transitions)},
516f55e12f3SAjit Khaparde 	{"pfc_pri2_tx_duration_us", offsetof(struct tx_port_stats_ext,
517f55e12f3SAjit Khaparde 				pfc_pri2_tx_duration_us)},
518f55e12f3SAjit Khaparde 	{"pfc_pri2_tx_transitions", offsetof(struct tx_port_stats_ext,
519f55e12f3SAjit Khaparde 				pfc_pri2_tx_transitions)},
520f55e12f3SAjit Khaparde 	{"pfc_pri3_tx_duration_us", offsetof(struct tx_port_stats_ext,
521f55e12f3SAjit Khaparde 				pfc_pri3_tx_duration_us)},
522f55e12f3SAjit Khaparde 	{"pfc_pri3_tx_transitions", offsetof(struct tx_port_stats_ext,
523f55e12f3SAjit Khaparde 				pfc_pri3_tx_transitions)},
524f55e12f3SAjit Khaparde 	{"pfc_pri4_tx_duration_us", offsetof(struct tx_port_stats_ext,
525f55e12f3SAjit Khaparde 				pfc_pri4_tx_duration_us)},
526f55e12f3SAjit Khaparde 	{"pfc_pri4_tx_transitions", offsetof(struct tx_port_stats_ext,
527f55e12f3SAjit Khaparde 				pfc_pri4_tx_transitions)},
528f55e12f3SAjit Khaparde 	{"pfc_pri5_tx_duration_us", offsetof(struct tx_port_stats_ext,
529f55e12f3SAjit Khaparde 				pfc_pri5_tx_duration_us)},
530f55e12f3SAjit Khaparde 	{"pfc_pri5_tx_transitions", offsetof(struct tx_port_stats_ext,
531f55e12f3SAjit Khaparde 				pfc_pri5_tx_transitions)},
532f55e12f3SAjit Khaparde 	{"pfc_pri6_tx_duration_us", offsetof(struct tx_port_stats_ext,
533f55e12f3SAjit Khaparde 				pfc_pri6_tx_duration_us)},
534f55e12f3SAjit Khaparde 	{"pfc_pri6_tx_transitions", offsetof(struct tx_port_stats_ext,
535f55e12f3SAjit Khaparde 				pfc_pri6_tx_transitions)},
536f55e12f3SAjit Khaparde 	{"pfc_pri7_tx_duration_us", offsetof(struct tx_port_stats_ext,
537f55e12f3SAjit Khaparde 				pfc_pri7_tx_duration_us)},
538f55e12f3SAjit Khaparde 	{"pfc_pri7_tx_transitions", offsetof(struct tx_port_stats_ext,
539f55e12f3SAjit Khaparde 				pfc_pri7_tx_transitions)},
540f55e12f3SAjit Khaparde };
541f55e12f3SAjit Khaparde 
54257d5e5bcSAjit Khaparde /*
54357d5e5bcSAjit Khaparde  * Statistics functions
54457d5e5bcSAjit Khaparde  */
54557d5e5bcSAjit Khaparde 
54657d5e5bcSAjit Khaparde void bnxt_free_stats(struct bnxt *bp)
54757d5e5bcSAjit Khaparde {
54857d5e5bcSAjit Khaparde 	int i;
54957d5e5bcSAjit Khaparde 
55057d5e5bcSAjit Khaparde 	for (i = 0; i < (int)bp->tx_cp_nr_rings; i++) {
55157d5e5bcSAjit Khaparde 		struct bnxt_tx_queue *txq = bp->tx_queues[i];
55257d5e5bcSAjit Khaparde 
55357d5e5bcSAjit Khaparde 		bnxt_free_txq_stats(txq);
55457d5e5bcSAjit Khaparde 	}
55557d5e5bcSAjit Khaparde 	for (i = 0; i < (int)bp->rx_cp_nr_rings; i++) {
55657d5e5bcSAjit Khaparde 		struct bnxt_rx_queue *rxq = bp->rx_queues[i];
55757d5e5bcSAjit Khaparde 
55857d5e5bcSAjit Khaparde 		bnxt_free_rxq_stats(rxq);
55957d5e5bcSAjit Khaparde 	}
56057d5e5bcSAjit Khaparde }
56157d5e5bcSAjit Khaparde 
56227c32143SDamodharam Ammepalli static void bnxt_fill_rte_eth_stats_ext(struct rte_eth_stats *stats,
56327c32143SDamodharam Ammepalli 					struct bnxt_ring_stats_ext *ring_stats,
56427c32143SDamodharam Ammepalli 					unsigned int i, bool rx)
56527c32143SDamodharam Ammepalli {
56627c32143SDamodharam Ammepalli 	if (rx) {
56727c32143SDamodharam Ammepalli 		stats->q_ipackets[i] = ring_stats->rx_ucast_pkts;
56827c32143SDamodharam Ammepalli 		stats->q_ipackets[i] += ring_stats->rx_mcast_pkts;
56927c32143SDamodharam Ammepalli 		stats->q_ipackets[i] += ring_stats->rx_bcast_pkts;
57027c32143SDamodharam Ammepalli 
57127c32143SDamodharam Ammepalli 		stats->ipackets += stats->q_ipackets[i];
57227c32143SDamodharam Ammepalli 
57327c32143SDamodharam Ammepalli 		stats->q_ibytes[i] = ring_stats->rx_ucast_bytes;
57427c32143SDamodharam Ammepalli 		stats->q_ibytes[i] += ring_stats->rx_mcast_bytes;
57527c32143SDamodharam Ammepalli 		stats->q_ibytes[i] += ring_stats->rx_bcast_bytes;
57627c32143SDamodharam Ammepalli 
57727c32143SDamodharam Ammepalli 		stats->ibytes += stats->q_ibytes[i];
57827c32143SDamodharam Ammepalli 
57927c32143SDamodharam Ammepalli 		stats->q_errors[i] = ring_stats->rx_discard_pkts;
58027c32143SDamodharam Ammepalli 		stats->q_errors[i] += ring_stats->rx_error_pkts;
58127c32143SDamodharam Ammepalli 
58227c32143SDamodharam Ammepalli 		stats->imissed += ring_stats->rx_discard_pkts;
58327c32143SDamodharam Ammepalli 		stats->ierrors += ring_stats->rx_error_pkts;
58427c32143SDamodharam Ammepalli 	} else {
58527c32143SDamodharam Ammepalli 		stats->q_opackets[i] = ring_stats->tx_ucast_pkts;
58627c32143SDamodharam Ammepalli 		stats->q_opackets[i] += ring_stats->tx_mcast_pkts;
58727c32143SDamodharam Ammepalli 		stats->q_opackets[i] += ring_stats->tx_bcast_pkts;
58827c32143SDamodharam Ammepalli 
58927c32143SDamodharam Ammepalli 		stats->opackets += stats->q_opackets[i];
59027c32143SDamodharam Ammepalli 
59127c32143SDamodharam Ammepalli 		stats->q_obytes[i] = ring_stats->tx_ucast_bytes;
59227c32143SDamodharam Ammepalli 		stats->q_obytes[i] += ring_stats->tx_mcast_bytes;
59327c32143SDamodharam Ammepalli 		stats->q_obytes[i] += ring_stats->tx_bcast_bytes;
59427c32143SDamodharam Ammepalli 
59527c32143SDamodharam Ammepalli 		stats->obytes += stats->q_obytes[i];
59627c32143SDamodharam Ammepalli 
59727c32143SDamodharam Ammepalli 		stats->oerrors += ring_stats->tx_discard_pkts;
59827c32143SDamodharam Ammepalli 	}
59927c32143SDamodharam Ammepalli }
60027c32143SDamodharam Ammepalli 
601219842b9SSomnath Kotur static void bnxt_fill_rte_eth_stats(struct rte_eth_stats *stats,
602219842b9SSomnath Kotur 				    struct bnxt_ring_stats *ring_stats,
603219842b9SSomnath Kotur 				    unsigned int i, bool rx)
604219842b9SSomnath Kotur {
605219842b9SSomnath Kotur 	if (rx) {
606219842b9SSomnath Kotur 		stats->q_ipackets[i] = ring_stats->rx_ucast_pkts;
607219842b9SSomnath Kotur 		stats->q_ipackets[i] += ring_stats->rx_mcast_pkts;
608219842b9SSomnath Kotur 		stats->q_ipackets[i] += ring_stats->rx_bcast_pkts;
609219842b9SSomnath Kotur 
610219842b9SSomnath Kotur 		stats->ipackets += stats->q_ipackets[i];
611219842b9SSomnath Kotur 
612219842b9SSomnath Kotur 		stats->q_ibytes[i] = ring_stats->rx_ucast_bytes;
613219842b9SSomnath Kotur 		stats->q_ibytes[i] += ring_stats->rx_mcast_bytes;
614219842b9SSomnath Kotur 		stats->q_ibytes[i] += ring_stats->rx_bcast_bytes;
615219842b9SSomnath Kotur 
616219842b9SSomnath Kotur 		stats->ibytes += stats->q_ibytes[i];
617219842b9SSomnath Kotur 
618219842b9SSomnath Kotur 		stats->q_errors[i] = ring_stats->rx_discard_pkts;
619219842b9SSomnath Kotur 		stats->q_errors[i] += ring_stats->rx_error_pkts;
620219842b9SSomnath Kotur 
621219842b9SSomnath Kotur 		stats->imissed += ring_stats->rx_discard_pkts;
622219842b9SSomnath Kotur 		stats->ierrors += ring_stats->rx_error_pkts;
623219842b9SSomnath Kotur 	} else {
624219842b9SSomnath Kotur 		stats->q_opackets[i] = ring_stats->tx_ucast_pkts;
625219842b9SSomnath Kotur 		stats->q_opackets[i] += ring_stats->tx_mcast_pkts;
626219842b9SSomnath Kotur 		stats->q_opackets[i] += ring_stats->tx_bcast_pkts;
627219842b9SSomnath Kotur 
628219842b9SSomnath Kotur 		stats->opackets += stats->q_opackets[i];
629219842b9SSomnath Kotur 
630219842b9SSomnath Kotur 		stats->q_obytes[i] = ring_stats->tx_ucast_bytes;
631219842b9SSomnath Kotur 		stats->q_obytes[i] += ring_stats->tx_mcast_bytes;
632219842b9SSomnath Kotur 		stats->q_obytes[i] += ring_stats->tx_bcast_bytes;
633219842b9SSomnath Kotur 
634219842b9SSomnath Kotur 		stats->obytes += stats->q_obytes[i];
635219842b9SSomnath Kotur 
636219842b9SSomnath Kotur 		stats->oerrors += ring_stats->tx_discard_pkts;
637219842b9SSomnath Kotur 	}
638219842b9SSomnath Kotur }
639219842b9SSomnath Kotur 
64027c32143SDamodharam Ammepalli static int bnxt_stats_get_ext(struct rte_eth_dev *eth_dev,
64127c32143SDamodharam Ammepalli 				 struct rte_eth_stats *bnxt_stats)
64227c32143SDamodharam Ammepalli {
64327c32143SDamodharam Ammepalli 	int rc = 0;
64427c32143SDamodharam Ammepalli 	unsigned int i;
64527c32143SDamodharam Ammepalli 	struct bnxt *bp = eth_dev->data->dev_private;
64627c32143SDamodharam Ammepalli 	unsigned int num_q_stats;
64727c32143SDamodharam Ammepalli 
64827c32143SDamodharam Ammepalli 	num_q_stats = RTE_MIN(bp->rx_cp_nr_rings,
64927c32143SDamodharam Ammepalli 			      (unsigned int)RTE_ETHDEV_QUEUE_STAT_CNTRS);
65027c32143SDamodharam Ammepalli 
65127c32143SDamodharam Ammepalli 	for (i = 0; i < num_q_stats; i++) {
65227c32143SDamodharam Ammepalli 		struct bnxt_rx_queue *rxq = bp->rx_queues[i];
65327c32143SDamodharam Ammepalli 		struct bnxt_cp_ring_info *cpr = rxq->cp_ring;
65427c32143SDamodharam Ammepalli 		struct bnxt_ring_stats_ext ring_stats = {0};
65527c32143SDamodharam Ammepalli 
65627c32143SDamodharam Ammepalli 		if (!rxq->rx_started)
65727c32143SDamodharam Ammepalli 			continue;
65827c32143SDamodharam Ammepalli 
65927c32143SDamodharam Ammepalli 		rc = bnxt_hwrm_ring_stats_ext(bp, cpr->hw_stats_ctx_id, i,
66027c32143SDamodharam Ammepalli 					      &ring_stats, true);
66127c32143SDamodharam Ammepalli 		if (unlikely(rc))
66227c32143SDamodharam Ammepalli 			return rc;
66327c32143SDamodharam Ammepalli 
66427c32143SDamodharam Ammepalli 		bnxt_fill_rte_eth_stats_ext(bnxt_stats, &ring_stats, i, true);
66527c32143SDamodharam Ammepalli 		bnxt_stats->rx_nombuf +=
666e12a0166STyler Retzlaff 				rte_atomic_load_explicit(&rxq->rx_mbuf_alloc_fail,
667e12a0166STyler Retzlaff 							 rte_memory_order_relaxed);
66827c32143SDamodharam Ammepalli 	}
66927c32143SDamodharam Ammepalli 
67027c32143SDamodharam Ammepalli 	num_q_stats = RTE_MIN(bp->tx_cp_nr_rings,
67127c32143SDamodharam Ammepalli 			      (unsigned int)RTE_ETHDEV_QUEUE_STAT_CNTRS);
67227c32143SDamodharam Ammepalli 
67327c32143SDamodharam Ammepalli 	for (i = 0; i < num_q_stats; i++) {
67427c32143SDamodharam Ammepalli 		struct bnxt_tx_queue *txq = bp->tx_queues[i];
67527c32143SDamodharam Ammepalli 		struct bnxt_cp_ring_info *cpr = txq->cp_ring;
67627c32143SDamodharam Ammepalli 		struct bnxt_ring_stats_ext ring_stats = {0};
67727c32143SDamodharam Ammepalli 
67827c32143SDamodharam Ammepalli 		if (!txq->tx_started)
67927c32143SDamodharam Ammepalli 			continue;
68027c32143SDamodharam Ammepalli 
68127c32143SDamodharam Ammepalli 		rc = bnxt_hwrm_ring_stats_ext(bp, cpr->hw_stats_ctx_id, i,
68227c32143SDamodharam Ammepalli 					      &ring_stats, false);
68327c32143SDamodharam Ammepalli 		if (unlikely(rc))
68427c32143SDamodharam Ammepalli 			return rc;
68527c32143SDamodharam Ammepalli 
68627c32143SDamodharam Ammepalli 		bnxt_fill_rte_eth_stats_ext(bnxt_stats, &ring_stats, i, false);
68727c32143SDamodharam Ammepalli 	}
68827c32143SDamodharam Ammepalli 
68927c32143SDamodharam Ammepalli 	return rc;
69027c32143SDamodharam Ammepalli }
69127c32143SDamodharam Ammepalli 
692d5b0924bSMatan Azrad int bnxt_stats_get_op(struct rte_eth_dev *eth_dev,
69357d5e5bcSAjit Khaparde 		      struct rte_eth_stats *bnxt_stats)
69457d5e5bcSAjit Khaparde {
695d5b0924bSMatan Azrad 	int rc = 0;
69657d5e5bcSAjit Khaparde 	unsigned int i;
69757d5e5bcSAjit Khaparde 	struct bnxt *bp = eth_dev->data->dev_private;
69875306ee0SLance Richardson 	unsigned int num_q_stats;
69957d5e5bcSAjit Khaparde 
7001bf01f51SKalesh AP 	rc = is_bnxt_in_error(bp);
7011bf01f51SKalesh AP 	if (rc)
7021bf01f51SKalesh AP 		return rc;
7031bf01f51SKalesh AP 
704925e3cbdSKalesh AP 	if (!eth_dev->data->dev_started)
7059f55e6acSKalesh AP 		return -EIO;
70657d5e5bcSAjit Khaparde 
70727c32143SDamodharam Ammepalli 	if (BNXT_TPA_V2_P7(bp))
70827c32143SDamodharam Ammepalli 		return bnxt_stats_get_ext(eth_dev, bnxt_stats);
70927c32143SDamodharam Ammepalli 
71075306ee0SLance Richardson 	num_q_stats = RTE_MIN(bp->rx_cp_nr_rings,
71175306ee0SLance Richardson 			      (unsigned int)RTE_ETHDEV_QUEUE_STAT_CNTRS);
71275306ee0SLance Richardson 
71375306ee0SLance Richardson 	for (i = 0; i < num_q_stats; i++) {
71457d5e5bcSAjit Khaparde 		struct bnxt_rx_queue *rxq = bp->rx_queues[i];
71557d5e5bcSAjit Khaparde 		struct bnxt_cp_ring_info *cpr = rxq->cp_ring;
716219842b9SSomnath Kotur 		struct bnxt_ring_stats ring_stats = {0};
71757d5e5bcSAjit Khaparde 
7186aba4a03SStephen Hemminger 		if (!rxq->rx_started)
7196aba4a03SStephen Hemminger 			continue;
720219842b9SSomnath Kotur 
721219842b9SSomnath Kotur 		rc = bnxt_hwrm_ring_stats(bp, cpr->hw_stats_ctx_id, i,
722219842b9SSomnath Kotur 					  &ring_stats, true);
723d5b0924bSMatan Azrad 		if (unlikely(rc))
724d5b0924bSMatan Azrad 			return rc;
725219842b9SSomnath Kotur 
726219842b9SSomnath Kotur 		bnxt_fill_rte_eth_stats(bnxt_stats, &ring_stats, i, true);
727472193a7SAjit Khaparde 		bnxt_stats->rx_nombuf +=
728e12a0166STyler Retzlaff 				rte_atomic_load_explicit(&rxq->rx_mbuf_alloc_fail,
729e12a0166STyler Retzlaff 							 rte_memory_order_relaxed);
73057d5e5bcSAjit Khaparde 	}
73157d5e5bcSAjit Khaparde 
73275306ee0SLance Richardson 	num_q_stats = RTE_MIN(bp->tx_cp_nr_rings,
73375306ee0SLance Richardson 			      (unsigned int)RTE_ETHDEV_QUEUE_STAT_CNTRS);
73475306ee0SLance Richardson 
73575306ee0SLance Richardson 	for (i = 0; i < num_q_stats; i++) {
73657d5e5bcSAjit Khaparde 		struct bnxt_tx_queue *txq = bp->tx_queues[i];
73757d5e5bcSAjit Khaparde 		struct bnxt_cp_ring_info *cpr = txq->cp_ring;
738219842b9SSomnath Kotur 		struct bnxt_ring_stats ring_stats = {0};
73957d5e5bcSAjit Khaparde 
7406aba4a03SStephen Hemminger 		if (!txq->tx_started)
7416aba4a03SStephen Hemminger 			continue;
742219842b9SSomnath Kotur 
743219842b9SSomnath Kotur 		rc = bnxt_hwrm_ring_stats(bp, cpr->hw_stats_ctx_id, i,
744219842b9SSomnath Kotur 					  &ring_stats, false);
745d5b0924bSMatan Azrad 		if (unlikely(rc))
746d5b0924bSMatan Azrad 			return rc;
747219842b9SSomnath Kotur 
748219842b9SSomnath Kotur 		bnxt_fill_rte_eth_stats(bnxt_stats, &ring_stats, i, false);
749*6cc5dfa6SAjit Khaparde 		bnxt_stats->oerrors +=
750*6cc5dfa6SAjit Khaparde 				rte_atomic_load_explicit(&txq->tx_mbuf_drop,
751*6cc5dfa6SAjit Khaparde 							 rte_memory_order_relaxed);
75257d5e5bcSAjit Khaparde 	}
7539f55e6acSKalesh AP 
754d5b0924bSMatan Azrad 	return rc;
75557d5e5bcSAjit Khaparde }
75657d5e5bcSAjit Khaparde 
75784fd852cSKalesh AP static void bnxt_clear_prev_stat(struct bnxt *bp)
75884fd852cSKalesh AP {
75984fd852cSKalesh AP 	/*
76084fd852cSKalesh AP 	 * Clear the cached values of stats returned by HW in the previous
76184fd852cSKalesh AP 	 * get operation.
76284fd852cSKalesh AP 	 */
76327c32143SDamodharam Ammepalli 	if (BNXT_TPA_V2_P7(bp)) {
76427c32143SDamodharam Ammepalli 		memset(bp->prev_rx_ring_stats_ext, 0,
76527c32143SDamodharam Ammepalli 		       sizeof(struct bnxt_ring_stats_ext) * bp->rx_cp_nr_rings);
76627c32143SDamodharam Ammepalli 		memset(bp->prev_tx_ring_stats_ext, 0,
76727c32143SDamodharam Ammepalli 		       sizeof(struct bnxt_ring_stats_ext) * bp->tx_cp_nr_rings);
76827c32143SDamodharam Ammepalli 	} else {
76927c32143SDamodharam Ammepalli 		memset(bp->prev_rx_ring_stats, 0,
77027c32143SDamodharam Ammepalli 		       sizeof(struct bnxt_ring_stats) * bp->rx_cp_nr_rings);
77127c32143SDamodharam Ammepalli 		memset(bp->prev_tx_ring_stats, 0,
77227c32143SDamodharam Ammepalli 		       sizeof(struct bnxt_ring_stats) * bp->tx_cp_nr_rings);
77327c32143SDamodharam Ammepalli 	}
77484fd852cSKalesh AP }
77584fd852cSKalesh AP 
7769970a9adSIgor Romanov int bnxt_stats_reset_op(struct rte_eth_dev *eth_dev)
77757d5e5bcSAjit Khaparde {
77878466c95SStephen Hemminger 	struct bnxt *bp = eth_dev->data->dev_private;
779472193a7SAjit Khaparde 	unsigned int i;
7809970a9adSIgor Romanov 	int ret;
78157d5e5bcSAjit Khaparde 
7821bf01f51SKalesh AP 	ret = is_bnxt_in_error(bp);
7831bf01f51SKalesh AP 	if (ret)
7841bf01f51SKalesh AP 		return ret;
7851bf01f51SKalesh AP 
786925e3cbdSKalesh AP 	if (!eth_dev->data->dev_started) {
787e99981afSDavid Marchand 		PMD_DRV_LOG_LINE(ERR, "Device Initialization not complete!");
7889970a9adSIgor Romanov 		return -EINVAL;
789ed2ced6fSAjit Khaparde 	}
790ed2ced6fSAjit Khaparde 
7919970a9adSIgor Romanov 	ret = bnxt_clear_all_hwrm_stat_ctxs(bp);
792472193a7SAjit Khaparde 	for (i = 0; i < bp->rx_cp_nr_rings; i++) {
793472193a7SAjit Khaparde 		struct bnxt_rx_queue *rxq = bp->rx_queues[i];
794472193a7SAjit Khaparde 
79556bbd6acSRuifeng Wang 		rxq->rx_mbuf_alloc_fail = 0;
796472193a7SAjit Khaparde 	}
7979970a9adSIgor Romanov 
798*6cc5dfa6SAjit Khaparde 	for (i = 0; i < bp->tx_cp_nr_rings; i++) {
799*6cc5dfa6SAjit Khaparde 		struct bnxt_tx_queue *txq = bp->tx_queues[i];
800*6cc5dfa6SAjit Khaparde 
801*6cc5dfa6SAjit Khaparde 		txq->tx_mbuf_drop = 0;
802*6cc5dfa6SAjit Khaparde 	}
803*6cc5dfa6SAjit Khaparde 
80484fd852cSKalesh AP 	bnxt_clear_prev_stat(bp);
80584fd852cSKalesh AP 
8069970a9adSIgor Romanov 	return ret;
80757d5e5bcSAjit Khaparde }
808bfb9c226SAjit Khaparde 
80927c32143SDamodharam Ammepalli static void bnxt_fill_func_qstats_ext(struct hwrm_func_qstats_ext_output *func_qstats,
81027c32143SDamodharam Ammepalli 				      struct bnxt_ring_stats_ext *ring_stats,
81127c32143SDamodharam Ammepalli 				      bool rx)
81227c32143SDamodharam Ammepalli {
81327c32143SDamodharam Ammepalli 	if (rx) {
81427c32143SDamodharam Ammepalli 		func_qstats->rx_ucast_pkts += ring_stats->rx_ucast_pkts;
81527c32143SDamodharam Ammepalli 		func_qstats->rx_mcast_pkts += ring_stats->rx_mcast_pkts;
81627c32143SDamodharam Ammepalli 		func_qstats->rx_bcast_pkts += ring_stats->rx_bcast_pkts;
81727c32143SDamodharam Ammepalli 
81827c32143SDamodharam Ammepalli 		func_qstats->rx_ucast_bytes += ring_stats->rx_ucast_bytes;
81927c32143SDamodharam Ammepalli 		func_qstats->rx_mcast_bytes += ring_stats->rx_mcast_bytes;
82027c32143SDamodharam Ammepalli 		func_qstats->rx_bcast_bytes += ring_stats->rx_bcast_bytes;
82127c32143SDamodharam Ammepalli 
82227c32143SDamodharam Ammepalli 		func_qstats->rx_discard_pkts += ring_stats->rx_discard_pkts;
82327c32143SDamodharam Ammepalli 		func_qstats->rx_error_pkts += ring_stats->rx_error_pkts;
82427c32143SDamodharam Ammepalli 
82527c32143SDamodharam Ammepalli 		func_qstats->rx_tpa_eligible_pkt += ring_stats->rx_tpa_eligible_pkt;
82627c32143SDamodharam Ammepalli 		func_qstats->rx_tpa_eligible_bytes += ring_stats->rx_tpa_eligible_bytes;
82727c32143SDamodharam Ammepalli 		func_qstats->rx_tpa_pkt += ring_stats->rx_tpa_pkt;
82827c32143SDamodharam Ammepalli 		func_qstats->rx_tpa_bytes += ring_stats->rx_tpa_bytes;
82927c32143SDamodharam Ammepalli 		func_qstats->rx_tpa_errors += ring_stats->rx_tpa_errors;
83027c32143SDamodharam Ammepalli 		func_qstats->rx_tpa_events += ring_stats->rx_tpa_events;
83127c32143SDamodharam Ammepalli 	} else {
83227c32143SDamodharam Ammepalli 		func_qstats->tx_ucast_pkts += ring_stats->tx_ucast_pkts;
83327c32143SDamodharam Ammepalli 		func_qstats->tx_mcast_pkts += ring_stats->tx_mcast_pkts;
83427c32143SDamodharam Ammepalli 		func_qstats->tx_bcast_pkts += ring_stats->tx_bcast_pkts;
83527c32143SDamodharam Ammepalli 
83627c32143SDamodharam Ammepalli 		func_qstats->tx_ucast_bytes += ring_stats->tx_ucast_bytes;
83727c32143SDamodharam Ammepalli 		func_qstats->tx_mcast_bytes += ring_stats->tx_mcast_bytes;
83827c32143SDamodharam Ammepalli 		func_qstats->tx_bcast_bytes += ring_stats->tx_bcast_bytes;
83927c32143SDamodharam Ammepalli 
84027c32143SDamodharam Ammepalli 		func_qstats->tx_error_pkts += ring_stats->tx_error_pkts;
84127c32143SDamodharam Ammepalli 		func_qstats->tx_discard_pkts += ring_stats->tx_discard_pkts;
84227c32143SDamodharam Ammepalli 	}
84327c32143SDamodharam Ammepalli }
84427c32143SDamodharam Ammepalli 
845219842b9SSomnath Kotur static void bnxt_fill_func_qstats(struct hwrm_func_qstats_output *func_qstats,
846219842b9SSomnath Kotur 				  struct bnxt_ring_stats *ring_stats,
847219842b9SSomnath Kotur 				  bool rx)
848219842b9SSomnath Kotur {
849219842b9SSomnath Kotur 	if (rx) {
850219842b9SSomnath Kotur 		func_qstats->rx_ucast_pkts += ring_stats->rx_ucast_pkts;
851219842b9SSomnath Kotur 		func_qstats->rx_mcast_pkts += ring_stats->rx_mcast_pkts;
852219842b9SSomnath Kotur 		func_qstats->rx_bcast_pkts += ring_stats->rx_bcast_pkts;
853219842b9SSomnath Kotur 
854219842b9SSomnath Kotur 		func_qstats->rx_ucast_bytes += ring_stats->rx_ucast_bytes;
855219842b9SSomnath Kotur 		func_qstats->rx_mcast_bytes += ring_stats->rx_mcast_bytes;
856219842b9SSomnath Kotur 		func_qstats->rx_bcast_bytes += ring_stats->rx_bcast_bytes;
857219842b9SSomnath Kotur 
858219842b9SSomnath Kotur 		func_qstats->rx_discard_pkts += ring_stats->rx_discard_pkts;
859219842b9SSomnath Kotur 		func_qstats->rx_drop_pkts += ring_stats->rx_error_pkts;
860219842b9SSomnath Kotur 
861219842b9SSomnath Kotur 		func_qstats->rx_agg_pkts += ring_stats->rx_agg_pkts;
862219842b9SSomnath Kotur 		func_qstats->rx_agg_bytes += ring_stats->rx_agg_bytes;
863219842b9SSomnath Kotur 		func_qstats->rx_agg_events += ring_stats->rx_agg_events;
864219842b9SSomnath Kotur 		func_qstats->rx_agg_aborts += ring_stats->rx_agg_aborts;
865219842b9SSomnath Kotur 	} else {
866219842b9SSomnath Kotur 		func_qstats->tx_ucast_pkts += ring_stats->tx_ucast_pkts;
867219842b9SSomnath Kotur 		func_qstats->tx_mcast_pkts += ring_stats->tx_mcast_pkts;
868219842b9SSomnath Kotur 		func_qstats->tx_bcast_pkts += ring_stats->tx_bcast_pkts;
869219842b9SSomnath Kotur 
870219842b9SSomnath Kotur 		func_qstats->tx_ucast_bytes += ring_stats->tx_ucast_bytes;
871219842b9SSomnath Kotur 		func_qstats->tx_mcast_bytes += ring_stats->tx_mcast_bytes;
872219842b9SSomnath Kotur 		func_qstats->tx_bcast_bytes += ring_stats->tx_bcast_bytes;
873219842b9SSomnath Kotur 
874219842b9SSomnath Kotur 		func_qstats->tx_drop_pkts += ring_stats->tx_error_pkts;
875219842b9SSomnath Kotur 		func_qstats->tx_discard_pkts += ring_stats->tx_discard_pkts;
876219842b9SSomnath Kotur 	}
877219842b9SSomnath Kotur }
878219842b9SSomnath Kotur 
879bfb9c226SAjit Khaparde int bnxt_dev_xstats_get_op(struct rte_eth_dev *eth_dev,
880bfb9c226SAjit Khaparde 			   struct rte_eth_xstat *xstats, unsigned int n)
881bfb9c226SAjit Khaparde {
88278466c95SStephen Hemminger 	struct bnxt *bp = eth_dev->data->dev_private;
883bfb9c226SAjit Khaparde 	unsigned int count, i;
884f55e12f3SAjit Khaparde 	unsigned int rx_port_stats_ext_cnt;
885f55e12f3SAjit Khaparde 	unsigned int tx_port_stats_ext_cnt;
886f55e12f3SAjit Khaparde 	unsigned int stat_size = sizeof(uint64_t);
8875f9374deSAjit Khaparde 	struct hwrm_func_qstats_output func_qstats = {0};
88827c32143SDamodharam Ammepalli 	struct hwrm_func_qstats_ext_output func_qstats_ext = {0};
88927c32143SDamodharam Ammepalli 	unsigned int stat_count, sz;
8901bf01f51SKalesh AP 	int rc;
8911bf01f51SKalesh AP 
8921bf01f51SKalesh AP 	rc = is_bnxt_in_error(bp);
8931bf01f51SKalesh AP 	if (rc)
8941bf01f51SKalesh AP 		return rc;
895bfb9c226SAjit Khaparde 
89627c32143SDamodharam Ammepalli 	if (BNXT_TPA_V2_P7(bp))
89727c32143SDamodharam Ammepalli 		sz = RTE_DIM(bnxt_func_stats_ext_strings);
89827c32143SDamodharam Ammepalli 	else
89927c32143SDamodharam Ammepalli 		sz = RTE_DIM(bnxt_func_stats_strings);
90027c32143SDamodharam Ammepalli 
901eac4fc71SSomnath Kotur 	stat_count = RTE_DIM(bnxt_rx_stats_strings) +
90227c32143SDamodharam Ammepalli 		RTE_DIM(bnxt_tx_stats_strings) + sz +
903eac4fc71SSomnath Kotur 		RTE_DIM(bnxt_rx_ext_stats_strings) +
904eac4fc71SSomnath Kotur 		RTE_DIM(bnxt_tx_ext_stats_strings) +
905eac4fc71SSomnath Kotur 		bnxt_flow_stats_cnt(bp);
906063e59ddSAjit Khaparde 
907eac4fc71SSomnath Kotur 	if (n < stat_count || xstats == NULL)
908eac4fc71SSomnath Kotur 		return stat_count;
909a9586abdSKalesh AP 
910219842b9SSomnath Kotur 	for (i = 0; i < bp->rx_cp_nr_rings; i++) {
911219842b9SSomnath Kotur 		struct bnxt_rx_queue *rxq = bp->rx_queues[i];
912219842b9SSomnath Kotur 		struct bnxt_cp_ring_info *cpr = rxq->cp_ring;
913219842b9SSomnath Kotur 		struct bnxt_ring_stats ring_stats = {0};
91427c32143SDamodharam Ammepalli 		struct bnxt_ring_stats_ext ring_stats_ext = {0};
915219842b9SSomnath Kotur 
916219842b9SSomnath Kotur 		if (!rxq->rx_started)
917219842b9SSomnath Kotur 			continue;
918219842b9SSomnath Kotur 
91927c32143SDamodharam Ammepalli 		if (BNXT_TPA_V2_P7(bp))
92027c32143SDamodharam Ammepalli 			rc = bnxt_hwrm_ring_stats_ext(bp, cpr->hw_stats_ctx_id, i,
92127c32143SDamodharam Ammepalli 						      &ring_stats_ext, true);
92227c32143SDamodharam Ammepalli 		else
923219842b9SSomnath Kotur 			rc = bnxt_hwrm_ring_stats(bp, cpr->hw_stats_ctx_id, i,
924219842b9SSomnath Kotur 						  &ring_stats, true);
92527c32143SDamodharam Ammepalli 
926219842b9SSomnath Kotur 		if (unlikely(rc))
927219842b9SSomnath Kotur 			return rc;
928219842b9SSomnath Kotur 
92927c32143SDamodharam Ammepalli 		if (BNXT_TPA_V2_P7(bp))
93027c32143SDamodharam Ammepalli 			bnxt_fill_func_qstats_ext(&func_qstats_ext,
93127c32143SDamodharam Ammepalli 						  &ring_stats_ext, true);
93227c32143SDamodharam Ammepalli 		else
933219842b9SSomnath Kotur 			bnxt_fill_func_qstats(&func_qstats, &ring_stats, true);
934219842b9SSomnath Kotur 	}
935219842b9SSomnath Kotur 
936219842b9SSomnath Kotur 	for (i = 0; i < bp->tx_cp_nr_rings; i++) {
937219842b9SSomnath Kotur 		struct bnxt_tx_queue *txq = bp->tx_queues[i];
938219842b9SSomnath Kotur 		struct bnxt_cp_ring_info *cpr = txq->cp_ring;
939219842b9SSomnath Kotur 		struct bnxt_ring_stats ring_stats = {0};
94027c32143SDamodharam Ammepalli 		struct bnxt_ring_stats_ext ring_stats_ext = {0};
941219842b9SSomnath Kotur 
942219842b9SSomnath Kotur 		if (!txq->tx_started)
943219842b9SSomnath Kotur 			continue;
944219842b9SSomnath Kotur 
94527c32143SDamodharam Ammepalli 		if (BNXT_TPA_V2_P7(bp))
94627c32143SDamodharam Ammepalli 			rc = bnxt_hwrm_ring_stats_ext(bp, cpr->hw_stats_ctx_id, i,
94727c32143SDamodharam Ammepalli 						      &ring_stats_ext, false);
94827c32143SDamodharam Ammepalli 		else
949219842b9SSomnath Kotur 			rc = bnxt_hwrm_ring_stats(bp, cpr->hw_stats_ctx_id, i,
950219842b9SSomnath Kotur 						  &ring_stats, false);
951219842b9SSomnath Kotur 		if (unlikely(rc))
952219842b9SSomnath Kotur 			return rc;
953219842b9SSomnath Kotur 
95427c32143SDamodharam Ammepalli 		if (BNXT_TPA_V2_P7(bp))
95527c32143SDamodharam Ammepalli 			bnxt_fill_func_qstats_ext(&func_qstats_ext,
95627c32143SDamodharam Ammepalli 						  &ring_stats_ext, false);
95727c32143SDamodharam Ammepalli 		else
958219842b9SSomnath Kotur 			bnxt_fill_func_qstats(&func_qstats, &ring_stats, false);
959219842b9SSomnath Kotur 	}
960219842b9SSomnath Kotur 
961bfb9c226SAjit Khaparde 	bnxt_hwrm_port_qstats(bp);
962f55e12f3SAjit Khaparde 	bnxt_hwrm_ext_port_qstats(bp);
963b02a39baSSantoshkumar Karanappa Rastapur 	rx_port_stats_ext_cnt = RTE_MIN(RTE_DIM(bnxt_rx_ext_stats_strings),
964b02a39baSSantoshkumar Karanappa Rastapur 					(bp->fw_rx_port_stats_ext_size /
965b02a39baSSantoshkumar Karanappa Rastapur 					 stat_size));
966b02a39baSSantoshkumar Karanappa Rastapur 	tx_port_stats_ext_cnt = RTE_MIN(RTE_DIM(bnxt_tx_ext_stats_strings),
967b02a39baSSantoshkumar Karanappa Rastapur 					(bp->fw_tx_port_stats_ext_size /
968b02a39baSSantoshkumar Karanappa Rastapur 					 stat_size));
969bfb9c226SAjit Khaparde 
970c05c22f9SKalesh AP 	memset(xstats, 0, sizeof(*xstats) * n);
971bfb9c226SAjit Khaparde 
972bfb9c226SAjit Khaparde 	count = 0;
973bfb9c226SAjit Khaparde 	for (i = 0; i < RTE_DIM(bnxt_rx_stats_strings); i++) {
974bfb9c226SAjit Khaparde 		uint64_t *rx_stats = (uint64_t *)bp->hw_rx_port_stats;
97567659988SDavid Marchand 		xstats[count].id = count;
976bfb9c226SAjit Khaparde 		xstats[count].value = rte_le_to_cpu_64(
977bfb9c226SAjit Khaparde 				*(uint64_t *)((char *)rx_stats +
978bfb9c226SAjit Khaparde 				bnxt_rx_stats_strings[i].offset));
979bfb9c226SAjit Khaparde 		count++;
980bfb9c226SAjit Khaparde 	}
981bfb9c226SAjit Khaparde 
982bfb9c226SAjit Khaparde 	for (i = 0; i < RTE_DIM(bnxt_tx_stats_strings); i++) {
983bfb9c226SAjit Khaparde 		uint64_t *tx_stats = (uint64_t *)bp->hw_tx_port_stats;
98467659988SDavid Marchand 		xstats[count].id = count;
985bfb9c226SAjit Khaparde 		xstats[count].value = rte_le_to_cpu_64(
986bfb9c226SAjit Khaparde 				 *(uint64_t *)((char *)tx_stats +
987bfb9c226SAjit Khaparde 				bnxt_tx_stats_strings[i].offset));
988bfb9c226SAjit Khaparde 		count++;
989bfb9c226SAjit Khaparde 	}
990bfb9c226SAjit Khaparde 
99127c32143SDamodharam Ammepalli 	if (BNXT_TPA_V2_P7(bp)) {
99227c32143SDamodharam Ammepalli 		for (i = 0; i < RTE_DIM(bnxt_func_stats_ext_strings); i++) {
99327c32143SDamodharam Ammepalli 			xstats[count].id = count;
99427c32143SDamodharam Ammepalli 			xstats[count].value = *(uint64_t *)((char *)&func_qstats_ext +
99527c32143SDamodharam Ammepalli 							    bnxt_func_stats_ext_strings[i].offset);
99627c32143SDamodharam Ammepalli 			count++;
99727c32143SDamodharam Ammepalli 		}
99827c32143SDamodharam Ammepalli 		goto skip_func_stats;
99927c32143SDamodharam Ammepalli 	}
10005f9374deSAjit Khaparde 	for (i = 0; i < RTE_DIM(bnxt_func_stats_strings); i++) {
100167659988SDavid Marchand 		xstats[count].id = count;
1002219842b9SSomnath Kotur 		xstats[count].value = *(uint64_t *)((char *)&func_qstats +
1003219842b9SSomnath Kotur 					 bnxt_func_stats_strings[i].offset);
1004dd46c6bbSAjit Khaparde 		count++;
10055f9374deSAjit Khaparde 	}
10065f9374deSAjit Khaparde 
100727c32143SDamodharam Ammepalli skip_func_stats:
1008f55e12f3SAjit Khaparde 	for (i = 0; i < rx_port_stats_ext_cnt; i++) {
1009f55e12f3SAjit Khaparde 		uint64_t *rx_stats_ext = (uint64_t *)bp->hw_rx_port_stats_ext;
1010f55e12f3SAjit Khaparde 
1011f55e12f3SAjit Khaparde 		xstats[count].value = rte_le_to_cpu_64
1012f55e12f3SAjit Khaparde 					(*(uint64_t *)((char *)rx_stats_ext +
1013f55e12f3SAjit Khaparde 					 bnxt_rx_ext_stats_strings[i].offset));
1014f55e12f3SAjit Khaparde 
1015f55e12f3SAjit Khaparde 		count++;
1016f55e12f3SAjit Khaparde 	}
1017f55e12f3SAjit Khaparde 
1018b02a39baSSantoshkumar Karanappa Rastapur 	for (i = 0; i < tx_port_stats_ext_cnt; i++) {
1019b02a39baSSantoshkumar Karanappa Rastapur 		uint64_t *tx_stats_ext = (uint64_t *)bp->hw_tx_port_stats_ext;
1020b02a39baSSantoshkumar Karanappa Rastapur 
1021b02a39baSSantoshkumar Karanappa Rastapur 		xstats[count].value = rte_le_to_cpu_64
1022b02a39baSSantoshkumar Karanappa Rastapur 					(*(uint64_t *)((char *)tx_stats_ext +
1023b02a39baSSantoshkumar Karanappa Rastapur 					 bnxt_tx_ext_stats_strings[i].offset));
1024b02a39baSSantoshkumar Karanappa Rastapur 		count++;
1025b02a39baSSantoshkumar Karanappa Rastapur 	}
1026b02a39baSSantoshkumar Karanappa Rastapur 
102702a95625SSomnath Kotur 	if (bp->fw_cap & BNXT_FW_CAP_ADV_FLOW_COUNTERS &&
102802a95625SSomnath Kotur 	    bp->fw_cap & BNXT_FW_CAP_ADV_FLOW_MGMT &&
10291e2f8acaSAjit Khaparde 	    BNXT_FLOW_XSTATS_EN(bp)) {
103002a95625SSomnath Kotur 		int j;
103102a95625SSomnath Kotur 
103202a95625SSomnath Kotur 		i = 0;
103302a95625SSomnath Kotur 		for (j = 0; j < bp->max_vnics; j++) {
103402a95625SSomnath Kotur 			struct bnxt_filter_info *filter;
103502a95625SSomnath Kotur 			struct bnxt_vnic_info *vnic;
103602a95625SSomnath Kotur 			struct rte_flow *flow;
103702a95625SSomnath Kotur 
103802a95625SSomnath Kotur 			vnic = &bp->vnic_info[j];
103902a95625SSomnath Kotur 			if (vnic && vnic->fw_vnic_id == INVALID_VNIC_ID)
104002a95625SSomnath Kotur 				continue;
104102a95625SSomnath Kotur 
104202a95625SSomnath Kotur 			if (STAILQ_EMPTY(&vnic->flow_list))
104302a95625SSomnath Kotur 				continue;
104402a95625SSomnath Kotur 
104502a95625SSomnath Kotur 			STAILQ_FOREACH(flow, &vnic->flow_list, next) {
104602a95625SSomnath Kotur 				if (!flow || !flow->filter)
104702a95625SSomnath Kotur 					continue;
104802a95625SSomnath Kotur 
104902a95625SSomnath Kotur 				filter = flow->filter;
105002a95625SSomnath Kotur 				xstats[count].id = count;
105102a95625SSomnath Kotur 				xstats[count].value =
105202a95625SSomnath Kotur 					filter->hw_stats.bytes;
105302a95625SSomnath Kotur 				count++;
105402a95625SSomnath Kotur 				xstats[count].id = count;
105502a95625SSomnath Kotur 				xstats[count].value =
105602a95625SSomnath Kotur 					filter->hw_stats.packets;
105702a95625SSomnath Kotur 				count++;
105802a95625SSomnath Kotur 				if (++i > bp->max_l2_ctx)
105902a95625SSomnath Kotur 					break;
106002a95625SSomnath Kotur 			}
106102a95625SSomnath Kotur 			if (i > bp->max_l2_ctx)
106202a95625SSomnath Kotur 				break;
106302a95625SSomnath Kotur 		}
106402a95625SSomnath Kotur 	}
106502a95625SSomnath Kotur 
1066f55e12f3SAjit Khaparde 	return stat_count;
1067bfb9c226SAjit Khaparde }
1068bfb9c226SAjit Khaparde 
106902a95625SSomnath Kotur int bnxt_flow_stats_cnt(struct bnxt *bp)
107002a95625SSomnath Kotur {
107102a95625SSomnath Kotur 	if (bp->fw_cap & BNXT_FW_CAP_ADV_FLOW_COUNTERS &&
107202a95625SSomnath Kotur 	    bp->fw_cap & BNXT_FW_CAP_ADV_FLOW_MGMT &&
10731e2f8acaSAjit Khaparde 	    BNXT_FLOW_XSTATS_EN(bp)) {
107402a95625SSomnath Kotur 		struct bnxt_xstats_name_off flow_bytes[bp->max_l2_ctx];
107502a95625SSomnath Kotur 		struct bnxt_xstats_name_off flow_pkts[bp->max_l2_ctx];
107602a95625SSomnath Kotur 
107702a95625SSomnath Kotur 		return RTE_DIM(flow_bytes) + RTE_DIM(flow_pkts);
107802a95625SSomnath Kotur 	}
107902a95625SSomnath Kotur 
108002a95625SSomnath Kotur 	return 0;
108102a95625SSomnath Kotur }
108202a95625SSomnath Kotur 
1083fd36aa85SKalesh AP int bnxt_dev_xstats_get_names_op(struct rte_eth_dev *eth_dev,
1084bfb9c226SAjit Khaparde 		struct rte_eth_xstat_name *xstats_names,
10858dcee14fSLance Richardson 		unsigned int size)
1086bfb9c226SAjit Khaparde {
108702a95625SSomnath Kotur 	struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;
108827c32143SDamodharam Ammepalli 	unsigned int stat_cnt;
108927c32143SDamodharam Ammepalli 	unsigned int i, count = 0, sz;
10901bf01f51SKalesh AP 	int rc;
10911bf01f51SKalesh AP 
10921bf01f51SKalesh AP 	rc = is_bnxt_in_error(bp);
10931bf01f51SKalesh AP 	if (rc)
10941bf01f51SKalesh AP 		return rc;
1095bfb9c226SAjit Khaparde 
109627c32143SDamodharam Ammepalli 	if (BNXT_TPA_V2_P7(bp))
109727c32143SDamodharam Ammepalli 		sz = RTE_DIM(bnxt_func_stats_ext_strings);
109827c32143SDamodharam Ammepalli 	else
109927c32143SDamodharam Ammepalli 		sz = RTE_DIM(bnxt_func_stats_strings);
110027c32143SDamodharam Ammepalli 
110127c32143SDamodharam Ammepalli 	stat_cnt = RTE_DIM(bnxt_rx_stats_strings) +
110227c32143SDamodharam Ammepalli 				RTE_DIM(bnxt_tx_stats_strings) +
110327c32143SDamodharam Ammepalli 				sz +
110427c32143SDamodharam Ammepalli 				RTE_DIM(bnxt_rx_ext_stats_strings) +
110527c32143SDamodharam Ammepalli 				RTE_DIM(bnxt_tx_ext_stats_strings) +
110627c32143SDamodharam Ammepalli 				bnxt_flow_stats_cnt(bp);
110727c32143SDamodharam Ammepalli 
11088dcee14fSLance Richardson 	if (xstats_names == NULL || size < stat_cnt)
11098dcee14fSLance Richardson 		return stat_cnt;
1110bfb9c226SAjit Khaparde 
1111bfb9c226SAjit Khaparde 	for (i = 0; i < RTE_DIM(bnxt_rx_stats_strings); i++) {
11126723c0fcSBruce Richardson 		strlcpy(xstats_names[count].name,
11136723c0fcSBruce Richardson 			bnxt_rx_stats_strings[i].name,
11146723c0fcSBruce Richardson 			sizeof(xstats_names[count].name));
1115bfb9c226SAjit Khaparde 		count++;
1116bfb9c226SAjit Khaparde 	}
1117bfb9c226SAjit Khaparde 
1118bfb9c226SAjit Khaparde 	for (i = 0; i < RTE_DIM(bnxt_tx_stats_strings); i++) {
11196723c0fcSBruce Richardson 		strlcpy(xstats_names[count].name,
11206723c0fcSBruce Richardson 			bnxt_tx_stats_strings[i].name,
11216723c0fcSBruce Richardson 			sizeof(xstats_names[count].name));
1122bfb9c226SAjit Khaparde 		count++;
1123bfb9c226SAjit Khaparde 	}
1124dd46c6bbSAjit Khaparde 
112527c32143SDamodharam Ammepalli 	if (BNXT_TPA_V2_P7(bp)) {
112627c32143SDamodharam Ammepalli 		for (i = 0; i < RTE_DIM(bnxt_func_stats_ext_strings); i++) {
112727c32143SDamodharam Ammepalli 			strlcpy(xstats_names[count].name,
112827c32143SDamodharam Ammepalli 				bnxt_func_stats_ext_strings[i].name,
112927c32143SDamodharam Ammepalli 				sizeof(xstats_names[count].name));
113027c32143SDamodharam Ammepalli 			count++;
113127c32143SDamodharam Ammepalli 		}
113227c32143SDamodharam Ammepalli 		goto skip_func_stats;
113327c32143SDamodharam Ammepalli 	}
113427c32143SDamodharam Ammepalli 
11355f9374deSAjit Khaparde 	for (i = 0; i < RTE_DIM(bnxt_func_stats_strings); i++) {
11366723c0fcSBruce Richardson 		strlcpy(xstats_names[count].name,
11375f9374deSAjit Khaparde 			bnxt_func_stats_strings[i].name,
11386723c0fcSBruce Richardson 			sizeof(xstats_names[count].name));
1139dd46c6bbSAjit Khaparde 		count++;
11405f9374deSAjit Khaparde 	}
1141f55e12f3SAjit Khaparde 
114227c32143SDamodharam Ammepalli skip_func_stats:
1143f55e12f3SAjit Khaparde 	for (i = 0; i < RTE_DIM(bnxt_rx_ext_stats_strings); i++) {
11446723c0fcSBruce Richardson 		strlcpy(xstats_names[count].name,
11456723c0fcSBruce Richardson 			bnxt_rx_ext_stats_strings[i].name,
11466723c0fcSBruce Richardson 			sizeof(xstats_names[count].name));
1147f55e12f3SAjit Khaparde 
1148f55e12f3SAjit Khaparde 		count++;
1149f55e12f3SAjit Khaparde 	}
1150f55e12f3SAjit Khaparde 
1151f55e12f3SAjit Khaparde 	for (i = 0; i < RTE_DIM(bnxt_tx_ext_stats_strings); i++) {
11526723c0fcSBruce Richardson 		strlcpy(xstats_names[count].name,
11536723c0fcSBruce Richardson 			bnxt_tx_ext_stats_strings[i].name,
11546723c0fcSBruce Richardson 			sizeof(xstats_names[count].name));
1155f55e12f3SAjit Khaparde 
1156f55e12f3SAjit Khaparde 		count++;
1157f55e12f3SAjit Khaparde 	}
1158f55e12f3SAjit Khaparde 
115902a95625SSomnath Kotur 	if (bp->fw_cap & BNXT_FW_CAP_ADV_FLOW_COUNTERS &&
116002a95625SSomnath Kotur 	    bp->fw_cap & BNXT_FW_CAP_ADV_FLOW_MGMT &&
11611e2f8acaSAjit Khaparde 	    BNXT_FLOW_XSTATS_EN(bp)) {
116202a95625SSomnath Kotur 		for (i = 0; i < bp->max_l2_ctx; i++) {
116302a95625SSomnath Kotur 			char buf[RTE_ETH_XSTATS_NAME_SIZE];
116402a95625SSomnath Kotur 
116502a95625SSomnath Kotur 			sprintf(buf, "flow_%d_bytes", i);
116602a95625SSomnath Kotur 			strlcpy(xstats_names[count].name, buf,
116702a95625SSomnath Kotur 				sizeof(xstats_names[count].name));
116802a95625SSomnath Kotur 			count++;
116902a95625SSomnath Kotur 
117002a95625SSomnath Kotur 			sprintf(buf, "flow_%d_packets", i);
117102a95625SSomnath Kotur 			strlcpy(xstats_names[count].name, buf,
117202a95625SSomnath Kotur 				sizeof(xstats_names[count].name));
117302a95625SSomnath Kotur 
117402a95625SSomnath Kotur 			count++;
1175bfb9c226SAjit Khaparde 		}
117602a95625SSomnath Kotur 	}
117702a95625SSomnath Kotur 
1178bfb9c226SAjit Khaparde 	return stat_cnt;
1179bfb9c226SAjit Khaparde }
1180bfb9c226SAjit Khaparde 
11819970a9adSIgor Romanov int bnxt_dev_xstats_reset_op(struct rte_eth_dev *eth_dev)
1182bfb9c226SAjit Khaparde {
118378466c95SStephen Hemminger 	struct bnxt *bp = eth_dev->data->dev_private;
11849970a9adSIgor Romanov 	int ret;
1185bfb9c226SAjit Khaparde 
11861bf01f51SKalesh AP 	ret = is_bnxt_in_error(bp);
11871bf01f51SKalesh AP 	if (ret)
11881bf01f51SKalesh AP 		return ret;
11891bf01f51SKalesh AP 
11909f55e6acSKalesh AP 	if (BNXT_VF(bp) || !BNXT_SINGLE_PF(bp) ||
11919f55e6acSKalesh AP 	    !(bp->flags & BNXT_FLAG_PORT_STATS)) {
1192e99981afSDavid Marchand 		PMD_DRV_LOG_LINE(ERR, "Operation not supported");
11939bc556e3SKalesh AP 		return -ENOTSUP;
11949970a9adSIgor Romanov 	}
11959970a9adSIgor Romanov 
11969f55e6acSKalesh AP 	ret = bnxt_hwrm_port_clr_stats(bp);
11979f55e6acSKalesh AP 	if (ret != 0)
1198e99981afSDavid Marchand 		PMD_DRV_LOG_LINE(ERR, "Failed to reset xstats: %s",
11999f55e6acSKalesh AP 			    strerror(-ret));
12009f55e6acSKalesh AP 
120184fd852cSKalesh AP 	bnxt_clear_prev_stat(bp);
120284fd852cSKalesh AP 
12039970a9adSIgor Romanov 	return ret;
1204bfb9c226SAjit Khaparde }
120588920136SAjit Khaparde 
120602a95625SSomnath Kotur /* Update the input context memory with the flow counter IDs
120702a95625SSomnath Kotur  * of the flows that we are interested in.
120802a95625SSomnath Kotur  * Also, update the output tables with the current local values
120902a95625SSomnath Kotur  * since that is what will be used by FW to accumulate
121002a95625SSomnath Kotur  */
121102a95625SSomnath Kotur static void bnxt_update_fc_pre_qstat(uint32_t *in_tbl,
121202a95625SSomnath Kotur 				     uint64_t *out_tbl,
121302a95625SSomnath Kotur 				     struct bnxt_filter_info *filter,
121402a95625SSomnath Kotur 				     uint32_t *ptbl_cnt)
121502a95625SSomnath Kotur {
121602a95625SSomnath Kotur 	uint32_t in_tbl_cnt = *ptbl_cnt;
121702a95625SSomnath Kotur 
121802a95625SSomnath Kotur 	in_tbl[in_tbl_cnt] = filter->flow_id;
121902a95625SSomnath Kotur 	out_tbl[2 * in_tbl_cnt] = filter->hw_stats.packets;
122002a95625SSomnath Kotur 	out_tbl[2 * in_tbl_cnt + 1] = filter->hw_stats.bytes;
122102a95625SSomnath Kotur 	in_tbl_cnt++;
122202a95625SSomnath Kotur 	*ptbl_cnt = in_tbl_cnt;
122302a95625SSomnath Kotur }
122402a95625SSomnath Kotur 
122502a95625SSomnath Kotur /* Post issuing counter_qstats cmd, update the driver's local stat
122602a95625SSomnath Kotur  * entries with the values DMA-ed by FW in the output table
122702a95625SSomnath Kotur  */
122802a95625SSomnath Kotur static void bnxt_update_fc_post_qstat(struct bnxt_filter_info *filter,
122902a95625SSomnath Kotur 				      uint64_t *out_tbl,
123002a95625SSomnath Kotur 				      uint32_t out_tbl_idx)
123102a95625SSomnath Kotur {
123202a95625SSomnath Kotur 	filter->hw_stats.packets = out_tbl[2 * out_tbl_idx];
123302a95625SSomnath Kotur 	filter->hw_stats.bytes = out_tbl[(2 * out_tbl_idx) + 1];
123402a95625SSomnath Kotur }
123502a95625SSomnath Kotur 
123602a95625SSomnath Kotur static int bnxt_update_fc_tbl(struct bnxt *bp, uint16_t ctr,
123702a95625SSomnath Kotur 			      struct bnxt_filter_info *en_tbl[],
123802a95625SSomnath Kotur 			      uint16_t in_flow_cnt)
123902a95625SSomnath Kotur {
124002a95625SSomnath Kotur 	uint32_t *in_rx_tbl;
124102a95625SSomnath Kotur 	uint64_t *out_rx_tbl;
124202a95625SSomnath Kotur 	uint32_t in_rx_tbl_cnt = 0;
124302a95625SSomnath Kotur 	uint32_t out_rx_tbl_cnt = 0;
124402a95625SSomnath Kotur 	int i, rc = 0;
124502a95625SSomnath Kotur 
12461e2f8acaSAjit Khaparde 	in_rx_tbl = (uint32_t *)bp->flow_stat->rx_fc_in_tbl.va;
12471e2f8acaSAjit Khaparde 	out_rx_tbl = (uint64_t *)bp->flow_stat->rx_fc_out_tbl.va;
124802a95625SSomnath Kotur 
124902a95625SSomnath Kotur 	for (i = 0; i < in_flow_cnt; i++) {
125002a95625SSomnath Kotur 		if (!en_tbl[i])
125102a95625SSomnath Kotur 			continue;
125202a95625SSomnath Kotur 
125302a95625SSomnath Kotur 		/* Currently only ingress/Rx flows are supported anyway. */
125402a95625SSomnath Kotur 		bnxt_update_fc_pre_qstat(in_rx_tbl, out_rx_tbl,
125502a95625SSomnath Kotur 					 en_tbl[i], &in_rx_tbl_cnt);
125602a95625SSomnath Kotur 	}
125702a95625SSomnath Kotur 
125802a95625SSomnath Kotur 	/* Currently only ingress/Rx flows are supported */
125902a95625SSomnath Kotur 	if (in_rx_tbl_cnt) {
126002a95625SSomnath Kotur 		rc = bnxt_hwrm_cfa_counter_qstats(bp, BNXT_DIR_RX, ctr,
126102a95625SSomnath Kotur 						  in_rx_tbl_cnt);
126202a95625SSomnath Kotur 		if (rc)
126302a95625SSomnath Kotur 			return rc;
126402a95625SSomnath Kotur 	}
126502a95625SSomnath Kotur 
126602a95625SSomnath Kotur 	for (i = 0; i < in_flow_cnt; i++) {
126702a95625SSomnath Kotur 		if (!en_tbl[i])
126802a95625SSomnath Kotur 			continue;
126902a95625SSomnath Kotur 
127002a95625SSomnath Kotur 		/* Currently only ingress/Rx flows are supported */
127102a95625SSomnath Kotur 		bnxt_update_fc_post_qstat(en_tbl[i], out_rx_tbl,
127202a95625SSomnath Kotur 					  out_rx_tbl_cnt);
127302a95625SSomnath Kotur 		out_rx_tbl_cnt++;
127402a95625SSomnath Kotur 	}
127502a95625SSomnath Kotur 
127602a95625SSomnath Kotur 	return rc;
127702a95625SSomnath Kotur }
127802a95625SSomnath Kotur 
127902a95625SSomnath Kotur /* Walks through the list which has all the flows
128002a95625SSomnath Kotur  * requesting for explicit flow counters.
128102a95625SSomnath Kotur  */
128202a95625SSomnath Kotur int bnxt_flow_stats_req(struct bnxt *bp)
128302a95625SSomnath Kotur {
128402a95625SSomnath Kotur 	int i;
128502a95625SSomnath Kotur 	int rc = 0;
128602a95625SSomnath Kotur 	struct rte_flow *flow;
128702a95625SSomnath Kotur 	uint16_t in_flow_tbl_cnt = 0;
128802a95625SSomnath Kotur 	struct bnxt_vnic_info *vnic = NULL;
12891e2f8acaSAjit Khaparde 	struct bnxt_filter_info *valid_en_tbl[bp->flow_stat->max_fc];
129002a95625SSomnath Kotur 	uint16_t counter_type = CFA_COUNTER_CFG_IN_COUNTER_TYPE_FC;
129102a95625SSomnath Kotur 
129202a95625SSomnath Kotur 	bnxt_acquire_flow_lock(bp);
129302a95625SSomnath Kotur 	for (i = 0; i < bp->max_vnics; i++) {
129402a95625SSomnath Kotur 		vnic = &bp->vnic_info[i];
129502a95625SSomnath Kotur 		if (vnic && vnic->fw_vnic_id == INVALID_VNIC_ID)
129602a95625SSomnath Kotur 			continue;
129702a95625SSomnath Kotur 
129802a95625SSomnath Kotur 		if (STAILQ_EMPTY(&vnic->flow_list))
129902a95625SSomnath Kotur 			continue;
130002a95625SSomnath Kotur 
130102a95625SSomnath Kotur 		STAILQ_FOREACH(flow, &vnic->flow_list, next) {
130202a95625SSomnath Kotur 			if (!flow || !flow->filter)
130302a95625SSomnath Kotur 				continue;
130402a95625SSomnath Kotur 
130502a95625SSomnath Kotur 			valid_en_tbl[in_flow_tbl_cnt++] = flow->filter;
13061e2f8acaSAjit Khaparde 			if (in_flow_tbl_cnt >= bp->flow_stat->max_fc) {
130702a95625SSomnath Kotur 				rc = bnxt_update_fc_tbl(bp, counter_type,
130802a95625SSomnath Kotur 							valid_en_tbl,
130902a95625SSomnath Kotur 							in_flow_tbl_cnt);
131002a95625SSomnath Kotur 				if (rc)
131102a95625SSomnath Kotur 					goto err;
131202a95625SSomnath Kotur 				in_flow_tbl_cnt = 0;
131302a95625SSomnath Kotur 				continue;
131402a95625SSomnath Kotur 			}
131502a95625SSomnath Kotur 		}
131602a95625SSomnath Kotur 	}
131702a95625SSomnath Kotur 
1318df212347SYunjian Wang 	if (!in_flow_tbl_cnt) {
1319df212347SYunjian Wang 		bnxt_release_flow_lock(bp);
132002a95625SSomnath Kotur 		goto out;
1321df212347SYunjian Wang 	}
132202a95625SSomnath Kotur 
132302a95625SSomnath Kotur 	rc = bnxt_update_fc_tbl(bp, counter_type, valid_en_tbl,
132402a95625SSomnath Kotur 				in_flow_tbl_cnt);
132502a95625SSomnath Kotur 	if (!rc) {
132602a95625SSomnath Kotur 		bnxt_release_flow_lock(bp);
132702a95625SSomnath Kotur 		return 0;
132802a95625SSomnath Kotur 	}
132902a95625SSomnath Kotur 
133002a95625SSomnath Kotur err:
133102a95625SSomnath Kotur 	/* If cmd fails once, no need of
133202a95625SSomnath Kotur 	 * invoking again every second
133302a95625SSomnath Kotur 	 */
133402a95625SSomnath Kotur 	bnxt_release_flow_lock(bp);
133502a95625SSomnath Kotur 	bnxt_cancel_fc_thread(bp);
133602a95625SSomnath Kotur out:
133702a95625SSomnath Kotur 	return rc;
133802a95625SSomnath Kotur }
1339