1c0752f2bSKamal Heib /*
2c0752f2bSKamal Heib  * Copyright (c) 2017, Mellanox Technologies, Ltd.  All rights reserved.
3c0752f2bSKamal Heib  *
4c0752f2bSKamal Heib  * This software is available to you under a choice of one of two
5c0752f2bSKamal Heib  * licenses.  You may choose to be licensed under the terms of the GNU
6c0752f2bSKamal Heib  * General Public License (GPL) Version 2, available from the file
7c0752f2bSKamal Heib  * COPYING in the main directory of this source tree, or the
8c0752f2bSKamal Heib  * OpenIB.org BSD license below:
9c0752f2bSKamal Heib  *
10c0752f2bSKamal Heib  *     Redistribution and use in source and binary forms, with or
11c0752f2bSKamal Heib  *     without modification, are permitted provided that the following
12c0752f2bSKamal Heib  *     conditions are met:
13c0752f2bSKamal Heib  *
14c0752f2bSKamal Heib  *      - Redistributions of source code must retain the above
15c0752f2bSKamal Heib  *        copyright notice, this list of conditions and the following
16c0752f2bSKamal Heib  *        disclaimer.
17c0752f2bSKamal Heib  *
18c0752f2bSKamal Heib  *      - Redistributions in binary form must reproduce the above
19c0752f2bSKamal Heib  *        copyright notice, this list of conditions and the following
20c0752f2bSKamal Heib  *        disclaimer in the documentation and/or other materials
21c0752f2bSKamal Heib  *        provided with the distribution.
22c0752f2bSKamal Heib  *
23c0752f2bSKamal Heib  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24c0752f2bSKamal Heib  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25c0752f2bSKamal Heib  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26c0752f2bSKamal Heib  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27c0752f2bSKamal Heib  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28c0752f2bSKamal Heib  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29c0752f2bSKamal Heib  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30c0752f2bSKamal Heib  * SOFTWARE.
31c0752f2bSKamal Heib  */
32c0752f2bSKamal Heib 
3369c1280bSSaeed Mahameed #include "lib/mlx5.h"
34c0752f2bSKamal Heib #include "en.h"
3543585a41SIlya Lesokhin #include "en_accel/tls.h"
360aab3e1bSRaed Salem #include "en_accel/en_accel.h"
37dd1979cfSLama Kayal #include "en/ptp.h"
38*0a1498ebSLama Kayal #include "en/port.h"
39c0752f2bSKamal Heib 
403460c184SSaeed Mahameed static unsigned int stats_grps_num(struct mlx5e_priv *priv)
413460c184SSaeed Mahameed {
423460c184SSaeed Mahameed 	return !priv->profile->stats_grps_num ? 0 :
433460c184SSaeed Mahameed 		priv->profile->stats_grps_num(priv);
443460c184SSaeed Mahameed }
453460c184SSaeed Mahameed 
463460c184SSaeed Mahameed unsigned int mlx5e_stats_total_num(struct mlx5e_priv *priv)
473460c184SSaeed Mahameed {
48f0ff8e8cSSaeed Mahameed 	mlx5e_stats_grp_t *stats_grps = priv->profile->stats_grps;
493460c184SSaeed Mahameed 	const unsigned int num_stats_grps = stats_grps_num(priv);
503460c184SSaeed Mahameed 	unsigned int total = 0;
513460c184SSaeed Mahameed 	int i;
523460c184SSaeed Mahameed 
533460c184SSaeed Mahameed 	for (i = 0; i < num_stats_grps; i++)
54f0ff8e8cSSaeed Mahameed 		total += stats_grps[i]->get_num_stats(priv);
553460c184SSaeed Mahameed 
563460c184SSaeed Mahameed 	return total;
573460c184SSaeed Mahameed }
583460c184SSaeed Mahameed 
59b521105bSAlaa Hleihel void mlx5e_stats_update_ndo_stats(struct mlx5e_priv *priv)
60b521105bSAlaa Hleihel {
61b521105bSAlaa Hleihel 	mlx5e_stats_grp_t *stats_grps = priv->profile->stats_grps;
62b521105bSAlaa Hleihel 	const unsigned int num_stats_grps = stats_grps_num(priv);
63b521105bSAlaa Hleihel 	int i;
64b521105bSAlaa Hleihel 
65b521105bSAlaa Hleihel 	for (i = num_stats_grps - 1; i >= 0; i--)
66b521105bSAlaa Hleihel 		if (stats_grps[i]->update_stats &&
67b521105bSAlaa Hleihel 		    stats_grps[i]->update_stats_mask & MLX5E_NDO_UPDATE_STATS)
68b521105bSAlaa Hleihel 			stats_grps[i]->update_stats(priv);
69b521105bSAlaa Hleihel }
70b521105bSAlaa Hleihel 
713460c184SSaeed Mahameed void mlx5e_stats_update(struct mlx5e_priv *priv)
723460c184SSaeed Mahameed {
73f0ff8e8cSSaeed Mahameed 	mlx5e_stats_grp_t *stats_grps = priv->profile->stats_grps;
743460c184SSaeed Mahameed 	const unsigned int num_stats_grps = stats_grps_num(priv);
753460c184SSaeed Mahameed 	int i;
763460c184SSaeed Mahameed 
773460c184SSaeed Mahameed 	for (i = num_stats_grps - 1; i >= 0; i--)
78f0ff8e8cSSaeed Mahameed 		if (stats_grps[i]->update_stats)
79f0ff8e8cSSaeed Mahameed 			stats_grps[i]->update_stats(priv);
803460c184SSaeed Mahameed }
813460c184SSaeed Mahameed 
823460c184SSaeed Mahameed void mlx5e_stats_fill(struct mlx5e_priv *priv, u64 *data, int idx)
833460c184SSaeed Mahameed {
84f0ff8e8cSSaeed Mahameed 	mlx5e_stats_grp_t *stats_grps = priv->profile->stats_grps;
853460c184SSaeed Mahameed 	const unsigned int num_stats_grps = stats_grps_num(priv);
863460c184SSaeed Mahameed 	int i;
873460c184SSaeed Mahameed 
883460c184SSaeed Mahameed 	for (i = 0; i < num_stats_grps; i++)
89f0ff8e8cSSaeed Mahameed 		idx = stats_grps[i]->fill_stats(priv, data, idx);
903460c184SSaeed Mahameed }
913460c184SSaeed Mahameed 
923460c184SSaeed Mahameed void mlx5e_stats_fill_strings(struct mlx5e_priv *priv, u8 *data)
933460c184SSaeed Mahameed {
94f0ff8e8cSSaeed Mahameed 	mlx5e_stats_grp_t *stats_grps = priv->profile->stats_grps;
953460c184SSaeed Mahameed 	const unsigned int num_stats_grps = stats_grps_num(priv);
963460c184SSaeed Mahameed 	int i, idx = 0;
973460c184SSaeed Mahameed 
983460c184SSaeed Mahameed 	for (i = 0; i < num_stats_grps; i++)
99f0ff8e8cSSaeed Mahameed 		idx = stats_grps[i]->fill_strings(priv, data, idx);
1003460c184SSaeed Mahameed }
1013460c184SSaeed Mahameed 
1023460c184SSaeed Mahameed /* Concrete NIC Stats */
1033460c184SSaeed Mahameed 
104c0752f2bSKamal Heib static const struct counter_desc sw_stats_desc[] = {
105c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_packets) },
106c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_bytes) },
107c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_packets) },
108c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_bytes) },
109c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tso_packets) },
110c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tso_bytes) },
111c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tso_inner_packets) },
112c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tso_inner_bytes) },
113f24686e8SGal Pressman 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_added_vlan_packets) },
1142ad9ecdbSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_nop) },
1155af75c74SMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_mpwqe_blks) },
1165af75c74SMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_mpwqe_pkts) },
117bf239741SIlya Lesokhin 
118bf239741SIlya Lesokhin #ifdef CONFIG_MLX5_EN_TLS
119d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_encrypted_packets) },
120d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_encrypted_bytes) },
121bf239741SIlya Lesokhin 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_ooo) },
122d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_dump_packets) },
123d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_dump_bytes) },
12446a3ea98STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_resync_bytes) },
12546a3ea98STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_skip_no_sync_data) },
12646a3ea98STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_drop_no_sync_data) },
12746a3ea98STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_drop_bypass_req) },
128bf239741SIlya Lesokhin #endif
129bf239741SIlya Lesokhin 
130c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_lro_packets) },
131c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_lro_bytes) },
132def09e7bSKhalid Manaa 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_gro_packets) },
133def09e7bSKhalid Manaa 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_gro_bytes) },
134def09e7bSKhalid Manaa 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_gro_skbs) },
135def09e7bSKhalid Manaa 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_gro_match_packets) },
136def09e7bSKhalid Manaa 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_gro_large_hds) },
137f007c13dSNatali Shechtman 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_ecn_mark) },
138f24686e8SGal Pressman 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_removed_vlan_packets) },
139c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_unnecessary) },
140c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_none) },
141c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_complete) },
1420aa1d186SSaeed Mahameed 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_complete_tail) },
1430aa1d186SSaeed Mahameed 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_complete_tail_slow) },
144c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_unnecessary_inner) },
145c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_drop) },
14686690b4bSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_redirect) },
147890388adSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_xmit) },
14873cab880SShay Agroskin 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_mpwqe) },
149c2273219SShay Agroskin 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_inlnw) },
1506c085a8aSShay Agroskin 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_nops) },
151c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_full) },
152890388adSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_err) },
153890388adSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_cqe) },
154c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_csum_none) },
155c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_csum_partial) },
156c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_csum_partial_inner) },
157c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_stopped) },
158c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_dropped) },
159c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xmit_more) },
160db75373cSEran Ben Elisha 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_recover) },
16186155656STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_cqes) },
162f65a59ffSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_wake) },
163f65a59ffSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_cqe_err) },
16458b99ee3STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_xmit) },
16573cab880SShay Agroskin 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_mpwqe) },
166c2273219SShay Agroskin 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_inlnw) },
1676c085a8aSShay Agroskin 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_nops) },
16858b99ee3STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_full) },
16958b99ee3STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_err) },
17058b99ee3STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_cqes) },
171c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_wqe_err) },
172b71ba6b4STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_mpwqe_filler_cqes) },
173b71ba6b4STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_mpwqe_filler_strides) },
1740073c8f7SMoshe Shemesh 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_oversize_pkts_sw_drop) },
175c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_buff_alloc_err) },
176c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cqe_compress_blks) },
177c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cqe_compress_pkts) },
178c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cache_reuse) },
179c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cache_full) },
180c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cache_empty) },
181c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cache_busy) },
182c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cache_waive) },
183dc983f0eSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_congst_umr) },
18494563847SEran Ben Elisha 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_arfs_err) },
185be5323c8SAya Levin 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_recover) },
18676c1e1acSTariq Toukan #ifdef CONFIG_MLX5_EN_TLS
18776c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_decrypted_packets) },
18876c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_decrypted_bytes) },
18976c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_req_pkt) },
19076c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_req_start) },
19176c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_req_end) },
19276c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_req_skip) },
19376c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_res_ok) },
194e9ce991bSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_res_retry) },
19576c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_res_skip) },
19676c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_err) },
19776c1e1acSTariq Toukan #endif
198a1bf74dcSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, ch_events) },
1992d7103c8STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, ch_poll) },
2002d7103c8STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, ch_arm) },
2012d7103c8STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, ch_aff_change) },
202db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, ch_force_irq) },
20357d689a8SEran Ben Elisha 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, ch_eq_rearm) },
204db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_packets) },
205db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_bytes) },
206db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_csum_complete) },
207db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_csum_unnecessary) },
208db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_csum_unnecessary_inner) },
209db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_csum_none) },
210db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_ecn_mark) },
211db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_removed_vlan_packets) },
212db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_xdp_drop) },
213db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_xdp_redirect) },
214db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_wqe_err) },
215db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_mpwqe_filler_cqes) },
216db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_mpwqe_filler_strides) },
217db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_oversize_pkts_sw_drop) },
218db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_buff_alloc_err) },
219db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_cqe_compress_blks) },
220db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_cqe_compress_pkts) },
221db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_congst_umr) },
222db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_arfs_err) },
223db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xsk_xmit) },
224db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xsk_mpwqe) },
225db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xsk_inlnw) },
226db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xsk_full) },
227db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xsk_err) },
228db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xsk_cqes) },
229c0752f2bSKamal Heib };
230c0752f2bSKamal Heib 
231c0752f2bSKamal Heib #define NUM_SW_COUNTERS			ARRAY_SIZE(sw_stats_desc)
232c0752f2bSKamal Heib 
23396b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(sw)
234c0752f2bSKamal Heib {
235c0752f2bSKamal Heib 	return NUM_SW_COUNTERS;
236c0752f2bSKamal Heib }
237c0752f2bSKamal Heib 
23896b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(sw)
239c0752f2bSKamal Heib {
240c0752f2bSKamal Heib 	int i;
241c0752f2bSKamal Heib 
242c0752f2bSKamal Heib 	for (i = 0; i < NUM_SW_COUNTERS; i++)
243c0752f2bSKamal Heib 		strcpy(data + (idx++) * ETH_GSTRING_LEN, sw_stats_desc[i].format);
244c0752f2bSKamal Heib 	return idx;
245c0752f2bSKamal Heib }
246c0752f2bSKamal Heib 
24796b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(sw)
248c0752f2bSKamal Heib {
249c0752f2bSKamal Heib 	int i;
250c0752f2bSKamal Heib 
251c0752f2bSKamal Heib 	for (i = 0; i < NUM_SW_COUNTERS; i++)
252c0752f2bSKamal Heib 		data[idx++] = MLX5E_READ_CTR64_CPU(&priv->stats.sw, sw_stats_desc, i);
253c0752f2bSKamal Heib 	return idx;
254c0752f2bSKamal Heib }
255c0752f2bSKamal Heib 
2561a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_xdp_red(struct mlx5e_sw_stats *s,
2571a7f5124SEran Ben Elisha 						    struct mlx5e_xdpsq_stats *xdpsq_red_stats)
25819386177SKamal Heib {
2591a7f5124SEran Ben Elisha 	s->tx_xdp_xmit  += xdpsq_red_stats->xmit;
2601a7f5124SEran Ben Elisha 	s->tx_xdp_mpwqe += xdpsq_red_stats->mpwqe;
2611a7f5124SEran Ben Elisha 	s->tx_xdp_inlnw += xdpsq_red_stats->inlnw;
2621a7f5124SEran Ben Elisha 	s->tx_xdp_nops  += xdpsq_red_stats->nops;
2631a7f5124SEran Ben Elisha 	s->tx_xdp_full  += xdpsq_red_stats->full;
2641a7f5124SEran Ben Elisha 	s->tx_xdp_err   += xdpsq_red_stats->err;
2651a7f5124SEran Ben Elisha 	s->tx_xdp_cqes  += xdpsq_red_stats->cqes;
2661a7f5124SEran Ben Elisha }
26719386177SKamal Heib 
2681a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_xdpsq(struct mlx5e_sw_stats *s,
2691a7f5124SEran Ben Elisha 						  struct mlx5e_xdpsq_stats *xdpsq_stats)
2701a7f5124SEran Ben Elisha {
2711a7f5124SEran Ben Elisha 	s->rx_xdp_tx_xmit  += xdpsq_stats->xmit;
2721a7f5124SEran Ben Elisha 	s->rx_xdp_tx_mpwqe += xdpsq_stats->mpwqe;
2731a7f5124SEran Ben Elisha 	s->rx_xdp_tx_inlnw += xdpsq_stats->inlnw;
2741a7f5124SEran Ben Elisha 	s->rx_xdp_tx_nops  += xdpsq_stats->nops;
2751a7f5124SEran Ben Elisha 	s->rx_xdp_tx_full  += xdpsq_stats->full;
2761a7f5124SEran Ben Elisha 	s->rx_xdp_tx_err   += xdpsq_stats->err;
2771a7f5124SEran Ben Elisha 	s->rx_xdp_tx_cqe   += xdpsq_stats->cqes;
2781a7f5124SEran Ben Elisha }
27919386177SKamal Heib 
2801a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_xsksq(struct mlx5e_sw_stats *s,
2811a7f5124SEran Ben Elisha 						  struct mlx5e_xdpsq_stats *xsksq_stats)
2821a7f5124SEran Ben Elisha {
2831a7f5124SEran Ben Elisha 	s->tx_xsk_xmit  += xsksq_stats->xmit;
2841a7f5124SEran Ben Elisha 	s->tx_xsk_mpwqe += xsksq_stats->mpwqe;
2851a7f5124SEran Ben Elisha 	s->tx_xsk_inlnw += xsksq_stats->inlnw;
2861a7f5124SEran Ben Elisha 	s->tx_xsk_full  += xsksq_stats->full;
2871a7f5124SEran Ben Elisha 	s->tx_xsk_err   += xsksq_stats->err;
2881a7f5124SEran Ben Elisha 	s->tx_xsk_cqes  += xsksq_stats->cqes;
2891a7f5124SEran Ben Elisha }
29019386177SKamal Heib 
2911a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_xskrq(struct mlx5e_sw_stats *s,
2921a7f5124SEran Ben Elisha 						  struct mlx5e_rq_stats *xskrq_stats)
2931a7f5124SEran Ben Elisha {
2941a7f5124SEran Ben Elisha 	s->rx_xsk_packets                += xskrq_stats->packets;
2951a7f5124SEran Ben Elisha 	s->rx_xsk_bytes                  += xskrq_stats->bytes;
2961a7f5124SEran Ben Elisha 	s->rx_xsk_csum_complete          += xskrq_stats->csum_complete;
2971a7f5124SEran Ben Elisha 	s->rx_xsk_csum_unnecessary       += xskrq_stats->csum_unnecessary;
2981a7f5124SEran Ben Elisha 	s->rx_xsk_csum_unnecessary_inner += xskrq_stats->csum_unnecessary_inner;
2991a7f5124SEran Ben Elisha 	s->rx_xsk_csum_none              += xskrq_stats->csum_none;
3001a7f5124SEran Ben Elisha 	s->rx_xsk_ecn_mark               += xskrq_stats->ecn_mark;
3011a7f5124SEran Ben Elisha 	s->rx_xsk_removed_vlan_packets   += xskrq_stats->removed_vlan_packets;
3021a7f5124SEran Ben Elisha 	s->rx_xsk_xdp_drop               += xskrq_stats->xdp_drop;
3031a7f5124SEran Ben Elisha 	s->rx_xsk_xdp_redirect           += xskrq_stats->xdp_redirect;
3041a7f5124SEran Ben Elisha 	s->rx_xsk_wqe_err                += xskrq_stats->wqe_err;
3051a7f5124SEran Ben Elisha 	s->rx_xsk_mpwqe_filler_cqes      += xskrq_stats->mpwqe_filler_cqes;
3061a7f5124SEran Ben Elisha 	s->rx_xsk_mpwqe_filler_strides   += xskrq_stats->mpwqe_filler_strides;
3071a7f5124SEran Ben Elisha 	s->rx_xsk_oversize_pkts_sw_drop  += xskrq_stats->oversize_pkts_sw_drop;
3081a7f5124SEran Ben Elisha 	s->rx_xsk_buff_alloc_err         += xskrq_stats->buff_alloc_err;
3091a7f5124SEran Ben Elisha 	s->rx_xsk_cqe_compress_blks      += xskrq_stats->cqe_compress_blks;
3101a7f5124SEran Ben Elisha 	s->rx_xsk_cqe_compress_pkts      += xskrq_stats->cqe_compress_pkts;
3111a7f5124SEran Ben Elisha 	s->rx_xsk_congst_umr             += xskrq_stats->congst_umr;
3121a7f5124SEran Ben Elisha 	s->rx_xsk_arfs_err               += xskrq_stats->arfs_err;
3131a7f5124SEran Ben Elisha }
3141a7f5124SEran Ben Elisha 
3151a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_rq_stats(struct mlx5e_sw_stats *s,
3161a7f5124SEran Ben Elisha 						     struct mlx5e_rq_stats *rq_stats)
3171a7f5124SEran Ben Elisha {
31819386177SKamal Heib 	s->rx_packets                 += rq_stats->packets;
31919386177SKamal Heib 	s->rx_bytes                   += rq_stats->bytes;
32019386177SKamal Heib 	s->rx_lro_packets             += rq_stats->lro_packets;
32119386177SKamal Heib 	s->rx_lro_bytes               += rq_stats->lro_bytes;
322def09e7bSKhalid Manaa 	s->rx_gro_packets             += rq_stats->gro_packets;
323def09e7bSKhalid Manaa 	s->rx_gro_bytes               += rq_stats->gro_bytes;
324def09e7bSKhalid Manaa 	s->rx_gro_skbs                += rq_stats->gro_skbs;
325def09e7bSKhalid Manaa 	s->rx_gro_match_packets       += rq_stats->gro_match_packets;
326def09e7bSKhalid Manaa 	s->rx_gro_large_hds           += rq_stats->gro_large_hds;
327f007c13dSNatali Shechtman 	s->rx_ecn_mark                += rq_stats->ecn_mark;
32819386177SKamal Heib 	s->rx_removed_vlan_packets    += rq_stats->removed_vlan_packets;
32919386177SKamal Heib 	s->rx_csum_none               += rq_stats->csum_none;
33019386177SKamal Heib 	s->rx_csum_complete           += rq_stats->csum_complete;
3310aa1d186SSaeed Mahameed 	s->rx_csum_complete_tail      += rq_stats->csum_complete_tail;
3320aa1d186SSaeed Mahameed 	s->rx_csum_complete_tail_slow += rq_stats->csum_complete_tail_slow;
33319386177SKamal Heib 	s->rx_csum_unnecessary        += rq_stats->csum_unnecessary;
33419386177SKamal Heib 	s->rx_csum_unnecessary_inner  += rq_stats->csum_unnecessary_inner;
33519386177SKamal Heib 	s->rx_xdp_drop                += rq_stats->xdp_drop;
33686690b4bSTariq Toukan 	s->rx_xdp_redirect            += rq_stats->xdp_redirect;
33719386177SKamal Heib 	s->rx_wqe_err                 += rq_stats->wqe_err;
338b71ba6b4STariq Toukan 	s->rx_mpwqe_filler_cqes       += rq_stats->mpwqe_filler_cqes;
339b71ba6b4STariq Toukan 	s->rx_mpwqe_filler_strides    += rq_stats->mpwqe_filler_strides;
3400073c8f7SMoshe Shemesh 	s->rx_oversize_pkts_sw_drop   += rq_stats->oversize_pkts_sw_drop;
34119386177SKamal Heib 	s->rx_buff_alloc_err          += rq_stats->buff_alloc_err;
34219386177SKamal Heib 	s->rx_cqe_compress_blks       += rq_stats->cqe_compress_blks;
34319386177SKamal Heib 	s->rx_cqe_compress_pkts       += rq_stats->cqe_compress_pkts;
34419386177SKamal Heib 	s->rx_cache_reuse             += rq_stats->cache_reuse;
34519386177SKamal Heib 	s->rx_cache_full              += rq_stats->cache_full;
34619386177SKamal Heib 	s->rx_cache_empty             += rq_stats->cache_empty;
34719386177SKamal Heib 	s->rx_cache_busy              += rq_stats->cache_busy;
34819386177SKamal Heib 	s->rx_cache_waive             += rq_stats->cache_waive;
349dc983f0eSTariq Toukan 	s->rx_congst_umr              += rq_stats->congst_umr;
35094563847SEran Ben Elisha 	s->rx_arfs_err                += rq_stats->arfs_err;
351be5323c8SAya Levin 	s->rx_recover                 += rq_stats->recover;
35276c1e1acSTariq Toukan #ifdef CONFIG_MLX5_EN_TLS
35376c1e1acSTariq Toukan 	s->rx_tls_decrypted_packets   += rq_stats->tls_decrypted_packets;
35476c1e1acSTariq Toukan 	s->rx_tls_decrypted_bytes     += rq_stats->tls_decrypted_bytes;
35576c1e1acSTariq Toukan 	s->rx_tls_resync_req_pkt      += rq_stats->tls_resync_req_pkt;
35676c1e1acSTariq Toukan 	s->rx_tls_resync_req_start    += rq_stats->tls_resync_req_start;
35776c1e1acSTariq Toukan 	s->rx_tls_resync_req_end      += rq_stats->tls_resync_req_end;
35876c1e1acSTariq Toukan 	s->rx_tls_resync_req_skip     += rq_stats->tls_resync_req_skip;
35976c1e1acSTariq Toukan 	s->rx_tls_resync_res_ok       += rq_stats->tls_resync_res_ok;
360e9ce991bSTariq Toukan 	s->rx_tls_resync_res_retry    += rq_stats->tls_resync_res_retry;
36176c1e1acSTariq Toukan 	s->rx_tls_resync_res_skip     += rq_stats->tls_resync_res_skip;
36276c1e1acSTariq Toukan 	s->rx_tls_err                 += rq_stats->tls_err;
36376c1e1acSTariq Toukan #endif
3641a7f5124SEran Ben Elisha }
3651a7f5124SEran Ben Elisha 
3661a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_ch_stats(struct mlx5e_sw_stats *s,
3671a7f5124SEran Ben Elisha 						     struct mlx5e_ch_stats *ch_stats)
3681a7f5124SEran Ben Elisha {
369a1bf74dcSTariq Toukan 	s->ch_events      += ch_stats->events;
3702d7103c8STariq Toukan 	s->ch_poll        += ch_stats->poll;
3712d7103c8STariq Toukan 	s->ch_arm         += ch_stats->arm;
3722d7103c8STariq Toukan 	s->ch_aff_change  += ch_stats->aff_change;
373db05815bSMaxim Mikityanskiy 	s->ch_force_irq   += ch_stats->force_irq;
37419386177SKamal Heib 	s->ch_eq_rearm    += ch_stats->eq_rearm;
3751a7f5124SEran Ben Elisha }
37619386177SKamal Heib 
3771a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_sq(struct mlx5e_sw_stats *s,
3781a7f5124SEran Ben Elisha 					       struct mlx5e_sq_stats *sq_stats)
3791a7f5124SEran Ben Elisha {
38019386177SKamal Heib 	s->tx_packets               += sq_stats->packets;
38119386177SKamal Heib 	s->tx_bytes                 += sq_stats->bytes;
38219386177SKamal Heib 	s->tx_tso_packets           += sq_stats->tso_packets;
38319386177SKamal Heib 	s->tx_tso_bytes             += sq_stats->tso_bytes;
38419386177SKamal Heib 	s->tx_tso_inner_packets     += sq_stats->tso_inner_packets;
38519386177SKamal Heib 	s->tx_tso_inner_bytes       += sq_stats->tso_inner_bytes;
38619386177SKamal Heib 	s->tx_added_vlan_packets    += sq_stats->added_vlan_packets;
3872ad9ecdbSTariq Toukan 	s->tx_nop                   += sq_stats->nop;
3885af75c74SMaxim Mikityanskiy 	s->tx_mpwqe_blks            += sq_stats->mpwqe_blks;
3895af75c74SMaxim Mikityanskiy 	s->tx_mpwqe_pkts            += sq_stats->mpwqe_pkts;
39019386177SKamal Heib 	s->tx_queue_stopped         += sq_stats->stopped;
39119386177SKamal Heib 	s->tx_queue_wake            += sq_stats->wake;
39219386177SKamal Heib 	s->tx_queue_dropped         += sq_stats->dropped;
39316cc14d8SEran Ben Elisha 	s->tx_cqe_err               += sq_stats->cqe_err;
394db75373cSEran Ben Elisha 	s->tx_recover               += sq_stats->recover;
39519386177SKamal Heib 	s->tx_xmit_more             += sq_stats->xmit_more;
39619386177SKamal Heib 	s->tx_csum_partial_inner    += sq_stats->csum_partial_inner;
39719386177SKamal Heib 	s->tx_csum_none             += sq_stats->csum_none;
39819386177SKamal Heib 	s->tx_csum_partial          += sq_stats->csum_partial;
399bf239741SIlya Lesokhin #ifdef CONFIG_MLX5_EN_TLS
400d2ead1f3STariq Toukan 	s->tx_tls_encrypted_packets += sq_stats->tls_encrypted_packets;
401d2ead1f3STariq Toukan 	s->tx_tls_encrypted_bytes   += sq_stats->tls_encrypted_bytes;
402bf239741SIlya Lesokhin 	s->tx_tls_ooo               += sq_stats->tls_ooo;
403d2ead1f3STariq Toukan 	s->tx_tls_dump_bytes        += sq_stats->tls_dump_bytes;
404d2ead1f3STariq Toukan 	s->tx_tls_dump_packets      += sq_stats->tls_dump_packets;
40546a3ea98STariq Toukan 	s->tx_tls_resync_bytes      += sq_stats->tls_resync_bytes;
40646a3ea98STariq Toukan 	s->tx_tls_skip_no_sync_data += sq_stats->tls_skip_no_sync_data;
40746a3ea98STariq Toukan 	s->tx_tls_drop_no_sync_data += sq_stats->tls_drop_no_sync_data;
40846a3ea98STariq Toukan 	s->tx_tls_drop_bypass_req   += sq_stats->tls_drop_bypass_req;
409bf239741SIlya Lesokhin #endif
41086155656STariq Toukan 	s->tx_cqes                  += sq_stats->cqes;
4111a7f5124SEran Ben Elisha }
4121a7f5124SEran Ben Elisha 
413145e5637SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_ptp(struct mlx5e_priv *priv,
414145e5637SEran Ben Elisha 						struct mlx5e_sw_stats *s)
415145e5637SEran Ben Elisha {
416145e5637SEran Ben Elisha 	int i;
417145e5637SEran Ben Elisha 
418a28359e9SAya Levin 	if (!priv->tx_ptp_opened && !priv->rx_ptp_opened)
419145e5637SEran Ben Elisha 		return;
420145e5637SEran Ben Elisha 
421b0d35de4SAya Levin 	mlx5e_stats_grp_sw_update_stats_ch_stats(s, &priv->ptp_stats.ch);
422145e5637SEran Ben Elisha 
423a28359e9SAya Levin 	if (priv->tx_ptp_opened) {
424145e5637SEran Ben Elisha 		for (i = 0; i < priv->max_opened_tc; i++) {
425b0d35de4SAya Levin 			mlx5e_stats_grp_sw_update_stats_sq(s, &priv->ptp_stats.sq[i]);
426145e5637SEran Ben Elisha 
427145e5637SEran Ben Elisha 			/* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92657 */
428145e5637SEran Ben Elisha 			barrier();
429145e5637SEran Ben Elisha 		}
430145e5637SEran Ben Elisha 	}
431a28359e9SAya Levin 	if (priv->rx_ptp_opened) {
432a28359e9SAya Levin 		mlx5e_stats_grp_sw_update_stats_rq_stats(s, &priv->ptp_stats.rq);
433a28359e9SAya Levin 
434a28359e9SAya Levin 		/* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92657 */
435a28359e9SAya Levin 		barrier();
436a28359e9SAya Levin 	}
437a28359e9SAya Levin }
438145e5637SEran Ben Elisha 
439214baf22SMaxim Mikityanskiy static void mlx5e_stats_grp_sw_update_stats_qos(struct mlx5e_priv *priv,
440214baf22SMaxim Mikityanskiy 						struct mlx5e_sw_stats *s)
441214baf22SMaxim Mikityanskiy {
442214baf22SMaxim Mikityanskiy 	struct mlx5e_sq_stats **stats;
443214baf22SMaxim Mikityanskiy 	u16 max_qos_sqs;
444214baf22SMaxim Mikityanskiy 	int i;
445214baf22SMaxim Mikityanskiy 
446214baf22SMaxim Mikityanskiy 	/* Pairs with smp_store_release in mlx5e_open_qos_sq. */
447214baf22SMaxim Mikityanskiy 	max_qos_sqs = smp_load_acquire(&priv->htb.max_qos_sqs);
448214baf22SMaxim Mikityanskiy 	stats = READ_ONCE(priv->htb.qos_sq_stats);
449214baf22SMaxim Mikityanskiy 
450214baf22SMaxim Mikityanskiy 	for (i = 0; i < max_qos_sqs; i++) {
451214baf22SMaxim Mikityanskiy 		mlx5e_stats_grp_sw_update_stats_sq(s, READ_ONCE(stats[i]));
452214baf22SMaxim Mikityanskiy 
453214baf22SMaxim Mikityanskiy 		/* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92657 */
454214baf22SMaxim Mikityanskiy 		barrier();
455214baf22SMaxim Mikityanskiy 	}
456214baf22SMaxim Mikityanskiy }
457214baf22SMaxim Mikityanskiy 
4581a7f5124SEran Ben Elisha static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(sw)
4591a7f5124SEran Ben Elisha {
4601a7f5124SEran Ben Elisha 	struct mlx5e_sw_stats *s = &priv->stats.sw;
4611a7f5124SEran Ben Elisha 	int i;
4621a7f5124SEran Ben Elisha 
4631a7f5124SEran Ben Elisha 	memset(s, 0, sizeof(*s));
4641a7f5124SEran Ben Elisha 
4659d758d4aSTariq Toukan 	for (i = 0; i < priv->stats_nch; i++) {
4661a7f5124SEran Ben Elisha 		struct mlx5e_channel_stats *channel_stats =
467be98737aSTariq Toukan 			priv->channel_stats[i];
4681a7f5124SEran Ben Elisha 		int j;
4691a7f5124SEran Ben Elisha 
4701a7f5124SEran Ben Elisha 		mlx5e_stats_grp_sw_update_stats_rq_stats(s, &channel_stats->rq);
4711a7f5124SEran Ben Elisha 		mlx5e_stats_grp_sw_update_stats_xdpsq(s, &channel_stats->rq_xdpsq);
4721a7f5124SEran Ben Elisha 		mlx5e_stats_grp_sw_update_stats_ch_stats(s, &channel_stats->ch);
4731a7f5124SEran Ben Elisha 		/* xdp redirect */
4741a7f5124SEran Ben Elisha 		mlx5e_stats_grp_sw_update_stats_xdp_red(s, &channel_stats->xdpsq);
4751a7f5124SEran Ben Elisha 		/* AF_XDP zero-copy */
4761a7f5124SEran Ben Elisha 		mlx5e_stats_grp_sw_update_stats_xskrq(s, &channel_stats->xskrq);
4771a7f5124SEran Ben Elisha 		mlx5e_stats_grp_sw_update_stats_xsksq(s, &channel_stats->xsksq);
4781a7f5124SEran Ben Elisha 
4791a7f5124SEran Ben Elisha 		for (j = 0; j < priv->max_opened_tc; j++) {
4801a7f5124SEran Ben Elisha 			mlx5e_stats_grp_sw_update_stats_sq(s, &channel_stats->sq[j]);
48142ae1a5cSArnd Bergmann 
48242ae1a5cSArnd Bergmann 			/* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92657 */
48342ae1a5cSArnd Bergmann 			barrier();
48419386177SKamal Heib 		}
48519386177SKamal Heib 	}
486145e5637SEran Ben Elisha 	mlx5e_stats_grp_sw_update_stats_ptp(priv, s);
487214baf22SMaxim Mikityanskiy 	mlx5e_stats_grp_sw_update_stats_qos(priv, s);
48819386177SKamal Heib }
48919386177SKamal Heib 
490fd8dcdb8SKamal Heib static const struct counter_desc q_stats_desc[] = {
491fd8dcdb8SKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_qcounter_stats, rx_out_of_buffer) },
492fd8dcdb8SKamal Heib };
493fd8dcdb8SKamal Heib 
4947cbaf9a3SMoshe Shemesh static const struct counter_desc drop_rq_stats_desc[] = {
4957cbaf9a3SMoshe Shemesh 	{ MLX5E_DECLARE_STAT(struct mlx5e_qcounter_stats, rx_if_down_packets) },
4967cbaf9a3SMoshe Shemesh };
4977cbaf9a3SMoshe Shemesh 
498fd8dcdb8SKamal Heib #define NUM_Q_COUNTERS			ARRAY_SIZE(q_stats_desc)
4997cbaf9a3SMoshe Shemesh #define NUM_DROP_RQ_COUNTERS		ARRAY_SIZE(drop_rq_stats_desc)
500fd8dcdb8SKamal Heib 
50196b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(qcnt)
502fd8dcdb8SKamal Heib {
5037cbaf9a3SMoshe Shemesh 	int num_stats = 0;
5047cbaf9a3SMoshe Shemesh 
5057cbaf9a3SMoshe Shemesh 	if (priv->q_counter)
5067cbaf9a3SMoshe Shemesh 		num_stats += NUM_Q_COUNTERS;
5077cbaf9a3SMoshe Shemesh 
5087cbaf9a3SMoshe Shemesh 	if (priv->drop_rq_q_counter)
5097cbaf9a3SMoshe Shemesh 		num_stats += NUM_DROP_RQ_COUNTERS;
5107cbaf9a3SMoshe Shemesh 
5117cbaf9a3SMoshe Shemesh 	return num_stats;
512fd8dcdb8SKamal Heib }
513fd8dcdb8SKamal Heib 
51496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(qcnt)
515fd8dcdb8SKamal Heib {
516fd8dcdb8SKamal Heib 	int i;
517fd8dcdb8SKamal Heib 
518fd8dcdb8SKamal Heib 	for (i = 0; i < NUM_Q_COUNTERS && priv->q_counter; i++)
5197cbaf9a3SMoshe Shemesh 		strcpy(data + (idx++) * ETH_GSTRING_LEN,
5207cbaf9a3SMoshe Shemesh 		       q_stats_desc[i].format);
5217cbaf9a3SMoshe Shemesh 
5227cbaf9a3SMoshe Shemesh 	for (i = 0; i < NUM_DROP_RQ_COUNTERS && priv->drop_rq_q_counter; i++)
5237cbaf9a3SMoshe Shemesh 		strcpy(data + (idx++) * ETH_GSTRING_LEN,
5247cbaf9a3SMoshe Shemesh 		       drop_rq_stats_desc[i].format);
5257cbaf9a3SMoshe Shemesh 
526fd8dcdb8SKamal Heib 	return idx;
527fd8dcdb8SKamal Heib }
528fd8dcdb8SKamal Heib 
52996b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(qcnt)
530fd8dcdb8SKamal Heib {
531fd8dcdb8SKamal Heib 	int i;
532fd8dcdb8SKamal Heib 
533fd8dcdb8SKamal Heib 	for (i = 0; i < NUM_Q_COUNTERS && priv->q_counter; i++)
5347cbaf9a3SMoshe Shemesh 		data[idx++] = MLX5E_READ_CTR32_CPU(&priv->stats.qcnt,
5357cbaf9a3SMoshe Shemesh 						   q_stats_desc, i);
5367cbaf9a3SMoshe Shemesh 	for (i = 0; i < NUM_DROP_RQ_COUNTERS && priv->drop_rq_q_counter; i++)
5377cbaf9a3SMoshe Shemesh 		data[idx++] = MLX5E_READ_CTR32_CPU(&priv->stats.qcnt,
5387cbaf9a3SMoshe Shemesh 						   drop_rq_stats_desc, i);
539fd8dcdb8SKamal Heib 	return idx;
540fd8dcdb8SKamal Heib }
541fd8dcdb8SKamal Heib 
54296b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(qcnt)
54319386177SKamal Heib {
54419386177SKamal Heib 	struct mlx5e_qcounter_stats *qcnt = &priv->stats.qcnt;
54566247fbbSLeon Romanovsky 	u32 out[MLX5_ST_SZ_DW(query_q_counter_out)] = {};
54666247fbbSLeon Romanovsky 	u32 in[MLX5_ST_SZ_DW(query_q_counter_in)] = {};
54766247fbbSLeon Romanovsky 	int ret;
54819386177SKamal Heib 
54966247fbbSLeon Romanovsky 	MLX5_SET(query_q_counter_in, in, opcode, MLX5_CMD_OP_QUERY_Q_COUNTER);
55066247fbbSLeon Romanovsky 
55166247fbbSLeon Romanovsky 	if (priv->q_counter) {
55266247fbbSLeon Romanovsky 		MLX5_SET(query_q_counter_in, in, counter_set_id,
55366247fbbSLeon Romanovsky 			 priv->q_counter);
55466247fbbSLeon Romanovsky 		ret = mlx5_cmd_exec_inout(priv->mdev, query_q_counter, in, out);
55566247fbbSLeon Romanovsky 		if (!ret)
5567cbaf9a3SMoshe Shemesh 			qcnt->rx_out_of_buffer = MLX5_GET(query_q_counter_out,
5577cbaf9a3SMoshe Shemesh 							  out, out_of_buffer);
55866247fbbSLeon Romanovsky 	}
55966247fbbSLeon Romanovsky 
56066247fbbSLeon Romanovsky 	if (priv->drop_rq_q_counter) {
56166247fbbSLeon Romanovsky 		MLX5_SET(query_q_counter_in, in, counter_set_id,
56266247fbbSLeon Romanovsky 			 priv->drop_rq_q_counter);
56366247fbbSLeon Romanovsky 		ret = mlx5_cmd_exec_inout(priv->mdev, query_q_counter, in, out);
56466247fbbSLeon Romanovsky 		if (!ret)
56566247fbbSLeon Romanovsky 			qcnt->rx_if_down_packets = MLX5_GET(query_q_counter_out,
56666247fbbSLeon Romanovsky 							    out, out_of_buffer);
56766247fbbSLeon Romanovsky 	}
56819386177SKamal Heib }
56919386177SKamal Heib 
5705c298143SMoshe Shemesh #define VNIC_ENV_OFF(c) MLX5_BYTE_OFF(query_vnic_env_out, c)
5710cfafd4bSMoshe Shemesh static const struct counter_desc vnic_env_stats_steer_desc[] = {
5725c298143SMoshe Shemesh 	{ "rx_steer_missed_packets",
5735c298143SMoshe Shemesh 		VNIC_ENV_OFF(vport_env.nic_receive_steering_discard) },
5745c298143SMoshe Shemesh };
5755c298143SMoshe Shemesh 
5760cfafd4bSMoshe Shemesh static const struct counter_desc vnic_env_stats_dev_oob_desc[] = {
5770cfafd4bSMoshe Shemesh 	{ "dev_internal_queue_oob",
5780cfafd4bSMoshe Shemesh 		VNIC_ENV_OFF(vport_env.internal_rq_out_of_buffer) },
5790cfafd4bSMoshe Shemesh };
5800cfafd4bSMoshe Shemesh 
5810cfafd4bSMoshe Shemesh #define NUM_VNIC_ENV_STEER_COUNTERS(dev) \
5820cfafd4bSMoshe Shemesh 	(MLX5_CAP_GEN(dev, nic_receive_steering_discard) ? \
5830cfafd4bSMoshe Shemesh 	 ARRAY_SIZE(vnic_env_stats_steer_desc) : 0)
5840cfafd4bSMoshe Shemesh #define NUM_VNIC_ENV_DEV_OOB_COUNTERS(dev) \
5850cfafd4bSMoshe Shemesh 	(MLX5_CAP_GEN(dev, vnic_env_int_rq_oob) ? \
5860cfafd4bSMoshe Shemesh 	 ARRAY_SIZE(vnic_env_stats_dev_oob_desc) : 0)
5875c298143SMoshe Shemesh 
58896b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(vnic_env)
5895c298143SMoshe Shemesh {
5900cfafd4bSMoshe Shemesh 	return NUM_VNIC_ENV_STEER_COUNTERS(priv->mdev) +
5910cfafd4bSMoshe Shemesh 		NUM_VNIC_ENV_DEV_OOB_COUNTERS(priv->mdev);
5925c298143SMoshe Shemesh }
5935c298143SMoshe Shemesh 
59496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(vnic_env)
5955c298143SMoshe Shemesh {
5965c298143SMoshe Shemesh 	int i;
5975c298143SMoshe Shemesh 
5980cfafd4bSMoshe Shemesh 	for (i = 0; i < NUM_VNIC_ENV_STEER_COUNTERS(priv->mdev); i++)
5995c298143SMoshe Shemesh 		strcpy(data + (idx++) * ETH_GSTRING_LEN,
6000cfafd4bSMoshe Shemesh 		       vnic_env_stats_steer_desc[i].format);
6010cfafd4bSMoshe Shemesh 
6020cfafd4bSMoshe Shemesh 	for (i = 0; i < NUM_VNIC_ENV_DEV_OOB_COUNTERS(priv->mdev); i++)
6030cfafd4bSMoshe Shemesh 		strcpy(data + (idx++) * ETH_GSTRING_LEN,
6040cfafd4bSMoshe Shemesh 		       vnic_env_stats_dev_oob_desc[i].format);
6055c298143SMoshe Shemesh 	return idx;
6065c298143SMoshe Shemesh }
6075c298143SMoshe Shemesh 
60896b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(vnic_env)
6095c298143SMoshe Shemesh {
6105c298143SMoshe Shemesh 	int i;
6115c298143SMoshe Shemesh 
6120cfafd4bSMoshe Shemesh 	for (i = 0; i < NUM_VNIC_ENV_STEER_COUNTERS(priv->mdev); i++)
6135c298143SMoshe Shemesh 		data[idx++] = MLX5E_READ_CTR64_BE(priv->stats.vnic.query_vnic_env_out,
6140cfafd4bSMoshe Shemesh 						  vnic_env_stats_steer_desc, i);
6150cfafd4bSMoshe Shemesh 
6160cfafd4bSMoshe Shemesh 	for (i = 0; i < NUM_VNIC_ENV_DEV_OOB_COUNTERS(priv->mdev); i++)
6170cfafd4bSMoshe Shemesh 		data[idx++] = MLX5E_READ_CTR32_BE(priv->stats.vnic.query_vnic_env_out,
6180cfafd4bSMoshe Shemesh 						  vnic_env_stats_dev_oob_desc, i);
6195c298143SMoshe Shemesh 	return idx;
6205c298143SMoshe Shemesh }
6215c298143SMoshe Shemesh 
62296b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(vnic_env)
6235c298143SMoshe Shemesh {
6245c298143SMoshe Shemesh 	u32 *out = (u32 *)priv->stats.vnic.query_vnic_env_out;
625a184cda1SLeon Romanovsky 	u32 in[MLX5_ST_SZ_DW(query_vnic_env_in)] = {};
6265c298143SMoshe Shemesh 	struct mlx5_core_dev *mdev = priv->mdev;
6275c298143SMoshe Shemesh 
6285c298143SMoshe Shemesh 	if (!MLX5_CAP_GEN(priv->mdev, nic_receive_steering_discard))
6295c298143SMoshe Shemesh 		return;
6305c298143SMoshe Shemesh 
631a184cda1SLeon Romanovsky 	MLX5_SET(query_vnic_env_in, in, opcode, MLX5_CMD_OP_QUERY_VNIC_ENV);
632a184cda1SLeon Romanovsky 	mlx5_cmd_exec_inout(mdev, query_vnic_env, in, out);
6335c298143SMoshe Shemesh }
6345c298143SMoshe Shemesh 
63540cab9f1SKamal Heib #define VPORT_COUNTER_OFF(c) MLX5_BYTE_OFF(query_vport_counter_out, c)
63640cab9f1SKamal Heib static const struct counter_desc vport_stats_desc[] = {
63740cab9f1SKamal Heib 	{ "rx_vport_unicast_packets",
63840cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_eth_unicast.packets) },
63940cab9f1SKamal Heib 	{ "rx_vport_unicast_bytes",
64040cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_eth_unicast.octets) },
64140cab9f1SKamal Heib 	{ "tx_vport_unicast_packets",
64240cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_eth_unicast.packets) },
64340cab9f1SKamal Heib 	{ "tx_vport_unicast_bytes",
64440cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_eth_unicast.octets) },
64540cab9f1SKamal Heib 	{ "rx_vport_multicast_packets",
64640cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_eth_multicast.packets) },
64740cab9f1SKamal Heib 	{ "rx_vport_multicast_bytes",
64840cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_eth_multicast.octets) },
64940cab9f1SKamal Heib 	{ "tx_vport_multicast_packets",
65040cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_eth_multicast.packets) },
65140cab9f1SKamal Heib 	{ "tx_vport_multicast_bytes",
65240cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_eth_multicast.octets) },
65340cab9f1SKamal Heib 	{ "rx_vport_broadcast_packets",
65440cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_eth_broadcast.packets) },
65540cab9f1SKamal Heib 	{ "rx_vport_broadcast_bytes",
65640cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_eth_broadcast.octets) },
65740cab9f1SKamal Heib 	{ "tx_vport_broadcast_packets",
65840cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_eth_broadcast.packets) },
65940cab9f1SKamal Heib 	{ "tx_vport_broadcast_bytes",
66040cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_eth_broadcast.octets) },
66140cab9f1SKamal Heib 	{ "rx_vport_rdma_unicast_packets",
66240cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_ib_unicast.packets) },
66340cab9f1SKamal Heib 	{ "rx_vport_rdma_unicast_bytes",
66440cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_ib_unicast.octets) },
66540cab9f1SKamal Heib 	{ "tx_vport_rdma_unicast_packets",
66640cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_ib_unicast.packets) },
66740cab9f1SKamal Heib 	{ "tx_vport_rdma_unicast_bytes",
66840cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_ib_unicast.octets) },
66940cab9f1SKamal Heib 	{ "rx_vport_rdma_multicast_packets",
67040cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_ib_multicast.packets) },
67140cab9f1SKamal Heib 	{ "rx_vport_rdma_multicast_bytes",
67240cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_ib_multicast.octets) },
67340cab9f1SKamal Heib 	{ "tx_vport_rdma_multicast_packets",
67440cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_ib_multicast.packets) },
67540cab9f1SKamal Heib 	{ "tx_vport_rdma_multicast_bytes",
67640cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_ib_multicast.octets) },
67740cab9f1SKamal Heib };
67840cab9f1SKamal Heib 
67940cab9f1SKamal Heib #define NUM_VPORT_COUNTERS		ARRAY_SIZE(vport_stats_desc)
68040cab9f1SKamal Heib 
68196b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(vport)
68240cab9f1SKamal Heib {
68340cab9f1SKamal Heib 	return NUM_VPORT_COUNTERS;
68440cab9f1SKamal Heib }
68540cab9f1SKamal Heib 
68696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(vport)
68740cab9f1SKamal Heib {
68840cab9f1SKamal Heib 	int i;
68940cab9f1SKamal Heib 
69040cab9f1SKamal Heib 	for (i = 0; i < NUM_VPORT_COUNTERS; i++)
69140cab9f1SKamal Heib 		strcpy(data + (idx++) * ETH_GSTRING_LEN, vport_stats_desc[i].format);
69240cab9f1SKamal Heib 	return idx;
69340cab9f1SKamal Heib }
69440cab9f1SKamal Heib 
69596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(vport)
69640cab9f1SKamal Heib {
69740cab9f1SKamal Heib 	int i;
69840cab9f1SKamal Heib 
69940cab9f1SKamal Heib 	for (i = 0; i < NUM_VPORT_COUNTERS; i++)
70040cab9f1SKamal Heib 		data[idx++] = MLX5E_READ_CTR64_BE(priv->stats.vport.query_vport_out,
70140cab9f1SKamal Heib 						  vport_stats_desc, i);
70240cab9f1SKamal Heib 	return idx;
70340cab9f1SKamal Heib }
70440cab9f1SKamal Heib 
70596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(vport)
70619386177SKamal Heib {
70719386177SKamal Heib 	u32 *out = (u32 *)priv->stats.vport.query_vport_out;
708a184cda1SLeon Romanovsky 	u32 in[MLX5_ST_SZ_DW(query_vport_counter_in)] = {};
70919386177SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
71019386177SKamal Heib 
71119386177SKamal Heib 	MLX5_SET(query_vport_counter_in, in, opcode, MLX5_CMD_OP_QUERY_VPORT_COUNTER);
712a184cda1SLeon Romanovsky 	mlx5_cmd_exec_inout(mdev, query_vport_counter, in, out);
71319386177SKamal Heib }
71419386177SKamal Heib 
7156e6ef814SKamal Heib #define PPORT_802_3_OFF(c) \
7166e6ef814SKamal Heib 	MLX5_BYTE_OFF(ppcnt_reg, \
7176e6ef814SKamal Heib 		      counter_set.eth_802_3_cntrs_grp_data_layout.c##_high)
7186e6ef814SKamal Heib static const struct counter_desc pport_802_3_stats_desc[] = {
7196e6ef814SKamal Heib 	{ "tx_packets_phy", PPORT_802_3_OFF(a_frames_transmitted_ok) },
7206e6ef814SKamal Heib 	{ "rx_packets_phy", PPORT_802_3_OFF(a_frames_received_ok) },
7216e6ef814SKamal Heib 	{ "rx_crc_errors_phy", PPORT_802_3_OFF(a_frame_check_sequence_errors) },
7226e6ef814SKamal Heib 	{ "tx_bytes_phy", PPORT_802_3_OFF(a_octets_transmitted_ok) },
7236e6ef814SKamal Heib 	{ "rx_bytes_phy", PPORT_802_3_OFF(a_octets_received_ok) },
7246e6ef814SKamal Heib 	{ "tx_multicast_phy", PPORT_802_3_OFF(a_multicast_frames_xmitted_ok) },
7256e6ef814SKamal Heib 	{ "tx_broadcast_phy", PPORT_802_3_OFF(a_broadcast_frames_xmitted_ok) },
7266e6ef814SKamal Heib 	{ "rx_multicast_phy", PPORT_802_3_OFF(a_multicast_frames_received_ok) },
7276e6ef814SKamal Heib 	{ "rx_broadcast_phy", PPORT_802_3_OFF(a_broadcast_frames_received_ok) },
7286e6ef814SKamal Heib 	{ "rx_in_range_len_errors_phy", PPORT_802_3_OFF(a_in_range_length_errors) },
7296e6ef814SKamal Heib 	{ "rx_out_of_range_len_phy", PPORT_802_3_OFF(a_out_of_range_length_field) },
7306e6ef814SKamal Heib 	{ "rx_oversize_pkts_phy", PPORT_802_3_OFF(a_frame_too_long_errors) },
7316e6ef814SKamal Heib 	{ "rx_symbol_err_phy", PPORT_802_3_OFF(a_symbol_error_during_carrier) },
7326e6ef814SKamal Heib 	{ "tx_mac_control_phy", PPORT_802_3_OFF(a_mac_control_frames_transmitted) },
7336e6ef814SKamal Heib 	{ "rx_mac_control_phy", PPORT_802_3_OFF(a_mac_control_frames_received) },
7346e6ef814SKamal Heib 	{ "rx_unsupported_op_phy", PPORT_802_3_OFF(a_unsupported_opcodes_received) },
7356e6ef814SKamal Heib 	{ "rx_pause_ctrl_phy", PPORT_802_3_OFF(a_pause_mac_ctrl_frames_received) },
7366e6ef814SKamal Heib 	{ "tx_pause_ctrl_phy", PPORT_802_3_OFF(a_pause_mac_ctrl_frames_transmitted) },
7376e6ef814SKamal Heib };
7386e6ef814SKamal Heib 
7396e6ef814SKamal Heib #define NUM_PPORT_802_3_COUNTERS	ARRAY_SIZE(pport_802_3_stats_desc)
7406e6ef814SKamal Heib 
74196b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(802_3)
7426e6ef814SKamal Heib {
7436e6ef814SKamal Heib 	return NUM_PPORT_802_3_COUNTERS;
7446e6ef814SKamal Heib }
7456e6ef814SKamal Heib 
74696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(802_3)
7476e6ef814SKamal Heib {
7486e6ef814SKamal Heib 	int i;
7496e6ef814SKamal Heib 
7506e6ef814SKamal Heib 	for (i = 0; i < NUM_PPORT_802_3_COUNTERS; i++)
7516e6ef814SKamal Heib 		strcpy(data + (idx++) * ETH_GSTRING_LEN, pport_802_3_stats_desc[i].format);
7526e6ef814SKamal Heib 	return idx;
7536e6ef814SKamal Heib }
7546e6ef814SKamal Heib 
75596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(802_3)
7566e6ef814SKamal Heib {
7576e6ef814SKamal Heib 	int i;
7586e6ef814SKamal Heib 
7596e6ef814SKamal Heib 	for (i = 0; i < NUM_PPORT_802_3_COUNTERS; i++)
7606e6ef814SKamal Heib 		data[idx++] = MLX5E_READ_CTR64_BE(&priv->stats.pport.IEEE_802_3_counters,
7616e6ef814SKamal Heib 						  pport_802_3_stats_desc, i);
7626e6ef814SKamal Heib 	return idx;
7636e6ef814SKamal Heib }
7646e6ef814SKamal Heib 
76575370eb0SEyal Davidovich #define MLX5_BASIC_PPCNT_SUPPORTED(mdev) \
76675370eb0SEyal Davidovich 	(MLX5_CAP_GEN(mdev, pcam_reg) ? MLX5_CAP_PCAM_REG(mdev, ppcnt) : 1)
76775370eb0SEyal Davidovich 
7687c453526SVlad Buslov static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(802_3)
76919386177SKamal Heib {
77019386177SKamal Heib 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
77119386177SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
77219386177SKamal Heib 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
77319386177SKamal Heib 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
77419386177SKamal Heib 	void *out;
77519386177SKamal Heib 
77675370eb0SEyal Davidovich 	if (!MLX5_BASIC_PPCNT_SUPPORTED(mdev))
77775370eb0SEyal Davidovich 		return;
77875370eb0SEyal Davidovich 
77919386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, local_port, 1);
78019386177SKamal Heib 	out = pstats->IEEE_802_3_counters;
78119386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, grp, MLX5_IEEE_802_3_COUNTERS_GROUP);
78219386177SKamal Heib 	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
78319386177SKamal Heib }
78419386177SKamal Heib 
7851703bb50SJakub Kicinski #define MLX5E_READ_CTR64_BE_F(ptr, set, c)		\
786098d9ed9SJakub Kicinski 	be64_to_cpu(*(__be64 *)((char *)ptr +		\
787098d9ed9SJakub Kicinski 		MLX5_BYTE_OFF(ppcnt_reg,		\
7881703bb50SJakub Kicinski 			      counter_set.set.c##_high)))
789098d9ed9SJakub Kicinski 
790b572ec9fSJakub Kicinski static int mlx5e_stats_get_ieee(struct mlx5_core_dev *mdev,
791b572ec9fSJakub Kicinski 				u32 *ppcnt_ieee_802_3)
792b572ec9fSJakub Kicinski {
793b572ec9fSJakub Kicinski 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {};
794b572ec9fSJakub Kicinski 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
795b572ec9fSJakub Kicinski 
796b572ec9fSJakub Kicinski 	if (!MLX5_BASIC_PPCNT_SUPPORTED(mdev))
797b572ec9fSJakub Kicinski 		return -EOPNOTSUPP;
798b572ec9fSJakub Kicinski 
799b572ec9fSJakub Kicinski 	MLX5_SET(ppcnt_reg, in, local_port, 1);
800b572ec9fSJakub Kicinski 	MLX5_SET(ppcnt_reg, in, grp, MLX5_IEEE_802_3_COUNTERS_GROUP);
801b572ec9fSJakub Kicinski 	return mlx5_core_access_reg(mdev, in, sz, ppcnt_ieee_802_3,
802b572ec9fSJakub Kicinski 				    sz, MLX5_REG_PPCNT, 0, 0);
803b572ec9fSJakub Kicinski }
804b572ec9fSJakub Kicinski 
805098d9ed9SJakub Kicinski void mlx5e_stats_pause_get(struct mlx5e_priv *priv,
806098d9ed9SJakub Kicinski 			   struct ethtool_pause_stats *pause_stats)
807098d9ed9SJakub Kicinski {
808098d9ed9SJakub Kicinski 	u32 ppcnt_ieee_802_3[MLX5_ST_SZ_DW(ppcnt_reg)];
809098d9ed9SJakub Kicinski 	struct mlx5_core_dev *mdev = priv->mdev;
810098d9ed9SJakub Kicinski 
811b572ec9fSJakub Kicinski 	if (mlx5e_stats_get_ieee(mdev, ppcnt_ieee_802_3))
812098d9ed9SJakub Kicinski 		return;
813098d9ed9SJakub Kicinski 
814098d9ed9SJakub Kicinski 	pause_stats->tx_pause_frames =
815098d9ed9SJakub Kicinski 		MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3,
8161703bb50SJakub Kicinski 				      eth_802_3_cntrs_grp_data_layout,
817098d9ed9SJakub Kicinski 				      a_pause_mac_ctrl_frames_transmitted);
818098d9ed9SJakub Kicinski 	pause_stats->rx_pause_frames =
819098d9ed9SJakub Kicinski 		MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3,
8201703bb50SJakub Kicinski 				      eth_802_3_cntrs_grp_data_layout,
821098d9ed9SJakub Kicinski 				      a_pause_mac_ctrl_frames_received);
822098d9ed9SJakub Kicinski }
823098d9ed9SJakub Kicinski 
824b572ec9fSJakub Kicinski void mlx5e_stats_eth_phy_get(struct mlx5e_priv *priv,
825b572ec9fSJakub Kicinski 			     struct ethtool_eth_phy_stats *phy_stats)
826b572ec9fSJakub Kicinski {
827b572ec9fSJakub Kicinski 	u32 ppcnt_ieee_802_3[MLX5_ST_SZ_DW(ppcnt_reg)];
828b572ec9fSJakub Kicinski 	struct mlx5_core_dev *mdev = priv->mdev;
829b572ec9fSJakub Kicinski 
830b572ec9fSJakub Kicinski 	if (mlx5e_stats_get_ieee(mdev, ppcnt_ieee_802_3))
831b572ec9fSJakub Kicinski 		return;
832b572ec9fSJakub Kicinski 
833b572ec9fSJakub Kicinski 	phy_stats->SymbolErrorDuringCarrier =
834b572ec9fSJakub Kicinski 		MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3,
835b572ec9fSJakub Kicinski 				      eth_802_3_cntrs_grp_data_layout,
836b572ec9fSJakub Kicinski 				      a_symbol_error_during_carrier);
837b572ec9fSJakub Kicinski }
838b572ec9fSJakub Kicinski 
839b572ec9fSJakub Kicinski void mlx5e_stats_eth_mac_get(struct mlx5e_priv *priv,
840b572ec9fSJakub Kicinski 			     struct ethtool_eth_mac_stats *mac_stats)
841b572ec9fSJakub Kicinski {
842b572ec9fSJakub Kicinski 	u32 ppcnt_ieee_802_3[MLX5_ST_SZ_DW(ppcnt_reg)];
843b572ec9fSJakub Kicinski 	struct mlx5_core_dev *mdev = priv->mdev;
844b572ec9fSJakub Kicinski 
845b572ec9fSJakub Kicinski 	if (mlx5e_stats_get_ieee(mdev, ppcnt_ieee_802_3))
846b572ec9fSJakub Kicinski 		return;
847b572ec9fSJakub Kicinski 
848b572ec9fSJakub Kicinski #define RD(name)							\
849b572ec9fSJakub Kicinski 	MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3,				\
850b572ec9fSJakub Kicinski 			      eth_802_3_cntrs_grp_data_layout,		\
851b572ec9fSJakub Kicinski 			      name)
852b572ec9fSJakub Kicinski 
853b572ec9fSJakub Kicinski 	mac_stats->FramesTransmittedOK	= RD(a_frames_transmitted_ok);
854b572ec9fSJakub Kicinski 	mac_stats->FramesReceivedOK	= RD(a_frames_received_ok);
855b572ec9fSJakub Kicinski 	mac_stats->FrameCheckSequenceErrors = RD(a_frame_check_sequence_errors);
856b572ec9fSJakub Kicinski 	mac_stats->OctetsTransmittedOK	= RD(a_octets_transmitted_ok);
857b572ec9fSJakub Kicinski 	mac_stats->OctetsReceivedOK	= RD(a_octets_received_ok);
858b572ec9fSJakub Kicinski 	mac_stats->MulticastFramesXmittedOK = RD(a_multicast_frames_xmitted_ok);
859b572ec9fSJakub Kicinski 	mac_stats->BroadcastFramesXmittedOK = RD(a_broadcast_frames_xmitted_ok);
860b572ec9fSJakub Kicinski 	mac_stats->MulticastFramesReceivedOK = RD(a_multicast_frames_received_ok);
861b572ec9fSJakub Kicinski 	mac_stats->BroadcastFramesReceivedOK = RD(a_broadcast_frames_received_ok);
862b572ec9fSJakub Kicinski 	mac_stats->InRangeLengthErrors	= RD(a_in_range_length_errors);
863b572ec9fSJakub Kicinski 	mac_stats->OutOfRangeLengthField = RD(a_out_of_range_length_field);
864b572ec9fSJakub Kicinski 	mac_stats->FrameTooLongErrors	= RD(a_frame_too_long_errors);
865b572ec9fSJakub Kicinski #undef RD
866b572ec9fSJakub Kicinski }
867b572ec9fSJakub Kicinski 
868b572ec9fSJakub Kicinski void mlx5e_stats_eth_ctrl_get(struct mlx5e_priv *priv,
869b572ec9fSJakub Kicinski 			      struct ethtool_eth_ctrl_stats *ctrl_stats)
870b572ec9fSJakub Kicinski {
871b572ec9fSJakub Kicinski 	u32 ppcnt_ieee_802_3[MLX5_ST_SZ_DW(ppcnt_reg)];
872b572ec9fSJakub Kicinski 	struct mlx5_core_dev *mdev = priv->mdev;
873b572ec9fSJakub Kicinski 
874b572ec9fSJakub Kicinski 	if (mlx5e_stats_get_ieee(mdev, ppcnt_ieee_802_3))
875b572ec9fSJakub Kicinski 		return;
876b572ec9fSJakub Kicinski 
877b572ec9fSJakub Kicinski 	ctrl_stats->MACControlFramesTransmitted =
878b572ec9fSJakub Kicinski 		MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3,
879b572ec9fSJakub Kicinski 				      eth_802_3_cntrs_grp_data_layout,
880b572ec9fSJakub Kicinski 				      a_mac_control_frames_transmitted);
881b572ec9fSJakub Kicinski 	ctrl_stats->MACControlFramesReceived =
882b572ec9fSJakub Kicinski 		MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3,
883b572ec9fSJakub Kicinski 				      eth_802_3_cntrs_grp_data_layout,
884b572ec9fSJakub Kicinski 				      a_mac_control_frames_received);
885b572ec9fSJakub Kicinski 	ctrl_stats->UnsupportedOpcodesReceived =
886b572ec9fSJakub Kicinski 		MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3,
887b572ec9fSJakub Kicinski 				      eth_802_3_cntrs_grp_data_layout,
888b572ec9fSJakub Kicinski 				      a_unsupported_opcodes_received);
889b572ec9fSJakub Kicinski }
890b572ec9fSJakub Kicinski 
891fc8e64a3SKamal Heib #define PPORT_2863_OFF(c) \
892fc8e64a3SKamal Heib 	MLX5_BYTE_OFF(ppcnt_reg, \
893fc8e64a3SKamal Heib 		      counter_set.eth_2863_cntrs_grp_data_layout.c##_high)
894fc8e64a3SKamal Heib static const struct counter_desc pport_2863_stats_desc[] = {
895fc8e64a3SKamal Heib 	{ "rx_discards_phy", PPORT_2863_OFF(if_in_discards) },
896fc8e64a3SKamal Heib 	{ "tx_discards_phy", PPORT_2863_OFF(if_out_discards) },
897fc8e64a3SKamal Heib 	{ "tx_errors_phy", PPORT_2863_OFF(if_out_errors) },
898fc8e64a3SKamal Heib };
899fc8e64a3SKamal Heib 
900fc8e64a3SKamal Heib #define NUM_PPORT_2863_COUNTERS		ARRAY_SIZE(pport_2863_stats_desc)
901fc8e64a3SKamal Heib 
90296b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(2863)
903fc8e64a3SKamal Heib {
904fc8e64a3SKamal Heib 	return NUM_PPORT_2863_COUNTERS;
905fc8e64a3SKamal Heib }
906fc8e64a3SKamal Heib 
90796b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(2863)
908fc8e64a3SKamal Heib {
909fc8e64a3SKamal Heib 	int i;
910fc8e64a3SKamal Heib 
911fc8e64a3SKamal Heib 	for (i = 0; i < NUM_PPORT_2863_COUNTERS; i++)
912fc8e64a3SKamal Heib 		strcpy(data + (idx++) * ETH_GSTRING_LEN, pport_2863_stats_desc[i].format);
913fc8e64a3SKamal Heib 	return idx;
914fc8e64a3SKamal Heib }
915fc8e64a3SKamal Heib 
91696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(2863)
917fc8e64a3SKamal Heib {
918fc8e64a3SKamal Heib 	int i;
919fc8e64a3SKamal Heib 
920fc8e64a3SKamal Heib 	for (i = 0; i < NUM_PPORT_2863_COUNTERS; i++)
921fc8e64a3SKamal Heib 		data[idx++] = MLX5E_READ_CTR64_BE(&priv->stats.pport.RFC_2863_counters,
922fc8e64a3SKamal Heib 						  pport_2863_stats_desc, i);
923fc8e64a3SKamal Heib 	return idx;
924fc8e64a3SKamal Heib }
925fc8e64a3SKamal Heib 
92696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(2863)
92719386177SKamal Heib {
92819386177SKamal Heib 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
92919386177SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
93019386177SKamal Heib 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
93119386177SKamal Heib 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
93219386177SKamal Heib 	void *out;
93319386177SKamal Heib 
93419386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, local_port, 1);
93519386177SKamal Heib 	out = pstats->RFC_2863_counters;
93619386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, grp, MLX5_RFC_2863_COUNTERS_GROUP);
93719386177SKamal Heib 	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
93819386177SKamal Heib }
93919386177SKamal Heib 
940e0e0def9SKamal Heib #define PPORT_2819_OFF(c) \
941e0e0def9SKamal Heib 	MLX5_BYTE_OFF(ppcnt_reg, \
942e0e0def9SKamal Heib 		      counter_set.eth_2819_cntrs_grp_data_layout.c##_high)
943e0e0def9SKamal Heib static const struct counter_desc pport_2819_stats_desc[] = {
944e0e0def9SKamal Heib 	{ "rx_undersize_pkts_phy", PPORT_2819_OFF(ether_stats_undersize_pkts) },
945e0e0def9SKamal Heib 	{ "rx_fragments_phy", PPORT_2819_OFF(ether_stats_fragments) },
946e0e0def9SKamal Heib 	{ "rx_jabbers_phy", PPORT_2819_OFF(ether_stats_jabbers) },
947e0e0def9SKamal Heib 	{ "rx_64_bytes_phy", PPORT_2819_OFF(ether_stats_pkts64octets) },
948e0e0def9SKamal Heib 	{ "rx_65_to_127_bytes_phy", PPORT_2819_OFF(ether_stats_pkts65to127octets) },
949e0e0def9SKamal Heib 	{ "rx_128_to_255_bytes_phy", PPORT_2819_OFF(ether_stats_pkts128to255octets) },
950e0e0def9SKamal Heib 	{ "rx_256_to_511_bytes_phy", PPORT_2819_OFF(ether_stats_pkts256to511octets) },
951e0e0def9SKamal Heib 	{ "rx_512_to_1023_bytes_phy", PPORT_2819_OFF(ether_stats_pkts512to1023octets) },
952e0e0def9SKamal Heib 	{ "rx_1024_to_1518_bytes_phy", PPORT_2819_OFF(ether_stats_pkts1024to1518octets) },
953e0e0def9SKamal Heib 	{ "rx_1519_to_2047_bytes_phy", PPORT_2819_OFF(ether_stats_pkts1519to2047octets) },
954e0e0def9SKamal Heib 	{ "rx_2048_to_4095_bytes_phy", PPORT_2819_OFF(ether_stats_pkts2048to4095octets) },
955e0e0def9SKamal Heib 	{ "rx_4096_to_8191_bytes_phy", PPORT_2819_OFF(ether_stats_pkts4096to8191octets) },
956e0e0def9SKamal Heib 	{ "rx_8192_to_10239_bytes_phy", PPORT_2819_OFF(ether_stats_pkts8192to10239octets) },
957e0e0def9SKamal Heib };
958e0e0def9SKamal Heib 
959e0e0def9SKamal Heib #define NUM_PPORT_2819_COUNTERS		ARRAY_SIZE(pport_2819_stats_desc)
960e0e0def9SKamal Heib 
96196b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(2819)
962e0e0def9SKamal Heib {
963e0e0def9SKamal Heib 	return NUM_PPORT_2819_COUNTERS;
964e0e0def9SKamal Heib }
965e0e0def9SKamal Heib 
96696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(2819)
967e0e0def9SKamal Heib {
968e0e0def9SKamal Heib 	int i;
969e0e0def9SKamal Heib 
970e0e0def9SKamal Heib 	for (i = 0; i < NUM_PPORT_2819_COUNTERS; i++)
971e0e0def9SKamal Heib 		strcpy(data + (idx++) * ETH_GSTRING_LEN, pport_2819_stats_desc[i].format);
972e0e0def9SKamal Heib 	return idx;
973e0e0def9SKamal Heib }
974e0e0def9SKamal Heib 
97596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(2819)
976e0e0def9SKamal Heib {
977e0e0def9SKamal Heib 	int i;
978e0e0def9SKamal Heib 
979e0e0def9SKamal Heib 	for (i = 0; i < NUM_PPORT_2819_COUNTERS; i++)
980e0e0def9SKamal Heib 		data[idx++] = MLX5E_READ_CTR64_BE(&priv->stats.pport.RFC_2819_counters,
981e0e0def9SKamal Heib 						  pport_2819_stats_desc, i);
982e0e0def9SKamal Heib 	return idx;
983e0e0def9SKamal Heib }
984e0e0def9SKamal Heib 
98596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(2819)
98619386177SKamal Heib {
98719386177SKamal Heib 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
98819386177SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
98919386177SKamal Heib 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
99019386177SKamal Heib 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
99119386177SKamal Heib 	void *out;
99219386177SKamal Heib 
99375370eb0SEyal Davidovich 	if (!MLX5_BASIC_PPCNT_SUPPORTED(mdev))
99475370eb0SEyal Davidovich 		return;
99575370eb0SEyal Davidovich 
99619386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, local_port, 1);
99719386177SKamal Heib 	out = pstats->RFC_2819_counters;
99819386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, grp, MLX5_RFC_2819_COUNTERS_GROUP);
99919386177SKamal Heib 	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
100019386177SKamal Heib }
100119386177SKamal Heib 
1002b572ec9fSJakub Kicinski static const struct ethtool_rmon_hist_range mlx5e_rmon_ranges[] = {
1003b572ec9fSJakub Kicinski 	{    0,    64 },
1004b572ec9fSJakub Kicinski 	{   65,   127 },
1005b572ec9fSJakub Kicinski 	{  128,   255 },
1006b572ec9fSJakub Kicinski 	{  256,   511 },
1007b572ec9fSJakub Kicinski 	{  512,  1023 },
1008b572ec9fSJakub Kicinski 	{ 1024,  1518 },
1009b572ec9fSJakub Kicinski 	{ 1519,  2047 },
1010b572ec9fSJakub Kicinski 	{ 2048,  4095 },
1011b572ec9fSJakub Kicinski 	{ 4096,  8191 },
1012b572ec9fSJakub Kicinski 	{ 8192, 10239 },
1013b572ec9fSJakub Kicinski 	{}
1014b572ec9fSJakub Kicinski };
1015b572ec9fSJakub Kicinski 
1016b572ec9fSJakub Kicinski void mlx5e_stats_rmon_get(struct mlx5e_priv *priv,
1017b572ec9fSJakub Kicinski 			  struct ethtool_rmon_stats *rmon,
1018b572ec9fSJakub Kicinski 			  const struct ethtool_rmon_hist_range **ranges)
1019b572ec9fSJakub Kicinski {
1020b572ec9fSJakub Kicinski 	u32 ppcnt_RFC_2819_counters[MLX5_ST_SZ_DW(ppcnt_reg)];
1021b572ec9fSJakub Kicinski 	struct mlx5_core_dev *mdev = priv->mdev;
1022b572ec9fSJakub Kicinski 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
1023b572ec9fSJakub Kicinski 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
1024b572ec9fSJakub Kicinski 
1025b572ec9fSJakub Kicinski 	MLX5_SET(ppcnt_reg, in, local_port, 1);
1026b572ec9fSJakub Kicinski 	MLX5_SET(ppcnt_reg, in, grp, MLX5_RFC_2819_COUNTERS_GROUP);
1027b572ec9fSJakub Kicinski 	if (mlx5_core_access_reg(mdev, in, sz, ppcnt_RFC_2819_counters,
1028b572ec9fSJakub Kicinski 				 sz, MLX5_REG_PPCNT, 0, 0))
1029b572ec9fSJakub Kicinski 		return;
1030b572ec9fSJakub Kicinski 
1031b572ec9fSJakub Kicinski #define RD(name)						\
1032b572ec9fSJakub Kicinski 	MLX5E_READ_CTR64_BE_F(ppcnt_RFC_2819_counters,		\
1033b572ec9fSJakub Kicinski 			      eth_2819_cntrs_grp_data_layout,	\
1034b572ec9fSJakub Kicinski 			      name)
1035b572ec9fSJakub Kicinski 
1036b572ec9fSJakub Kicinski 	rmon->undersize_pkts	= RD(ether_stats_undersize_pkts);
1037b572ec9fSJakub Kicinski 	rmon->fragments		= RD(ether_stats_fragments);
1038b572ec9fSJakub Kicinski 	rmon->jabbers		= RD(ether_stats_jabbers);
1039b572ec9fSJakub Kicinski 
1040b572ec9fSJakub Kicinski 	rmon->hist[0]		= RD(ether_stats_pkts64octets);
1041b572ec9fSJakub Kicinski 	rmon->hist[1]		= RD(ether_stats_pkts65to127octets);
1042b572ec9fSJakub Kicinski 	rmon->hist[2]		= RD(ether_stats_pkts128to255octets);
1043b572ec9fSJakub Kicinski 	rmon->hist[3]		= RD(ether_stats_pkts256to511octets);
1044b572ec9fSJakub Kicinski 	rmon->hist[4]		= RD(ether_stats_pkts512to1023octets);
1045b572ec9fSJakub Kicinski 	rmon->hist[5]		= RD(ether_stats_pkts1024to1518octets);
1046b572ec9fSJakub Kicinski 	rmon->hist[6]		= RD(ether_stats_pkts1519to2047octets);
1047b572ec9fSJakub Kicinski 	rmon->hist[7]		= RD(ether_stats_pkts2048to4095octets);
1048b572ec9fSJakub Kicinski 	rmon->hist[8]		= RD(ether_stats_pkts4096to8191octets);
1049b572ec9fSJakub Kicinski 	rmon->hist[9]		= RD(ether_stats_pkts8192to10239octets);
1050b572ec9fSJakub Kicinski #undef RD
1051b572ec9fSJakub Kicinski 
1052b572ec9fSJakub Kicinski 	*ranges = mlx5e_rmon_ranges;
1053b572ec9fSJakub Kicinski }
1054b572ec9fSJakub Kicinski 
10552e4df0b2SKamal Heib #define PPORT_PHY_STATISTICAL_OFF(c) \
10562e4df0b2SKamal Heib 	MLX5_BYTE_OFF(ppcnt_reg, \
10572e4df0b2SKamal Heib 		      counter_set.phys_layer_statistical_cntrs.c##_high)
10582e4df0b2SKamal Heib static const struct counter_desc pport_phy_statistical_stats_desc[] = {
10592e4df0b2SKamal Heib 	{ "rx_pcs_symbol_err_phy", PPORT_PHY_STATISTICAL_OFF(phy_symbol_errors) },
10602e4df0b2SKamal Heib 	{ "rx_corrected_bits_phy", PPORT_PHY_STATISTICAL_OFF(phy_corrected_bits) },
10612e4df0b2SKamal Heib };
10622e4df0b2SKamal Heib 
10634cb4e98eSShay Agroskin static const struct counter_desc
10644cb4e98eSShay Agroskin pport_phy_statistical_err_lanes_stats_desc[] = {
10654cb4e98eSShay Agroskin 	{ "rx_err_lane_0_phy", PPORT_PHY_STATISTICAL_OFF(phy_corrected_bits_lane0) },
10664cb4e98eSShay Agroskin 	{ "rx_err_lane_1_phy", PPORT_PHY_STATISTICAL_OFF(phy_corrected_bits_lane1) },
10674cb4e98eSShay Agroskin 	{ "rx_err_lane_2_phy", PPORT_PHY_STATISTICAL_OFF(phy_corrected_bits_lane2) },
10684cb4e98eSShay Agroskin 	{ "rx_err_lane_3_phy", PPORT_PHY_STATISTICAL_OFF(phy_corrected_bits_lane3) },
10694cb4e98eSShay Agroskin };
10704cb4e98eSShay Agroskin 
10714cb4e98eSShay Agroskin #define NUM_PPORT_PHY_STATISTICAL_COUNTERS \
10724cb4e98eSShay Agroskin 	ARRAY_SIZE(pport_phy_statistical_stats_desc)
10734cb4e98eSShay Agroskin #define NUM_PPORT_PHY_STATISTICAL_PER_LANE_COUNTERS \
10744cb4e98eSShay Agroskin 	ARRAY_SIZE(pport_phy_statistical_err_lanes_stats_desc)
10752e4df0b2SKamal Heib 
107696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(phy)
10772e4df0b2SKamal Heib {
10784cb4e98eSShay Agroskin 	struct mlx5_core_dev *mdev = priv->mdev;
10794cb4e98eSShay Agroskin 	int num_stats;
10804cb4e98eSShay Agroskin 
10816ab75516SSaeed Mahameed 	/* "1" for link_down_events special counter */
10824cb4e98eSShay Agroskin 	num_stats = 1;
10834cb4e98eSShay Agroskin 
10844cb4e98eSShay Agroskin 	num_stats += MLX5_CAP_PCAM_FEATURE(mdev, ppcnt_statistical_group) ?
10854cb4e98eSShay Agroskin 		     NUM_PPORT_PHY_STATISTICAL_COUNTERS : 0;
10864cb4e98eSShay Agroskin 
10874cb4e98eSShay Agroskin 	num_stats += MLX5_CAP_PCAM_FEATURE(mdev, per_lane_error_counters) ?
10884cb4e98eSShay Agroskin 		     NUM_PPORT_PHY_STATISTICAL_PER_LANE_COUNTERS : 0;
10894cb4e98eSShay Agroskin 
10904cb4e98eSShay Agroskin 	return num_stats;
10912e4df0b2SKamal Heib }
10922e4df0b2SKamal Heib 
109396b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(phy)
10942e4df0b2SKamal Heib {
10954cb4e98eSShay Agroskin 	struct mlx5_core_dev *mdev = priv->mdev;
10962e4df0b2SKamal Heib 	int i;
10972e4df0b2SKamal Heib 
10986ab75516SSaeed Mahameed 	strcpy(data + (idx++) * ETH_GSTRING_LEN, "link_down_events_phy");
10996ab75516SSaeed Mahameed 
11004cb4e98eSShay Agroskin 	if (!MLX5_CAP_PCAM_FEATURE(mdev, ppcnt_statistical_group))
11016ab75516SSaeed Mahameed 		return idx;
11026ab75516SSaeed Mahameed 
11036ab75516SSaeed Mahameed 	for (i = 0; i < NUM_PPORT_PHY_STATISTICAL_COUNTERS; i++)
11042e4df0b2SKamal Heib 		strcpy(data + (idx++) * ETH_GSTRING_LEN,
11052e4df0b2SKamal Heib 		       pport_phy_statistical_stats_desc[i].format);
11064cb4e98eSShay Agroskin 
11074cb4e98eSShay Agroskin 	if (MLX5_CAP_PCAM_FEATURE(mdev, per_lane_error_counters))
11084cb4e98eSShay Agroskin 		for (i = 0; i < NUM_PPORT_PHY_STATISTICAL_PER_LANE_COUNTERS; i++)
11094cb4e98eSShay Agroskin 			strcpy(data + (idx++) * ETH_GSTRING_LEN,
11104cb4e98eSShay Agroskin 			       pport_phy_statistical_err_lanes_stats_desc[i].format);
11114cb4e98eSShay Agroskin 
11122e4df0b2SKamal Heib 	return idx;
11132e4df0b2SKamal Heib }
11142e4df0b2SKamal Heib 
111596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(phy)
11162e4df0b2SKamal Heib {
11174cb4e98eSShay Agroskin 	struct mlx5_core_dev *mdev = priv->mdev;
11182e4df0b2SKamal Heib 	int i;
11192e4df0b2SKamal Heib 
11206ab75516SSaeed Mahameed 	/* link_down_events_phy has special handling since it is not stored in __be64 format */
11216ab75516SSaeed Mahameed 	data[idx++] = MLX5_GET(ppcnt_reg, priv->stats.pport.phy_counters,
11226ab75516SSaeed Mahameed 			       counter_set.phys_layer_cntrs.link_down_events);
11236ab75516SSaeed Mahameed 
11244cb4e98eSShay Agroskin 	if (!MLX5_CAP_PCAM_FEATURE(mdev, ppcnt_statistical_group))
11256ab75516SSaeed Mahameed 		return idx;
11266ab75516SSaeed Mahameed 
11276ab75516SSaeed Mahameed 	for (i = 0; i < NUM_PPORT_PHY_STATISTICAL_COUNTERS; i++)
11282e4df0b2SKamal Heib 		data[idx++] =
11292e4df0b2SKamal Heib 			MLX5E_READ_CTR64_BE(&priv->stats.pport.phy_statistical_counters,
11302e4df0b2SKamal Heib 					    pport_phy_statistical_stats_desc, i);
11314cb4e98eSShay Agroskin 
11324cb4e98eSShay Agroskin 	if (MLX5_CAP_PCAM_FEATURE(mdev, per_lane_error_counters))
11334cb4e98eSShay Agroskin 		for (i = 0; i < NUM_PPORT_PHY_STATISTICAL_PER_LANE_COUNTERS; i++)
11344cb4e98eSShay Agroskin 			data[idx++] =
11354cb4e98eSShay Agroskin 				MLX5E_READ_CTR64_BE(&priv->stats.pport.phy_statistical_counters,
11364cb4e98eSShay Agroskin 						    pport_phy_statistical_err_lanes_stats_desc,
11374cb4e98eSShay Agroskin 						    i);
11382e4df0b2SKamal Heib 	return idx;
11392e4df0b2SKamal Heib }
11402e4df0b2SKamal Heib 
114196b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(phy)
114219386177SKamal Heib {
114319386177SKamal Heib 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
114419386177SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
114519386177SKamal Heib 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
114619386177SKamal Heib 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
114719386177SKamal Heib 	void *out;
114819386177SKamal Heib 
114919386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, local_port, 1);
115019386177SKamal Heib 	out = pstats->phy_counters;
115119386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, grp, MLX5_PHYSICAL_LAYER_COUNTERS_GROUP);
115219386177SKamal Heib 	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
115319386177SKamal Heib 
115419386177SKamal Heib 	if (!MLX5_CAP_PCAM_FEATURE(mdev, ppcnt_statistical_group))
115519386177SKamal Heib 		return;
115619386177SKamal Heib 
115719386177SKamal Heib 	out = pstats->phy_statistical_counters;
115819386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, grp, MLX5_PHYSICAL_LAYER_STATISTICAL_GROUP);
115919386177SKamal Heib 	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
116019386177SKamal Heib }
116119386177SKamal Heib 
1162*0a1498ebSLama Kayal static int fec_num_lanes(struct mlx5_core_dev *dev)
1163*0a1498ebSLama Kayal {
1164*0a1498ebSLama Kayal 	u32 out[MLX5_ST_SZ_DW(pmlp_reg)] = {};
1165*0a1498ebSLama Kayal 	u32 in[MLX5_ST_SZ_DW(pmlp_reg)] = {};
1166*0a1498ebSLama Kayal 	int err;
1167*0a1498ebSLama Kayal 
1168*0a1498ebSLama Kayal 	MLX5_SET(pmlp_reg, in, local_port, 1);
1169*0a1498ebSLama Kayal 	err = mlx5_core_access_reg(dev, in, sizeof(in), out, sizeof(out),
1170*0a1498ebSLama Kayal 				   MLX5_REG_PMLP, 0, 0);
1171*0a1498ebSLama Kayal 	if (err)
1172*0a1498ebSLama Kayal 		return 0;
1173*0a1498ebSLama Kayal 
1174*0a1498ebSLama Kayal 	return MLX5_GET(pmlp_reg, out, width);
1175*0a1498ebSLama Kayal }
1176*0a1498ebSLama Kayal 
1177*0a1498ebSLama Kayal static int fec_active_mode(struct mlx5_core_dev *mdev)
1178*0a1498ebSLama Kayal {
1179*0a1498ebSLama Kayal 	unsigned long fec_active_long;
1180*0a1498ebSLama Kayal 	u32 fec_active;
1181*0a1498ebSLama Kayal 
1182*0a1498ebSLama Kayal 	if (mlx5e_get_fec_mode(mdev, &fec_active, NULL))
1183*0a1498ebSLama Kayal 		return MLX5E_FEC_NOFEC;
1184*0a1498ebSLama Kayal 
1185*0a1498ebSLama Kayal 	fec_active_long = fec_active;
1186*0a1498ebSLama Kayal 	return find_first_bit(&fec_active_long, sizeof(unsigned long) * BITS_PER_BYTE);
1187*0a1498ebSLama Kayal }
1188*0a1498ebSLama Kayal 
1189*0a1498ebSLama Kayal #define MLX5E_STATS_SET_FEC_BLOCK(idx) ({ \
1190*0a1498ebSLama Kayal 	fec_stats->corrected_blocks.lanes[(idx)] = \
1191*0a1498ebSLama Kayal 		MLX5E_READ_CTR64_BE_F(ppcnt, phys_layer_cntrs, \
1192*0a1498ebSLama Kayal 				      fc_fec_corrected_blocks_lane##idx); \
1193*0a1498ebSLama Kayal 	fec_stats->uncorrectable_blocks.lanes[(idx)] = \
1194*0a1498ebSLama Kayal 		MLX5E_READ_CTR64_BE_F(ppcnt, phys_layer_cntrs, \
1195*0a1498ebSLama Kayal 				      fc_fec_uncorrectable_blocks_lane##idx); \
1196*0a1498ebSLama Kayal })
1197*0a1498ebSLama Kayal 
1198*0a1498ebSLama Kayal static void fec_set_fc_stats(struct ethtool_fec_stats *fec_stats,
1199*0a1498ebSLama Kayal 			     u32 *ppcnt, u8 lanes)
1200*0a1498ebSLama Kayal {
1201*0a1498ebSLama Kayal 	if (lanes > 3) { /* 4 lanes */
1202*0a1498ebSLama Kayal 		MLX5E_STATS_SET_FEC_BLOCK(3);
1203*0a1498ebSLama Kayal 		MLX5E_STATS_SET_FEC_BLOCK(2);
1204*0a1498ebSLama Kayal 	}
1205*0a1498ebSLama Kayal 	if (lanes > 1) /* 2 lanes */
1206*0a1498ebSLama Kayal 		MLX5E_STATS_SET_FEC_BLOCK(1);
1207*0a1498ebSLama Kayal 	if (lanes > 0) /* 1 lane */
1208*0a1498ebSLama Kayal 		MLX5E_STATS_SET_FEC_BLOCK(0);
1209*0a1498ebSLama Kayal }
1210*0a1498ebSLama Kayal 
1211*0a1498ebSLama Kayal static void fec_set_rs_stats(struct ethtool_fec_stats *fec_stats, u32 *ppcnt)
1212*0a1498ebSLama Kayal {
1213*0a1498ebSLama Kayal 	fec_stats->corrected_blocks.total =
1214*0a1498ebSLama Kayal 		MLX5E_READ_CTR64_BE_F(ppcnt, phys_layer_cntrs,
1215*0a1498ebSLama Kayal 				      rs_fec_corrected_blocks);
1216*0a1498ebSLama Kayal 	fec_stats->uncorrectable_blocks.total =
1217*0a1498ebSLama Kayal 		MLX5E_READ_CTR64_BE_F(ppcnt, phys_layer_cntrs,
1218*0a1498ebSLama Kayal 				      rs_fec_uncorrectable_blocks);
1219*0a1498ebSLama Kayal }
1220*0a1498ebSLama Kayal 
1221*0a1498ebSLama Kayal static void fec_set_block_stats(struct mlx5e_priv *priv,
1222*0a1498ebSLama Kayal 				struct ethtool_fec_stats *fec_stats)
1223*0a1498ebSLama Kayal {
1224*0a1498ebSLama Kayal 	struct mlx5_core_dev *mdev = priv->mdev;
1225*0a1498ebSLama Kayal 	u32 out[MLX5_ST_SZ_DW(ppcnt_reg)] = {};
1226*0a1498ebSLama Kayal 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {};
1227*0a1498ebSLama Kayal 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
1228*0a1498ebSLama Kayal 	int mode = fec_active_mode(mdev);
1229*0a1498ebSLama Kayal 
1230*0a1498ebSLama Kayal 	if (mode == MLX5E_FEC_NOFEC)
1231*0a1498ebSLama Kayal 		return;
1232*0a1498ebSLama Kayal 
1233*0a1498ebSLama Kayal 	MLX5_SET(ppcnt_reg, in, local_port, 1);
1234*0a1498ebSLama Kayal 	MLX5_SET(ppcnt_reg, in, grp, MLX5_PHYSICAL_LAYER_COUNTERS_GROUP);
1235*0a1498ebSLama Kayal 	if (mlx5_core_access_reg(mdev, in, sz, outl, sz, MLX5_REG_PPCNT, 0, 0))
1236*0a1498ebSLama Kayal 		return;
1237*0a1498ebSLama Kayal 
1238*0a1498ebSLama Kayal 	switch (mode) {
1239*0a1498ebSLama Kayal 	case MLX5E_FEC_RS_528_514:
1240*0a1498ebSLama Kayal 	case MLX5E_FEC_RS_544_514:
1241*0a1498ebSLama Kayal 	case MLX5E_FEC_LLRS_272_257_1:
1242*0a1498ebSLama Kayal 		fec_set_rs_stats(fec_stats, out);
1243*0a1498ebSLama Kayal 		return;
1244*0a1498ebSLama Kayal 	case MLX5E_FEC_FIRECODE:
1245*0a1498ebSLama Kayal 		fec_set_fc_stats(fec_stats, out, fec_num_lanes(mdev));
1246*0a1498ebSLama Kayal 	}
1247*0a1498ebSLama Kayal }
1248*0a1498ebSLama Kayal 
1249*0a1498ebSLama Kayal static void fec_set_corrected_bits_total(struct mlx5e_priv *priv,
12501703bb50SJakub Kicinski 					 struct ethtool_fec_stats *fec_stats)
12511703bb50SJakub Kicinski {
12521703bb50SJakub Kicinski 	u32 ppcnt_phy_statistical[MLX5_ST_SZ_DW(ppcnt_reg)];
12531703bb50SJakub Kicinski 	struct mlx5_core_dev *mdev = priv->mdev;
1254*0a1498ebSLama Kayal 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {};
12551703bb50SJakub Kicinski 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
12561703bb50SJakub Kicinski 
12571703bb50SJakub Kicinski 	if (!MLX5_CAP_PCAM_FEATURE(mdev, ppcnt_statistical_group))
12581703bb50SJakub Kicinski 		return;
12591703bb50SJakub Kicinski 
12601703bb50SJakub Kicinski 	MLX5_SET(ppcnt_reg, in, local_port, 1);
12611703bb50SJakub Kicinski 	MLX5_SET(ppcnt_reg, in, grp, MLX5_PHYSICAL_LAYER_STATISTICAL_GROUP);
12621703bb50SJakub Kicinski 	if (mlx5_core_access_reg(mdev, in, sz, ppcnt_phy_statistical,
12631703bb50SJakub Kicinski 				 sz, MLX5_REG_PPCNT, 0, 0))
12641703bb50SJakub Kicinski 		return;
12651703bb50SJakub Kicinski 
12661703bb50SJakub Kicinski 	fec_stats->corrected_bits.total =
12671703bb50SJakub Kicinski 		MLX5E_READ_CTR64_BE_F(ppcnt_phy_statistical,
12681703bb50SJakub Kicinski 				      phys_layer_statistical_cntrs,
12691703bb50SJakub Kicinski 				      phy_corrected_bits);
12701703bb50SJakub Kicinski }
12711703bb50SJakub Kicinski 
1272*0a1498ebSLama Kayal void mlx5e_stats_fec_get(struct mlx5e_priv *priv,
1273*0a1498ebSLama Kayal 			 struct ethtool_fec_stats *fec_stats)
1274*0a1498ebSLama Kayal {
1275*0a1498ebSLama Kayal 	fec_set_corrected_bits_total(priv, fec_stats);
1276*0a1498ebSLama Kayal 	fec_set_block_stats(priv, fec_stats);
1277*0a1498ebSLama Kayal }
1278*0a1498ebSLama Kayal 
12793488bd4cSKamal Heib #define PPORT_ETH_EXT_OFF(c) \
12803488bd4cSKamal Heib 	MLX5_BYTE_OFF(ppcnt_reg, \
12813488bd4cSKamal Heib 		      counter_set.eth_extended_cntrs_grp_data_layout.c##_high)
12823488bd4cSKamal Heib static const struct counter_desc pport_eth_ext_stats_desc[] = {
12833488bd4cSKamal Heib 	{ "rx_buffer_passed_thres_phy", PPORT_ETH_EXT_OFF(rx_buffer_almost_full) },
12843488bd4cSKamal Heib };
12853488bd4cSKamal Heib 
12863488bd4cSKamal Heib #define NUM_PPORT_ETH_EXT_COUNTERS	ARRAY_SIZE(pport_eth_ext_stats_desc)
12873488bd4cSKamal Heib 
128896b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(eth_ext)
12893488bd4cSKamal Heib {
12903488bd4cSKamal Heib 	if (MLX5_CAP_PCAM_FEATURE((priv)->mdev, rx_buffer_fullness_counters))
12913488bd4cSKamal Heib 		return NUM_PPORT_ETH_EXT_COUNTERS;
12923488bd4cSKamal Heib 
12933488bd4cSKamal Heib 	return 0;
12943488bd4cSKamal Heib }
12953488bd4cSKamal Heib 
129696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(eth_ext)
12973488bd4cSKamal Heib {
12983488bd4cSKamal Heib 	int i;
12993488bd4cSKamal Heib 
13003488bd4cSKamal Heib 	if (MLX5_CAP_PCAM_FEATURE((priv)->mdev, rx_buffer_fullness_counters))
13013488bd4cSKamal Heib 		for (i = 0; i < NUM_PPORT_ETH_EXT_COUNTERS; i++)
13023488bd4cSKamal Heib 			strcpy(data + (idx++) * ETH_GSTRING_LEN,
13033488bd4cSKamal Heib 			       pport_eth_ext_stats_desc[i].format);
13043488bd4cSKamal Heib 	return idx;
13053488bd4cSKamal Heib }
13063488bd4cSKamal Heib 
130796b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(eth_ext)
13083488bd4cSKamal Heib {
13093488bd4cSKamal Heib 	int i;
13103488bd4cSKamal Heib 
13113488bd4cSKamal Heib 	if (MLX5_CAP_PCAM_FEATURE((priv)->mdev, rx_buffer_fullness_counters))
13123488bd4cSKamal Heib 		for (i = 0; i < NUM_PPORT_ETH_EXT_COUNTERS; i++)
13133488bd4cSKamal Heib 			data[idx++] =
13143488bd4cSKamal Heib 				MLX5E_READ_CTR64_BE(&priv->stats.pport.eth_ext_counters,
13153488bd4cSKamal Heib 						    pport_eth_ext_stats_desc, i);
13163488bd4cSKamal Heib 	return idx;
13173488bd4cSKamal Heib }
13183488bd4cSKamal Heib 
131996b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(eth_ext)
132019386177SKamal Heib {
132119386177SKamal Heib 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
132219386177SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
132319386177SKamal Heib 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
132419386177SKamal Heib 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
132519386177SKamal Heib 	void *out;
132619386177SKamal Heib 
132719386177SKamal Heib 	if (!MLX5_CAP_PCAM_FEATURE(mdev, rx_buffer_fullness_counters))
132819386177SKamal Heib 		return;
132919386177SKamal Heib 
133019386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, local_port, 1);
133119386177SKamal Heib 	out = pstats->eth_ext_counters;
133219386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, grp, MLX5_ETHERNET_EXTENDED_COUNTERS_GROUP);
133319386177SKamal Heib 	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
133419386177SKamal Heib }
133519386177SKamal Heib 
13369fd2b5f1SKamal Heib #define PCIE_PERF_OFF(c) \
13379fd2b5f1SKamal Heib 	MLX5_BYTE_OFF(mpcnt_reg, counter_set.pcie_perf_cntrs_grp_data_layout.c)
13389fd2b5f1SKamal Heib static const struct counter_desc pcie_perf_stats_desc[] = {
13399fd2b5f1SKamal Heib 	{ "rx_pci_signal_integrity", PCIE_PERF_OFF(rx_errors) },
13409fd2b5f1SKamal Heib 	{ "tx_pci_signal_integrity", PCIE_PERF_OFF(tx_errors) },
13419fd2b5f1SKamal Heib };
13429fd2b5f1SKamal Heib 
13439fd2b5f1SKamal Heib #define PCIE_PERF_OFF64(c) \
13449fd2b5f1SKamal Heib 	MLX5_BYTE_OFF(mpcnt_reg, counter_set.pcie_perf_cntrs_grp_data_layout.c##_high)
13459fd2b5f1SKamal Heib static const struct counter_desc pcie_perf_stats_desc64[] = {
13469fd2b5f1SKamal Heib 	{ "outbound_pci_buffer_overflow", PCIE_PERF_OFF64(tx_overflow_buffer_pkt) },
13479fd2b5f1SKamal Heib };
13489fd2b5f1SKamal Heib 
13499fd2b5f1SKamal Heib static const struct counter_desc pcie_perf_stall_stats_desc[] = {
13509fd2b5f1SKamal Heib 	{ "outbound_pci_stalled_rd", PCIE_PERF_OFF(outbound_stalled_reads) },
13519fd2b5f1SKamal Heib 	{ "outbound_pci_stalled_wr", PCIE_PERF_OFF(outbound_stalled_writes) },
13529fd2b5f1SKamal Heib 	{ "outbound_pci_stalled_rd_events", PCIE_PERF_OFF(outbound_stalled_reads_events) },
13539fd2b5f1SKamal Heib 	{ "outbound_pci_stalled_wr_events", PCIE_PERF_OFF(outbound_stalled_writes_events) },
13549fd2b5f1SKamal Heib };
13559fd2b5f1SKamal Heib 
13569fd2b5f1SKamal Heib #define NUM_PCIE_PERF_COUNTERS		ARRAY_SIZE(pcie_perf_stats_desc)
13579fd2b5f1SKamal Heib #define NUM_PCIE_PERF_COUNTERS64	ARRAY_SIZE(pcie_perf_stats_desc64)
13589fd2b5f1SKamal Heib #define NUM_PCIE_PERF_STALL_COUNTERS	ARRAY_SIZE(pcie_perf_stall_stats_desc)
13599fd2b5f1SKamal Heib 
136096b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(pcie)
13619fd2b5f1SKamal Heib {
13629fd2b5f1SKamal Heib 	int num_stats = 0;
13639fd2b5f1SKamal Heib 
13649fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_performance_group))
13659fd2b5f1SKamal Heib 		num_stats += NUM_PCIE_PERF_COUNTERS;
13669fd2b5f1SKamal Heib 
13679fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, tx_overflow_buffer_pkt))
13689fd2b5f1SKamal Heib 		num_stats += NUM_PCIE_PERF_COUNTERS64;
13699fd2b5f1SKamal Heib 
13709fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_outbound_stalled))
13719fd2b5f1SKamal Heib 		num_stats += NUM_PCIE_PERF_STALL_COUNTERS;
13729fd2b5f1SKamal Heib 
13739fd2b5f1SKamal Heib 	return num_stats;
13749fd2b5f1SKamal Heib }
13759fd2b5f1SKamal Heib 
137696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(pcie)
13779fd2b5f1SKamal Heib {
13789fd2b5f1SKamal Heib 	int i;
13799fd2b5f1SKamal Heib 
13809fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_performance_group))
13819fd2b5f1SKamal Heib 		for (i = 0; i < NUM_PCIE_PERF_COUNTERS; i++)
13829fd2b5f1SKamal Heib 			strcpy(data + (idx++) * ETH_GSTRING_LEN,
13839fd2b5f1SKamal Heib 			       pcie_perf_stats_desc[i].format);
13849fd2b5f1SKamal Heib 
13859fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, tx_overflow_buffer_pkt))
13869fd2b5f1SKamal Heib 		for (i = 0; i < NUM_PCIE_PERF_COUNTERS64; i++)
13879fd2b5f1SKamal Heib 			strcpy(data + (idx++) * ETH_GSTRING_LEN,
13889fd2b5f1SKamal Heib 			       pcie_perf_stats_desc64[i].format);
13899fd2b5f1SKamal Heib 
13909fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_outbound_stalled))
13919fd2b5f1SKamal Heib 		for (i = 0; i < NUM_PCIE_PERF_STALL_COUNTERS; i++)
13929fd2b5f1SKamal Heib 			strcpy(data + (idx++) * ETH_GSTRING_LEN,
13939fd2b5f1SKamal Heib 			       pcie_perf_stall_stats_desc[i].format);
13949fd2b5f1SKamal Heib 	return idx;
13959fd2b5f1SKamal Heib }
13969fd2b5f1SKamal Heib 
139796b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(pcie)
13989fd2b5f1SKamal Heib {
13999fd2b5f1SKamal Heib 	int i;
14009fd2b5f1SKamal Heib 
14019fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_performance_group))
14029fd2b5f1SKamal Heib 		for (i = 0; i < NUM_PCIE_PERF_COUNTERS; i++)
14039fd2b5f1SKamal Heib 			data[idx++] =
14049fd2b5f1SKamal Heib 				MLX5E_READ_CTR32_BE(&priv->stats.pcie.pcie_perf_counters,
14059fd2b5f1SKamal Heib 						    pcie_perf_stats_desc, i);
14069fd2b5f1SKamal Heib 
14079fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, tx_overflow_buffer_pkt))
14089fd2b5f1SKamal Heib 		for (i = 0; i < NUM_PCIE_PERF_COUNTERS64; i++)
14099fd2b5f1SKamal Heib 			data[idx++] =
14109fd2b5f1SKamal Heib 				MLX5E_READ_CTR64_BE(&priv->stats.pcie.pcie_perf_counters,
14119fd2b5f1SKamal Heib 						    pcie_perf_stats_desc64, i);
14129fd2b5f1SKamal Heib 
14139fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_outbound_stalled))
14149fd2b5f1SKamal Heib 		for (i = 0; i < NUM_PCIE_PERF_STALL_COUNTERS; i++)
14159fd2b5f1SKamal Heib 			data[idx++] =
14169fd2b5f1SKamal Heib 				MLX5E_READ_CTR32_BE(&priv->stats.pcie.pcie_perf_counters,
14179fd2b5f1SKamal Heib 						    pcie_perf_stall_stats_desc, i);
14189fd2b5f1SKamal Heib 	return idx;
14199fd2b5f1SKamal Heib }
14209fd2b5f1SKamal Heib 
142196b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(pcie)
142219386177SKamal Heib {
142319386177SKamal Heib 	struct mlx5e_pcie_stats *pcie_stats = &priv->stats.pcie;
142419386177SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
142519386177SKamal Heib 	u32 in[MLX5_ST_SZ_DW(mpcnt_reg)] = {0};
142619386177SKamal Heib 	int sz = MLX5_ST_SZ_BYTES(mpcnt_reg);
142719386177SKamal Heib 	void *out;
142819386177SKamal Heib 
142919386177SKamal Heib 	if (!MLX5_CAP_MCAM_FEATURE(mdev, pcie_performance_group))
143019386177SKamal Heib 		return;
143119386177SKamal Heib 
143219386177SKamal Heib 	out = pcie_stats->pcie_perf_counters;
143319386177SKamal Heib 	MLX5_SET(mpcnt_reg, in, grp, MLX5_PCIE_PERFORMANCE_COUNTERS_GROUP);
143419386177SKamal Heib 	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_MPCNT, 0, 0);
143519386177SKamal Heib }
143619386177SKamal Heib 
14371297d97fSAya Levin #define PPORT_PER_TC_PRIO_OFF(c) \
14381297d97fSAya Levin 	MLX5_BYTE_OFF(ppcnt_reg, \
14391297d97fSAya Levin 		      counter_set.eth_per_tc_prio_grp_data_layout.c##_high)
14401297d97fSAya Levin 
14411297d97fSAya Levin static const struct counter_desc pport_per_tc_prio_stats_desc[] = {
14421297d97fSAya Levin 	{ "rx_prio%d_buf_discard", PPORT_PER_TC_PRIO_OFF(no_buffer_discard_uc) },
14431297d97fSAya Levin };
14441297d97fSAya Levin 
14451297d97fSAya Levin #define NUM_PPORT_PER_TC_PRIO_COUNTERS	ARRAY_SIZE(pport_per_tc_prio_stats_desc)
14461297d97fSAya Levin 
14471297d97fSAya Levin #define PPORT_PER_TC_CONGEST_PRIO_OFF(c) \
14481297d97fSAya Levin 	MLX5_BYTE_OFF(ppcnt_reg, \
14491297d97fSAya Levin 		      counter_set.eth_per_tc_congest_prio_grp_data_layout.c##_high)
14501297d97fSAya Levin 
14511297d97fSAya Levin static const struct counter_desc pport_per_tc_congest_prio_stats_desc[] = {
14521297d97fSAya Levin 	{ "rx_prio%d_cong_discard", PPORT_PER_TC_CONGEST_PRIO_OFF(wred_discard) },
14531297d97fSAya Levin 	{ "rx_prio%d_marked", PPORT_PER_TC_CONGEST_PRIO_OFF(ecn_marked_tc) },
14541297d97fSAya Levin };
14551297d97fSAya Levin 
14561297d97fSAya Levin #define NUM_PPORT_PER_TC_CONGEST_PRIO_COUNTERS \
14571297d97fSAya Levin 	ARRAY_SIZE(pport_per_tc_congest_prio_stats_desc)
14581297d97fSAya Levin 
14591297d97fSAya Levin static int mlx5e_grp_per_tc_prio_get_num_stats(struct mlx5e_priv *priv)
14601297d97fSAya Levin {
14611297d97fSAya Levin 	struct mlx5_core_dev *mdev = priv->mdev;
14621297d97fSAya Levin 
14631297d97fSAya Levin 	if (!MLX5_CAP_GEN(mdev, sbcam_reg))
14641297d97fSAya Levin 		return 0;
14651297d97fSAya Levin 
14661297d97fSAya Levin 	return NUM_PPORT_PER_TC_PRIO_COUNTERS * NUM_PPORT_PRIO;
14671297d97fSAya Levin }
14681297d97fSAya Levin 
146996b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(per_port_buff_congest)
14701297d97fSAya Levin {
14711297d97fSAya Levin 	struct mlx5_core_dev *mdev = priv->mdev;
14721297d97fSAya Levin 	int i, prio;
14731297d97fSAya Levin 
14741297d97fSAya Levin 	if (!MLX5_CAP_GEN(mdev, sbcam_reg))
14751297d97fSAya Levin 		return idx;
14761297d97fSAya Levin 
14771297d97fSAya Levin 	for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
14781297d97fSAya Levin 		for (i = 0; i < NUM_PPORT_PER_TC_PRIO_COUNTERS; i++)
14791297d97fSAya Levin 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
14801297d97fSAya Levin 				pport_per_tc_prio_stats_desc[i].format, prio);
14811297d97fSAya Levin 		for (i = 0; i < NUM_PPORT_PER_TC_CONGEST_PRIO_COUNTERS; i++)
14821297d97fSAya Levin 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
14831297d97fSAya Levin 				pport_per_tc_congest_prio_stats_desc[i].format, prio);
14841297d97fSAya Levin 	}
14851297d97fSAya Levin 
14861297d97fSAya Levin 	return idx;
14871297d97fSAya Levin }
14881297d97fSAya Levin 
148996b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(per_port_buff_congest)
14901297d97fSAya Levin {
14911297d97fSAya Levin 	struct mlx5e_pport_stats *pport = &priv->stats.pport;
14921297d97fSAya Levin 	struct mlx5_core_dev *mdev = priv->mdev;
14931297d97fSAya Levin 	int i, prio;
14941297d97fSAya Levin 
14951297d97fSAya Levin 	if (!MLX5_CAP_GEN(mdev, sbcam_reg))
14961297d97fSAya Levin 		return idx;
14971297d97fSAya Levin 
14981297d97fSAya Levin 	for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
14991297d97fSAya Levin 		for (i = 0; i < NUM_PPORT_PER_TC_PRIO_COUNTERS; i++)
15001297d97fSAya Levin 			data[idx++] =
15011297d97fSAya Levin 				MLX5E_READ_CTR64_BE(&pport->per_tc_prio_counters[prio],
15021297d97fSAya Levin 						    pport_per_tc_prio_stats_desc, i);
15031297d97fSAya Levin 		for (i = 0; i < NUM_PPORT_PER_TC_CONGEST_PRIO_COUNTERS ; i++)
15041297d97fSAya Levin 			data[idx++] =
15051297d97fSAya Levin 				MLX5E_READ_CTR64_BE(&pport->per_tc_congest_prio_counters[prio],
15061297d97fSAya Levin 						    pport_per_tc_congest_prio_stats_desc, i);
15071297d97fSAya Levin 	}
15081297d97fSAya Levin 
15091297d97fSAya Levin 	return idx;
15101297d97fSAya Levin }
15111297d97fSAya Levin 
15121297d97fSAya Levin static void mlx5e_grp_per_tc_prio_update_stats(struct mlx5e_priv *priv)
15131297d97fSAya Levin {
15141297d97fSAya Levin 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
15151297d97fSAya Levin 	struct mlx5_core_dev *mdev = priv->mdev;
15161297d97fSAya Levin 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {};
15171297d97fSAya Levin 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
15181297d97fSAya Levin 	void *out;
15191297d97fSAya Levin 	int prio;
15201297d97fSAya Levin 
15211297d97fSAya Levin 	if (!MLX5_CAP_GEN(mdev, sbcam_reg))
15221297d97fSAya Levin 		return;
15231297d97fSAya Levin 
15241297d97fSAya Levin 	MLX5_SET(ppcnt_reg, in, pnat, 2);
15251297d97fSAya Levin 	MLX5_SET(ppcnt_reg, in, grp, MLX5_PER_TRAFFIC_CLASS_COUNTERS_GROUP);
15261297d97fSAya Levin 	for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
15271297d97fSAya Levin 		out = pstats->per_tc_prio_counters[prio];
15281297d97fSAya Levin 		MLX5_SET(ppcnt_reg, in, prio_tc, prio);
15291297d97fSAya Levin 		mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
15301297d97fSAya Levin 	}
15311297d97fSAya Levin }
15321297d97fSAya Levin 
15331297d97fSAya Levin static int mlx5e_grp_per_tc_congest_prio_get_num_stats(struct mlx5e_priv *priv)
15341297d97fSAya Levin {
15351297d97fSAya Levin 	struct mlx5_core_dev *mdev = priv->mdev;
15361297d97fSAya Levin 
15371297d97fSAya Levin 	if (!MLX5_CAP_GEN(mdev, sbcam_reg))
15381297d97fSAya Levin 		return 0;
15391297d97fSAya Levin 
15401297d97fSAya Levin 	return NUM_PPORT_PER_TC_CONGEST_PRIO_COUNTERS * NUM_PPORT_PRIO;
15411297d97fSAya Levin }
15421297d97fSAya Levin 
15431297d97fSAya Levin static void mlx5e_grp_per_tc_congest_prio_update_stats(struct mlx5e_priv *priv)
15441297d97fSAya Levin {
15451297d97fSAya Levin 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
15461297d97fSAya Levin 	struct mlx5_core_dev *mdev = priv->mdev;
15471297d97fSAya Levin 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {};
15481297d97fSAya Levin 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
15491297d97fSAya Levin 	void *out;
15501297d97fSAya Levin 	int prio;
15511297d97fSAya Levin 
15521297d97fSAya Levin 	if (!MLX5_CAP_GEN(mdev, sbcam_reg))
15531297d97fSAya Levin 		return;
15541297d97fSAya Levin 
15551297d97fSAya Levin 	MLX5_SET(ppcnt_reg, in, pnat, 2);
15561297d97fSAya Levin 	MLX5_SET(ppcnt_reg, in, grp, MLX5_PER_TRAFFIC_CLASS_CONGESTION_GROUP);
15571297d97fSAya Levin 	for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
15581297d97fSAya Levin 		out = pstats->per_tc_congest_prio_counters[prio];
15591297d97fSAya Levin 		MLX5_SET(ppcnt_reg, in, prio_tc, prio);
15601297d97fSAya Levin 		mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
15611297d97fSAya Levin 	}
15621297d97fSAya Levin }
15631297d97fSAya Levin 
156496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(per_port_buff_congest)
15651297d97fSAya Levin {
15661297d97fSAya Levin 	return mlx5e_grp_per_tc_prio_get_num_stats(priv) +
15671297d97fSAya Levin 		mlx5e_grp_per_tc_congest_prio_get_num_stats(priv);
15681297d97fSAya Levin }
15691297d97fSAya Levin 
157096b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(per_port_buff_congest)
15711297d97fSAya Levin {
15721297d97fSAya Levin 	mlx5e_grp_per_tc_prio_update_stats(priv);
15731297d97fSAya Levin 	mlx5e_grp_per_tc_congest_prio_update_stats(priv);
15741297d97fSAya Levin }
15751297d97fSAya Levin 
15764377bea2SKamal Heib #define PPORT_PER_PRIO_OFF(c) \
15774377bea2SKamal Heib 	MLX5_BYTE_OFF(ppcnt_reg, \
15784377bea2SKamal Heib 		      counter_set.eth_per_prio_grp_data_layout.c##_high)
1579e6000651SKamal Heib static const struct counter_desc pport_per_prio_traffic_stats_desc[] = {
1580e6000651SKamal Heib 	{ "rx_prio%d_bytes", PPORT_PER_PRIO_OFF(rx_octets) },
1581e6000651SKamal Heib 	{ "rx_prio%d_packets", PPORT_PER_PRIO_OFF(rx_frames) },
1582827a8cb2SAharon Landau 	{ "rx_prio%d_discards", PPORT_PER_PRIO_OFF(rx_discards) },
1583e6000651SKamal Heib 	{ "tx_prio%d_bytes", PPORT_PER_PRIO_OFF(tx_octets) },
1584e6000651SKamal Heib 	{ "tx_prio%d_packets", PPORT_PER_PRIO_OFF(tx_frames) },
1585e6000651SKamal Heib };
1586e6000651SKamal Heib 
1587e6000651SKamal Heib #define NUM_PPORT_PER_PRIO_TRAFFIC_COUNTERS	ARRAY_SIZE(pport_per_prio_traffic_stats_desc)
1588e6000651SKamal Heib 
158954c73f86SYuval Shaia static int mlx5e_grp_per_prio_traffic_get_num_stats(void)
1590e6000651SKamal Heib {
1591e6000651SKamal Heib 	return NUM_PPORT_PER_PRIO_TRAFFIC_COUNTERS * NUM_PPORT_PRIO;
1592e6000651SKamal Heib }
1593e6000651SKamal Heib 
1594e6000651SKamal Heib static int mlx5e_grp_per_prio_traffic_fill_strings(struct mlx5e_priv *priv,
1595e6000651SKamal Heib 						   u8 *data,
1596e6000651SKamal Heib 						   int idx)
1597e6000651SKamal Heib {
1598e6000651SKamal Heib 	int i, prio;
1599e6000651SKamal Heib 
1600e6000651SKamal Heib 	for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
1601e6000651SKamal Heib 		for (i = 0; i < NUM_PPORT_PER_PRIO_TRAFFIC_COUNTERS; i++)
1602e6000651SKamal Heib 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
1603e6000651SKamal Heib 				pport_per_prio_traffic_stats_desc[i].format, prio);
1604e6000651SKamal Heib 	}
1605e6000651SKamal Heib 
1606e6000651SKamal Heib 	return idx;
1607e6000651SKamal Heib }
1608e6000651SKamal Heib 
1609e6000651SKamal Heib static int mlx5e_grp_per_prio_traffic_fill_stats(struct mlx5e_priv *priv,
1610e6000651SKamal Heib 						 u64 *data,
1611e6000651SKamal Heib 						 int idx)
1612e6000651SKamal Heib {
1613e6000651SKamal Heib 	int i, prio;
1614e6000651SKamal Heib 
1615e6000651SKamal Heib 	for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
1616e6000651SKamal Heib 		for (i = 0; i < NUM_PPORT_PER_PRIO_TRAFFIC_COUNTERS; i++)
1617e6000651SKamal Heib 			data[idx++] =
1618e6000651SKamal Heib 				MLX5E_READ_CTR64_BE(&priv->stats.pport.per_prio_counters[prio],
1619e6000651SKamal Heib 						    pport_per_prio_traffic_stats_desc, i);
1620e6000651SKamal Heib 	}
1621e6000651SKamal Heib 
1622e6000651SKamal Heib 	return idx;
1623e6000651SKamal Heib }
1624e6000651SKamal Heib 
16254377bea2SKamal Heib static const struct counter_desc pport_per_prio_pfc_stats_desc[] = {
16264377bea2SKamal Heib 	/* %s is "global" or "prio{i}" */
16274377bea2SKamal Heib 	{ "rx_%s_pause", PPORT_PER_PRIO_OFF(rx_pause) },
16284377bea2SKamal Heib 	{ "rx_%s_pause_duration", PPORT_PER_PRIO_OFF(rx_pause_duration) },
16294377bea2SKamal Heib 	{ "tx_%s_pause", PPORT_PER_PRIO_OFF(tx_pause) },
16304377bea2SKamal Heib 	{ "tx_%s_pause_duration", PPORT_PER_PRIO_OFF(tx_pause_duration) },
16314377bea2SKamal Heib 	{ "rx_%s_pause_transition", PPORT_PER_PRIO_OFF(rx_pause_transition) },
16324377bea2SKamal Heib };
16334377bea2SKamal Heib 
16342fcb12dfSInbar Karmy static const struct counter_desc pport_pfc_stall_stats_desc[] = {
16352fcb12dfSInbar Karmy 	{ "tx_pause_storm_warning_events", PPORT_PER_PRIO_OFF(device_stall_minor_watermark_cnt) },
16362fcb12dfSInbar Karmy 	{ "tx_pause_storm_error_events", PPORT_PER_PRIO_OFF(device_stall_critical_watermark_cnt) },
16372fcb12dfSInbar Karmy };
16382fcb12dfSInbar Karmy 
16394377bea2SKamal Heib #define NUM_PPORT_PER_PRIO_PFC_COUNTERS		ARRAY_SIZE(pport_per_prio_pfc_stats_desc)
16402fcb12dfSInbar Karmy #define NUM_PPORT_PFC_STALL_COUNTERS(priv)	(ARRAY_SIZE(pport_pfc_stall_stats_desc) * \
16412fcb12dfSInbar Karmy 						 MLX5_CAP_PCAM_FEATURE((priv)->mdev, pfcc_mask) * \
16422fcb12dfSInbar Karmy 						 MLX5_CAP_DEBUG((priv)->mdev, stall_detect))
16434377bea2SKamal Heib 
16444377bea2SKamal Heib static unsigned long mlx5e_query_pfc_combined(struct mlx5e_priv *priv)
16454377bea2SKamal Heib {
16464377bea2SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
16474377bea2SKamal Heib 	u8 pfc_en_tx;
16484377bea2SKamal Heib 	u8 pfc_en_rx;
16494377bea2SKamal Heib 	int err;
16504377bea2SKamal Heib 
16514377bea2SKamal Heib 	if (MLX5_CAP_GEN(mdev, port_type) != MLX5_CAP_PORT_TYPE_ETH)
16524377bea2SKamal Heib 		return 0;
16534377bea2SKamal Heib 
16544377bea2SKamal Heib 	err = mlx5_query_port_pfc(mdev, &pfc_en_tx, &pfc_en_rx);
16554377bea2SKamal Heib 
16564377bea2SKamal Heib 	return err ? 0 : pfc_en_tx | pfc_en_rx;
16574377bea2SKamal Heib }
16584377bea2SKamal Heib 
16594377bea2SKamal Heib static bool mlx5e_query_global_pause_combined(struct mlx5e_priv *priv)
16604377bea2SKamal Heib {
16614377bea2SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
16624377bea2SKamal Heib 	u32 rx_pause;
16634377bea2SKamal Heib 	u32 tx_pause;
16644377bea2SKamal Heib 	int err;
16654377bea2SKamal Heib 
16664377bea2SKamal Heib 	if (MLX5_CAP_GEN(mdev, port_type) != MLX5_CAP_PORT_TYPE_ETH)
16674377bea2SKamal Heib 		return false;
16684377bea2SKamal Heib 
16694377bea2SKamal Heib 	err = mlx5_query_port_pause(mdev, &rx_pause, &tx_pause);
16704377bea2SKamal Heib 
16714377bea2SKamal Heib 	return err ? false : rx_pause | tx_pause;
16724377bea2SKamal Heib }
16734377bea2SKamal Heib 
16744377bea2SKamal Heib static int mlx5e_grp_per_prio_pfc_get_num_stats(struct mlx5e_priv *priv)
16754377bea2SKamal Heib {
16764377bea2SKamal Heib 	return (mlx5e_query_global_pause_combined(priv) +
16774377bea2SKamal Heib 		hweight8(mlx5e_query_pfc_combined(priv))) *
16782fcb12dfSInbar Karmy 		NUM_PPORT_PER_PRIO_PFC_COUNTERS +
16792fcb12dfSInbar Karmy 		NUM_PPORT_PFC_STALL_COUNTERS(priv);
16804377bea2SKamal Heib }
16814377bea2SKamal Heib 
16824377bea2SKamal Heib static int mlx5e_grp_per_prio_pfc_fill_strings(struct mlx5e_priv *priv,
16834377bea2SKamal Heib 					       u8 *data,
16844377bea2SKamal Heib 					       int idx)
16854377bea2SKamal Heib {
16864377bea2SKamal Heib 	unsigned long pfc_combined;
16874377bea2SKamal Heib 	int i, prio;
16884377bea2SKamal Heib 
16894377bea2SKamal Heib 	pfc_combined = mlx5e_query_pfc_combined(priv);
16904377bea2SKamal Heib 	for_each_set_bit(prio, &pfc_combined, NUM_PPORT_PRIO) {
16914377bea2SKamal Heib 		for (i = 0; i < NUM_PPORT_PER_PRIO_PFC_COUNTERS; i++) {
16924377bea2SKamal Heib 			char pfc_string[ETH_GSTRING_LEN];
16934377bea2SKamal Heib 
16944377bea2SKamal Heib 			snprintf(pfc_string, sizeof(pfc_string), "prio%d", prio);
16954377bea2SKamal Heib 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
16964377bea2SKamal Heib 				pport_per_prio_pfc_stats_desc[i].format, pfc_string);
16974377bea2SKamal Heib 		}
16984377bea2SKamal Heib 	}
16994377bea2SKamal Heib 
17004377bea2SKamal Heib 	if (mlx5e_query_global_pause_combined(priv)) {
17014377bea2SKamal Heib 		for (i = 0; i < NUM_PPORT_PER_PRIO_PFC_COUNTERS; i++) {
17024377bea2SKamal Heib 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
17034377bea2SKamal Heib 				pport_per_prio_pfc_stats_desc[i].format, "global");
17044377bea2SKamal Heib 		}
17054377bea2SKamal Heib 	}
17064377bea2SKamal Heib 
17072fcb12dfSInbar Karmy 	for (i = 0; i < NUM_PPORT_PFC_STALL_COUNTERS(priv); i++)
17082fcb12dfSInbar Karmy 		strcpy(data + (idx++) * ETH_GSTRING_LEN,
17092fcb12dfSInbar Karmy 		       pport_pfc_stall_stats_desc[i].format);
17102fcb12dfSInbar Karmy 
17114377bea2SKamal Heib 	return idx;
17124377bea2SKamal Heib }
17134377bea2SKamal Heib 
17144377bea2SKamal Heib static int mlx5e_grp_per_prio_pfc_fill_stats(struct mlx5e_priv *priv,
17154377bea2SKamal Heib 					     u64 *data,
17164377bea2SKamal Heib 					     int idx)
17174377bea2SKamal Heib {
17184377bea2SKamal Heib 	unsigned long pfc_combined;
17194377bea2SKamal Heib 	int i, prio;
17204377bea2SKamal Heib 
17214377bea2SKamal Heib 	pfc_combined = mlx5e_query_pfc_combined(priv);
17224377bea2SKamal Heib 	for_each_set_bit(prio, &pfc_combined, NUM_PPORT_PRIO) {
17234377bea2SKamal Heib 		for (i = 0; i < NUM_PPORT_PER_PRIO_PFC_COUNTERS; i++) {
17244377bea2SKamal Heib 			data[idx++] =
17254377bea2SKamal Heib 				MLX5E_READ_CTR64_BE(&priv->stats.pport.per_prio_counters[prio],
17264377bea2SKamal Heib 						    pport_per_prio_pfc_stats_desc, i);
17274377bea2SKamal Heib 		}
17284377bea2SKamal Heib 	}
17294377bea2SKamal Heib 
17304377bea2SKamal Heib 	if (mlx5e_query_global_pause_combined(priv)) {
17314377bea2SKamal Heib 		for (i = 0; i < NUM_PPORT_PER_PRIO_PFC_COUNTERS; i++) {
17324377bea2SKamal Heib 			data[idx++] =
17334377bea2SKamal Heib 				MLX5E_READ_CTR64_BE(&priv->stats.pport.per_prio_counters[0],
17344377bea2SKamal Heib 						    pport_per_prio_pfc_stats_desc, i);
17354377bea2SKamal Heib 		}
17364377bea2SKamal Heib 	}
17374377bea2SKamal Heib 
17382fcb12dfSInbar Karmy 	for (i = 0; i < NUM_PPORT_PFC_STALL_COUNTERS(priv); i++)
17392fcb12dfSInbar Karmy 		data[idx++] = MLX5E_READ_CTR64_BE(&priv->stats.pport.per_prio_counters[0],
17402fcb12dfSInbar Karmy 						  pport_pfc_stall_stats_desc, i);
17412fcb12dfSInbar Karmy 
17424377bea2SKamal Heib 	return idx;
17434377bea2SKamal Heib }
17444377bea2SKamal Heib 
174596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(per_prio)
1746a8984281SKamal Heib {
174754c73f86SYuval Shaia 	return mlx5e_grp_per_prio_traffic_get_num_stats() +
1748a8984281SKamal Heib 		mlx5e_grp_per_prio_pfc_get_num_stats(priv);
1749a8984281SKamal Heib }
1750a8984281SKamal Heib 
175196b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(per_prio)
1752a8984281SKamal Heib {
1753a8984281SKamal Heib 	idx = mlx5e_grp_per_prio_traffic_fill_strings(priv, data, idx);
1754a8984281SKamal Heib 	idx = mlx5e_grp_per_prio_pfc_fill_strings(priv, data, idx);
1755a8984281SKamal Heib 	return idx;
1756a8984281SKamal Heib }
1757a8984281SKamal Heib 
175896b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(per_prio)
1759a8984281SKamal Heib {
1760a8984281SKamal Heib 	idx = mlx5e_grp_per_prio_traffic_fill_stats(priv, data, idx);
1761a8984281SKamal Heib 	idx = mlx5e_grp_per_prio_pfc_fill_stats(priv, data, idx);
1762a8984281SKamal Heib 	return idx;
1763a8984281SKamal Heib }
1764a8984281SKamal Heib 
176596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(per_prio)
176619386177SKamal Heib {
176719386177SKamal Heib 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
176819386177SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
176919386177SKamal Heib 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
177019386177SKamal Heib 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
177119386177SKamal Heib 	int prio;
177219386177SKamal Heib 	void *out;
177319386177SKamal Heib 
177475370eb0SEyal Davidovich 	if (!MLX5_BASIC_PPCNT_SUPPORTED(mdev))
177575370eb0SEyal Davidovich 		return;
177675370eb0SEyal Davidovich 
177719386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, local_port, 1);
177819386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, grp, MLX5_PER_PRIORITY_COUNTERS_GROUP);
177919386177SKamal Heib 	for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
178019386177SKamal Heib 		out = pstats->per_prio_counters[prio];
178119386177SKamal Heib 		MLX5_SET(ppcnt_reg, in, prio_tc, prio);
178219386177SKamal Heib 		mlx5_core_access_reg(mdev, in, sz, out, sz,
178319386177SKamal Heib 				     MLX5_REG_PPCNT, 0, 0);
178419386177SKamal Heib 	}
178519386177SKamal Heib }
178619386177SKamal Heib 
17870e6f01a4SKamal Heib static const struct counter_desc mlx5e_pme_status_desc[] = {
1788c2fb3db2SMikhael Goikhman 	{ "module_unplug",       sizeof(u64) * MLX5_MODULE_STATUS_UNPLUGGED },
17890e6f01a4SKamal Heib };
17900e6f01a4SKamal Heib 
17910e6f01a4SKamal Heib static const struct counter_desc mlx5e_pme_error_desc[] = {
1792c2fb3db2SMikhael Goikhman 	{ "module_bus_stuck",    sizeof(u64) * MLX5_MODULE_EVENT_ERROR_BUS_STUCK },
1793c2fb3db2SMikhael Goikhman 	{ "module_high_temp",    sizeof(u64) * MLX5_MODULE_EVENT_ERROR_HIGH_TEMPERATURE },
1794c2fb3db2SMikhael Goikhman 	{ "module_bad_shorted",  sizeof(u64) * MLX5_MODULE_EVENT_ERROR_BAD_CABLE },
17950e6f01a4SKamal Heib };
17960e6f01a4SKamal Heib 
17970e6f01a4SKamal Heib #define NUM_PME_STATUS_STATS		ARRAY_SIZE(mlx5e_pme_status_desc)
17980e6f01a4SKamal Heib #define NUM_PME_ERR_STATS		ARRAY_SIZE(mlx5e_pme_error_desc)
17990e6f01a4SKamal Heib 
180096b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(pme)
18010e6f01a4SKamal Heib {
18020e6f01a4SKamal Heib 	return NUM_PME_STATUS_STATS + NUM_PME_ERR_STATS;
18030e6f01a4SKamal Heib }
18040e6f01a4SKamal Heib 
180596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(pme)
18060e6f01a4SKamal Heib {
18070e6f01a4SKamal Heib 	int i;
18080e6f01a4SKamal Heib 
18090e6f01a4SKamal Heib 	for (i = 0; i < NUM_PME_STATUS_STATS; i++)
18100e6f01a4SKamal Heib 		strcpy(data + (idx++) * ETH_GSTRING_LEN, mlx5e_pme_status_desc[i].format);
18110e6f01a4SKamal Heib 
18120e6f01a4SKamal Heib 	for (i = 0; i < NUM_PME_ERR_STATS; i++)
18130e6f01a4SKamal Heib 		strcpy(data + (idx++) * ETH_GSTRING_LEN, mlx5e_pme_error_desc[i].format);
18140e6f01a4SKamal Heib 
18150e6f01a4SKamal Heib 	return idx;
18160e6f01a4SKamal Heib }
18170e6f01a4SKamal Heib 
181896b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(pme)
18190e6f01a4SKamal Heib {
182069c1280bSSaeed Mahameed 	struct mlx5_pme_stats pme_stats;
18210e6f01a4SKamal Heib 	int i;
18220e6f01a4SKamal Heib 
182369c1280bSSaeed Mahameed 	mlx5_get_pme_stats(priv->mdev, &pme_stats);
182469c1280bSSaeed Mahameed 
18250e6f01a4SKamal Heib 	for (i = 0; i < NUM_PME_STATUS_STATS; i++)
182669c1280bSSaeed Mahameed 		data[idx++] = MLX5E_READ_CTR64_CPU(pme_stats.status_counters,
18270e6f01a4SKamal Heib 						   mlx5e_pme_status_desc, i);
18280e6f01a4SKamal Heib 
18290e6f01a4SKamal Heib 	for (i = 0; i < NUM_PME_ERR_STATS; i++)
183069c1280bSSaeed Mahameed 		data[idx++] = MLX5E_READ_CTR64_CPU(pme_stats.error_counters,
18310e6f01a4SKamal Heib 						   mlx5e_pme_error_desc, i);
18320e6f01a4SKamal Heib 
18330e6f01a4SKamal Heib 	return idx;
18340e6f01a4SKamal Heib }
18350e6f01a4SKamal Heib 
183696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(pme) { return; }
183796b12796SSaeed Mahameed 
183896b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(tls)
183943585a41SIlya Lesokhin {
184043585a41SIlya Lesokhin 	return mlx5e_tls_get_count(priv);
184143585a41SIlya Lesokhin }
184243585a41SIlya Lesokhin 
184396b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(tls)
184443585a41SIlya Lesokhin {
184543585a41SIlya Lesokhin 	return idx + mlx5e_tls_get_strings(priv, data + idx * ETH_GSTRING_LEN);
184643585a41SIlya Lesokhin }
184743585a41SIlya Lesokhin 
184896b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(tls)
184943585a41SIlya Lesokhin {
185043585a41SIlya Lesokhin 	return idx + mlx5e_tls_get_stats(priv, data + idx);
185143585a41SIlya Lesokhin }
185243585a41SIlya Lesokhin 
185396b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(tls) { return; }
185496b12796SSaeed Mahameed 
18551fe85006SKamal Heib static const struct counter_desc rq_stats_desc[] = {
18561fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, packets) },
18571fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, bytes) },
18581fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_complete) },
18590aa1d186SSaeed Mahameed 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_complete_tail) },
18600aa1d186SSaeed Mahameed 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_complete_tail_slow) },
18611fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_unnecessary) },
18621fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_unnecessary_inner) },
18631fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_none) },
18641fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, xdp_drop) },
186586690b4bSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, xdp_redirect) },
18661fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, lro_packets) },
18671fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, lro_bytes) },
1868def09e7bSKhalid Manaa 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, gro_packets) },
1869def09e7bSKhalid Manaa 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, gro_bytes) },
1870def09e7bSKhalid Manaa 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, gro_skbs) },
1871def09e7bSKhalid Manaa 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, gro_match_packets) },
1872def09e7bSKhalid Manaa 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, gro_large_hds) },
1873f007c13dSNatali Shechtman 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, ecn_mark) },
1874f24686e8SGal Pressman 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, removed_vlan_packets) },
18751fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, wqe_err) },
1876b71ba6b4STariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, mpwqe_filler_cqes) },
1877b71ba6b4STariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, mpwqe_filler_strides) },
18780073c8f7SMoshe Shemesh 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, oversize_pkts_sw_drop) },
18791fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, buff_alloc_err) },
18801fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, cqe_compress_blks) },
18811fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, cqe_compress_pkts) },
18821fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, cache_reuse) },
18831fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, cache_full) },
18841fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, cache_empty) },
18851fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, cache_busy) },
18861fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, cache_waive) },
1887dc983f0eSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, congst_umr) },
188894563847SEran Ben Elisha 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, arfs_err) },
1889be5323c8SAya Levin 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, recover) },
189076c1e1acSTariq Toukan #ifdef CONFIG_MLX5_EN_TLS
189176c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_decrypted_packets) },
189276c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_decrypted_bytes) },
189376c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_req_pkt) },
189476c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_req_start) },
189576c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_req_end) },
189676c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_req_skip) },
189776c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_res_ok) },
1898e9ce991bSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_res_retry) },
189976c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_res_skip) },
190076c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_err) },
190176c1e1acSTariq Toukan #endif
19021fe85006SKamal Heib };
19031fe85006SKamal Heib 
19041fe85006SKamal Heib static const struct counter_desc sq_stats_desc[] = {
19051fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, packets) },
19061fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, bytes) },
19071fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tso_packets) },
19081fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tso_bytes) },
19091fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tso_inner_packets) },
19101fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tso_inner_bytes) },
19111fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, csum_partial) },
19121fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, csum_partial_inner) },
1913f24686e8SGal Pressman 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, added_vlan_packets) },
19141fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, nop) },
19155af75c74SMaxim Mikityanskiy 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, mpwqe_blks) },
19165af75c74SMaxim Mikityanskiy 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, mpwqe_pkts) },
1917d2ead1f3STariq Toukan #ifdef CONFIG_MLX5_EN_TLS
1918d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_encrypted_packets) },
1919d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_encrypted_bytes) },
1920d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_ooo) },
1921d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_dump_packets) },
1922d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_dump_bytes) },
192346a3ea98STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_resync_bytes) },
192446a3ea98STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_skip_no_sync_data) },
192546a3ea98STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_drop_no_sync_data) },
192646a3ea98STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_drop_bypass_req) },
1927d2ead1f3STariq Toukan #endif
19281fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, csum_none) },
19291fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, stopped) },
19301fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, dropped) },
19311fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, xmit_more) },
1932db75373cSEran Ben Elisha 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, recover) },
193386155656STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, cqes) },
1934f65a59ffSTariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, wake) },
1935f65a59ffSTariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, cqe_err) },
19361fe85006SKamal Heib };
19371fe85006SKamal Heib 
1938890388adSTariq Toukan static const struct counter_desc rq_xdpsq_stats_desc[] = {
1939890388adSTariq Toukan 	{ MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, xmit) },
194073cab880SShay Agroskin 	{ MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, mpwqe) },
1941c2273219SShay Agroskin 	{ MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, inlnw) },
19426c085a8aSShay Agroskin 	{ MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, nops) },
1943890388adSTariq Toukan 	{ MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, full) },
1944890388adSTariq Toukan 	{ MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, err) },
1945890388adSTariq Toukan 	{ MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, cqes) },
1946890388adSTariq Toukan };
1947890388adSTariq Toukan 
194858b99ee3STariq Toukan static const struct counter_desc xdpsq_stats_desc[] = {
194958b99ee3STariq Toukan 	{ MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, xmit) },
195073cab880SShay Agroskin 	{ MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, mpwqe) },
1951c2273219SShay Agroskin 	{ MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, inlnw) },
19526c085a8aSShay Agroskin 	{ MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, nops) },
195358b99ee3STariq Toukan 	{ MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, full) },
195458b99ee3STariq Toukan 	{ MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, err) },
195558b99ee3STariq Toukan 	{ MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, cqes) },
195658b99ee3STariq Toukan };
195758b99ee3STariq Toukan 
1958db05815bSMaxim Mikityanskiy static const struct counter_desc xskrq_stats_desc[] = {
1959db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, packets) },
1960db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, bytes) },
1961db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, csum_complete) },
1962db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, csum_unnecessary) },
1963db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, csum_unnecessary_inner) },
1964db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, csum_none) },
1965db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, ecn_mark) },
1966db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, removed_vlan_packets) },
1967db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, xdp_drop) },
1968db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, xdp_redirect) },
1969db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, wqe_err) },
1970db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, mpwqe_filler_cqes) },
1971db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, mpwqe_filler_strides) },
1972db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, oversize_pkts_sw_drop) },
1973db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, buff_alloc_err) },
1974db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, cqe_compress_blks) },
1975db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, cqe_compress_pkts) },
1976db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, congst_umr) },
1977db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, arfs_err) },
1978db05815bSMaxim Mikityanskiy };
1979db05815bSMaxim Mikityanskiy 
1980db05815bSMaxim Mikityanskiy static const struct counter_desc xsksq_stats_desc[] = {
1981db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKSQ_STAT(struct mlx5e_xdpsq_stats, xmit) },
1982db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKSQ_STAT(struct mlx5e_xdpsq_stats, mpwqe) },
1983db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKSQ_STAT(struct mlx5e_xdpsq_stats, inlnw) },
1984db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKSQ_STAT(struct mlx5e_xdpsq_stats, full) },
1985db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKSQ_STAT(struct mlx5e_xdpsq_stats, err) },
1986db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKSQ_STAT(struct mlx5e_xdpsq_stats, cqes) },
1987db05815bSMaxim Mikityanskiy };
1988db05815bSMaxim Mikityanskiy 
198957d689a8SEran Ben Elisha static const struct counter_desc ch_stats_desc[] = {
1990a1bf74dcSTariq Toukan 	{ MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, events) },
19912d7103c8STariq Toukan 	{ MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, poll) },
19922d7103c8STariq Toukan 	{ MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, arm) },
19932d7103c8STariq Toukan 	{ MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, aff_change) },
1994db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, force_irq) },
199557d689a8SEran Ben Elisha 	{ MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, eq_rearm) },
199657d689a8SEran Ben Elisha };
199757d689a8SEran Ben Elisha 
1998145e5637SEran Ben Elisha static const struct counter_desc ptp_sq_stats_desc[] = {
1999145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, packets) },
2000145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, bytes) },
2001145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, csum_partial) },
2002145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, csum_partial_inner) },
2003145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, added_vlan_packets) },
2004145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, nop) },
2005145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, csum_none) },
2006145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, stopped) },
2007145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, dropped) },
2008145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, xmit_more) },
2009145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, recover) },
2010145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, cqes) },
2011145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, wake) },
2012145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, cqe_err) },
2013145e5637SEran Ben Elisha };
2014145e5637SEran Ben Elisha 
2015145e5637SEran Ben Elisha static const struct counter_desc ptp_ch_stats_desc[] = {
2016145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_CH_STAT(struct mlx5e_ch_stats, events) },
2017145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_CH_STAT(struct mlx5e_ch_stats, poll) },
2018145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_CH_STAT(struct mlx5e_ch_stats, arm) },
2019145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_CH_STAT(struct mlx5e_ch_stats, eq_rearm) },
2020145e5637SEran Ben Elisha };
2021145e5637SEran Ben Elisha 
20221880bc4eSEran Ben Elisha static const struct counter_desc ptp_cq_stats_desc[] = {
20231880bc4eSEran Ben Elisha 	{ MLX5E_DECLARE_PTP_CQ_STAT(struct mlx5e_ptp_cq_stats, cqe) },
20241880bc4eSEran Ben Elisha 	{ MLX5E_DECLARE_PTP_CQ_STAT(struct mlx5e_ptp_cq_stats, err_cqe) },
20251880bc4eSEran Ben Elisha 	{ MLX5E_DECLARE_PTP_CQ_STAT(struct mlx5e_ptp_cq_stats, abort) },
20261880bc4eSEran Ben Elisha 	{ MLX5E_DECLARE_PTP_CQ_STAT(struct mlx5e_ptp_cq_stats, abort_abs_diff_ns) },
20271880bc4eSEran Ben Elisha };
20281880bc4eSEran Ben Elisha 
2029a28359e9SAya Levin static const struct counter_desc ptp_rq_stats_desc[] = {
2030a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, packets) },
2031a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, bytes) },
2032a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, csum_complete) },
2033a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, csum_complete_tail) },
2034a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, csum_complete_tail_slow) },
2035a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, csum_unnecessary) },
2036a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, csum_unnecessary_inner) },
2037a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, csum_none) },
2038a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, xdp_drop) },
2039a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, xdp_redirect) },
2040a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, lro_packets) },
2041a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, lro_bytes) },
2042a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, ecn_mark) },
2043a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, removed_vlan_packets) },
2044a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, wqe_err) },
2045a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, mpwqe_filler_cqes) },
2046a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, mpwqe_filler_strides) },
2047a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, oversize_pkts_sw_drop) },
2048a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, buff_alloc_err) },
2049a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, cqe_compress_blks) },
2050a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, cqe_compress_pkts) },
2051a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, cache_reuse) },
2052a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, cache_full) },
2053a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, cache_empty) },
2054a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, cache_busy) },
2055a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, cache_waive) },
2056a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, congst_umr) },
2057a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, arfs_err) },
2058a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, recover) },
2059a28359e9SAya Levin };
2060a28359e9SAya Levin 
2061214baf22SMaxim Mikityanskiy static const struct counter_desc qos_sq_stats_desc[] = {
2062214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, packets) },
2063214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, bytes) },
2064214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tso_packets) },
2065214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tso_bytes) },
2066214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tso_inner_packets) },
2067214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tso_inner_bytes) },
2068214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, csum_partial) },
2069214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, csum_partial_inner) },
2070214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, added_vlan_packets) },
2071214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, nop) },
2072214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, mpwqe_blks) },
2073214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, mpwqe_pkts) },
2074214baf22SMaxim Mikityanskiy #ifdef CONFIG_MLX5_EN_TLS
2075214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_encrypted_packets) },
2076214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_encrypted_bytes) },
2077214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_ooo) },
2078214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_dump_packets) },
2079214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_dump_bytes) },
2080214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_resync_bytes) },
2081214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_skip_no_sync_data) },
2082214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_drop_no_sync_data) },
2083214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_drop_bypass_req) },
2084214baf22SMaxim Mikityanskiy #endif
2085214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, csum_none) },
2086214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, stopped) },
2087214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, dropped) },
2088214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, xmit_more) },
2089214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, recover) },
2090214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, cqes) },
2091214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, wake) },
2092214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, cqe_err) },
2093214baf22SMaxim Mikityanskiy };
2094214baf22SMaxim Mikityanskiy 
20951fe85006SKamal Heib #define NUM_RQ_STATS			ARRAY_SIZE(rq_stats_desc)
20961fe85006SKamal Heib #define NUM_SQ_STATS			ARRAY_SIZE(sq_stats_desc)
209758b99ee3STariq Toukan #define NUM_XDPSQ_STATS			ARRAY_SIZE(xdpsq_stats_desc)
2098890388adSTariq Toukan #define NUM_RQ_XDPSQ_STATS		ARRAY_SIZE(rq_xdpsq_stats_desc)
2099db05815bSMaxim Mikityanskiy #define NUM_XSKRQ_STATS			ARRAY_SIZE(xskrq_stats_desc)
2100db05815bSMaxim Mikityanskiy #define NUM_XSKSQ_STATS			ARRAY_SIZE(xsksq_stats_desc)
210157d689a8SEran Ben Elisha #define NUM_CH_STATS			ARRAY_SIZE(ch_stats_desc)
2102145e5637SEran Ben Elisha #define NUM_PTP_SQ_STATS		ARRAY_SIZE(ptp_sq_stats_desc)
2103145e5637SEran Ben Elisha #define NUM_PTP_CH_STATS		ARRAY_SIZE(ptp_ch_stats_desc)
21041880bc4eSEran Ben Elisha #define NUM_PTP_CQ_STATS		ARRAY_SIZE(ptp_cq_stats_desc)
2105a28359e9SAya Levin #define NUM_PTP_RQ_STATS                ARRAY_SIZE(ptp_rq_stats_desc)
2106214baf22SMaxim Mikityanskiy #define NUM_QOS_SQ_STATS		ARRAY_SIZE(qos_sq_stats_desc)
2107214baf22SMaxim Mikityanskiy 
2108214baf22SMaxim Mikityanskiy static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(qos)
2109214baf22SMaxim Mikityanskiy {
2110214baf22SMaxim Mikityanskiy 	/* Pairs with smp_store_release in mlx5e_open_qos_sq. */
2111214baf22SMaxim Mikityanskiy 	return NUM_QOS_SQ_STATS * smp_load_acquire(&priv->htb.max_qos_sqs);
2112214baf22SMaxim Mikityanskiy }
2113214baf22SMaxim Mikityanskiy 
2114214baf22SMaxim Mikityanskiy static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(qos)
2115214baf22SMaxim Mikityanskiy {
2116214baf22SMaxim Mikityanskiy 	/* Pairs with smp_store_release in mlx5e_open_qos_sq. */
2117214baf22SMaxim Mikityanskiy 	u16 max_qos_sqs = smp_load_acquire(&priv->htb.max_qos_sqs);
2118214baf22SMaxim Mikityanskiy 	int i, qid;
2119214baf22SMaxim Mikityanskiy 
2120214baf22SMaxim Mikityanskiy 	for (qid = 0; qid < max_qos_sqs; qid++)
2121214baf22SMaxim Mikityanskiy 		for (i = 0; i < NUM_QOS_SQ_STATS; i++)
2122214baf22SMaxim Mikityanskiy 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
2123214baf22SMaxim Mikityanskiy 				qos_sq_stats_desc[i].format, qid);
2124214baf22SMaxim Mikityanskiy 
2125214baf22SMaxim Mikityanskiy 	return idx;
2126214baf22SMaxim Mikityanskiy }
2127214baf22SMaxim Mikityanskiy 
2128214baf22SMaxim Mikityanskiy static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(qos)
2129214baf22SMaxim Mikityanskiy {
2130214baf22SMaxim Mikityanskiy 	struct mlx5e_sq_stats **stats;
2131214baf22SMaxim Mikityanskiy 	u16 max_qos_sqs;
2132214baf22SMaxim Mikityanskiy 	int i, qid;
2133214baf22SMaxim Mikityanskiy 
2134214baf22SMaxim Mikityanskiy 	/* Pairs with smp_store_release in mlx5e_open_qos_sq. */
2135214baf22SMaxim Mikityanskiy 	max_qos_sqs = smp_load_acquire(&priv->htb.max_qos_sqs);
2136214baf22SMaxim Mikityanskiy 	stats = READ_ONCE(priv->htb.qos_sq_stats);
2137214baf22SMaxim Mikityanskiy 
2138214baf22SMaxim Mikityanskiy 	for (qid = 0; qid < max_qos_sqs; qid++) {
2139214baf22SMaxim Mikityanskiy 		struct mlx5e_sq_stats *s = READ_ONCE(stats[qid]);
2140214baf22SMaxim Mikityanskiy 
2141214baf22SMaxim Mikityanskiy 		for (i = 0; i < NUM_QOS_SQ_STATS; i++)
2142214baf22SMaxim Mikityanskiy 			data[idx++] = MLX5E_READ_CTR64_CPU(s, qos_sq_stats_desc, i);
2143214baf22SMaxim Mikityanskiy 	}
2144214baf22SMaxim Mikityanskiy 
2145214baf22SMaxim Mikityanskiy 	return idx;
2146214baf22SMaxim Mikityanskiy }
2147214baf22SMaxim Mikityanskiy 
2148214baf22SMaxim Mikityanskiy static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(qos) { return; }
2149145e5637SEran Ben Elisha 
2150145e5637SEran Ben Elisha static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(ptp)
2151145e5637SEran Ben Elisha {
2152a28359e9SAya Levin 	int num = NUM_PTP_CH_STATS;
2153a28359e9SAya Levin 
2154a28359e9SAya Levin 	if (!priv->tx_ptp_opened && !priv->rx_ptp_opened)
2155a28359e9SAya Levin 		return 0;
2156a28359e9SAya Levin 
2157a28359e9SAya Levin 	if (priv->tx_ptp_opened)
2158a28359e9SAya Levin 		num += (NUM_PTP_SQ_STATS + NUM_PTP_CQ_STATS) * priv->max_opened_tc;
2159a28359e9SAya Levin 	if (priv->rx_ptp_opened)
2160a28359e9SAya Levin 		num += NUM_PTP_RQ_STATS;
2161a28359e9SAya Levin 
2162a28359e9SAya Levin 	return num;
2163145e5637SEran Ben Elisha }
2164145e5637SEran Ben Elisha 
2165145e5637SEran Ben Elisha static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(ptp)
2166145e5637SEran Ben Elisha {
2167145e5637SEran Ben Elisha 	int i, tc;
2168145e5637SEran Ben Elisha 
2169a28359e9SAya Levin 	if (!priv->tx_ptp_opened && !priv->rx_ptp_opened)
2170145e5637SEran Ben Elisha 		return idx;
2171145e5637SEran Ben Elisha 
2172145e5637SEran Ben Elisha 	for (i = 0; i < NUM_PTP_CH_STATS; i++)
2173145e5637SEran Ben Elisha 		sprintf(data + (idx++) * ETH_GSTRING_LEN,
2174aef0f8c6SSaeed Mahameed 			"%s", ptp_ch_stats_desc[i].format);
2175145e5637SEran Ben Elisha 
2176a28359e9SAya Levin 	if (priv->tx_ptp_opened) {
2177145e5637SEran Ben Elisha 		for (tc = 0; tc < priv->max_opened_tc; tc++)
2178145e5637SEran Ben Elisha 			for (i = 0; i < NUM_PTP_SQ_STATS; i++)
2179145e5637SEran Ben Elisha 				sprintf(data + (idx++) * ETH_GSTRING_LEN,
2180145e5637SEran Ben Elisha 					ptp_sq_stats_desc[i].format, tc);
2181145e5637SEran Ben Elisha 
21821880bc4eSEran Ben Elisha 		for (tc = 0; tc < priv->max_opened_tc; tc++)
21831880bc4eSEran Ben Elisha 			for (i = 0; i < NUM_PTP_CQ_STATS; i++)
21841880bc4eSEran Ben Elisha 				sprintf(data + (idx++) * ETH_GSTRING_LEN,
21851880bc4eSEran Ben Elisha 					ptp_cq_stats_desc[i].format, tc);
2186a28359e9SAya Levin 	}
2187a28359e9SAya Levin 	if (priv->rx_ptp_opened) {
2188a28359e9SAya Levin 		for (i = 0; i < NUM_PTP_RQ_STATS; i++)
2189a28359e9SAya Levin 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
2190dd1979cfSLama Kayal 				ptp_rq_stats_desc[i].format, MLX5E_PTP_CHANNEL_IX);
2191a28359e9SAya Levin 	}
2192145e5637SEran Ben Elisha 	return idx;
2193145e5637SEran Ben Elisha }
2194145e5637SEran Ben Elisha 
2195145e5637SEran Ben Elisha static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(ptp)
2196145e5637SEran Ben Elisha {
2197145e5637SEran Ben Elisha 	int i, tc;
2198145e5637SEran Ben Elisha 
2199a28359e9SAya Levin 	if (!priv->tx_ptp_opened && !priv->rx_ptp_opened)
2200145e5637SEran Ben Elisha 		return idx;
2201145e5637SEran Ben Elisha 
2202145e5637SEran Ben Elisha 	for (i = 0; i < NUM_PTP_CH_STATS; i++)
2203145e5637SEran Ben Elisha 		data[idx++] =
2204b0d35de4SAya Levin 			MLX5E_READ_CTR64_CPU(&priv->ptp_stats.ch,
2205145e5637SEran Ben Elisha 					     ptp_ch_stats_desc, i);
2206145e5637SEran Ben Elisha 
2207a28359e9SAya Levin 	if (priv->tx_ptp_opened) {
2208145e5637SEran Ben Elisha 		for (tc = 0; tc < priv->max_opened_tc; tc++)
2209145e5637SEran Ben Elisha 			for (i = 0; i < NUM_PTP_SQ_STATS; i++)
2210145e5637SEran Ben Elisha 				data[idx++] =
2211b0d35de4SAya Levin 					MLX5E_READ_CTR64_CPU(&priv->ptp_stats.sq[tc],
2212145e5637SEran Ben Elisha 							     ptp_sq_stats_desc, i);
2213145e5637SEran Ben Elisha 
22141880bc4eSEran Ben Elisha 		for (tc = 0; tc < priv->max_opened_tc; tc++)
22151880bc4eSEran Ben Elisha 			for (i = 0; i < NUM_PTP_CQ_STATS; i++)
22161880bc4eSEran Ben Elisha 				data[idx++] =
2217b0d35de4SAya Levin 					MLX5E_READ_CTR64_CPU(&priv->ptp_stats.cq[tc],
22181880bc4eSEran Ben Elisha 							     ptp_cq_stats_desc, i);
2219a28359e9SAya Levin 	}
2220a28359e9SAya Levin 	if (priv->rx_ptp_opened) {
2221a28359e9SAya Levin 		for (i = 0; i < NUM_PTP_RQ_STATS; i++)
2222a28359e9SAya Levin 			data[idx++] =
2223a28359e9SAya Levin 				MLX5E_READ_CTR64_CPU(&priv->ptp_stats.rq,
2224a28359e9SAya Levin 						     ptp_rq_stats_desc, i);
2225a28359e9SAya Levin 	}
2226145e5637SEran Ben Elisha 	return idx;
2227145e5637SEran Ben Elisha }
2228145e5637SEran Ben Elisha 
2229145e5637SEran Ben Elisha static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(ptp) { return; }
22301fe85006SKamal Heib 
223196b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(channels)
22321fe85006SKamal Heib {
22339d758d4aSTariq Toukan 	int max_nch = priv->stats_nch;
223405909babSEran Ben Elisha 
223505909babSEran Ben Elisha 	return (NUM_RQ_STATS * max_nch) +
223605909babSEran Ben Elisha 	       (NUM_CH_STATS * max_nch) +
2237890388adSTariq Toukan 	       (NUM_SQ_STATS * max_nch * priv->max_opened_tc) +
223858b99ee3STariq Toukan 	       (NUM_RQ_XDPSQ_STATS * max_nch) +
2239db05815bSMaxim Mikityanskiy 	       (NUM_XDPSQ_STATS * max_nch) +
2240db05815bSMaxim Mikityanskiy 	       (NUM_XSKRQ_STATS * max_nch * priv->xsk.ever_used) +
2241db05815bSMaxim Mikityanskiy 	       (NUM_XSKSQ_STATS * max_nch * priv->xsk.ever_used);
22421fe85006SKamal Heib }
22431fe85006SKamal Heib 
224496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(channels)
22451fe85006SKamal Heib {
2246db05815bSMaxim Mikityanskiy 	bool is_xsk = priv->xsk.ever_used;
22479d758d4aSTariq Toukan 	int max_nch = priv->stats_nch;
22481fe85006SKamal Heib 	int i, j, tc;
22491fe85006SKamal Heib 
225005909babSEran Ben Elisha 	for (i = 0; i < max_nch; i++)
225157d689a8SEran Ben Elisha 		for (j = 0; j < NUM_CH_STATS; j++)
225257d689a8SEran Ben Elisha 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
225357d689a8SEran Ben Elisha 				ch_stats_desc[j].format, i);
225457d689a8SEran Ben Elisha 
2255890388adSTariq Toukan 	for (i = 0; i < max_nch; i++) {
22561fe85006SKamal Heib 		for (j = 0; j < NUM_RQ_STATS; j++)
2257890388adSTariq Toukan 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
2258890388adSTariq Toukan 				rq_stats_desc[j].format, i);
2259db05815bSMaxim Mikityanskiy 		for (j = 0; j < NUM_XSKRQ_STATS * is_xsk; j++)
2260db05815bSMaxim Mikityanskiy 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
2261db05815bSMaxim Mikityanskiy 				xskrq_stats_desc[j].format, i);
2262890388adSTariq Toukan 		for (j = 0; j < NUM_RQ_XDPSQ_STATS; j++)
2263890388adSTariq Toukan 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
2264890388adSTariq Toukan 				rq_xdpsq_stats_desc[j].format, i);
2265890388adSTariq Toukan 	}
22661fe85006SKamal Heib 
226705909babSEran Ben Elisha 	for (tc = 0; tc < priv->max_opened_tc; tc++)
226805909babSEran Ben Elisha 		for (i = 0; i < max_nch; i++)
22691fe85006SKamal Heib 			for (j = 0; j < NUM_SQ_STATS; j++)
22701fe85006SKamal Heib 				sprintf(data + (idx++) * ETH_GSTRING_LEN,
22711fe85006SKamal Heib 					sq_stats_desc[j].format,
2272c55d8b10SEran Ben Elisha 					i + tc * max_nch);
22731fe85006SKamal Heib 
2274db05815bSMaxim Mikityanskiy 	for (i = 0; i < max_nch; i++) {
2275db05815bSMaxim Mikityanskiy 		for (j = 0; j < NUM_XSKSQ_STATS * is_xsk; j++)
2276db05815bSMaxim Mikityanskiy 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
2277db05815bSMaxim Mikityanskiy 				xsksq_stats_desc[j].format, i);
227858b99ee3STariq Toukan 		for (j = 0; j < NUM_XDPSQ_STATS; j++)
227958b99ee3STariq Toukan 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
228058b99ee3STariq Toukan 				xdpsq_stats_desc[j].format, i);
2281db05815bSMaxim Mikityanskiy 	}
228258b99ee3STariq Toukan 
22831fe85006SKamal Heib 	return idx;
22841fe85006SKamal Heib }
22851fe85006SKamal Heib 
228696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(channels)
22871fe85006SKamal Heib {
2288db05815bSMaxim Mikityanskiy 	bool is_xsk = priv->xsk.ever_used;
22899d758d4aSTariq Toukan 	int max_nch = priv->stats_nch;
22901fe85006SKamal Heib 	int i, j, tc;
22911fe85006SKamal Heib 
229205909babSEran Ben Elisha 	for (i = 0; i < max_nch; i++)
229357d689a8SEran Ben Elisha 		for (j = 0; j < NUM_CH_STATS; j++)
229457d689a8SEran Ben Elisha 			data[idx++] =
2295be98737aSTariq Toukan 				MLX5E_READ_CTR64_CPU(&priv->channel_stats[i]->ch,
229657d689a8SEran Ben Elisha 						     ch_stats_desc, j);
229757d689a8SEran Ben Elisha 
2298890388adSTariq Toukan 	for (i = 0; i < max_nch; i++) {
22991fe85006SKamal Heib 		for (j = 0; j < NUM_RQ_STATS; j++)
23001fe85006SKamal Heib 			data[idx++] =
2301be98737aSTariq Toukan 				MLX5E_READ_CTR64_CPU(&priv->channel_stats[i]->rq,
23021fe85006SKamal Heib 						     rq_stats_desc, j);
2303db05815bSMaxim Mikityanskiy 		for (j = 0; j < NUM_XSKRQ_STATS * is_xsk; j++)
2304db05815bSMaxim Mikityanskiy 			data[idx++] =
2305be98737aSTariq Toukan 				MLX5E_READ_CTR64_CPU(&priv->channel_stats[i]->xskrq,
2306db05815bSMaxim Mikityanskiy 						     xskrq_stats_desc, j);
2307890388adSTariq Toukan 		for (j = 0; j < NUM_RQ_XDPSQ_STATS; j++)
2308890388adSTariq Toukan 			data[idx++] =
2309be98737aSTariq Toukan 				MLX5E_READ_CTR64_CPU(&priv->channel_stats[i]->rq_xdpsq,
2310890388adSTariq Toukan 						     rq_xdpsq_stats_desc, j);
2311890388adSTariq Toukan 	}
23121fe85006SKamal Heib 
231305909babSEran Ben Elisha 	for (tc = 0; tc < priv->max_opened_tc; tc++)
231405909babSEran Ben Elisha 		for (i = 0; i < max_nch; i++)
23151fe85006SKamal Heib 			for (j = 0; j < NUM_SQ_STATS; j++)
23161fe85006SKamal Heib 				data[idx++] =
2317be98737aSTariq Toukan 					MLX5E_READ_CTR64_CPU(&priv->channel_stats[i]->sq[tc],
23181fe85006SKamal Heib 							     sq_stats_desc, j);
23191fe85006SKamal Heib 
2320db05815bSMaxim Mikityanskiy 	for (i = 0; i < max_nch; i++) {
2321db05815bSMaxim Mikityanskiy 		for (j = 0; j < NUM_XSKSQ_STATS * is_xsk; j++)
2322db05815bSMaxim Mikityanskiy 			data[idx++] =
2323be98737aSTariq Toukan 				MLX5E_READ_CTR64_CPU(&priv->channel_stats[i]->xsksq,
2324db05815bSMaxim Mikityanskiy 						     xsksq_stats_desc, j);
232558b99ee3STariq Toukan 		for (j = 0; j < NUM_XDPSQ_STATS; j++)
232658b99ee3STariq Toukan 			data[idx++] =
2327be98737aSTariq Toukan 				MLX5E_READ_CTR64_CPU(&priv->channel_stats[i]->xdpsq,
232858b99ee3STariq Toukan 						     xdpsq_stats_desc, j);
2329db05815bSMaxim Mikityanskiy 	}
233058b99ee3STariq Toukan 
23311fe85006SKamal Heib 	return idx;
23321fe85006SKamal Heib }
23331fe85006SKamal Heib 
233496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(channels) { return; }
233596b12796SSaeed Mahameed 
23362a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(sw, 0);
23372a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(qcnt, MLX5E_NDO_UPDATE_STATS);
23382a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(vnic_env, 0);
23392a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(vport, MLX5E_NDO_UPDATE_STATS);
23402a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(802_3, MLX5E_NDO_UPDATE_STATS);
23412a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(2863, 0);
23422a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(2819, 0);
23432a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(phy, 0);
23442a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(pcie, 0);
23452a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(per_prio, 0);
23462a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(pme, 0);
23472a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(channels, 0);
23482a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(per_port_buff_congest, 0);
23497c453526SVlad Buslov MLX5E_DEFINE_STATS_GRP(eth_ext, 0);
2350f0ff8e8cSSaeed Mahameed static MLX5E_DEFINE_STATS_GRP(tls, 0);
2351145e5637SEran Ben Elisha static MLX5E_DEFINE_STATS_GRP(ptp, 0);
2352214baf22SMaxim Mikityanskiy static MLX5E_DEFINE_STATS_GRP(qos, 0);
2353f0ff8e8cSSaeed Mahameed 
235419386177SKamal Heib /* The stats groups order is opposite to the update_stats() order calls */
2355f0ff8e8cSSaeed Mahameed mlx5e_stats_grp_t mlx5e_nic_stats_grps[] = {
2356f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(sw),
2357f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(qcnt),
2358f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(vnic_env),
2359f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(vport),
2360f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(802_3),
2361f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(2863),
2362f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(2819),
2363f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(phy),
2364f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(eth_ext),
2365f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(pcie),
2366f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(per_prio),
2367f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(pme),
23680aab3e1bSRaed Salem #ifdef CONFIG_MLX5_EN_IPSEC
23690aab3e1bSRaed Salem 	&MLX5E_STATS_GRP(ipsec_sw),
23700aab3e1bSRaed Salem 	&MLX5E_STATS_GRP(ipsec_hw),
23710aab3e1bSRaed Salem #endif
2372f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(tls),
2373f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(channels),
2374f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(per_port_buff_congest),
2375145e5637SEran Ben Elisha 	&MLX5E_STATS_GRP(ptp),
2376214baf22SMaxim Mikityanskiy 	&MLX5E_STATS_GRP(qos),
2377c0752f2bSKamal Heib };
2378c0752f2bSKamal Heib 
23793460c184SSaeed Mahameed unsigned int mlx5e_nic_stats_grps_num(struct mlx5e_priv *priv)
23803460c184SSaeed Mahameed {
23813460c184SSaeed Mahameed 	return ARRAY_SIZE(mlx5e_nic_stats_grps);
23823460c184SSaeed Mahameed }
2383