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"
38c0752f2bSKamal Heib 
393460c184SSaeed Mahameed static unsigned int stats_grps_num(struct mlx5e_priv *priv)
403460c184SSaeed Mahameed {
413460c184SSaeed Mahameed 	return !priv->profile->stats_grps_num ? 0 :
423460c184SSaeed Mahameed 		priv->profile->stats_grps_num(priv);
433460c184SSaeed Mahameed }
443460c184SSaeed Mahameed 
453460c184SSaeed Mahameed unsigned int mlx5e_stats_total_num(struct mlx5e_priv *priv)
463460c184SSaeed Mahameed {
47f0ff8e8cSSaeed Mahameed 	mlx5e_stats_grp_t *stats_grps = priv->profile->stats_grps;
483460c184SSaeed Mahameed 	const unsigned int num_stats_grps = stats_grps_num(priv);
493460c184SSaeed Mahameed 	unsigned int total = 0;
503460c184SSaeed Mahameed 	int i;
513460c184SSaeed Mahameed 
523460c184SSaeed Mahameed 	for (i = 0; i < num_stats_grps; i++)
53f0ff8e8cSSaeed Mahameed 		total += stats_grps[i]->get_num_stats(priv);
543460c184SSaeed Mahameed 
553460c184SSaeed Mahameed 	return total;
563460c184SSaeed Mahameed }
573460c184SSaeed Mahameed 
58b521105bSAlaa Hleihel void mlx5e_stats_update_ndo_stats(struct mlx5e_priv *priv)
59b521105bSAlaa Hleihel {
60b521105bSAlaa Hleihel 	mlx5e_stats_grp_t *stats_grps = priv->profile->stats_grps;
61b521105bSAlaa Hleihel 	const unsigned int num_stats_grps = stats_grps_num(priv);
62b521105bSAlaa Hleihel 	int i;
63b521105bSAlaa Hleihel 
64b521105bSAlaa Hleihel 	for (i = num_stats_grps - 1; i >= 0; i--)
65b521105bSAlaa Hleihel 		if (stats_grps[i]->update_stats &&
66b521105bSAlaa Hleihel 		    stats_grps[i]->update_stats_mask & MLX5E_NDO_UPDATE_STATS)
67b521105bSAlaa Hleihel 			stats_grps[i]->update_stats(priv);
68b521105bSAlaa Hleihel }
69b521105bSAlaa Hleihel 
703460c184SSaeed Mahameed void mlx5e_stats_update(struct mlx5e_priv *priv)
713460c184SSaeed Mahameed {
72f0ff8e8cSSaeed Mahameed 	mlx5e_stats_grp_t *stats_grps = priv->profile->stats_grps;
733460c184SSaeed Mahameed 	const unsigned int num_stats_grps = stats_grps_num(priv);
743460c184SSaeed Mahameed 	int i;
753460c184SSaeed Mahameed 
763460c184SSaeed Mahameed 	for (i = num_stats_grps - 1; i >= 0; i--)
77f0ff8e8cSSaeed Mahameed 		if (stats_grps[i]->update_stats)
78f0ff8e8cSSaeed Mahameed 			stats_grps[i]->update_stats(priv);
793460c184SSaeed Mahameed }
803460c184SSaeed Mahameed 
813460c184SSaeed Mahameed void mlx5e_stats_fill(struct mlx5e_priv *priv, u64 *data, int idx)
823460c184SSaeed Mahameed {
83f0ff8e8cSSaeed Mahameed 	mlx5e_stats_grp_t *stats_grps = priv->profile->stats_grps;
843460c184SSaeed Mahameed 	const unsigned int num_stats_grps = stats_grps_num(priv);
853460c184SSaeed Mahameed 	int i;
863460c184SSaeed Mahameed 
873460c184SSaeed Mahameed 	for (i = 0; i < num_stats_grps; i++)
88f0ff8e8cSSaeed Mahameed 		idx = stats_grps[i]->fill_stats(priv, data, idx);
893460c184SSaeed Mahameed }
903460c184SSaeed Mahameed 
913460c184SSaeed Mahameed void mlx5e_stats_fill_strings(struct mlx5e_priv *priv, u8 *data)
923460c184SSaeed Mahameed {
93f0ff8e8cSSaeed Mahameed 	mlx5e_stats_grp_t *stats_grps = priv->profile->stats_grps;
943460c184SSaeed Mahameed 	const unsigned int num_stats_grps = stats_grps_num(priv);
953460c184SSaeed Mahameed 	int i, idx = 0;
963460c184SSaeed Mahameed 
973460c184SSaeed Mahameed 	for (i = 0; i < num_stats_grps; i++)
98f0ff8e8cSSaeed Mahameed 		idx = stats_grps[i]->fill_strings(priv, data, idx);
993460c184SSaeed Mahameed }
1003460c184SSaeed Mahameed 
1013460c184SSaeed Mahameed /* Concrete NIC Stats */
1023460c184SSaeed Mahameed 
103c0752f2bSKamal Heib static const struct counter_desc sw_stats_desc[] = {
104c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_packets) },
105c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_bytes) },
106c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_packets) },
107c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_bytes) },
108c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tso_packets) },
109c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tso_bytes) },
110c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tso_inner_packets) },
111c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tso_inner_bytes) },
112f24686e8SGal Pressman 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_added_vlan_packets) },
1132ad9ecdbSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_nop) },
1145af75c74SMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_mpwqe_blks) },
1155af75c74SMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_mpwqe_pkts) },
116bf239741SIlya Lesokhin 
117bf239741SIlya Lesokhin #ifdef CONFIG_MLX5_EN_TLS
118d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_encrypted_packets) },
119d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_encrypted_bytes) },
120bf239741SIlya Lesokhin 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_ooo) },
121d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_dump_packets) },
122d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_dump_bytes) },
12346a3ea98STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_resync_bytes) },
12446a3ea98STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_skip_no_sync_data) },
12546a3ea98STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_drop_no_sync_data) },
12646a3ea98STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_drop_bypass_req) },
127bf239741SIlya Lesokhin #endif
128bf239741SIlya Lesokhin 
129c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_lro_packets) },
130c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_lro_bytes) },
131def09e7bSKhalid Manaa 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_gro_packets) },
132def09e7bSKhalid Manaa 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_gro_bytes) },
133def09e7bSKhalid Manaa 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_gro_skbs) },
134def09e7bSKhalid Manaa 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_gro_match_packets) },
135def09e7bSKhalid Manaa 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_gro_large_hds) },
136f007c13dSNatali Shechtman 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_ecn_mark) },
137f24686e8SGal Pressman 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_removed_vlan_packets) },
138c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_unnecessary) },
139c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_none) },
140c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_complete) },
1410aa1d186SSaeed Mahameed 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_complete_tail) },
1420aa1d186SSaeed Mahameed 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_complete_tail_slow) },
143c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_unnecessary_inner) },
144c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_drop) },
14586690b4bSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_redirect) },
146890388adSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_xmit) },
14773cab880SShay Agroskin 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_mpwqe) },
148c2273219SShay Agroskin 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_inlnw) },
1496c085a8aSShay Agroskin 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_nops) },
150c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_full) },
151890388adSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_err) },
152890388adSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_cqe) },
153c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_csum_none) },
154c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_csum_partial) },
155c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_csum_partial_inner) },
156c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_stopped) },
157c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_dropped) },
158c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xmit_more) },
159db75373cSEran Ben Elisha 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_recover) },
16086155656STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_cqes) },
161f65a59ffSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_wake) },
162f65a59ffSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_cqe_err) },
16358b99ee3STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_xmit) },
16473cab880SShay Agroskin 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_mpwqe) },
165c2273219SShay Agroskin 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_inlnw) },
1666c085a8aSShay Agroskin 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_nops) },
16758b99ee3STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_full) },
16858b99ee3STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_err) },
16958b99ee3STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_cqes) },
170c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_wqe_err) },
171b71ba6b4STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_mpwqe_filler_cqes) },
172b71ba6b4STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_mpwqe_filler_strides) },
1730073c8f7SMoshe Shemesh 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_oversize_pkts_sw_drop) },
174c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_buff_alloc_err) },
175c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cqe_compress_blks) },
176c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cqe_compress_pkts) },
177c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cache_reuse) },
178c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cache_full) },
179c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cache_empty) },
180c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cache_busy) },
181c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cache_waive) },
182dc983f0eSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_congst_umr) },
18394563847SEran Ben Elisha 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_arfs_err) },
184be5323c8SAya Levin 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_recover) },
18576c1e1acSTariq Toukan #ifdef CONFIG_MLX5_EN_TLS
18676c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_decrypted_packets) },
18776c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_decrypted_bytes) },
18876c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_req_pkt) },
18976c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_req_start) },
19076c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_req_end) },
19176c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_req_skip) },
19276c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_res_ok) },
193e9ce991bSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_res_retry) },
19476c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_res_skip) },
19576c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_err) },
19676c1e1acSTariq Toukan #endif
197a1bf74dcSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, ch_events) },
1982d7103c8STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, ch_poll) },
1992d7103c8STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, ch_arm) },
2002d7103c8STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, ch_aff_change) },
201db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, ch_force_irq) },
20257d689a8SEran Ben Elisha 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, ch_eq_rearm) },
203db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_packets) },
204db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_bytes) },
205db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_csum_complete) },
206db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_csum_unnecessary) },
207db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_csum_unnecessary_inner) },
208db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_csum_none) },
209db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_ecn_mark) },
210db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_removed_vlan_packets) },
211db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_xdp_drop) },
212db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_xdp_redirect) },
213db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_wqe_err) },
214db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_mpwqe_filler_cqes) },
215db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_mpwqe_filler_strides) },
216db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_oversize_pkts_sw_drop) },
217db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_buff_alloc_err) },
218db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_cqe_compress_blks) },
219db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_cqe_compress_pkts) },
220db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_congst_umr) },
221db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_arfs_err) },
222db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xsk_xmit) },
223db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xsk_mpwqe) },
224db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xsk_inlnw) },
225db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xsk_full) },
226db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xsk_err) },
227db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xsk_cqes) },
228c0752f2bSKamal Heib };
229c0752f2bSKamal Heib 
230c0752f2bSKamal Heib #define NUM_SW_COUNTERS			ARRAY_SIZE(sw_stats_desc)
231c0752f2bSKamal Heib 
23296b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(sw)
233c0752f2bSKamal Heib {
234c0752f2bSKamal Heib 	return NUM_SW_COUNTERS;
235c0752f2bSKamal Heib }
236c0752f2bSKamal Heib 
23796b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(sw)
238c0752f2bSKamal Heib {
239c0752f2bSKamal Heib 	int i;
240c0752f2bSKamal Heib 
241c0752f2bSKamal Heib 	for (i = 0; i < NUM_SW_COUNTERS; i++)
242c0752f2bSKamal Heib 		strcpy(data + (idx++) * ETH_GSTRING_LEN, sw_stats_desc[i].format);
243c0752f2bSKamal Heib 	return idx;
244c0752f2bSKamal Heib }
245c0752f2bSKamal Heib 
24696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(sw)
247c0752f2bSKamal Heib {
248c0752f2bSKamal Heib 	int i;
249c0752f2bSKamal Heib 
250c0752f2bSKamal Heib 	for (i = 0; i < NUM_SW_COUNTERS; i++)
251c0752f2bSKamal Heib 		data[idx++] = MLX5E_READ_CTR64_CPU(&priv->stats.sw, sw_stats_desc, i);
252c0752f2bSKamal Heib 	return idx;
253c0752f2bSKamal Heib }
254c0752f2bSKamal Heib 
2551a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_xdp_red(struct mlx5e_sw_stats *s,
2561a7f5124SEran Ben Elisha 						    struct mlx5e_xdpsq_stats *xdpsq_red_stats)
25719386177SKamal Heib {
2581a7f5124SEran Ben Elisha 	s->tx_xdp_xmit  += xdpsq_red_stats->xmit;
2591a7f5124SEran Ben Elisha 	s->tx_xdp_mpwqe += xdpsq_red_stats->mpwqe;
2601a7f5124SEran Ben Elisha 	s->tx_xdp_inlnw += xdpsq_red_stats->inlnw;
2611a7f5124SEran Ben Elisha 	s->tx_xdp_nops  += xdpsq_red_stats->nops;
2621a7f5124SEran Ben Elisha 	s->tx_xdp_full  += xdpsq_red_stats->full;
2631a7f5124SEran Ben Elisha 	s->tx_xdp_err   += xdpsq_red_stats->err;
2641a7f5124SEran Ben Elisha 	s->tx_xdp_cqes  += xdpsq_red_stats->cqes;
2651a7f5124SEran Ben Elisha }
26619386177SKamal Heib 
2671a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_xdpsq(struct mlx5e_sw_stats *s,
2681a7f5124SEran Ben Elisha 						  struct mlx5e_xdpsq_stats *xdpsq_stats)
2691a7f5124SEran Ben Elisha {
2701a7f5124SEran Ben Elisha 	s->rx_xdp_tx_xmit  += xdpsq_stats->xmit;
2711a7f5124SEran Ben Elisha 	s->rx_xdp_tx_mpwqe += xdpsq_stats->mpwqe;
2721a7f5124SEran Ben Elisha 	s->rx_xdp_tx_inlnw += xdpsq_stats->inlnw;
2731a7f5124SEran Ben Elisha 	s->rx_xdp_tx_nops  += xdpsq_stats->nops;
2741a7f5124SEran Ben Elisha 	s->rx_xdp_tx_full  += xdpsq_stats->full;
2751a7f5124SEran Ben Elisha 	s->rx_xdp_tx_err   += xdpsq_stats->err;
2761a7f5124SEran Ben Elisha 	s->rx_xdp_tx_cqe   += xdpsq_stats->cqes;
2771a7f5124SEran Ben Elisha }
27819386177SKamal Heib 
2791a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_xsksq(struct mlx5e_sw_stats *s,
2801a7f5124SEran Ben Elisha 						  struct mlx5e_xdpsq_stats *xsksq_stats)
2811a7f5124SEran Ben Elisha {
2821a7f5124SEran Ben Elisha 	s->tx_xsk_xmit  += xsksq_stats->xmit;
2831a7f5124SEran Ben Elisha 	s->tx_xsk_mpwqe += xsksq_stats->mpwqe;
2841a7f5124SEran Ben Elisha 	s->tx_xsk_inlnw += xsksq_stats->inlnw;
2851a7f5124SEran Ben Elisha 	s->tx_xsk_full  += xsksq_stats->full;
2861a7f5124SEran Ben Elisha 	s->tx_xsk_err   += xsksq_stats->err;
2871a7f5124SEran Ben Elisha 	s->tx_xsk_cqes  += xsksq_stats->cqes;
2881a7f5124SEran Ben Elisha }
28919386177SKamal Heib 
2901a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_xskrq(struct mlx5e_sw_stats *s,
2911a7f5124SEran Ben Elisha 						  struct mlx5e_rq_stats *xskrq_stats)
2921a7f5124SEran Ben Elisha {
2931a7f5124SEran Ben Elisha 	s->rx_xsk_packets                += xskrq_stats->packets;
2941a7f5124SEran Ben Elisha 	s->rx_xsk_bytes                  += xskrq_stats->bytes;
2951a7f5124SEran Ben Elisha 	s->rx_xsk_csum_complete          += xskrq_stats->csum_complete;
2961a7f5124SEran Ben Elisha 	s->rx_xsk_csum_unnecessary       += xskrq_stats->csum_unnecessary;
2971a7f5124SEran Ben Elisha 	s->rx_xsk_csum_unnecessary_inner += xskrq_stats->csum_unnecessary_inner;
2981a7f5124SEran Ben Elisha 	s->rx_xsk_csum_none              += xskrq_stats->csum_none;
2991a7f5124SEran Ben Elisha 	s->rx_xsk_ecn_mark               += xskrq_stats->ecn_mark;
3001a7f5124SEran Ben Elisha 	s->rx_xsk_removed_vlan_packets   += xskrq_stats->removed_vlan_packets;
3011a7f5124SEran Ben Elisha 	s->rx_xsk_xdp_drop               += xskrq_stats->xdp_drop;
3021a7f5124SEran Ben Elisha 	s->rx_xsk_xdp_redirect           += xskrq_stats->xdp_redirect;
3031a7f5124SEran Ben Elisha 	s->rx_xsk_wqe_err                += xskrq_stats->wqe_err;
3041a7f5124SEran Ben Elisha 	s->rx_xsk_mpwqe_filler_cqes      += xskrq_stats->mpwqe_filler_cqes;
3051a7f5124SEran Ben Elisha 	s->rx_xsk_mpwqe_filler_strides   += xskrq_stats->mpwqe_filler_strides;
3061a7f5124SEran Ben Elisha 	s->rx_xsk_oversize_pkts_sw_drop  += xskrq_stats->oversize_pkts_sw_drop;
3071a7f5124SEran Ben Elisha 	s->rx_xsk_buff_alloc_err         += xskrq_stats->buff_alloc_err;
3081a7f5124SEran Ben Elisha 	s->rx_xsk_cqe_compress_blks      += xskrq_stats->cqe_compress_blks;
3091a7f5124SEran Ben Elisha 	s->rx_xsk_cqe_compress_pkts      += xskrq_stats->cqe_compress_pkts;
3101a7f5124SEran Ben Elisha 	s->rx_xsk_congst_umr             += xskrq_stats->congst_umr;
3111a7f5124SEran Ben Elisha 	s->rx_xsk_arfs_err               += xskrq_stats->arfs_err;
3121a7f5124SEran Ben Elisha }
3131a7f5124SEran Ben Elisha 
3141a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_rq_stats(struct mlx5e_sw_stats *s,
3151a7f5124SEran Ben Elisha 						     struct mlx5e_rq_stats *rq_stats)
3161a7f5124SEran Ben Elisha {
31719386177SKamal Heib 	s->rx_packets                 += rq_stats->packets;
31819386177SKamal Heib 	s->rx_bytes                   += rq_stats->bytes;
31919386177SKamal Heib 	s->rx_lro_packets             += rq_stats->lro_packets;
32019386177SKamal Heib 	s->rx_lro_bytes               += rq_stats->lro_bytes;
321def09e7bSKhalid Manaa 	s->rx_gro_packets             += rq_stats->gro_packets;
322def09e7bSKhalid Manaa 	s->rx_gro_bytes               += rq_stats->gro_bytes;
323def09e7bSKhalid Manaa 	s->rx_gro_skbs                += rq_stats->gro_skbs;
324def09e7bSKhalid Manaa 	s->rx_gro_match_packets       += rq_stats->gro_match_packets;
325def09e7bSKhalid Manaa 	s->rx_gro_large_hds           += rq_stats->gro_large_hds;
326f007c13dSNatali Shechtman 	s->rx_ecn_mark                += rq_stats->ecn_mark;
32719386177SKamal Heib 	s->rx_removed_vlan_packets    += rq_stats->removed_vlan_packets;
32819386177SKamal Heib 	s->rx_csum_none               += rq_stats->csum_none;
32919386177SKamal Heib 	s->rx_csum_complete           += rq_stats->csum_complete;
3300aa1d186SSaeed Mahameed 	s->rx_csum_complete_tail      += rq_stats->csum_complete_tail;
3310aa1d186SSaeed Mahameed 	s->rx_csum_complete_tail_slow += rq_stats->csum_complete_tail_slow;
33219386177SKamal Heib 	s->rx_csum_unnecessary        += rq_stats->csum_unnecessary;
33319386177SKamal Heib 	s->rx_csum_unnecessary_inner  += rq_stats->csum_unnecessary_inner;
33419386177SKamal Heib 	s->rx_xdp_drop                += rq_stats->xdp_drop;
33586690b4bSTariq Toukan 	s->rx_xdp_redirect            += rq_stats->xdp_redirect;
33619386177SKamal Heib 	s->rx_wqe_err                 += rq_stats->wqe_err;
337b71ba6b4STariq Toukan 	s->rx_mpwqe_filler_cqes       += rq_stats->mpwqe_filler_cqes;
338b71ba6b4STariq Toukan 	s->rx_mpwqe_filler_strides    += rq_stats->mpwqe_filler_strides;
3390073c8f7SMoshe Shemesh 	s->rx_oversize_pkts_sw_drop   += rq_stats->oversize_pkts_sw_drop;
34019386177SKamal Heib 	s->rx_buff_alloc_err          += rq_stats->buff_alloc_err;
34119386177SKamal Heib 	s->rx_cqe_compress_blks       += rq_stats->cqe_compress_blks;
34219386177SKamal Heib 	s->rx_cqe_compress_pkts       += rq_stats->cqe_compress_pkts;
34319386177SKamal Heib 	s->rx_cache_reuse             += rq_stats->cache_reuse;
34419386177SKamal Heib 	s->rx_cache_full              += rq_stats->cache_full;
34519386177SKamal Heib 	s->rx_cache_empty             += rq_stats->cache_empty;
34619386177SKamal Heib 	s->rx_cache_busy              += rq_stats->cache_busy;
34719386177SKamal Heib 	s->rx_cache_waive             += rq_stats->cache_waive;
348dc983f0eSTariq Toukan 	s->rx_congst_umr              += rq_stats->congst_umr;
34994563847SEran Ben Elisha 	s->rx_arfs_err                += rq_stats->arfs_err;
350be5323c8SAya Levin 	s->rx_recover                 += rq_stats->recover;
35176c1e1acSTariq Toukan #ifdef CONFIG_MLX5_EN_TLS
35276c1e1acSTariq Toukan 	s->rx_tls_decrypted_packets   += rq_stats->tls_decrypted_packets;
35376c1e1acSTariq Toukan 	s->rx_tls_decrypted_bytes     += rq_stats->tls_decrypted_bytes;
35476c1e1acSTariq Toukan 	s->rx_tls_resync_req_pkt      += rq_stats->tls_resync_req_pkt;
35576c1e1acSTariq Toukan 	s->rx_tls_resync_req_start    += rq_stats->tls_resync_req_start;
35676c1e1acSTariq Toukan 	s->rx_tls_resync_req_end      += rq_stats->tls_resync_req_end;
35776c1e1acSTariq Toukan 	s->rx_tls_resync_req_skip     += rq_stats->tls_resync_req_skip;
35876c1e1acSTariq Toukan 	s->rx_tls_resync_res_ok       += rq_stats->tls_resync_res_ok;
359e9ce991bSTariq Toukan 	s->rx_tls_resync_res_retry    += rq_stats->tls_resync_res_retry;
36076c1e1acSTariq Toukan 	s->rx_tls_resync_res_skip     += rq_stats->tls_resync_res_skip;
36176c1e1acSTariq Toukan 	s->rx_tls_err                 += rq_stats->tls_err;
36276c1e1acSTariq Toukan #endif
3631a7f5124SEran Ben Elisha }
3641a7f5124SEran Ben Elisha 
3651a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_ch_stats(struct mlx5e_sw_stats *s,
3661a7f5124SEran Ben Elisha 						     struct mlx5e_ch_stats *ch_stats)
3671a7f5124SEran Ben Elisha {
368a1bf74dcSTariq Toukan 	s->ch_events      += ch_stats->events;
3692d7103c8STariq Toukan 	s->ch_poll        += ch_stats->poll;
3702d7103c8STariq Toukan 	s->ch_arm         += ch_stats->arm;
3712d7103c8STariq Toukan 	s->ch_aff_change  += ch_stats->aff_change;
372db05815bSMaxim Mikityanskiy 	s->ch_force_irq   += ch_stats->force_irq;
37319386177SKamal Heib 	s->ch_eq_rearm    += ch_stats->eq_rearm;
3741a7f5124SEran Ben Elisha }
37519386177SKamal Heib 
3761a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_sq(struct mlx5e_sw_stats *s,
3771a7f5124SEran Ben Elisha 					       struct mlx5e_sq_stats *sq_stats)
3781a7f5124SEran Ben Elisha {
37919386177SKamal Heib 	s->tx_packets               += sq_stats->packets;
38019386177SKamal Heib 	s->tx_bytes                 += sq_stats->bytes;
38119386177SKamal Heib 	s->tx_tso_packets           += sq_stats->tso_packets;
38219386177SKamal Heib 	s->tx_tso_bytes             += sq_stats->tso_bytes;
38319386177SKamal Heib 	s->tx_tso_inner_packets     += sq_stats->tso_inner_packets;
38419386177SKamal Heib 	s->tx_tso_inner_bytes       += sq_stats->tso_inner_bytes;
38519386177SKamal Heib 	s->tx_added_vlan_packets    += sq_stats->added_vlan_packets;
3862ad9ecdbSTariq Toukan 	s->tx_nop                   += sq_stats->nop;
3875af75c74SMaxim Mikityanskiy 	s->tx_mpwqe_blks            += sq_stats->mpwqe_blks;
3885af75c74SMaxim Mikityanskiy 	s->tx_mpwqe_pkts            += sq_stats->mpwqe_pkts;
38919386177SKamal Heib 	s->tx_queue_stopped         += sq_stats->stopped;
39019386177SKamal Heib 	s->tx_queue_wake            += sq_stats->wake;
39119386177SKamal Heib 	s->tx_queue_dropped         += sq_stats->dropped;
39216cc14d8SEran Ben Elisha 	s->tx_cqe_err               += sq_stats->cqe_err;
393db75373cSEran Ben Elisha 	s->tx_recover               += sq_stats->recover;
39419386177SKamal Heib 	s->tx_xmit_more             += sq_stats->xmit_more;
39519386177SKamal Heib 	s->tx_csum_partial_inner    += sq_stats->csum_partial_inner;
39619386177SKamal Heib 	s->tx_csum_none             += sq_stats->csum_none;
39719386177SKamal Heib 	s->tx_csum_partial          += sq_stats->csum_partial;
398bf239741SIlya Lesokhin #ifdef CONFIG_MLX5_EN_TLS
399d2ead1f3STariq Toukan 	s->tx_tls_encrypted_packets += sq_stats->tls_encrypted_packets;
400d2ead1f3STariq Toukan 	s->tx_tls_encrypted_bytes   += sq_stats->tls_encrypted_bytes;
401bf239741SIlya Lesokhin 	s->tx_tls_ooo               += sq_stats->tls_ooo;
402d2ead1f3STariq Toukan 	s->tx_tls_dump_bytes        += sq_stats->tls_dump_bytes;
403d2ead1f3STariq Toukan 	s->tx_tls_dump_packets      += sq_stats->tls_dump_packets;
40446a3ea98STariq Toukan 	s->tx_tls_resync_bytes      += sq_stats->tls_resync_bytes;
40546a3ea98STariq Toukan 	s->tx_tls_skip_no_sync_data += sq_stats->tls_skip_no_sync_data;
40646a3ea98STariq Toukan 	s->tx_tls_drop_no_sync_data += sq_stats->tls_drop_no_sync_data;
40746a3ea98STariq Toukan 	s->tx_tls_drop_bypass_req   += sq_stats->tls_drop_bypass_req;
408bf239741SIlya Lesokhin #endif
40986155656STariq Toukan 	s->tx_cqes                  += sq_stats->cqes;
4101a7f5124SEran Ben Elisha }
4111a7f5124SEran Ben Elisha 
412145e5637SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_ptp(struct mlx5e_priv *priv,
413145e5637SEran Ben Elisha 						struct mlx5e_sw_stats *s)
414145e5637SEran Ben Elisha {
415145e5637SEran Ben Elisha 	int i;
416145e5637SEran Ben Elisha 
417a28359e9SAya Levin 	if (!priv->tx_ptp_opened && !priv->rx_ptp_opened)
418145e5637SEran Ben Elisha 		return;
419145e5637SEran Ben Elisha 
420b0d35de4SAya Levin 	mlx5e_stats_grp_sw_update_stats_ch_stats(s, &priv->ptp_stats.ch);
421145e5637SEran Ben Elisha 
422a28359e9SAya Levin 	if (priv->tx_ptp_opened) {
423145e5637SEran Ben Elisha 		for (i = 0; i < priv->max_opened_tc; i++) {
424b0d35de4SAya Levin 			mlx5e_stats_grp_sw_update_stats_sq(s, &priv->ptp_stats.sq[i]);
425145e5637SEran Ben Elisha 
426145e5637SEran Ben Elisha 			/* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92657 */
427145e5637SEran Ben Elisha 			barrier();
428145e5637SEran Ben Elisha 		}
429145e5637SEran Ben Elisha 	}
430a28359e9SAya Levin 	if (priv->rx_ptp_opened) {
431a28359e9SAya Levin 		mlx5e_stats_grp_sw_update_stats_rq_stats(s, &priv->ptp_stats.rq);
432a28359e9SAya Levin 
433a28359e9SAya Levin 		/* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92657 */
434a28359e9SAya Levin 		barrier();
435a28359e9SAya Levin 	}
436a28359e9SAya Levin }
437145e5637SEran Ben Elisha 
438214baf22SMaxim Mikityanskiy static void mlx5e_stats_grp_sw_update_stats_qos(struct mlx5e_priv *priv,
439214baf22SMaxim Mikityanskiy 						struct mlx5e_sw_stats *s)
440214baf22SMaxim Mikityanskiy {
441214baf22SMaxim Mikityanskiy 	struct mlx5e_sq_stats **stats;
442214baf22SMaxim Mikityanskiy 	u16 max_qos_sqs;
443214baf22SMaxim Mikityanskiy 	int i;
444214baf22SMaxim Mikityanskiy 
445214baf22SMaxim Mikityanskiy 	/* Pairs with smp_store_release in mlx5e_open_qos_sq. */
446214baf22SMaxim Mikityanskiy 	max_qos_sqs = smp_load_acquire(&priv->htb.max_qos_sqs);
447214baf22SMaxim Mikityanskiy 	stats = READ_ONCE(priv->htb.qos_sq_stats);
448214baf22SMaxim Mikityanskiy 
449214baf22SMaxim Mikityanskiy 	for (i = 0; i < max_qos_sqs; i++) {
450214baf22SMaxim Mikityanskiy 		mlx5e_stats_grp_sw_update_stats_sq(s, READ_ONCE(stats[i]));
451214baf22SMaxim Mikityanskiy 
452214baf22SMaxim Mikityanskiy 		/* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92657 */
453214baf22SMaxim Mikityanskiy 		barrier();
454214baf22SMaxim Mikityanskiy 	}
455214baf22SMaxim Mikityanskiy }
456214baf22SMaxim Mikityanskiy 
4571a7f5124SEran Ben Elisha static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(sw)
4581a7f5124SEran Ben Elisha {
4591a7f5124SEran Ben Elisha 	struct mlx5e_sw_stats *s = &priv->stats.sw;
4601a7f5124SEran Ben Elisha 	int i;
4611a7f5124SEran Ben Elisha 
4621a7f5124SEran Ben Elisha 	memset(s, 0, sizeof(*s));
4631a7f5124SEran Ben Elisha 
4649d758d4aSTariq Toukan 	for (i = 0; i < priv->stats_nch; i++) {
4651a7f5124SEran Ben Elisha 		struct mlx5e_channel_stats *channel_stats =
4661a7f5124SEran Ben Elisha 			&priv->channel_stats[i];
4671a7f5124SEran Ben Elisha 		int j;
4681a7f5124SEran Ben Elisha 
4691a7f5124SEran Ben Elisha 		mlx5e_stats_grp_sw_update_stats_rq_stats(s, &channel_stats->rq);
4701a7f5124SEran Ben Elisha 		mlx5e_stats_grp_sw_update_stats_xdpsq(s, &channel_stats->rq_xdpsq);
4711a7f5124SEran Ben Elisha 		mlx5e_stats_grp_sw_update_stats_ch_stats(s, &channel_stats->ch);
4721a7f5124SEran Ben Elisha 		/* xdp redirect */
4731a7f5124SEran Ben Elisha 		mlx5e_stats_grp_sw_update_stats_xdp_red(s, &channel_stats->xdpsq);
4741a7f5124SEran Ben Elisha 		/* AF_XDP zero-copy */
4751a7f5124SEran Ben Elisha 		mlx5e_stats_grp_sw_update_stats_xskrq(s, &channel_stats->xskrq);
4761a7f5124SEran Ben Elisha 		mlx5e_stats_grp_sw_update_stats_xsksq(s, &channel_stats->xsksq);
4771a7f5124SEran Ben Elisha 
4781a7f5124SEran Ben Elisha 		for (j = 0; j < priv->max_opened_tc; j++) {
4791a7f5124SEran Ben Elisha 			mlx5e_stats_grp_sw_update_stats_sq(s, &channel_stats->sq[j]);
48042ae1a5cSArnd Bergmann 
48142ae1a5cSArnd Bergmann 			/* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92657 */
48242ae1a5cSArnd Bergmann 			barrier();
48319386177SKamal Heib 		}
48419386177SKamal Heib 	}
485145e5637SEran Ben Elisha 	mlx5e_stats_grp_sw_update_stats_ptp(priv, s);
486214baf22SMaxim Mikityanskiy 	mlx5e_stats_grp_sw_update_stats_qos(priv, s);
48719386177SKamal Heib }
48819386177SKamal Heib 
489fd8dcdb8SKamal Heib static const struct counter_desc q_stats_desc[] = {
490fd8dcdb8SKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_qcounter_stats, rx_out_of_buffer) },
491fd8dcdb8SKamal Heib };
492fd8dcdb8SKamal Heib 
4937cbaf9a3SMoshe Shemesh static const struct counter_desc drop_rq_stats_desc[] = {
4947cbaf9a3SMoshe Shemesh 	{ MLX5E_DECLARE_STAT(struct mlx5e_qcounter_stats, rx_if_down_packets) },
4957cbaf9a3SMoshe Shemesh };
4967cbaf9a3SMoshe Shemesh 
497fd8dcdb8SKamal Heib #define NUM_Q_COUNTERS			ARRAY_SIZE(q_stats_desc)
4987cbaf9a3SMoshe Shemesh #define NUM_DROP_RQ_COUNTERS		ARRAY_SIZE(drop_rq_stats_desc)
499fd8dcdb8SKamal Heib 
50096b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(qcnt)
501fd8dcdb8SKamal Heib {
5027cbaf9a3SMoshe Shemesh 	int num_stats = 0;
5037cbaf9a3SMoshe Shemesh 
5047cbaf9a3SMoshe Shemesh 	if (priv->q_counter)
5057cbaf9a3SMoshe Shemesh 		num_stats += NUM_Q_COUNTERS;
5067cbaf9a3SMoshe Shemesh 
5077cbaf9a3SMoshe Shemesh 	if (priv->drop_rq_q_counter)
5087cbaf9a3SMoshe Shemesh 		num_stats += NUM_DROP_RQ_COUNTERS;
5097cbaf9a3SMoshe Shemesh 
5107cbaf9a3SMoshe Shemesh 	return num_stats;
511fd8dcdb8SKamal Heib }
512fd8dcdb8SKamal Heib 
51396b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(qcnt)
514fd8dcdb8SKamal Heib {
515fd8dcdb8SKamal Heib 	int i;
516fd8dcdb8SKamal Heib 
517fd8dcdb8SKamal Heib 	for (i = 0; i < NUM_Q_COUNTERS && priv->q_counter; i++)
5187cbaf9a3SMoshe Shemesh 		strcpy(data + (idx++) * ETH_GSTRING_LEN,
5197cbaf9a3SMoshe Shemesh 		       q_stats_desc[i].format);
5207cbaf9a3SMoshe Shemesh 
5217cbaf9a3SMoshe Shemesh 	for (i = 0; i < NUM_DROP_RQ_COUNTERS && priv->drop_rq_q_counter; i++)
5227cbaf9a3SMoshe Shemesh 		strcpy(data + (idx++) * ETH_GSTRING_LEN,
5237cbaf9a3SMoshe Shemesh 		       drop_rq_stats_desc[i].format);
5247cbaf9a3SMoshe Shemesh 
525fd8dcdb8SKamal Heib 	return idx;
526fd8dcdb8SKamal Heib }
527fd8dcdb8SKamal Heib 
52896b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(qcnt)
529fd8dcdb8SKamal Heib {
530fd8dcdb8SKamal Heib 	int i;
531fd8dcdb8SKamal Heib 
532fd8dcdb8SKamal Heib 	for (i = 0; i < NUM_Q_COUNTERS && priv->q_counter; i++)
5337cbaf9a3SMoshe Shemesh 		data[idx++] = MLX5E_READ_CTR32_CPU(&priv->stats.qcnt,
5347cbaf9a3SMoshe Shemesh 						   q_stats_desc, i);
5357cbaf9a3SMoshe Shemesh 	for (i = 0; i < NUM_DROP_RQ_COUNTERS && priv->drop_rq_q_counter; i++)
5367cbaf9a3SMoshe Shemesh 		data[idx++] = MLX5E_READ_CTR32_CPU(&priv->stats.qcnt,
5377cbaf9a3SMoshe Shemesh 						   drop_rq_stats_desc, i);
538fd8dcdb8SKamal Heib 	return idx;
539fd8dcdb8SKamal Heib }
540fd8dcdb8SKamal Heib 
54196b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(qcnt)
54219386177SKamal Heib {
54319386177SKamal Heib 	struct mlx5e_qcounter_stats *qcnt = &priv->stats.qcnt;
54466247fbbSLeon Romanovsky 	u32 out[MLX5_ST_SZ_DW(query_q_counter_out)] = {};
54566247fbbSLeon Romanovsky 	u32 in[MLX5_ST_SZ_DW(query_q_counter_in)] = {};
54666247fbbSLeon Romanovsky 	int ret;
54719386177SKamal Heib 
54866247fbbSLeon Romanovsky 	MLX5_SET(query_q_counter_in, in, opcode, MLX5_CMD_OP_QUERY_Q_COUNTER);
54966247fbbSLeon Romanovsky 
55066247fbbSLeon Romanovsky 	if (priv->q_counter) {
55166247fbbSLeon Romanovsky 		MLX5_SET(query_q_counter_in, in, counter_set_id,
55266247fbbSLeon Romanovsky 			 priv->q_counter);
55366247fbbSLeon Romanovsky 		ret = mlx5_cmd_exec_inout(priv->mdev, query_q_counter, in, out);
55466247fbbSLeon Romanovsky 		if (!ret)
5557cbaf9a3SMoshe Shemesh 			qcnt->rx_out_of_buffer = MLX5_GET(query_q_counter_out,
5567cbaf9a3SMoshe Shemesh 							  out, out_of_buffer);
55766247fbbSLeon Romanovsky 	}
55866247fbbSLeon Romanovsky 
55966247fbbSLeon Romanovsky 	if (priv->drop_rq_q_counter) {
56066247fbbSLeon Romanovsky 		MLX5_SET(query_q_counter_in, in, counter_set_id,
56166247fbbSLeon Romanovsky 			 priv->drop_rq_q_counter);
56266247fbbSLeon Romanovsky 		ret = mlx5_cmd_exec_inout(priv->mdev, query_q_counter, in, out);
56366247fbbSLeon Romanovsky 		if (!ret)
56466247fbbSLeon Romanovsky 			qcnt->rx_if_down_packets = MLX5_GET(query_q_counter_out,
56566247fbbSLeon Romanovsky 							    out, out_of_buffer);
56666247fbbSLeon Romanovsky 	}
56719386177SKamal Heib }
56819386177SKamal Heib 
5695c298143SMoshe Shemesh #define VNIC_ENV_OFF(c) MLX5_BYTE_OFF(query_vnic_env_out, c)
5700cfafd4bSMoshe Shemesh static const struct counter_desc vnic_env_stats_steer_desc[] = {
5715c298143SMoshe Shemesh 	{ "rx_steer_missed_packets",
5725c298143SMoshe Shemesh 		VNIC_ENV_OFF(vport_env.nic_receive_steering_discard) },
5735c298143SMoshe Shemesh };
5745c298143SMoshe Shemesh 
5750cfafd4bSMoshe Shemesh static const struct counter_desc vnic_env_stats_dev_oob_desc[] = {
5760cfafd4bSMoshe Shemesh 	{ "dev_internal_queue_oob",
5770cfafd4bSMoshe Shemesh 		VNIC_ENV_OFF(vport_env.internal_rq_out_of_buffer) },
5780cfafd4bSMoshe Shemesh };
5790cfafd4bSMoshe Shemesh 
5800cfafd4bSMoshe Shemesh #define NUM_VNIC_ENV_STEER_COUNTERS(dev) \
5810cfafd4bSMoshe Shemesh 	(MLX5_CAP_GEN(dev, nic_receive_steering_discard) ? \
5820cfafd4bSMoshe Shemesh 	 ARRAY_SIZE(vnic_env_stats_steer_desc) : 0)
5830cfafd4bSMoshe Shemesh #define NUM_VNIC_ENV_DEV_OOB_COUNTERS(dev) \
5840cfafd4bSMoshe Shemesh 	(MLX5_CAP_GEN(dev, vnic_env_int_rq_oob) ? \
5850cfafd4bSMoshe Shemesh 	 ARRAY_SIZE(vnic_env_stats_dev_oob_desc) : 0)
5865c298143SMoshe Shemesh 
58796b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(vnic_env)
5885c298143SMoshe Shemesh {
5890cfafd4bSMoshe Shemesh 	return NUM_VNIC_ENV_STEER_COUNTERS(priv->mdev) +
5900cfafd4bSMoshe Shemesh 		NUM_VNIC_ENV_DEV_OOB_COUNTERS(priv->mdev);
5915c298143SMoshe Shemesh }
5925c298143SMoshe Shemesh 
59396b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(vnic_env)
5945c298143SMoshe Shemesh {
5955c298143SMoshe Shemesh 	int i;
5965c298143SMoshe Shemesh 
5970cfafd4bSMoshe Shemesh 	for (i = 0; i < NUM_VNIC_ENV_STEER_COUNTERS(priv->mdev); i++)
5985c298143SMoshe Shemesh 		strcpy(data + (idx++) * ETH_GSTRING_LEN,
5990cfafd4bSMoshe Shemesh 		       vnic_env_stats_steer_desc[i].format);
6000cfafd4bSMoshe Shemesh 
6010cfafd4bSMoshe Shemesh 	for (i = 0; i < NUM_VNIC_ENV_DEV_OOB_COUNTERS(priv->mdev); i++)
6020cfafd4bSMoshe Shemesh 		strcpy(data + (idx++) * ETH_GSTRING_LEN,
6030cfafd4bSMoshe Shemesh 		       vnic_env_stats_dev_oob_desc[i].format);
6045c298143SMoshe Shemesh 	return idx;
6055c298143SMoshe Shemesh }
6065c298143SMoshe Shemesh 
60796b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(vnic_env)
6085c298143SMoshe Shemesh {
6095c298143SMoshe Shemesh 	int i;
6105c298143SMoshe Shemesh 
6110cfafd4bSMoshe Shemesh 	for (i = 0; i < NUM_VNIC_ENV_STEER_COUNTERS(priv->mdev); i++)
6125c298143SMoshe Shemesh 		data[idx++] = MLX5E_READ_CTR64_BE(priv->stats.vnic.query_vnic_env_out,
6130cfafd4bSMoshe Shemesh 						  vnic_env_stats_steer_desc, i);
6140cfafd4bSMoshe Shemesh 
6150cfafd4bSMoshe Shemesh 	for (i = 0; i < NUM_VNIC_ENV_DEV_OOB_COUNTERS(priv->mdev); i++)
6160cfafd4bSMoshe Shemesh 		data[idx++] = MLX5E_READ_CTR32_BE(priv->stats.vnic.query_vnic_env_out,
6170cfafd4bSMoshe Shemesh 						  vnic_env_stats_dev_oob_desc, i);
6185c298143SMoshe Shemesh 	return idx;
6195c298143SMoshe Shemesh }
6205c298143SMoshe Shemesh 
62196b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(vnic_env)
6225c298143SMoshe Shemesh {
6235c298143SMoshe Shemesh 	u32 *out = (u32 *)priv->stats.vnic.query_vnic_env_out;
624a184cda1SLeon Romanovsky 	u32 in[MLX5_ST_SZ_DW(query_vnic_env_in)] = {};
6255c298143SMoshe Shemesh 	struct mlx5_core_dev *mdev = priv->mdev;
6265c298143SMoshe Shemesh 
6275c298143SMoshe Shemesh 	if (!MLX5_CAP_GEN(priv->mdev, nic_receive_steering_discard))
6285c298143SMoshe Shemesh 		return;
6295c298143SMoshe Shemesh 
630a184cda1SLeon Romanovsky 	MLX5_SET(query_vnic_env_in, in, opcode, MLX5_CMD_OP_QUERY_VNIC_ENV);
631a184cda1SLeon Romanovsky 	mlx5_cmd_exec_inout(mdev, query_vnic_env, in, out);
6325c298143SMoshe Shemesh }
6335c298143SMoshe Shemesh 
63440cab9f1SKamal Heib #define VPORT_COUNTER_OFF(c) MLX5_BYTE_OFF(query_vport_counter_out, c)
63540cab9f1SKamal Heib static const struct counter_desc vport_stats_desc[] = {
63640cab9f1SKamal Heib 	{ "rx_vport_unicast_packets",
63740cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_eth_unicast.packets) },
63840cab9f1SKamal Heib 	{ "rx_vport_unicast_bytes",
63940cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_eth_unicast.octets) },
64040cab9f1SKamal Heib 	{ "tx_vport_unicast_packets",
64140cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_eth_unicast.packets) },
64240cab9f1SKamal Heib 	{ "tx_vport_unicast_bytes",
64340cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_eth_unicast.octets) },
64440cab9f1SKamal Heib 	{ "rx_vport_multicast_packets",
64540cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_eth_multicast.packets) },
64640cab9f1SKamal Heib 	{ "rx_vport_multicast_bytes",
64740cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_eth_multicast.octets) },
64840cab9f1SKamal Heib 	{ "tx_vport_multicast_packets",
64940cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_eth_multicast.packets) },
65040cab9f1SKamal Heib 	{ "tx_vport_multicast_bytes",
65140cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_eth_multicast.octets) },
65240cab9f1SKamal Heib 	{ "rx_vport_broadcast_packets",
65340cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_eth_broadcast.packets) },
65440cab9f1SKamal Heib 	{ "rx_vport_broadcast_bytes",
65540cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_eth_broadcast.octets) },
65640cab9f1SKamal Heib 	{ "tx_vport_broadcast_packets",
65740cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_eth_broadcast.packets) },
65840cab9f1SKamal Heib 	{ "tx_vport_broadcast_bytes",
65940cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_eth_broadcast.octets) },
66040cab9f1SKamal Heib 	{ "rx_vport_rdma_unicast_packets",
66140cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_ib_unicast.packets) },
66240cab9f1SKamal Heib 	{ "rx_vport_rdma_unicast_bytes",
66340cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_ib_unicast.octets) },
66440cab9f1SKamal Heib 	{ "tx_vport_rdma_unicast_packets",
66540cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_ib_unicast.packets) },
66640cab9f1SKamal Heib 	{ "tx_vport_rdma_unicast_bytes",
66740cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_ib_unicast.octets) },
66840cab9f1SKamal Heib 	{ "rx_vport_rdma_multicast_packets",
66940cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_ib_multicast.packets) },
67040cab9f1SKamal Heib 	{ "rx_vport_rdma_multicast_bytes",
67140cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_ib_multicast.octets) },
67240cab9f1SKamal Heib 	{ "tx_vport_rdma_multicast_packets",
67340cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_ib_multicast.packets) },
67440cab9f1SKamal Heib 	{ "tx_vport_rdma_multicast_bytes",
67540cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_ib_multicast.octets) },
67640cab9f1SKamal Heib };
67740cab9f1SKamal Heib 
67840cab9f1SKamal Heib #define NUM_VPORT_COUNTERS		ARRAY_SIZE(vport_stats_desc)
67940cab9f1SKamal Heib 
68096b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(vport)
68140cab9f1SKamal Heib {
68240cab9f1SKamal Heib 	return NUM_VPORT_COUNTERS;
68340cab9f1SKamal Heib }
68440cab9f1SKamal Heib 
68596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(vport)
68640cab9f1SKamal Heib {
68740cab9f1SKamal Heib 	int i;
68840cab9f1SKamal Heib 
68940cab9f1SKamal Heib 	for (i = 0; i < NUM_VPORT_COUNTERS; i++)
69040cab9f1SKamal Heib 		strcpy(data + (idx++) * ETH_GSTRING_LEN, vport_stats_desc[i].format);
69140cab9f1SKamal Heib 	return idx;
69240cab9f1SKamal Heib }
69340cab9f1SKamal Heib 
69496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(vport)
69540cab9f1SKamal Heib {
69640cab9f1SKamal Heib 	int i;
69740cab9f1SKamal Heib 
69840cab9f1SKamal Heib 	for (i = 0; i < NUM_VPORT_COUNTERS; i++)
69940cab9f1SKamal Heib 		data[idx++] = MLX5E_READ_CTR64_BE(priv->stats.vport.query_vport_out,
70040cab9f1SKamal Heib 						  vport_stats_desc, i);
70140cab9f1SKamal Heib 	return idx;
70240cab9f1SKamal Heib }
70340cab9f1SKamal Heib 
70496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(vport)
70519386177SKamal Heib {
70619386177SKamal Heib 	u32 *out = (u32 *)priv->stats.vport.query_vport_out;
707a184cda1SLeon Romanovsky 	u32 in[MLX5_ST_SZ_DW(query_vport_counter_in)] = {};
70819386177SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
70919386177SKamal Heib 
71019386177SKamal Heib 	MLX5_SET(query_vport_counter_in, in, opcode, MLX5_CMD_OP_QUERY_VPORT_COUNTER);
711a184cda1SLeon Romanovsky 	mlx5_cmd_exec_inout(mdev, query_vport_counter, in, out);
71219386177SKamal Heib }
71319386177SKamal Heib 
7146e6ef814SKamal Heib #define PPORT_802_3_OFF(c) \
7156e6ef814SKamal Heib 	MLX5_BYTE_OFF(ppcnt_reg, \
7166e6ef814SKamal Heib 		      counter_set.eth_802_3_cntrs_grp_data_layout.c##_high)
7176e6ef814SKamal Heib static const struct counter_desc pport_802_3_stats_desc[] = {
7186e6ef814SKamal Heib 	{ "tx_packets_phy", PPORT_802_3_OFF(a_frames_transmitted_ok) },
7196e6ef814SKamal Heib 	{ "rx_packets_phy", PPORT_802_3_OFF(a_frames_received_ok) },
7206e6ef814SKamal Heib 	{ "rx_crc_errors_phy", PPORT_802_3_OFF(a_frame_check_sequence_errors) },
7216e6ef814SKamal Heib 	{ "tx_bytes_phy", PPORT_802_3_OFF(a_octets_transmitted_ok) },
7226e6ef814SKamal Heib 	{ "rx_bytes_phy", PPORT_802_3_OFF(a_octets_received_ok) },
7236e6ef814SKamal Heib 	{ "tx_multicast_phy", PPORT_802_3_OFF(a_multicast_frames_xmitted_ok) },
7246e6ef814SKamal Heib 	{ "tx_broadcast_phy", PPORT_802_3_OFF(a_broadcast_frames_xmitted_ok) },
7256e6ef814SKamal Heib 	{ "rx_multicast_phy", PPORT_802_3_OFF(a_multicast_frames_received_ok) },
7266e6ef814SKamal Heib 	{ "rx_broadcast_phy", PPORT_802_3_OFF(a_broadcast_frames_received_ok) },
7276e6ef814SKamal Heib 	{ "rx_in_range_len_errors_phy", PPORT_802_3_OFF(a_in_range_length_errors) },
7286e6ef814SKamal Heib 	{ "rx_out_of_range_len_phy", PPORT_802_3_OFF(a_out_of_range_length_field) },
7296e6ef814SKamal Heib 	{ "rx_oversize_pkts_phy", PPORT_802_3_OFF(a_frame_too_long_errors) },
7306e6ef814SKamal Heib 	{ "rx_symbol_err_phy", PPORT_802_3_OFF(a_symbol_error_during_carrier) },
7316e6ef814SKamal Heib 	{ "tx_mac_control_phy", PPORT_802_3_OFF(a_mac_control_frames_transmitted) },
7326e6ef814SKamal Heib 	{ "rx_mac_control_phy", PPORT_802_3_OFF(a_mac_control_frames_received) },
7336e6ef814SKamal Heib 	{ "rx_unsupported_op_phy", PPORT_802_3_OFF(a_unsupported_opcodes_received) },
7346e6ef814SKamal Heib 	{ "rx_pause_ctrl_phy", PPORT_802_3_OFF(a_pause_mac_ctrl_frames_received) },
7356e6ef814SKamal Heib 	{ "tx_pause_ctrl_phy", PPORT_802_3_OFF(a_pause_mac_ctrl_frames_transmitted) },
7366e6ef814SKamal Heib };
7376e6ef814SKamal Heib 
7386e6ef814SKamal Heib #define NUM_PPORT_802_3_COUNTERS	ARRAY_SIZE(pport_802_3_stats_desc)
7396e6ef814SKamal Heib 
74096b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(802_3)
7416e6ef814SKamal Heib {
7426e6ef814SKamal Heib 	return NUM_PPORT_802_3_COUNTERS;
7436e6ef814SKamal Heib }
7446e6ef814SKamal Heib 
74596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(802_3)
7466e6ef814SKamal Heib {
7476e6ef814SKamal Heib 	int i;
7486e6ef814SKamal Heib 
7496e6ef814SKamal Heib 	for (i = 0; i < NUM_PPORT_802_3_COUNTERS; i++)
7506e6ef814SKamal Heib 		strcpy(data + (idx++) * ETH_GSTRING_LEN, pport_802_3_stats_desc[i].format);
7516e6ef814SKamal Heib 	return idx;
7526e6ef814SKamal Heib }
7536e6ef814SKamal Heib 
75496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(802_3)
7556e6ef814SKamal Heib {
7566e6ef814SKamal Heib 	int i;
7576e6ef814SKamal Heib 
7586e6ef814SKamal Heib 	for (i = 0; i < NUM_PPORT_802_3_COUNTERS; i++)
7596e6ef814SKamal Heib 		data[idx++] = MLX5E_READ_CTR64_BE(&priv->stats.pport.IEEE_802_3_counters,
7606e6ef814SKamal Heib 						  pport_802_3_stats_desc, i);
7616e6ef814SKamal Heib 	return idx;
7626e6ef814SKamal Heib }
7636e6ef814SKamal Heib 
76475370eb0SEyal Davidovich #define MLX5_BASIC_PPCNT_SUPPORTED(mdev) \
76575370eb0SEyal Davidovich 	(MLX5_CAP_GEN(mdev, pcam_reg) ? MLX5_CAP_PCAM_REG(mdev, ppcnt) : 1)
76675370eb0SEyal Davidovich 
7677c453526SVlad Buslov static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(802_3)
76819386177SKamal Heib {
76919386177SKamal Heib 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
77019386177SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
77119386177SKamal Heib 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
77219386177SKamal Heib 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
77319386177SKamal Heib 	void *out;
77419386177SKamal Heib 
77575370eb0SEyal Davidovich 	if (!MLX5_BASIC_PPCNT_SUPPORTED(mdev))
77675370eb0SEyal Davidovich 		return;
77775370eb0SEyal Davidovich 
77819386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, local_port, 1);
77919386177SKamal Heib 	out = pstats->IEEE_802_3_counters;
78019386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, grp, MLX5_IEEE_802_3_COUNTERS_GROUP);
78119386177SKamal Heib 	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
78219386177SKamal Heib }
78319386177SKamal Heib 
7841703bb50SJakub Kicinski #define MLX5E_READ_CTR64_BE_F(ptr, set, c)		\
785098d9ed9SJakub Kicinski 	be64_to_cpu(*(__be64 *)((char *)ptr +		\
786098d9ed9SJakub Kicinski 		MLX5_BYTE_OFF(ppcnt_reg,		\
7871703bb50SJakub Kicinski 			      counter_set.set.c##_high)))
788098d9ed9SJakub Kicinski 
789b572ec9fSJakub Kicinski static int mlx5e_stats_get_ieee(struct mlx5_core_dev *mdev,
790b572ec9fSJakub Kicinski 				u32 *ppcnt_ieee_802_3)
791b572ec9fSJakub Kicinski {
792b572ec9fSJakub Kicinski 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {};
793b572ec9fSJakub Kicinski 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
794b572ec9fSJakub Kicinski 
795b572ec9fSJakub Kicinski 	if (!MLX5_BASIC_PPCNT_SUPPORTED(mdev))
796b572ec9fSJakub Kicinski 		return -EOPNOTSUPP;
797b572ec9fSJakub Kicinski 
798b572ec9fSJakub Kicinski 	MLX5_SET(ppcnt_reg, in, local_port, 1);
799b572ec9fSJakub Kicinski 	MLX5_SET(ppcnt_reg, in, grp, MLX5_IEEE_802_3_COUNTERS_GROUP);
800b572ec9fSJakub Kicinski 	return mlx5_core_access_reg(mdev, in, sz, ppcnt_ieee_802_3,
801b572ec9fSJakub Kicinski 				    sz, MLX5_REG_PPCNT, 0, 0);
802b572ec9fSJakub Kicinski }
803b572ec9fSJakub Kicinski 
804098d9ed9SJakub Kicinski void mlx5e_stats_pause_get(struct mlx5e_priv *priv,
805098d9ed9SJakub Kicinski 			   struct ethtool_pause_stats *pause_stats)
806098d9ed9SJakub Kicinski {
807098d9ed9SJakub Kicinski 	u32 ppcnt_ieee_802_3[MLX5_ST_SZ_DW(ppcnt_reg)];
808098d9ed9SJakub Kicinski 	struct mlx5_core_dev *mdev = priv->mdev;
809098d9ed9SJakub Kicinski 
810b572ec9fSJakub Kicinski 	if (mlx5e_stats_get_ieee(mdev, ppcnt_ieee_802_3))
811098d9ed9SJakub Kicinski 		return;
812098d9ed9SJakub Kicinski 
813098d9ed9SJakub Kicinski 	pause_stats->tx_pause_frames =
814098d9ed9SJakub Kicinski 		MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3,
8151703bb50SJakub Kicinski 				      eth_802_3_cntrs_grp_data_layout,
816098d9ed9SJakub Kicinski 				      a_pause_mac_ctrl_frames_transmitted);
817098d9ed9SJakub Kicinski 	pause_stats->rx_pause_frames =
818098d9ed9SJakub Kicinski 		MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3,
8191703bb50SJakub Kicinski 				      eth_802_3_cntrs_grp_data_layout,
820098d9ed9SJakub Kicinski 				      a_pause_mac_ctrl_frames_received);
821098d9ed9SJakub Kicinski }
822098d9ed9SJakub Kicinski 
823b572ec9fSJakub Kicinski void mlx5e_stats_eth_phy_get(struct mlx5e_priv *priv,
824b572ec9fSJakub Kicinski 			     struct ethtool_eth_phy_stats *phy_stats)
825b572ec9fSJakub Kicinski {
826b572ec9fSJakub Kicinski 	u32 ppcnt_ieee_802_3[MLX5_ST_SZ_DW(ppcnt_reg)];
827b572ec9fSJakub Kicinski 	struct mlx5_core_dev *mdev = priv->mdev;
828b572ec9fSJakub Kicinski 
829b572ec9fSJakub Kicinski 	if (mlx5e_stats_get_ieee(mdev, ppcnt_ieee_802_3))
830b572ec9fSJakub Kicinski 		return;
831b572ec9fSJakub Kicinski 
832b572ec9fSJakub Kicinski 	phy_stats->SymbolErrorDuringCarrier =
833b572ec9fSJakub Kicinski 		MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3,
834b572ec9fSJakub Kicinski 				      eth_802_3_cntrs_grp_data_layout,
835b572ec9fSJakub Kicinski 				      a_symbol_error_during_carrier);
836b572ec9fSJakub Kicinski }
837b572ec9fSJakub Kicinski 
838b572ec9fSJakub Kicinski void mlx5e_stats_eth_mac_get(struct mlx5e_priv *priv,
839b572ec9fSJakub Kicinski 			     struct ethtool_eth_mac_stats *mac_stats)
840b572ec9fSJakub Kicinski {
841b572ec9fSJakub Kicinski 	u32 ppcnt_ieee_802_3[MLX5_ST_SZ_DW(ppcnt_reg)];
842b572ec9fSJakub Kicinski 	struct mlx5_core_dev *mdev = priv->mdev;
843b572ec9fSJakub Kicinski 
844b572ec9fSJakub Kicinski 	if (mlx5e_stats_get_ieee(mdev, ppcnt_ieee_802_3))
845b572ec9fSJakub Kicinski 		return;
846b572ec9fSJakub Kicinski 
847b572ec9fSJakub Kicinski #define RD(name)							\
848b572ec9fSJakub Kicinski 	MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3,				\
849b572ec9fSJakub Kicinski 			      eth_802_3_cntrs_grp_data_layout,		\
850b572ec9fSJakub Kicinski 			      name)
851b572ec9fSJakub Kicinski 
852b572ec9fSJakub Kicinski 	mac_stats->FramesTransmittedOK	= RD(a_frames_transmitted_ok);
853b572ec9fSJakub Kicinski 	mac_stats->FramesReceivedOK	= RD(a_frames_received_ok);
854b572ec9fSJakub Kicinski 	mac_stats->FrameCheckSequenceErrors = RD(a_frame_check_sequence_errors);
855b572ec9fSJakub Kicinski 	mac_stats->OctetsTransmittedOK	= RD(a_octets_transmitted_ok);
856b572ec9fSJakub Kicinski 	mac_stats->OctetsReceivedOK	= RD(a_octets_received_ok);
857b572ec9fSJakub Kicinski 	mac_stats->MulticastFramesXmittedOK = RD(a_multicast_frames_xmitted_ok);
858b572ec9fSJakub Kicinski 	mac_stats->BroadcastFramesXmittedOK = RD(a_broadcast_frames_xmitted_ok);
859b572ec9fSJakub Kicinski 	mac_stats->MulticastFramesReceivedOK = RD(a_multicast_frames_received_ok);
860b572ec9fSJakub Kicinski 	mac_stats->BroadcastFramesReceivedOK = RD(a_broadcast_frames_received_ok);
861b572ec9fSJakub Kicinski 	mac_stats->InRangeLengthErrors	= RD(a_in_range_length_errors);
862b572ec9fSJakub Kicinski 	mac_stats->OutOfRangeLengthField = RD(a_out_of_range_length_field);
863b572ec9fSJakub Kicinski 	mac_stats->FrameTooLongErrors	= RD(a_frame_too_long_errors);
864b572ec9fSJakub Kicinski #undef RD
865b572ec9fSJakub Kicinski }
866b572ec9fSJakub Kicinski 
867b572ec9fSJakub Kicinski void mlx5e_stats_eth_ctrl_get(struct mlx5e_priv *priv,
868b572ec9fSJakub Kicinski 			      struct ethtool_eth_ctrl_stats *ctrl_stats)
869b572ec9fSJakub Kicinski {
870b572ec9fSJakub Kicinski 	u32 ppcnt_ieee_802_3[MLX5_ST_SZ_DW(ppcnt_reg)];
871b572ec9fSJakub Kicinski 	struct mlx5_core_dev *mdev = priv->mdev;
872b572ec9fSJakub Kicinski 
873b572ec9fSJakub Kicinski 	if (mlx5e_stats_get_ieee(mdev, ppcnt_ieee_802_3))
874b572ec9fSJakub Kicinski 		return;
875b572ec9fSJakub Kicinski 
876b572ec9fSJakub Kicinski 	ctrl_stats->MACControlFramesTransmitted =
877b572ec9fSJakub Kicinski 		MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3,
878b572ec9fSJakub Kicinski 				      eth_802_3_cntrs_grp_data_layout,
879b572ec9fSJakub Kicinski 				      a_mac_control_frames_transmitted);
880b572ec9fSJakub Kicinski 	ctrl_stats->MACControlFramesReceived =
881b572ec9fSJakub Kicinski 		MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3,
882b572ec9fSJakub Kicinski 				      eth_802_3_cntrs_grp_data_layout,
883b572ec9fSJakub Kicinski 				      a_mac_control_frames_received);
884b572ec9fSJakub Kicinski 	ctrl_stats->UnsupportedOpcodesReceived =
885b572ec9fSJakub Kicinski 		MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3,
886b572ec9fSJakub Kicinski 				      eth_802_3_cntrs_grp_data_layout,
887b572ec9fSJakub Kicinski 				      a_unsupported_opcodes_received);
888b572ec9fSJakub Kicinski }
889b572ec9fSJakub Kicinski 
890fc8e64a3SKamal Heib #define PPORT_2863_OFF(c) \
891fc8e64a3SKamal Heib 	MLX5_BYTE_OFF(ppcnt_reg, \
892fc8e64a3SKamal Heib 		      counter_set.eth_2863_cntrs_grp_data_layout.c##_high)
893fc8e64a3SKamal Heib static const struct counter_desc pport_2863_stats_desc[] = {
894fc8e64a3SKamal Heib 	{ "rx_discards_phy", PPORT_2863_OFF(if_in_discards) },
895fc8e64a3SKamal Heib 	{ "tx_discards_phy", PPORT_2863_OFF(if_out_discards) },
896fc8e64a3SKamal Heib 	{ "tx_errors_phy", PPORT_2863_OFF(if_out_errors) },
897fc8e64a3SKamal Heib };
898fc8e64a3SKamal Heib 
899fc8e64a3SKamal Heib #define NUM_PPORT_2863_COUNTERS		ARRAY_SIZE(pport_2863_stats_desc)
900fc8e64a3SKamal Heib 
90196b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(2863)
902fc8e64a3SKamal Heib {
903fc8e64a3SKamal Heib 	return NUM_PPORT_2863_COUNTERS;
904fc8e64a3SKamal Heib }
905fc8e64a3SKamal Heib 
90696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(2863)
907fc8e64a3SKamal Heib {
908fc8e64a3SKamal Heib 	int i;
909fc8e64a3SKamal Heib 
910fc8e64a3SKamal Heib 	for (i = 0; i < NUM_PPORT_2863_COUNTERS; i++)
911fc8e64a3SKamal Heib 		strcpy(data + (idx++) * ETH_GSTRING_LEN, pport_2863_stats_desc[i].format);
912fc8e64a3SKamal Heib 	return idx;
913fc8e64a3SKamal Heib }
914fc8e64a3SKamal Heib 
91596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(2863)
916fc8e64a3SKamal Heib {
917fc8e64a3SKamal Heib 	int i;
918fc8e64a3SKamal Heib 
919fc8e64a3SKamal Heib 	for (i = 0; i < NUM_PPORT_2863_COUNTERS; i++)
920fc8e64a3SKamal Heib 		data[idx++] = MLX5E_READ_CTR64_BE(&priv->stats.pport.RFC_2863_counters,
921fc8e64a3SKamal Heib 						  pport_2863_stats_desc, i);
922fc8e64a3SKamal Heib 	return idx;
923fc8e64a3SKamal Heib }
924fc8e64a3SKamal Heib 
92596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(2863)
92619386177SKamal Heib {
92719386177SKamal Heib 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
92819386177SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
92919386177SKamal Heib 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
93019386177SKamal Heib 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
93119386177SKamal Heib 	void *out;
93219386177SKamal Heib 
93319386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, local_port, 1);
93419386177SKamal Heib 	out = pstats->RFC_2863_counters;
93519386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, grp, MLX5_RFC_2863_COUNTERS_GROUP);
93619386177SKamal Heib 	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
93719386177SKamal Heib }
93819386177SKamal Heib 
939e0e0def9SKamal Heib #define PPORT_2819_OFF(c) \
940e0e0def9SKamal Heib 	MLX5_BYTE_OFF(ppcnt_reg, \
941e0e0def9SKamal Heib 		      counter_set.eth_2819_cntrs_grp_data_layout.c##_high)
942e0e0def9SKamal Heib static const struct counter_desc pport_2819_stats_desc[] = {
943e0e0def9SKamal Heib 	{ "rx_undersize_pkts_phy", PPORT_2819_OFF(ether_stats_undersize_pkts) },
944e0e0def9SKamal Heib 	{ "rx_fragments_phy", PPORT_2819_OFF(ether_stats_fragments) },
945e0e0def9SKamal Heib 	{ "rx_jabbers_phy", PPORT_2819_OFF(ether_stats_jabbers) },
946e0e0def9SKamal Heib 	{ "rx_64_bytes_phy", PPORT_2819_OFF(ether_stats_pkts64octets) },
947e0e0def9SKamal Heib 	{ "rx_65_to_127_bytes_phy", PPORT_2819_OFF(ether_stats_pkts65to127octets) },
948e0e0def9SKamal Heib 	{ "rx_128_to_255_bytes_phy", PPORT_2819_OFF(ether_stats_pkts128to255octets) },
949e0e0def9SKamal Heib 	{ "rx_256_to_511_bytes_phy", PPORT_2819_OFF(ether_stats_pkts256to511octets) },
950e0e0def9SKamal Heib 	{ "rx_512_to_1023_bytes_phy", PPORT_2819_OFF(ether_stats_pkts512to1023octets) },
951e0e0def9SKamal Heib 	{ "rx_1024_to_1518_bytes_phy", PPORT_2819_OFF(ether_stats_pkts1024to1518octets) },
952e0e0def9SKamal Heib 	{ "rx_1519_to_2047_bytes_phy", PPORT_2819_OFF(ether_stats_pkts1519to2047octets) },
953e0e0def9SKamal Heib 	{ "rx_2048_to_4095_bytes_phy", PPORT_2819_OFF(ether_stats_pkts2048to4095octets) },
954e0e0def9SKamal Heib 	{ "rx_4096_to_8191_bytes_phy", PPORT_2819_OFF(ether_stats_pkts4096to8191octets) },
955e0e0def9SKamal Heib 	{ "rx_8192_to_10239_bytes_phy", PPORT_2819_OFF(ether_stats_pkts8192to10239octets) },
956e0e0def9SKamal Heib };
957e0e0def9SKamal Heib 
958e0e0def9SKamal Heib #define NUM_PPORT_2819_COUNTERS		ARRAY_SIZE(pport_2819_stats_desc)
959e0e0def9SKamal Heib 
96096b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(2819)
961e0e0def9SKamal Heib {
962e0e0def9SKamal Heib 	return NUM_PPORT_2819_COUNTERS;
963e0e0def9SKamal Heib }
964e0e0def9SKamal Heib 
96596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(2819)
966e0e0def9SKamal Heib {
967e0e0def9SKamal Heib 	int i;
968e0e0def9SKamal Heib 
969e0e0def9SKamal Heib 	for (i = 0; i < NUM_PPORT_2819_COUNTERS; i++)
970e0e0def9SKamal Heib 		strcpy(data + (idx++) * ETH_GSTRING_LEN, pport_2819_stats_desc[i].format);
971e0e0def9SKamal Heib 	return idx;
972e0e0def9SKamal Heib }
973e0e0def9SKamal Heib 
97496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(2819)
975e0e0def9SKamal Heib {
976e0e0def9SKamal Heib 	int i;
977e0e0def9SKamal Heib 
978e0e0def9SKamal Heib 	for (i = 0; i < NUM_PPORT_2819_COUNTERS; i++)
979e0e0def9SKamal Heib 		data[idx++] = MLX5E_READ_CTR64_BE(&priv->stats.pport.RFC_2819_counters,
980e0e0def9SKamal Heib 						  pport_2819_stats_desc, i);
981e0e0def9SKamal Heib 	return idx;
982e0e0def9SKamal Heib }
983e0e0def9SKamal Heib 
98496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(2819)
98519386177SKamal Heib {
98619386177SKamal Heib 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
98719386177SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
98819386177SKamal Heib 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
98919386177SKamal Heib 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
99019386177SKamal Heib 	void *out;
99119386177SKamal Heib 
99275370eb0SEyal Davidovich 	if (!MLX5_BASIC_PPCNT_SUPPORTED(mdev))
99375370eb0SEyal Davidovich 		return;
99475370eb0SEyal Davidovich 
99519386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, local_port, 1);
99619386177SKamal Heib 	out = pstats->RFC_2819_counters;
99719386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, grp, MLX5_RFC_2819_COUNTERS_GROUP);
99819386177SKamal Heib 	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
99919386177SKamal Heib }
100019386177SKamal Heib 
1001b572ec9fSJakub Kicinski static const struct ethtool_rmon_hist_range mlx5e_rmon_ranges[] = {
1002b572ec9fSJakub Kicinski 	{    0,    64 },
1003b572ec9fSJakub Kicinski 	{   65,   127 },
1004b572ec9fSJakub Kicinski 	{  128,   255 },
1005b572ec9fSJakub Kicinski 	{  256,   511 },
1006b572ec9fSJakub Kicinski 	{  512,  1023 },
1007b572ec9fSJakub Kicinski 	{ 1024,  1518 },
1008b572ec9fSJakub Kicinski 	{ 1519,  2047 },
1009b572ec9fSJakub Kicinski 	{ 2048,  4095 },
1010b572ec9fSJakub Kicinski 	{ 4096,  8191 },
1011b572ec9fSJakub Kicinski 	{ 8192, 10239 },
1012b572ec9fSJakub Kicinski 	{}
1013b572ec9fSJakub Kicinski };
1014b572ec9fSJakub Kicinski 
1015b572ec9fSJakub Kicinski void mlx5e_stats_rmon_get(struct mlx5e_priv *priv,
1016b572ec9fSJakub Kicinski 			  struct ethtool_rmon_stats *rmon,
1017b572ec9fSJakub Kicinski 			  const struct ethtool_rmon_hist_range **ranges)
1018b572ec9fSJakub Kicinski {
1019b572ec9fSJakub Kicinski 	u32 ppcnt_RFC_2819_counters[MLX5_ST_SZ_DW(ppcnt_reg)];
1020b572ec9fSJakub Kicinski 	struct mlx5_core_dev *mdev = priv->mdev;
1021b572ec9fSJakub Kicinski 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
1022b572ec9fSJakub Kicinski 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
1023b572ec9fSJakub Kicinski 
1024b572ec9fSJakub Kicinski 	MLX5_SET(ppcnt_reg, in, local_port, 1);
1025b572ec9fSJakub Kicinski 	MLX5_SET(ppcnt_reg, in, grp, MLX5_RFC_2819_COUNTERS_GROUP);
1026b572ec9fSJakub Kicinski 	if (mlx5_core_access_reg(mdev, in, sz, ppcnt_RFC_2819_counters,
1027b572ec9fSJakub Kicinski 				 sz, MLX5_REG_PPCNT, 0, 0))
1028b572ec9fSJakub Kicinski 		return;
1029b572ec9fSJakub Kicinski 
1030b572ec9fSJakub Kicinski #define RD(name)						\
1031b572ec9fSJakub Kicinski 	MLX5E_READ_CTR64_BE_F(ppcnt_RFC_2819_counters,		\
1032b572ec9fSJakub Kicinski 			      eth_2819_cntrs_grp_data_layout,	\
1033b572ec9fSJakub Kicinski 			      name)
1034b572ec9fSJakub Kicinski 
1035b572ec9fSJakub Kicinski 	rmon->undersize_pkts	= RD(ether_stats_undersize_pkts);
1036b572ec9fSJakub Kicinski 	rmon->fragments		= RD(ether_stats_fragments);
1037b572ec9fSJakub Kicinski 	rmon->jabbers		= RD(ether_stats_jabbers);
1038b572ec9fSJakub Kicinski 
1039b572ec9fSJakub Kicinski 	rmon->hist[0]		= RD(ether_stats_pkts64octets);
1040b572ec9fSJakub Kicinski 	rmon->hist[1]		= RD(ether_stats_pkts65to127octets);
1041b572ec9fSJakub Kicinski 	rmon->hist[2]		= RD(ether_stats_pkts128to255octets);
1042b572ec9fSJakub Kicinski 	rmon->hist[3]		= RD(ether_stats_pkts256to511octets);
1043b572ec9fSJakub Kicinski 	rmon->hist[4]		= RD(ether_stats_pkts512to1023octets);
1044b572ec9fSJakub Kicinski 	rmon->hist[5]		= RD(ether_stats_pkts1024to1518octets);
1045b572ec9fSJakub Kicinski 	rmon->hist[6]		= RD(ether_stats_pkts1519to2047octets);
1046b572ec9fSJakub Kicinski 	rmon->hist[7]		= RD(ether_stats_pkts2048to4095octets);
1047b572ec9fSJakub Kicinski 	rmon->hist[8]		= RD(ether_stats_pkts4096to8191octets);
1048b572ec9fSJakub Kicinski 	rmon->hist[9]		= RD(ether_stats_pkts8192to10239octets);
1049b572ec9fSJakub Kicinski #undef RD
1050b572ec9fSJakub Kicinski 
1051b572ec9fSJakub Kicinski 	*ranges = mlx5e_rmon_ranges;
1052b572ec9fSJakub Kicinski }
1053b572ec9fSJakub Kicinski 
10542e4df0b2SKamal Heib #define PPORT_PHY_STATISTICAL_OFF(c) \
10552e4df0b2SKamal Heib 	MLX5_BYTE_OFF(ppcnt_reg, \
10562e4df0b2SKamal Heib 		      counter_set.phys_layer_statistical_cntrs.c##_high)
10572e4df0b2SKamal Heib static const struct counter_desc pport_phy_statistical_stats_desc[] = {
10582e4df0b2SKamal Heib 	{ "rx_pcs_symbol_err_phy", PPORT_PHY_STATISTICAL_OFF(phy_symbol_errors) },
10592e4df0b2SKamal Heib 	{ "rx_corrected_bits_phy", PPORT_PHY_STATISTICAL_OFF(phy_corrected_bits) },
10602e4df0b2SKamal Heib };
10612e4df0b2SKamal Heib 
10624cb4e98eSShay Agroskin static const struct counter_desc
10634cb4e98eSShay Agroskin pport_phy_statistical_err_lanes_stats_desc[] = {
10644cb4e98eSShay Agroskin 	{ "rx_err_lane_0_phy", PPORT_PHY_STATISTICAL_OFF(phy_corrected_bits_lane0) },
10654cb4e98eSShay Agroskin 	{ "rx_err_lane_1_phy", PPORT_PHY_STATISTICAL_OFF(phy_corrected_bits_lane1) },
10664cb4e98eSShay Agroskin 	{ "rx_err_lane_2_phy", PPORT_PHY_STATISTICAL_OFF(phy_corrected_bits_lane2) },
10674cb4e98eSShay Agroskin 	{ "rx_err_lane_3_phy", PPORT_PHY_STATISTICAL_OFF(phy_corrected_bits_lane3) },
10684cb4e98eSShay Agroskin };
10694cb4e98eSShay Agroskin 
10704cb4e98eSShay Agroskin #define NUM_PPORT_PHY_STATISTICAL_COUNTERS \
10714cb4e98eSShay Agroskin 	ARRAY_SIZE(pport_phy_statistical_stats_desc)
10724cb4e98eSShay Agroskin #define NUM_PPORT_PHY_STATISTICAL_PER_LANE_COUNTERS \
10734cb4e98eSShay Agroskin 	ARRAY_SIZE(pport_phy_statistical_err_lanes_stats_desc)
10742e4df0b2SKamal Heib 
107596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(phy)
10762e4df0b2SKamal Heib {
10774cb4e98eSShay Agroskin 	struct mlx5_core_dev *mdev = priv->mdev;
10784cb4e98eSShay Agroskin 	int num_stats;
10794cb4e98eSShay Agroskin 
10806ab75516SSaeed Mahameed 	/* "1" for link_down_events special counter */
10814cb4e98eSShay Agroskin 	num_stats = 1;
10824cb4e98eSShay Agroskin 
10834cb4e98eSShay Agroskin 	num_stats += MLX5_CAP_PCAM_FEATURE(mdev, ppcnt_statistical_group) ?
10844cb4e98eSShay Agroskin 		     NUM_PPORT_PHY_STATISTICAL_COUNTERS : 0;
10854cb4e98eSShay Agroskin 
10864cb4e98eSShay Agroskin 	num_stats += MLX5_CAP_PCAM_FEATURE(mdev, per_lane_error_counters) ?
10874cb4e98eSShay Agroskin 		     NUM_PPORT_PHY_STATISTICAL_PER_LANE_COUNTERS : 0;
10884cb4e98eSShay Agroskin 
10894cb4e98eSShay Agroskin 	return num_stats;
10902e4df0b2SKamal Heib }
10912e4df0b2SKamal Heib 
109296b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(phy)
10932e4df0b2SKamal Heib {
10944cb4e98eSShay Agroskin 	struct mlx5_core_dev *mdev = priv->mdev;
10952e4df0b2SKamal Heib 	int i;
10962e4df0b2SKamal Heib 
10976ab75516SSaeed Mahameed 	strcpy(data + (idx++) * ETH_GSTRING_LEN, "link_down_events_phy");
10986ab75516SSaeed Mahameed 
10994cb4e98eSShay Agroskin 	if (!MLX5_CAP_PCAM_FEATURE(mdev, ppcnt_statistical_group))
11006ab75516SSaeed Mahameed 		return idx;
11016ab75516SSaeed Mahameed 
11026ab75516SSaeed Mahameed 	for (i = 0; i < NUM_PPORT_PHY_STATISTICAL_COUNTERS; i++)
11032e4df0b2SKamal Heib 		strcpy(data + (idx++) * ETH_GSTRING_LEN,
11042e4df0b2SKamal Heib 		       pport_phy_statistical_stats_desc[i].format);
11054cb4e98eSShay Agroskin 
11064cb4e98eSShay Agroskin 	if (MLX5_CAP_PCAM_FEATURE(mdev, per_lane_error_counters))
11074cb4e98eSShay Agroskin 		for (i = 0; i < NUM_PPORT_PHY_STATISTICAL_PER_LANE_COUNTERS; i++)
11084cb4e98eSShay Agroskin 			strcpy(data + (idx++) * ETH_GSTRING_LEN,
11094cb4e98eSShay Agroskin 			       pport_phy_statistical_err_lanes_stats_desc[i].format);
11104cb4e98eSShay Agroskin 
11112e4df0b2SKamal Heib 	return idx;
11122e4df0b2SKamal Heib }
11132e4df0b2SKamal Heib 
111496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(phy)
11152e4df0b2SKamal Heib {
11164cb4e98eSShay Agroskin 	struct mlx5_core_dev *mdev = priv->mdev;
11172e4df0b2SKamal Heib 	int i;
11182e4df0b2SKamal Heib 
11196ab75516SSaeed Mahameed 	/* link_down_events_phy has special handling since it is not stored in __be64 format */
11206ab75516SSaeed Mahameed 	data[idx++] = MLX5_GET(ppcnt_reg, priv->stats.pport.phy_counters,
11216ab75516SSaeed Mahameed 			       counter_set.phys_layer_cntrs.link_down_events);
11226ab75516SSaeed Mahameed 
11234cb4e98eSShay Agroskin 	if (!MLX5_CAP_PCAM_FEATURE(mdev, ppcnt_statistical_group))
11246ab75516SSaeed Mahameed 		return idx;
11256ab75516SSaeed Mahameed 
11266ab75516SSaeed Mahameed 	for (i = 0; i < NUM_PPORT_PHY_STATISTICAL_COUNTERS; i++)
11272e4df0b2SKamal Heib 		data[idx++] =
11282e4df0b2SKamal Heib 			MLX5E_READ_CTR64_BE(&priv->stats.pport.phy_statistical_counters,
11292e4df0b2SKamal Heib 					    pport_phy_statistical_stats_desc, i);
11304cb4e98eSShay Agroskin 
11314cb4e98eSShay Agroskin 	if (MLX5_CAP_PCAM_FEATURE(mdev, per_lane_error_counters))
11324cb4e98eSShay Agroskin 		for (i = 0; i < NUM_PPORT_PHY_STATISTICAL_PER_LANE_COUNTERS; i++)
11334cb4e98eSShay Agroskin 			data[idx++] =
11344cb4e98eSShay Agroskin 				MLX5E_READ_CTR64_BE(&priv->stats.pport.phy_statistical_counters,
11354cb4e98eSShay Agroskin 						    pport_phy_statistical_err_lanes_stats_desc,
11364cb4e98eSShay Agroskin 						    i);
11372e4df0b2SKamal Heib 	return idx;
11382e4df0b2SKamal Heib }
11392e4df0b2SKamal Heib 
114096b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(phy)
114119386177SKamal Heib {
114219386177SKamal Heib 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
114319386177SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
114419386177SKamal Heib 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
114519386177SKamal Heib 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
114619386177SKamal Heib 	void *out;
114719386177SKamal Heib 
114819386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, local_port, 1);
114919386177SKamal Heib 	out = pstats->phy_counters;
115019386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, grp, MLX5_PHYSICAL_LAYER_COUNTERS_GROUP);
115119386177SKamal Heib 	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
115219386177SKamal Heib 
115319386177SKamal Heib 	if (!MLX5_CAP_PCAM_FEATURE(mdev, ppcnt_statistical_group))
115419386177SKamal Heib 		return;
115519386177SKamal Heib 
115619386177SKamal Heib 	out = pstats->phy_statistical_counters;
115719386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, grp, MLX5_PHYSICAL_LAYER_STATISTICAL_GROUP);
115819386177SKamal Heib 	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
115919386177SKamal Heib }
116019386177SKamal Heib 
11611703bb50SJakub Kicinski void mlx5e_stats_fec_get(struct mlx5e_priv *priv,
11621703bb50SJakub Kicinski 			 struct ethtool_fec_stats *fec_stats)
11631703bb50SJakub Kicinski {
11641703bb50SJakub Kicinski 	u32 ppcnt_phy_statistical[MLX5_ST_SZ_DW(ppcnt_reg)];
11651703bb50SJakub Kicinski 	struct mlx5_core_dev *mdev = priv->mdev;
11661703bb50SJakub Kicinski 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
11671703bb50SJakub Kicinski 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
11681703bb50SJakub Kicinski 
11691703bb50SJakub Kicinski 	if (!MLX5_CAP_PCAM_FEATURE(mdev, ppcnt_statistical_group))
11701703bb50SJakub Kicinski 		return;
11711703bb50SJakub Kicinski 
11721703bb50SJakub Kicinski 	MLX5_SET(ppcnt_reg, in, local_port, 1);
11731703bb50SJakub Kicinski 	MLX5_SET(ppcnt_reg, in, grp, MLX5_PHYSICAL_LAYER_STATISTICAL_GROUP);
11741703bb50SJakub Kicinski 	if (mlx5_core_access_reg(mdev, in, sz, ppcnt_phy_statistical,
11751703bb50SJakub Kicinski 				 sz, MLX5_REG_PPCNT, 0, 0))
11761703bb50SJakub Kicinski 		return;
11771703bb50SJakub Kicinski 
11781703bb50SJakub Kicinski 	fec_stats->corrected_bits.total =
11791703bb50SJakub Kicinski 		MLX5E_READ_CTR64_BE_F(ppcnt_phy_statistical,
11801703bb50SJakub Kicinski 				      phys_layer_statistical_cntrs,
11811703bb50SJakub Kicinski 				      phy_corrected_bits);
11821703bb50SJakub Kicinski }
11831703bb50SJakub Kicinski 
11843488bd4cSKamal Heib #define PPORT_ETH_EXT_OFF(c) \
11853488bd4cSKamal Heib 	MLX5_BYTE_OFF(ppcnt_reg, \
11863488bd4cSKamal Heib 		      counter_set.eth_extended_cntrs_grp_data_layout.c##_high)
11873488bd4cSKamal Heib static const struct counter_desc pport_eth_ext_stats_desc[] = {
11883488bd4cSKamal Heib 	{ "rx_buffer_passed_thres_phy", PPORT_ETH_EXT_OFF(rx_buffer_almost_full) },
11893488bd4cSKamal Heib };
11903488bd4cSKamal Heib 
11913488bd4cSKamal Heib #define NUM_PPORT_ETH_EXT_COUNTERS	ARRAY_SIZE(pport_eth_ext_stats_desc)
11923488bd4cSKamal Heib 
119396b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(eth_ext)
11943488bd4cSKamal Heib {
11953488bd4cSKamal Heib 	if (MLX5_CAP_PCAM_FEATURE((priv)->mdev, rx_buffer_fullness_counters))
11963488bd4cSKamal Heib 		return NUM_PPORT_ETH_EXT_COUNTERS;
11973488bd4cSKamal Heib 
11983488bd4cSKamal Heib 	return 0;
11993488bd4cSKamal Heib }
12003488bd4cSKamal Heib 
120196b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(eth_ext)
12023488bd4cSKamal Heib {
12033488bd4cSKamal Heib 	int i;
12043488bd4cSKamal Heib 
12053488bd4cSKamal Heib 	if (MLX5_CAP_PCAM_FEATURE((priv)->mdev, rx_buffer_fullness_counters))
12063488bd4cSKamal Heib 		for (i = 0; i < NUM_PPORT_ETH_EXT_COUNTERS; i++)
12073488bd4cSKamal Heib 			strcpy(data + (idx++) * ETH_GSTRING_LEN,
12083488bd4cSKamal Heib 			       pport_eth_ext_stats_desc[i].format);
12093488bd4cSKamal Heib 	return idx;
12103488bd4cSKamal Heib }
12113488bd4cSKamal Heib 
121296b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(eth_ext)
12133488bd4cSKamal Heib {
12143488bd4cSKamal Heib 	int i;
12153488bd4cSKamal Heib 
12163488bd4cSKamal Heib 	if (MLX5_CAP_PCAM_FEATURE((priv)->mdev, rx_buffer_fullness_counters))
12173488bd4cSKamal Heib 		for (i = 0; i < NUM_PPORT_ETH_EXT_COUNTERS; i++)
12183488bd4cSKamal Heib 			data[idx++] =
12193488bd4cSKamal Heib 				MLX5E_READ_CTR64_BE(&priv->stats.pport.eth_ext_counters,
12203488bd4cSKamal Heib 						    pport_eth_ext_stats_desc, i);
12213488bd4cSKamal Heib 	return idx;
12223488bd4cSKamal Heib }
12233488bd4cSKamal Heib 
122496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(eth_ext)
122519386177SKamal Heib {
122619386177SKamal Heib 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
122719386177SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
122819386177SKamal Heib 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
122919386177SKamal Heib 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
123019386177SKamal Heib 	void *out;
123119386177SKamal Heib 
123219386177SKamal Heib 	if (!MLX5_CAP_PCAM_FEATURE(mdev, rx_buffer_fullness_counters))
123319386177SKamal Heib 		return;
123419386177SKamal Heib 
123519386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, local_port, 1);
123619386177SKamal Heib 	out = pstats->eth_ext_counters;
123719386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, grp, MLX5_ETHERNET_EXTENDED_COUNTERS_GROUP);
123819386177SKamal Heib 	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
123919386177SKamal Heib }
124019386177SKamal Heib 
12419fd2b5f1SKamal Heib #define PCIE_PERF_OFF(c) \
12429fd2b5f1SKamal Heib 	MLX5_BYTE_OFF(mpcnt_reg, counter_set.pcie_perf_cntrs_grp_data_layout.c)
12439fd2b5f1SKamal Heib static const struct counter_desc pcie_perf_stats_desc[] = {
12449fd2b5f1SKamal Heib 	{ "rx_pci_signal_integrity", PCIE_PERF_OFF(rx_errors) },
12459fd2b5f1SKamal Heib 	{ "tx_pci_signal_integrity", PCIE_PERF_OFF(tx_errors) },
12469fd2b5f1SKamal Heib };
12479fd2b5f1SKamal Heib 
12489fd2b5f1SKamal Heib #define PCIE_PERF_OFF64(c) \
12499fd2b5f1SKamal Heib 	MLX5_BYTE_OFF(mpcnt_reg, counter_set.pcie_perf_cntrs_grp_data_layout.c##_high)
12509fd2b5f1SKamal Heib static const struct counter_desc pcie_perf_stats_desc64[] = {
12519fd2b5f1SKamal Heib 	{ "outbound_pci_buffer_overflow", PCIE_PERF_OFF64(tx_overflow_buffer_pkt) },
12529fd2b5f1SKamal Heib };
12539fd2b5f1SKamal Heib 
12549fd2b5f1SKamal Heib static const struct counter_desc pcie_perf_stall_stats_desc[] = {
12559fd2b5f1SKamal Heib 	{ "outbound_pci_stalled_rd", PCIE_PERF_OFF(outbound_stalled_reads) },
12569fd2b5f1SKamal Heib 	{ "outbound_pci_stalled_wr", PCIE_PERF_OFF(outbound_stalled_writes) },
12579fd2b5f1SKamal Heib 	{ "outbound_pci_stalled_rd_events", PCIE_PERF_OFF(outbound_stalled_reads_events) },
12589fd2b5f1SKamal Heib 	{ "outbound_pci_stalled_wr_events", PCIE_PERF_OFF(outbound_stalled_writes_events) },
12599fd2b5f1SKamal Heib };
12609fd2b5f1SKamal Heib 
12619fd2b5f1SKamal Heib #define NUM_PCIE_PERF_COUNTERS		ARRAY_SIZE(pcie_perf_stats_desc)
12629fd2b5f1SKamal Heib #define NUM_PCIE_PERF_COUNTERS64	ARRAY_SIZE(pcie_perf_stats_desc64)
12639fd2b5f1SKamal Heib #define NUM_PCIE_PERF_STALL_COUNTERS	ARRAY_SIZE(pcie_perf_stall_stats_desc)
12649fd2b5f1SKamal Heib 
126596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(pcie)
12669fd2b5f1SKamal Heib {
12679fd2b5f1SKamal Heib 	int num_stats = 0;
12689fd2b5f1SKamal Heib 
12699fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_performance_group))
12709fd2b5f1SKamal Heib 		num_stats += NUM_PCIE_PERF_COUNTERS;
12719fd2b5f1SKamal Heib 
12729fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, tx_overflow_buffer_pkt))
12739fd2b5f1SKamal Heib 		num_stats += NUM_PCIE_PERF_COUNTERS64;
12749fd2b5f1SKamal Heib 
12759fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_outbound_stalled))
12769fd2b5f1SKamal Heib 		num_stats += NUM_PCIE_PERF_STALL_COUNTERS;
12779fd2b5f1SKamal Heib 
12789fd2b5f1SKamal Heib 	return num_stats;
12799fd2b5f1SKamal Heib }
12809fd2b5f1SKamal Heib 
128196b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(pcie)
12829fd2b5f1SKamal Heib {
12839fd2b5f1SKamal Heib 	int i;
12849fd2b5f1SKamal Heib 
12859fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_performance_group))
12869fd2b5f1SKamal Heib 		for (i = 0; i < NUM_PCIE_PERF_COUNTERS; i++)
12879fd2b5f1SKamal Heib 			strcpy(data + (idx++) * ETH_GSTRING_LEN,
12889fd2b5f1SKamal Heib 			       pcie_perf_stats_desc[i].format);
12899fd2b5f1SKamal Heib 
12909fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, tx_overflow_buffer_pkt))
12919fd2b5f1SKamal Heib 		for (i = 0; i < NUM_PCIE_PERF_COUNTERS64; i++)
12929fd2b5f1SKamal Heib 			strcpy(data + (idx++) * ETH_GSTRING_LEN,
12939fd2b5f1SKamal Heib 			       pcie_perf_stats_desc64[i].format);
12949fd2b5f1SKamal Heib 
12959fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_outbound_stalled))
12969fd2b5f1SKamal Heib 		for (i = 0; i < NUM_PCIE_PERF_STALL_COUNTERS; i++)
12979fd2b5f1SKamal Heib 			strcpy(data + (idx++) * ETH_GSTRING_LEN,
12989fd2b5f1SKamal Heib 			       pcie_perf_stall_stats_desc[i].format);
12999fd2b5f1SKamal Heib 	return idx;
13009fd2b5f1SKamal Heib }
13019fd2b5f1SKamal Heib 
130296b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(pcie)
13039fd2b5f1SKamal Heib {
13049fd2b5f1SKamal Heib 	int i;
13059fd2b5f1SKamal Heib 
13069fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_performance_group))
13079fd2b5f1SKamal Heib 		for (i = 0; i < NUM_PCIE_PERF_COUNTERS; i++)
13089fd2b5f1SKamal Heib 			data[idx++] =
13099fd2b5f1SKamal Heib 				MLX5E_READ_CTR32_BE(&priv->stats.pcie.pcie_perf_counters,
13109fd2b5f1SKamal Heib 						    pcie_perf_stats_desc, i);
13119fd2b5f1SKamal Heib 
13129fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, tx_overflow_buffer_pkt))
13139fd2b5f1SKamal Heib 		for (i = 0; i < NUM_PCIE_PERF_COUNTERS64; i++)
13149fd2b5f1SKamal Heib 			data[idx++] =
13159fd2b5f1SKamal Heib 				MLX5E_READ_CTR64_BE(&priv->stats.pcie.pcie_perf_counters,
13169fd2b5f1SKamal Heib 						    pcie_perf_stats_desc64, i);
13179fd2b5f1SKamal Heib 
13189fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_outbound_stalled))
13199fd2b5f1SKamal Heib 		for (i = 0; i < NUM_PCIE_PERF_STALL_COUNTERS; i++)
13209fd2b5f1SKamal Heib 			data[idx++] =
13219fd2b5f1SKamal Heib 				MLX5E_READ_CTR32_BE(&priv->stats.pcie.pcie_perf_counters,
13229fd2b5f1SKamal Heib 						    pcie_perf_stall_stats_desc, i);
13239fd2b5f1SKamal Heib 	return idx;
13249fd2b5f1SKamal Heib }
13259fd2b5f1SKamal Heib 
132696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(pcie)
132719386177SKamal Heib {
132819386177SKamal Heib 	struct mlx5e_pcie_stats *pcie_stats = &priv->stats.pcie;
132919386177SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
133019386177SKamal Heib 	u32 in[MLX5_ST_SZ_DW(mpcnt_reg)] = {0};
133119386177SKamal Heib 	int sz = MLX5_ST_SZ_BYTES(mpcnt_reg);
133219386177SKamal Heib 	void *out;
133319386177SKamal Heib 
133419386177SKamal Heib 	if (!MLX5_CAP_MCAM_FEATURE(mdev, pcie_performance_group))
133519386177SKamal Heib 		return;
133619386177SKamal Heib 
133719386177SKamal Heib 	out = pcie_stats->pcie_perf_counters;
133819386177SKamal Heib 	MLX5_SET(mpcnt_reg, in, grp, MLX5_PCIE_PERFORMANCE_COUNTERS_GROUP);
133919386177SKamal Heib 	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_MPCNT, 0, 0);
134019386177SKamal Heib }
134119386177SKamal Heib 
13421297d97fSAya Levin #define PPORT_PER_TC_PRIO_OFF(c) \
13431297d97fSAya Levin 	MLX5_BYTE_OFF(ppcnt_reg, \
13441297d97fSAya Levin 		      counter_set.eth_per_tc_prio_grp_data_layout.c##_high)
13451297d97fSAya Levin 
13461297d97fSAya Levin static const struct counter_desc pport_per_tc_prio_stats_desc[] = {
13471297d97fSAya Levin 	{ "rx_prio%d_buf_discard", PPORT_PER_TC_PRIO_OFF(no_buffer_discard_uc) },
13481297d97fSAya Levin };
13491297d97fSAya Levin 
13501297d97fSAya Levin #define NUM_PPORT_PER_TC_PRIO_COUNTERS	ARRAY_SIZE(pport_per_tc_prio_stats_desc)
13511297d97fSAya Levin 
13521297d97fSAya Levin #define PPORT_PER_TC_CONGEST_PRIO_OFF(c) \
13531297d97fSAya Levin 	MLX5_BYTE_OFF(ppcnt_reg, \
13541297d97fSAya Levin 		      counter_set.eth_per_tc_congest_prio_grp_data_layout.c##_high)
13551297d97fSAya Levin 
13561297d97fSAya Levin static const struct counter_desc pport_per_tc_congest_prio_stats_desc[] = {
13571297d97fSAya Levin 	{ "rx_prio%d_cong_discard", PPORT_PER_TC_CONGEST_PRIO_OFF(wred_discard) },
13581297d97fSAya Levin 	{ "rx_prio%d_marked", PPORT_PER_TC_CONGEST_PRIO_OFF(ecn_marked_tc) },
13591297d97fSAya Levin };
13601297d97fSAya Levin 
13611297d97fSAya Levin #define NUM_PPORT_PER_TC_CONGEST_PRIO_COUNTERS \
13621297d97fSAya Levin 	ARRAY_SIZE(pport_per_tc_congest_prio_stats_desc)
13631297d97fSAya Levin 
13641297d97fSAya Levin static int mlx5e_grp_per_tc_prio_get_num_stats(struct mlx5e_priv *priv)
13651297d97fSAya Levin {
13661297d97fSAya Levin 	struct mlx5_core_dev *mdev = priv->mdev;
13671297d97fSAya Levin 
13681297d97fSAya Levin 	if (!MLX5_CAP_GEN(mdev, sbcam_reg))
13691297d97fSAya Levin 		return 0;
13701297d97fSAya Levin 
13711297d97fSAya Levin 	return NUM_PPORT_PER_TC_PRIO_COUNTERS * NUM_PPORT_PRIO;
13721297d97fSAya Levin }
13731297d97fSAya Levin 
137496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(per_port_buff_congest)
13751297d97fSAya Levin {
13761297d97fSAya Levin 	struct mlx5_core_dev *mdev = priv->mdev;
13771297d97fSAya Levin 	int i, prio;
13781297d97fSAya Levin 
13791297d97fSAya Levin 	if (!MLX5_CAP_GEN(mdev, sbcam_reg))
13801297d97fSAya Levin 		return idx;
13811297d97fSAya Levin 
13821297d97fSAya Levin 	for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
13831297d97fSAya Levin 		for (i = 0; i < NUM_PPORT_PER_TC_PRIO_COUNTERS; i++)
13841297d97fSAya Levin 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
13851297d97fSAya Levin 				pport_per_tc_prio_stats_desc[i].format, prio);
13861297d97fSAya Levin 		for (i = 0; i < NUM_PPORT_PER_TC_CONGEST_PRIO_COUNTERS; i++)
13871297d97fSAya Levin 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
13881297d97fSAya Levin 				pport_per_tc_congest_prio_stats_desc[i].format, prio);
13891297d97fSAya Levin 	}
13901297d97fSAya Levin 
13911297d97fSAya Levin 	return idx;
13921297d97fSAya Levin }
13931297d97fSAya Levin 
139496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(per_port_buff_congest)
13951297d97fSAya Levin {
13961297d97fSAya Levin 	struct mlx5e_pport_stats *pport = &priv->stats.pport;
13971297d97fSAya Levin 	struct mlx5_core_dev *mdev = priv->mdev;
13981297d97fSAya Levin 	int i, prio;
13991297d97fSAya Levin 
14001297d97fSAya Levin 	if (!MLX5_CAP_GEN(mdev, sbcam_reg))
14011297d97fSAya Levin 		return idx;
14021297d97fSAya Levin 
14031297d97fSAya Levin 	for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
14041297d97fSAya Levin 		for (i = 0; i < NUM_PPORT_PER_TC_PRIO_COUNTERS; i++)
14051297d97fSAya Levin 			data[idx++] =
14061297d97fSAya Levin 				MLX5E_READ_CTR64_BE(&pport->per_tc_prio_counters[prio],
14071297d97fSAya Levin 						    pport_per_tc_prio_stats_desc, i);
14081297d97fSAya Levin 		for (i = 0; i < NUM_PPORT_PER_TC_CONGEST_PRIO_COUNTERS ; i++)
14091297d97fSAya Levin 			data[idx++] =
14101297d97fSAya Levin 				MLX5E_READ_CTR64_BE(&pport->per_tc_congest_prio_counters[prio],
14111297d97fSAya Levin 						    pport_per_tc_congest_prio_stats_desc, i);
14121297d97fSAya Levin 	}
14131297d97fSAya Levin 
14141297d97fSAya Levin 	return idx;
14151297d97fSAya Levin }
14161297d97fSAya Levin 
14171297d97fSAya Levin static void mlx5e_grp_per_tc_prio_update_stats(struct mlx5e_priv *priv)
14181297d97fSAya Levin {
14191297d97fSAya Levin 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
14201297d97fSAya Levin 	struct mlx5_core_dev *mdev = priv->mdev;
14211297d97fSAya Levin 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {};
14221297d97fSAya Levin 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
14231297d97fSAya Levin 	void *out;
14241297d97fSAya Levin 	int prio;
14251297d97fSAya Levin 
14261297d97fSAya Levin 	if (!MLX5_CAP_GEN(mdev, sbcam_reg))
14271297d97fSAya Levin 		return;
14281297d97fSAya Levin 
14291297d97fSAya Levin 	MLX5_SET(ppcnt_reg, in, pnat, 2);
14301297d97fSAya Levin 	MLX5_SET(ppcnt_reg, in, grp, MLX5_PER_TRAFFIC_CLASS_COUNTERS_GROUP);
14311297d97fSAya Levin 	for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
14321297d97fSAya Levin 		out = pstats->per_tc_prio_counters[prio];
14331297d97fSAya Levin 		MLX5_SET(ppcnt_reg, in, prio_tc, prio);
14341297d97fSAya Levin 		mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
14351297d97fSAya Levin 	}
14361297d97fSAya Levin }
14371297d97fSAya Levin 
14381297d97fSAya Levin static int mlx5e_grp_per_tc_congest_prio_get_num_stats(struct mlx5e_priv *priv)
14391297d97fSAya Levin {
14401297d97fSAya Levin 	struct mlx5_core_dev *mdev = priv->mdev;
14411297d97fSAya Levin 
14421297d97fSAya Levin 	if (!MLX5_CAP_GEN(mdev, sbcam_reg))
14431297d97fSAya Levin 		return 0;
14441297d97fSAya Levin 
14451297d97fSAya Levin 	return NUM_PPORT_PER_TC_CONGEST_PRIO_COUNTERS * NUM_PPORT_PRIO;
14461297d97fSAya Levin }
14471297d97fSAya Levin 
14481297d97fSAya Levin static void mlx5e_grp_per_tc_congest_prio_update_stats(struct mlx5e_priv *priv)
14491297d97fSAya Levin {
14501297d97fSAya Levin 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
14511297d97fSAya Levin 	struct mlx5_core_dev *mdev = priv->mdev;
14521297d97fSAya Levin 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {};
14531297d97fSAya Levin 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
14541297d97fSAya Levin 	void *out;
14551297d97fSAya Levin 	int prio;
14561297d97fSAya Levin 
14571297d97fSAya Levin 	if (!MLX5_CAP_GEN(mdev, sbcam_reg))
14581297d97fSAya Levin 		return;
14591297d97fSAya Levin 
14601297d97fSAya Levin 	MLX5_SET(ppcnt_reg, in, pnat, 2);
14611297d97fSAya Levin 	MLX5_SET(ppcnt_reg, in, grp, MLX5_PER_TRAFFIC_CLASS_CONGESTION_GROUP);
14621297d97fSAya Levin 	for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
14631297d97fSAya Levin 		out = pstats->per_tc_congest_prio_counters[prio];
14641297d97fSAya Levin 		MLX5_SET(ppcnt_reg, in, prio_tc, prio);
14651297d97fSAya Levin 		mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
14661297d97fSAya Levin 	}
14671297d97fSAya Levin }
14681297d97fSAya Levin 
146996b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(per_port_buff_congest)
14701297d97fSAya Levin {
14711297d97fSAya Levin 	return mlx5e_grp_per_tc_prio_get_num_stats(priv) +
14721297d97fSAya Levin 		mlx5e_grp_per_tc_congest_prio_get_num_stats(priv);
14731297d97fSAya Levin }
14741297d97fSAya Levin 
147596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(per_port_buff_congest)
14761297d97fSAya Levin {
14771297d97fSAya Levin 	mlx5e_grp_per_tc_prio_update_stats(priv);
14781297d97fSAya Levin 	mlx5e_grp_per_tc_congest_prio_update_stats(priv);
14791297d97fSAya Levin }
14801297d97fSAya Levin 
14814377bea2SKamal Heib #define PPORT_PER_PRIO_OFF(c) \
14824377bea2SKamal Heib 	MLX5_BYTE_OFF(ppcnt_reg, \
14834377bea2SKamal Heib 		      counter_set.eth_per_prio_grp_data_layout.c##_high)
1484e6000651SKamal Heib static const struct counter_desc pport_per_prio_traffic_stats_desc[] = {
1485e6000651SKamal Heib 	{ "rx_prio%d_bytes", PPORT_PER_PRIO_OFF(rx_octets) },
1486e6000651SKamal Heib 	{ "rx_prio%d_packets", PPORT_PER_PRIO_OFF(rx_frames) },
1487827a8cb2SAharon Landau 	{ "rx_prio%d_discards", PPORT_PER_PRIO_OFF(rx_discards) },
1488e6000651SKamal Heib 	{ "tx_prio%d_bytes", PPORT_PER_PRIO_OFF(tx_octets) },
1489e6000651SKamal Heib 	{ "tx_prio%d_packets", PPORT_PER_PRIO_OFF(tx_frames) },
1490e6000651SKamal Heib };
1491e6000651SKamal Heib 
1492e6000651SKamal Heib #define NUM_PPORT_PER_PRIO_TRAFFIC_COUNTERS	ARRAY_SIZE(pport_per_prio_traffic_stats_desc)
1493e6000651SKamal Heib 
149454c73f86SYuval Shaia static int mlx5e_grp_per_prio_traffic_get_num_stats(void)
1495e6000651SKamal Heib {
1496e6000651SKamal Heib 	return NUM_PPORT_PER_PRIO_TRAFFIC_COUNTERS * NUM_PPORT_PRIO;
1497e6000651SKamal Heib }
1498e6000651SKamal Heib 
1499e6000651SKamal Heib static int mlx5e_grp_per_prio_traffic_fill_strings(struct mlx5e_priv *priv,
1500e6000651SKamal Heib 						   u8 *data,
1501e6000651SKamal Heib 						   int idx)
1502e6000651SKamal Heib {
1503e6000651SKamal Heib 	int i, prio;
1504e6000651SKamal Heib 
1505e6000651SKamal Heib 	for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
1506e6000651SKamal Heib 		for (i = 0; i < NUM_PPORT_PER_PRIO_TRAFFIC_COUNTERS; i++)
1507e6000651SKamal Heib 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
1508e6000651SKamal Heib 				pport_per_prio_traffic_stats_desc[i].format, prio);
1509e6000651SKamal Heib 	}
1510e6000651SKamal Heib 
1511e6000651SKamal Heib 	return idx;
1512e6000651SKamal Heib }
1513e6000651SKamal Heib 
1514e6000651SKamal Heib static int mlx5e_grp_per_prio_traffic_fill_stats(struct mlx5e_priv *priv,
1515e6000651SKamal Heib 						 u64 *data,
1516e6000651SKamal Heib 						 int idx)
1517e6000651SKamal Heib {
1518e6000651SKamal Heib 	int i, prio;
1519e6000651SKamal Heib 
1520e6000651SKamal Heib 	for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
1521e6000651SKamal Heib 		for (i = 0; i < NUM_PPORT_PER_PRIO_TRAFFIC_COUNTERS; i++)
1522e6000651SKamal Heib 			data[idx++] =
1523e6000651SKamal Heib 				MLX5E_READ_CTR64_BE(&priv->stats.pport.per_prio_counters[prio],
1524e6000651SKamal Heib 						    pport_per_prio_traffic_stats_desc, i);
1525e6000651SKamal Heib 	}
1526e6000651SKamal Heib 
1527e6000651SKamal Heib 	return idx;
1528e6000651SKamal Heib }
1529e6000651SKamal Heib 
15304377bea2SKamal Heib static const struct counter_desc pport_per_prio_pfc_stats_desc[] = {
15314377bea2SKamal Heib 	/* %s is "global" or "prio{i}" */
15324377bea2SKamal Heib 	{ "rx_%s_pause", PPORT_PER_PRIO_OFF(rx_pause) },
15334377bea2SKamal Heib 	{ "rx_%s_pause_duration", PPORT_PER_PRIO_OFF(rx_pause_duration) },
15344377bea2SKamal Heib 	{ "tx_%s_pause", PPORT_PER_PRIO_OFF(tx_pause) },
15354377bea2SKamal Heib 	{ "tx_%s_pause_duration", PPORT_PER_PRIO_OFF(tx_pause_duration) },
15364377bea2SKamal Heib 	{ "rx_%s_pause_transition", PPORT_PER_PRIO_OFF(rx_pause_transition) },
15374377bea2SKamal Heib };
15384377bea2SKamal Heib 
15392fcb12dfSInbar Karmy static const struct counter_desc pport_pfc_stall_stats_desc[] = {
15402fcb12dfSInbar Karmy 	{ "tx_pause_storm_warning_events", PPORT_PER_PRIO_OFF(device_stall_minor_watermark_cnt) },
15412fcb12dfSInbar Karmy 	{ "tx_pause_storm_error_events", PPORT_PER_PRIO_OFF(device_stall_critical_watermark_cnt) },
15422fcb12dfSInbar Karmy };
15432fcb12dfSInbar Karmy 
15444377bea2SKamal Heib #define NUM_PPORT_PER_PRIO_PFC_COUNTERS		ARRAY_SIZE(pport_per_prio_pfc_stats_desc)
15452fcb12dfSInbar Karmy #define NUM_PPORT_PFC_STALL_COUNTERS(priv)	(ARRAY_SIZE(pport_pfc_stall_stats_desc) * \
15462fcb12dfSInbar Karmy 						 MLX5_CAP_PCAM_FEATURE((priv)->mdev, pfcc_mask) * \
15472fcb12dfSInbar Karmy 						 MLX5_CAP_DEBUG((priv)->mdev, stall_detect))
15484377bea2SKamal Heib 
15494377bea2SKamal Heib static unsigned long mlx5e_query_pfc_combined(struct mlx5e_priv *priv)
15504377bea2SKamal Heib {
15514377bea2SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
15524377bea2SKamal Heib 	u8 pfc_en_tx;
15534377bea2SKamal Heib 	u8 pfc_en_rx;
15544377bea2SKamal Heib 	int err;
15554377bea2SKamal Heib 
15564377bea2SKamal Heib 	if (MLX5_CAP_GEN(mdev, port_type) != MLX5_CAP_PORT_TYPE_ETH)
15574377bea2SKamal Heib 		return 0;
15584377bea2SKamal Heib 
15594377bea2SKamal Heib 	err = mlx5_query_port_pfc(mdev, &pfc_en_tx, &pfc_en_rx);
15604377bea2SKamal Heib 
15614377bea2SKamal Heib 	return err ? 0 : pfc_en_tx | pfc_en_rx;
15624377bea2SKamal Heib }
15634377bea2SKamal Heib 
15644377bea2SKamal Heib static bool mlx5e_query_global_pause_combined(struct mlx5e_priv *priv)
15654377bea2SKamal Heib {
15664377bea2SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
15674377bea2SKamal Heib 	u32 rx_pause;
15684377bea2SKamal Heib 	u32 tx_pause;
15694377bea2SKamal Heib 	int err;
15704377bea2SKamal Heib 
15714377bea2SKamal Heib 	if (MLX5_CAP_GEN(mdev, port_type) != MLX5_CAP_PORT_TYPE_ETH)
15724377bea2SKamal Heib 		return false;
15734377bea2SKamal Heib 
15744377bea2SKamal Heib 	err = mlx5_query_port_pause(mdev, &rx_pause, &tx_pause);
15754377bea2SKamal Heib 
15764377bea2SKamal Heib 	return err ? false : rx_pause | tx_pause;
15774377bea2SKamal Heib }
15784377bea2SKamal Heib 
15794377bea2SKamal Heib static int mlx5e_grp_per_prio_pfc_get_num_stats(struct mlx5e_priv *priv)
15804377bea2SKamal Heib {
15814377bea2SKamal Heib 	return (mlx5e_query_global_pause_combined(priv) +
15824377bea2SKamal Heib 		hweight8(mlx5e_query_pfc_combined(priv))) *
15832fcb12dfSInbar Karmy 		NUM_PPORT_PER_PRIO_PFC_COUNTERS +
15842fcb12dfSInbar Karmy 		NUM_PPORT_PFC_STALL_COUNTERS(priv);
15854377bea2SKamal Heib }
15864377bea2SKamal Heib 
15874377bea2SKamal Heib static int mlx5e_grp_per_prio_pfc_fill_strings(struct mlx5e_priv *priv,
15884377bea2SKamal Heib 					       u8 *data,
15894377bea2SKamal Heib 					       int idx)
15904377bea2SKamal Heib {
15914377bea2SKamal Heib 	unsigned long pfc_combined;
15924377bea2SKamal Heib 	int i, prio;
15934377bea2SKamal Heib 
15944377bea2SKamal Heib 	pfc_combined = mlx5e_query_pfc_combined(priv);
15954377bea2SKamal Heib 	for_each_set_bit(prio, &pfc_combined, NUM_PPORT_PRIO) {
15964377bea2SKamal Heib 		for (i = 0; i < NUM_PPORT_PER_PRIO_PFC_COUNTERS; i++) {
15974377bea2SKamal Heib 			char pfc_string[ETH_GSTRING_LEN];
15984377bea2SKamal Heib 
15994377bea2SKamal Heib 			snprintf(pfc_string, sizeof(pfc_string), "prio%d", prio);
16004377bea2SKamal Heib 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
16014377bea2SKamal Heib 				pport_per_prio_pfc_stats_desc[i].format, pfc_string);
16024377bea2SKamal Heib 		}
16034377bea2SKamal Heib 	}
16044377bea2SKamal Heib 
16054377bea2SKamal Heib 	if (mlx5e_query_global_pause_combined(priv)) {
16064377bea2SKamal Heib 		for (i = 0; i < NUM_PPORT_PER_PRIO_PFC_COUNTERS; i++) {
16074377bea2SKamal Heib 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
16084377bea2SKamal Heib 				pport_per_prio_pfc_stats_desc[i].format, "global");
16094377bea2SKamal Heib 		}
16104377bea2SKamal Heib 	}
16114377bea2SKamal Heib 
16122fcb12dfSInbar Karmy 	for (i = 0; i < NUM_PPORT_PFC_STALL_COUNTERS(priv); i++)
16132fcb12dfSInbar Karmy 		strcpy(data + (idx++) * ETH_GSTRING_LEN,
16142fcb12dfSInbar Karmy 		       pport_pfc_stall_stats_desc[i].format);
16152fcb12dfSInbar Karmy 
16164377bea2SKamal Heib 	return idx;
16174377bea2SKamal Heib }
16184377bea2SKamal Heib 
16194377bea2SKamal Heib static int mlx5e_grp_per_prio_pfc_fill_stats(struct mlx5e_priv *priv,
16204377bea2SKamal Heib 					     u64 *data,
16214377bea2SKamal Heib 					     int idx)
16224377bea2SKamal Heib {
16234377bea2SKamal Heib 	unsigned long pfc_combined;
16244377bea2SKamal Heib 	int i, prio;
16254377bea2SKamal Heib 
16264377bea2SKamal Heib 	pfc_combined = mlx5e_query_pfc_combined(priv);
16274377bea2SKamal Heib 	for_each_set_bit(prio, &pfc_combined, NUM_PPORT_PRIO) {
16284377bea2SKamal Heib 		for (i = 0; i < NUM_PPORT_PER_PRIO_PFC_COUNTERS; i++) {
16294377bea2SKamal Heib 			data[idx++] =
16304377bea2SKamal Heib 				MLX5E_READ_CTR64_BE(&priv->stats.pport.per_prio_counters[prio],
16314377bea2SKamal Heib 						    pport_per_prio_pfc_stats_desc, i);
16324377bea2SKamal Heib 		}
16334377bea2SKamal Heib 	}
16344377bea2SKamal Heib 
16354377bea2SKamal Heib 	if (mlx5e_query_global_pause_combined(priv)) {
16364377bea2SKamal Heib 		for (i = 0; i < NUM_PPORT_PER_PRIO_PFC_COUNTERS; i++) {
16374377bea2SKamal Heib 			data[idx++] =
16384377bea2SKamal Heib 				MLX5E_READ_CTR64_BE(&priv->stats.pport.per_prio_counters[0],
16394377bea2SKamal Heib 						    pport_per_prio_pfc_stats_desc, i);
16404377bea2SKamal Heib 		}
16414377bea2SKamal Heib 	}
16424377bea2SKamal Heib 
16432fcb12dfSInbar Karmy 	for (i = 0; i < NUM_PPORT_PFC_STALL_COUNTERS(priv); i++)
16442fcb12dfSInbar Karmy 		data[idx++] = MLX5E_READ_CTR64_BE(&priv->stats.pport.per_prio_counters[0],
16452fcb12dfSInbar Karmy 						  pport_pfc_stall_stats_desc, i);
16462fcb12dfSInbar Karmy 
16474377bea2SKamal Heib 	return idx;
16484377bea2SKamal Heib }
16494377bea2SKamal Heib 
165096b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(per_prio)
1651a8984281SKamal Heib {
165254c73f86SYuval Shaia 	return mlx5e_grp_per_prio_traffic_get_num_stats() +
1653a8984281SKamal Heib 		mlx5e_grp_per_prio_pfc_get_num_stats(priv);
1654a8984281SKamal Heib }
1655a8984281SKamal Heib 
165696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(per_prio)
1657a8984281SKamal Heib {
1658a8984281SKamal Heib 	idx = mlx5e_grp_per_prio_traffic_fill_strings(priv, data, idx);
1659a8984281SKamal Heib 	idx = mlx5e_grp_per_prio_pfc_fill_strings(priv, data, idx);
1660a8984281SKamal Heib 	return idx;
1661a8984281SKamal Heib }
1662a8984281SKamal Heib 
166396b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(per_prio)
1664a8984281SKamal Heib {
1665a8984281SKamal Heib 	idx = mlx5e_grp_per_prio_traffic_fill_stats(priv, data, idx);
1666a8984281SKamal Heib 	idx = mlx5e_grp_per_prio_pfc_fill_stats(priv, data, idx);
1667a8984281SKamal Heib 	return idx;
1668a8984281SKamal Heib }
1669a8984281SKamal Heib 
167096b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(per_prio)
167119386177SKamal Heib {
167219386177SKamal Heib 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
167319386177SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
167419386177SKamal Heib 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
167519386177SKamal Heib 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
167619386177SKamal Heib 	int prio;
167719386177SKamal Heib 	void *out;
167819386177SKamal Heib 
167975370eb0SEyal Davidovich 	if (!MLX5_BASIC_PPCNT_SUPPORTED(mdev))
168075370eb0SEyal Davidovich 		return;
168175370eb0SEyal Davidovich 
168219386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, local_port, 1);
168319386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, grp, MLX5_PER_PRIORITY_COUNTERS_GROUP);
168419386177SKamal Heib 	for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
168519386177SKamal Heib 		out = pstats->per_prio_counters[prio];
168619386177SKamal Heib 		MLX5_SET(ppcnt_reg, in, prio_tc, prio);
168719386177SKamal Heib 		mlx5_core_access_reg(mdev, in, sz, out, sz,
168819386177SKamal Heib 				     MLX5_REG_PPCNT, 0, 0);
168919386177SKamal Heib 	}
169019386177SKamal Heib }
169119386177SKamal Heib 
16920e6f01a4SKamal Heib static const struct counter_desc mlx5e_pme_status_desc[] = {
1693c2fb3db2SMikhael Goikhman 	{ "module_unplug",       sizeof(u64) * MLX5_MODULE_STATUS_UNPLUGGED },
16940e6f01a4SKamal Heib };
16950e6f01a4SKamal Heib 
16960e6f01a4SKamal Heib static const struct counter_desc mlx5e_pme_error_desc[] = {
1697c2fb3db2SMikhael Goikhman 	{ "module_bus_stuck",    sizeof(u64) * MLX5_MODULE_EVENT_ERROR_BUS_STUCK },
1698c2fb3db2SMikhael Goikhman 	{ "module_high_temp",    sizeof(u64) * MLX5_MODULE_EVENT_ERROR_HIGH_TEMPERATURE },
1699c2fb3db2SMikhael Goikhman 	{ "module_bad_shorted",  sizeof(u64) * MLX5_MODULE_EVENT_ERROR_BAD_CABLE },
17000e6f01a4SKamal Heib };
17010e6f01a4SKamal Heib 
17020e6f01a4SKamal Heib #define NUM_PME_STATUS_STATS		ARRAY_SIZE(mlx5e_pme_status_desc)
17030e6f01a4SKamal Heib #define NUM_PME_ERR_STATS		ARRAY_SIZE(mlx5e_pme_error_desc)
17040e6f01a4SKamal Heib 
170596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(pme)
17060e6f01a4SKamal Heib {
17070e6f01a4SKamal Heib 	return NUM_PME_STATUS_STATS + NUM_PME_ERR_STATS;
17080e6f01a4SKamal Heib }
17090e6f01a4SKamal Heib 
171096b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(pme)
17110e6f01a4SKamal Heib {
17120e6f01a4SKamal Heib 	int i;
17130e6f01a4SKamal Heib 
17140e6f01a4SKamal Heib 	for (i = 0; i < NUM_PME_STATUS_STATS; i++)
17150e6f01a4SKamal Heib 		strcpy(data + (idx++) * ETH_GSTRING_LEN, mlx5e_pme_status_desc[i].format);
17160e6f01a4SKamal Heib 
17170e6f01a4SKamal Heib 	for (i = 0; i < NUM_PME_ERR_STATS; i++)
17180e6f01a4SKamal Heib 		strcpy(data + (idx++) * ETH_GSTRING_LEN, mlx5e_pme_error_desc[i].format);
17190e6f01a4SKamal Heib 
17200e6f01a4SKamal Heib 	return idx;
17210e6f01a4SKamal Heib }
17220e6f01a4SKamal Heib 
172396b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(pme)
17240e6f01a4SKamal Heib {
172569c1280bSSaeed Mahameed 	struct mlx5_pme_stats pme_stats;
17260e6f01a4SKamal Heib 	int i;
17270e6f01a4SKamal Heib 
172869c1280bSSaeed Mahameed 	mlx5_get_pme_stats(priv->mdev, &pme_stats);
172969c1280bSSaeed Mahameed 
17300e6f01a4SKamal Heib 	for (i = 0; i < NUM_PME_STATUS_STATS; i++)
173169c1280bSSaeed Mahameed 		data[idx++] = MLX5E_READ_CTR64_CPU(pme_stats.status_counters,
17320e6f01a4SKamal Heib 						   mlx5e_pme_status_desc, i);
17330e6f01a4SKamal Heib 
17340e6f01a4SKamal Heib 	for (i = 0; i < NUM_PME_ERR_STATS; i++)
173569c1280bSSaeed Mahameed 		data[idx++] = MLX5E_READ_CTR64_CPU(pme_stats.error_counters,
17360e6f01a4SKamal Heib 						   mlx5e_pme_error_desc, i);
17370e6f01a4SKamal Heib 
17380e6f01a4SKamal Heib 	return idx;
17390e6f01a4SKamal Heib }
17400e6f01a4SKamal Heib 
174196b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(pme) { return; }
174296b12796SSaeed Mahameed 
174396b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(tls)
174443585a41SIlya Lesokhin {
174543585a41SIlya Lesokhin 	return mlx5e_tls_get_count(priv);
174643585a41SIlya Lesokhin }
174743585a41SIlya Lesokhin 
174896b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(tls)
174943585a41SIlya Lesokhin {
175043585a41SIlya Lesokhin 	return idx + mlx5e_tls_get_strings(priv, data + idx * ETH_GSTRING_LEN);
175143585a41SIlya Lesokhin }
175243585a41SIlya Lesokhin 
175396b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(tls)
175443585a41SIlya Lesokhin {
175543585a41SIlya Lesokhin 	return idx + mlx5e_tls_get_stats(priv, data + idx);
175643585a41SIlya Lesokhin }
175743585a41SIlya Lesokhin 
175896b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(tls) { return; }
175996b12796SSaeed Mahameed 
17601fe85006SKamal Heib static const struct counter_desc rq_stats_desc[] = {
17611fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, packets) },
17621fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, bytes) },
17631fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_complete) },
17640aa1d186SSaeed Mahameed 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_complete_tail) },
17650aa1d186SSaeed Mahameed 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_complete_tail_slow) },
17661fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_unnecessary) },
17671fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_unnecessary_inner) },
17681fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_none) },
17691fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, xdp_drop) },
177086690b4bSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, xdp_redirect) },
17711fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, lro_packets) },
17721fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, lro_bytes) },
1773def09e7bSKhalid Manaa 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, gro_packets) },
1774def09e7bSKhalid Manaa 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, gro_bytes) },
1775def09e7bSKhalid Manaa 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, gro_skbs) },
1776def09e7bSKhalid Manaa 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, gro_match_packets) },
1777def09e7bSKhalid Manaa 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, gro_large_hds) },
1778f007c13dSNatali Shechtman 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, ecn_mark) },
1779f24686e8SGal Pressman 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, removed_vlan_packets) },
17801fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, wqe_err) },
1781b71ba6b4STariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, mpwqe_filler_cqes) },
1782b71ba6b4STariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, mpwqe_filler_strides) },
17830073c8f7SMoshe Shemesh 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, oversize_pkts_sw_drop) },
17841fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, buff_alloc_err) },
17851fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, cqe_compress_blks) },
17861fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, cqe_compress_pkts) },
17871fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, cache_reuse) },
17881fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, cache_full) },
17891fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, cache_empty) },
17901fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, cache_busy) },
17911fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, cache_waive) },
1792dc983f0eSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, congst_umr) },
179394563847SEran Ben Elisha 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, arfs_err) },
1794be5323c8SAya Levin 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, recover) },
179576c1e1acSTariq Toukan #ifdef CONFIG_MLX5_EN_TLS
179676c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_decrypted_packets) },
179776c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_decrypted_bytes) },
179876c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_req_pkt) },
179976c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_req_start) },
180076c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_req_end) },
180176c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_req_skip) },
180276c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_res_ok) },
1803e9ce991bSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_res_retry) },
180476c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_res_skip) },
180576c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_err) },
180676c1e1acSTariq Toukan #endif
18071fe85006SKamal Heib };
18081fe85006SKamal Heib 
18091fe85006SKamal Heib static const struct counter_desc sq_stats_desc[] = {
18101fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, packets) },
18111fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, bytes) },
18121fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tso_packets) },
18131fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tso_bytes) },
18141fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tso_inner_packets) },
18151fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tso_inner_bytes) },
18161fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, csum_partial) },
18171fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, csum_partial_inner) },
1818f24686e8SGal Pressman 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, added_vlan_packets) },
18191fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, nop) },
18205af75c74SMaxim Mikityanskiy 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, mpwqe_blks) },
18215af75c74SMaxim Mikityanskiy 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, mpwqe_pkts) },
1822d2ead1f3STariq Toukan #ifdef CONFIG_MLX5_EN_TLS
1823d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_encrypted_packets) },
1824d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_encrypted_bytes) },
1825d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_ooo) },
1826d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_dump_packets) },
1827d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_dump_bytes) },
182846a3ea98STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_resync_bytes) },
182946a3ea98STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_skip_no_sync_data) },
183046a3ea98STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_drop_no_sync_data) },
183146a3ea98STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_drop_bypass_req) },
1832d2ead1f3STariq Toukan #endif
18331fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, csum_none) },
18341fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, stopped) },
18351fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, dropped) },
18361fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, xmit_more) },
1837db75373cSEran Ben Elisha 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, recover) },
183886155656STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, cqes) },
1839f65a59ffSTariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, wake) },
1840f65a59ffSTariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, cqe_err) },
18411fe85006SKamal Heib };
18421fe85006SKamal Heib 
1843890388adSTariq Toukan static const struct counter_desc rq_xdpsq_stats_desc[] = {
1844890388adSTariq Toukan 	{ MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, xmit) },
184573cab880SShay Agroskin 	{ MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, mpwqe) },
1846c2273219SShay Agroskin 	{ MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, inlnw) },
18476c085a8aSShay Agroskin 	{ MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, nops) },
1848890388adSTariq Toukan 	{ MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, full) },
1849890388adSTariq Toukan 	{ MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, err) },
1850890388adSTariq Toukan 	{ MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, cqes) },
1851890388adSTariq Toukan };
1852890388adSTariq Toukan 
185358b99ee3STariq Toukan static const struct counter_desc xdpsq_stats_desc[] = {
185458b99ee3STariq Toukan 	{ MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, xmit) },
185573cab880SShay Agroskin 	{ MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, mpwqe) },
1856c2273219SShay Agroskin 	{ MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, inlnw) },
18576c085a8aSShay Agroskin 	{ MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, nops) },
185858b99ee3STariq Toukan 	{ MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, full) },
185958b99ee3STariq Toukan 	{ MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, err) },
186058b99ee3STariq Toukan 	{ MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, cqes) },
186158b99ee3STariq Toukan };
186258b99ee3STariq Toukan 
1863db05815bSMaxim Mikityanskiy static const struct counter_desc xskrq_stats_desc[] = {
1864db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, packets) },
1865db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, bytes) },
1866db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, csum_complete) },
1867db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, csum_unnecessary) },
1868db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, csum_unnecessary_inner) },
1869db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, csum_none) },
1870db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, ecn_mark) },
1871db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, removed_vlan_packets) },
1872db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, xdp_drop) },
1873db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, xdp_redirect) },
1874db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, wqe_err) },
1875db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, mpwqe_filler_cqes) },
1876db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, mpwqe_filler_strides) },
1877db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, oversize_pkts_sw_drop) },
1878db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, buff_alloc_err) },
1879db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, cqe_compress_blks) },
1880db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, cqe_compress_pkts) },
1881db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, congst_umr) },
1882db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, arfs_err) },
1883db05815bSMaxim Mikityanskiy };
1884db05815bSMaxim Mikityanskiy 
1885db05815bSMaxim Mikityanskiy static const struct counter_desc xsksq_stats_desc[] = {
1886db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKSQ_STAT(struct mlx5e_xdpsq_stats, xmit) },
1887db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKSQ_STAT(struct mlx5e_xdpsq_stats, mpwqe) },
1888db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKSQ_STAT(struct mlx5e_xdpsq_stats, inlnw) },
1889db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKSQ_STAT(struct mlx5e_xdpsq_stats, full) },
1890db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKSQ_STAT(struct mlx5e_xdpsq_stats, err) },
1891db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKSQ_STAT(struct mlx5e_xdpsq_stats, cqes) },
1892db05815bSMaxim Mikityanskiy };
1893db05815bSMaxim Mikityanskiy 
189457d689a8SEran Ben Elisha static const struct counter_desc ch_stats_desc[] = {
1895a1bf74dcSTariq Toukan 	{ MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, events) },
18962d7103c8STariq Toukan 	{ MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, poll) },
18972d7103c8STariq Toukan 	{ MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, arm) },
18982d7103c8STariq Toukan 	{ MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, aff_change) },
1899db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, force_irq) },
190057d689a8SEran Ben Elisha 	{ MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, eq_rearm) },
190157d689a8SEran Ben Elisha };
190257d689a8SEran Ben Elisha 
1903145e5637SEran Ben Elisha static const struct counter_desc ptp_sq_stats_desc[] = {
1904145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, packets) },
1905145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, bytes) },
1906145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, csum_partial) },
1907145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, csum_partial_inner) },
1908145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, added_vlan_packets) },
1909145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, nop) },
1910145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, csum_none) },
1911145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, stopped) },
1912145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, dropped) },
1913145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, xmit_more) },
1914145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, recover) },
1915145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, cqes) },
1916145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, wake) },
1917145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, cqe_err) },
1918145e5637SEran Ben Elisha };
1919145e5637SEran Ben Elisha 
1920145e5637SEran Ben Elisha static const struct counter_desc ptp_ch_stats_desc[] = {
1921145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_CH_STAT(struct mlx5e_ch_stats, events) },
1922145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_CH_STAT(struct mlx5e_ch_stats, poll) },
1923145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_CH_STAT(struct mlx5e_ch_stats, arm) },
1924145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_CH_STAT(struct mlx5e_ch_stats, eq_rearm) },
1925145e5637SEran Ben Elisha };
1926145e5637SEran Ben Elisha 
19271880bc4eSEran Ben Elisha static const struct counter_desc ptp_cq_stats_desc[] = {
19281880bc4eSEran Ben Elisha 	{ MLX5E_DECLARE_PTP_CQ_STAT(struct mlx5e_ptp_cq_stats, cqe) },
19291880bc4eSEran Ben Elisha 	{ MLX5E_DECLARE_PTP_CQ_STAT(struct mlx5e_ptp_cq_stats, err_cqe) },
19301880bc4eSEran Ben Elisha 	{ MLX5E_DECLARE_PTP_CQ_STAT(struct mlx5e_ptp_cq_stats, abort) },
19311880bc4eSEran Ben Elisha 	{ MLX5E_DECLARE_PTP_CQ_STAT(struct mlx5e_ptp_cq_stats, abort_abs_diff_ns) },
19321880bc4eSEran Ben Elisha };
19331880bc4eSEran Ben Elisha 
1934a28359e9SAya Levin static const struct counter_desc ptp_rq_stats_desc[] = {
1935a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, packets) },
1936a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, bytes) },
1937a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, csum_complete) },
1938a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, csum_complete_tail) },
1939a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, csum_complete_tail_slow) },
1940a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, csum_unnecessary) },
1941a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, csum_unnecessary_inner) },
1942a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, csum_none) },
1943a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, xdp_drop) },
1944a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, xdp_redirect) },
1945a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, lro_packets) },
1946a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, lro_bytes) },
1947a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, ecn_mark) },
1948a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, removed_vlan_packets) },
1949a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, wqe_err) },
1950a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, mpwqe_filler_cqes) },
1951a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, mpwqe_filler_strides) },
1952a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, oversize_pkts_sw_drop) },
1953a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, buff_alloc_err) },
1954a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, cqe_compress_blks) },
1955a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, cqe_compress_pkts) },
1956a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, cache_reuse) },
1957a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, cache_full) },
1958a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, cache_empty) },
1959a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, cache_busy) },
1960a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, cache_waive) },
1961a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, congst_umr) },
1962a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, arfs_err) },
1963a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, recover) },
1964a28359e9SAya Levin };
1965a28359e9SAya Levin 
1966214baf22SMaxim Mikityanskiy static const struct counter_desc qos_sq_stats_desc[] = {
1967214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, packets) },
1968214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, bytes) },
1969214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tso_packets) },
1970214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tso_bytes) },
1971214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tso_inner_packets) },
1972214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tso_inner_bytes) },
1973214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, csum_partial) },
1974214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, csum_partial_inner) },
1975214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, added_vlan_packets) },
1976214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, nop) },
1977214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, mpwqe_blks) },
1978214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, mpwqe_pkts) },
1979214baf22SMaxim Mikityanskiy #ifdef CONFIG_MLX5_EN_TLS
1980214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_encrypted_packets) },
1981214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_encrypted_bytes) },
1982214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_ooo) },
1983214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_dump_packets) },
1984214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_dump_bytes) },
1985214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_resync_bytes) },
1986214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_skip_no_sync_data) },
1987214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_drop_no_sync_data) },
1988214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_drop_bypass_req) },
1989214baf22SMaxim Mikityanskiy #endif
1990214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, csum_none) },
1991214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, stopped) },
1992214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, dropped) },
1993214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, xmit_more) },
1994214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, recover) },
1995214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, cqes) },
1996214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, wake) },
1997214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, cqe_err) },
1998214baf22SMaxim Mikityanskiy };
1999214baf22SMaxim Mikityanskiy 
20001fe85006SKamal Heib #define NUM_RQ_STATS			ARRAY_SIZE(rq_stats_desc)
20011fe85006SKamal Heib #define NUM_SQ_STATS			ARRAY_SIZE(sq_stats_desc)
200258b99ee3STariq Toukan #define NUM_XDPSQ_STATS			ARRAY_SIZE(xdpsq_stats_desc)
2003890388adSTariq Toukan #define NUM_RQ_XDPSQ_STATS		ARRAY_SIZE(rq_xdpsq_stats_desc)
2004db05815bSMaxim Mikityanskiy #define NUM_XSKRQ_STATS			ARRAY_SIZE(xskrq_stats_desc)
2005db05815bSMaxim Mikityanskiy #define NUM_XSKSQ_STATS			ARRAY_SIZE(xsksq_stats_desc)
200657d689a8SEran Ben Elisha #define NUM_CH_STATS			ARRAY_SIZE(ch_stats_desc)
2007145e5637SEran Ben Elisha #define NUM_PTP_SQ_STATS		ARRAY_SIZE(ptp_sq_stats_desc)
2008145e5637SEran Ben Elisha #define NUM_PTP_CH_STATS		ARRAY_SIZE(ptp_ch_stats_desc)
20091880bc4eSEran Ben Elisha #define NUM_PTP_CQ_STATS		ARRAY_SIZE(ptp_cq_stats_desc)
2010a28359e9SAya Levin #define NUM_PTP_RQ_STATS                ARRAY_SIZE(ptp_rq_stats_desc)
2011214baf22SMaxim Mikityanskiy #define NUM_QOS_SQ_STATS		ARRAY_SIZE(qos_sq_stats_desc)
2012214baf22SMaxim Mikityanskiy 
2013214baf22SMaxim Mikityanskiy static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(qos)
2014214baf22SMaxim Mikityanskiy {
2015214baf22SMaxim Mikityanskiy 	/* Pairs with smp_store_release in mlx5e_open_qos_sq. */
2016214baf22SMaxim Mikityanskiy 	return NUM_QOS_SQ_STATS * smp_load_acquire(&priv->htb.max_qos_sqs);
2017214baf22SMaxim Mikityanskiy }
2018214baf22SMaxim Mikityanskiy 
2019214baf22SMaxim Mikityanskiy static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(qos)
2020214baf22SMaxim Mikityanskiy {
2021214baf22SMaxim Mikityanskiy 	/* Pairs with smp_store_release in mlx5e_open_qos_sq. */
2022214baf22SMaxim Mikityanskiy 	u16 max_qos_sqs = smp_load_acquire(&priv->htb.max_qos_sqs);
2023214baf22SMaxim Mikityanskiy 	int i, qid;
2024214baf22SMaxim Mikityanskiy 
2025214baf22SMaxim Mikityanskiy 	for (qid = 0; qid < max_qos_sqs; qid++)
2026214baf22SMaxim Mikityanskiy 		for (i = 0; i < NUM_QOS_SQ_STATS; i++)
2027214baf22SMaxim Mikityanskiy 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
2028214baf22SMaxim Mikityanskiy 				qos_sq_stats_desc[i].format, qid);
2029214baf22SMaxim Mikityanskiy 
2030214baf22SMaxim Mikityanskiy 	return idx;
2031214baf22SMaxim Mikityanskiy }
2032214baf22SMaxim Mikityanskiy 
2033214baf22SMaxim Mikityanskiy static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(qos)
2034214baf22SMaxim Mikityanskiy {
2035214baf22SMaxim Mikityanskiy 	struct mlx5e_sq_stats **stats;
2036214baf22SMaxim Mikityanskiy 	u16 max_qos_sqs;
2037214baf22SMaxim Mikityanskiy 	int i, qid;
2038214baf22SMaxim Mikityanskiy 
2039214baf22SMaxim Mikityanskiy 	/* Pairs with smp_store_release in mlx5e_open_qos_sq. */
2040214baf22SMaxim Mikityanskiy 	max_qos_sqs = smp_load_acquire(&priv->htb.max_qos_sqs);
2041214baf22SMaxim Mikityanskiy 	stats = READ_ONCE(priv->htb.qos_sq_stats);
2042214baf22SMaxim Mikityanskiy 
2043214baf22SMaxim Mikityanskiy 	for (qid = 0; qid < max_qos_sqs; qid++) {
2044214baf22SMaxim Mikityanskiy 		struct mlx5e_sq_stats *s = READ_ONCE(stats[qid]);
2045214baf22SMaxim Mikityanskiy 
2046214baf22SMaxim Mikityanskiy 		for (i = 0; i < NUM_QOS_SQ_STATS; i++)
2047214baf22SMaxim Mikityanskiy 			data[idx++] = MLX5E_READ_CTR64_CPU(s, qos_sq_stats_desc, i);
2048214baf22SMaxim Mikityanskiy 	}
2049214baf22SMaxim Mikityanskiy 
2050214baf22SMaxim Mikityanskiy 	return idx;
2051214baf22SMaxim Mikityanskiy }
2052214baf22SMaxim Mikityanskiy 
2053214baf22SMaxim Mikityanskiy static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(qos) { return; }
2054145e5637SEran Ben Elisha 
2055145e5637SEran Ben Elisha static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(ptp)
2056145e5637SEran Ben Elisha {
2057a28359e9SAya Levin 	int num = NUM_PTP_CH_STATS;
2058a28359e9SAya Levin 
2059a28359e9SAya Levin 	if (!priv->tx_ptp_opened && !priv->rx_ptp_opened)
2060a28359e9SAya Levin 		return 0;
2061a28359e9SAya Levin 
2062a28359e9SAya Levin 	if (priv->tx_ptp_opened)
2063a28359e9SAya Levin 		num += (NUM_PTP_SQ_STATS + NUM_PTP_CQ_STATS) * priv->max_opened_tc;
2064a28359e9SAya Levin 	if (priv->rx_ptp_opened)
2065a28359e9SAya Levin 		num += NUM_PTP_RQ_STATS;
2066a28359e9SAya Levin 
2067a28359e9SAya Levin 	return num;
2068145e5637SEran Ben Elisha }
2069145e5637SEran Ben Elisha 
2070145e5637SEran Ben Elisha static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(ptp)
2071145e5637SEran Ben Elisha {
2072145e5637SEran Ben Elisha 	int i, tc;
2073145e5637SEran Ben Elisha 
2074a28359e9SAya Levin 	if (!priv->tx_ptp_opened && !priv->rx_ptp_opened)
2075145e5637SEran Ben Elisha 		return idx;
2076145e5637SEran Ben Elisha 
2077145e5637SEran Ben Elisha 	for (i = 0; i < NUM_PTP_CH_STATS; i++)
2078145e5637SEran Ben Elisha 		sprintf(data + (idx++) * ETH_GSTRING_LEN,
2079*aef0f8c6SSaeed Mahameed 			"%s", ptp_ch_stats_desc[i].format);
2080145e5637SEran Ben Elisha 
2081a28359e9SAya Levin 	if (priv->tx_ptp_opened) {
2082145e5637SEran Ben Elisha 		for (tc = 0; tc < priv->max_opened_tc; tc++)
2083145e5637SEran Ben Elisha 			for (i = 0; i < NUM_PTP_SQ_STATS; i++)
2084145e5637SEran Ben Elisha 				sprintf(data + (idx++) * ETH_GSTRING_LEN,
2085145e5637SEran Ben Elisha 					ptp_sq_stats_desc[i].format, tc);
2086145e5637SEran Ben Elisha 
20871880bc4eSEran Ben Elisha 		for (tc = 0; tc < priv->max_opened_tc; tc++)
20881880bc4eSEran Ben Elisha 			for (i = 0; i < NUM_PTP_CQ_STATS; i++)
20891880bc4eSEran Ben Elisha 				sprintf(data + (idx++) * ETH_GSTRING_LEN,
20901880bc4eSEran Ben Elisha 					ptp_cq_stats_desc[i].format, tc);
2091a28359e9SAya Levin 	}
2092a28359e9SAya Levin 	if (priv->rx_ptp_opened) {
2093a28359e9SAya Levin 		for (i = 0; i < NUM_PTP_RQ_STATS; i++)
2094a28359e9SAya Levin 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
2095dd1979cfSLama Kayal 				ptp_rq_stats_desc[i].format, MLX5E_PTP_CHANNEL_IX);
2096a28359e9SAya Levin 	}
2097145e5637SEran Ben Elisha 	return idx;
2098145e5637SEran Ben Elisha }
2099145e5637SEran Ben Elisha 
2100145e5637SEran Ben Elisha static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(ptp)
2101145e5637SEran Ben Elisha {
2102145e5637SEran Ben Elisha 	int i, tc;
2103145e5637SEran Ben Elisha 
2104a28359e9SAya Levin 	if (!priv->tx_ptp_opened && !priv->rx_ptp_opened)
2105145e5637SEran Ben Elisha 		return idx;
2106145e5637SEran Ben Elisha 
2107145e5637SEran Ben Elisha 	for (i = 0; i < NUM_PTP_CH_STATS; i++)
2108145e5637SEran Ben Elisha 		data[idx++] =
2109b0d35de4SAya Levin 			MLX5E_READ_CTR64_CPU(&priv->ptp_stats.ch,
2110145e5637SEran Ben Elisha 					     ptp_ch_stats_desc, i);
2111145e5637SEran Ben Elisha 
2112a28359e9SAya Levin 	if (priv->tx_ptp_opened) {
2113145e5637SEran Ben Elisha 		for (tc = 0; tc < priv->max_opened_tc; tc++)
2114145e5637SEran Ben Elisha 			for (i = 0; i < NUM_PTP_SQ_STATS; i++)
2115145e5637SEran Ben Elisha 				data[idx++] =
2116b0d35de4SAya Levin 					MLX5E_READ_CTR64_CPU(&priv->ptp_stats.sq[tc],
2117145e5637SEran Ben Elisha 							     ptp_sq_stats_desc, i);
2118145e5637SEran Ben Elisha 
21191880bc4eSEran Ben Elisha 		for (tc = 0; tc < priv->max_opened_tc; tc++)
21201880bc4eSEran Ben Elisha 			for (i = 0; i < NUM_PTP_CQ_STATS; i++)
21211880bc4eSEran Ben Elisha 				data[idx++] =
2122b0d35de4SAya Levin 					MLX5E_READ_CTR64_CPU(&priv->ptp_stats.cq[tc],
21231880bc4eSEran Ben Elisha 							     ptp_cq_stats_desc, i);
2124a28359e9SAya Levin 	}
2125a28359e9SAya Levin 	if (priv->rx_ptp_opened) {
2126a28359e9SAya Levin 		for (i = 0; i < NUM_PTP_RQ_STATS; i++)
2127a28359e9SAya Levin 			data[idx++] =
2128a28359e9SAya Levin 				MLX5E_READ_CTR64_CPU(&priv->ptp_stats.rq,
2129a28359e9SAya Levin 						     ptp_rq_stats_desc, i);
2130a28359e9SAya Levin 	}
2131145e5637SEran Ben Elisha 	return idx;
2132145e5637SEran Ben Elisha }
2133145e5637SEran Ben Elisha 
2134145e5637SEran Ben Elisha static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(ptp) { return; }
21351fe85006SKamal Heib 
213696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(channels)
21371fe85006SKamal Heib {
21389d758d4aSTariq Toukan 	int max_nch = priv->stats_nch;
213905909babSEran Ben Elisha 
214005909babSEran Ben Elisha 	return (NUM_RQ_STATS * max_nch) +
214105909babSEran Ben Elisha 	       (NUM_CH_STATS * max_nch) +
2142890388adSTariq Toukan 	       (NUM_SQ_STATS * max_nch * priv->max_opened_tc) +
214358b99ee3STariq Toukan 	       (NUM_RQ_XDPSQ_STATS * max_nch) +
2144db05815bSMaxim Mikityanskiy 	       (NUM_XDPSQ_STATS * max_nch) +
2145db05815bSMaxim Mikityanskiy 	       (NUM_XSKRQ_STATS * max_nch * priv->xsk.ever_used) +
2146db05815bSMaxim Mikityanskiy 	       (NUM_XSKSQ_STATS * max_nch * priv->xsk.ever_used);
21471fe85006SKamal Heib }
21481fe85006SKamal Heib 
214996b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(channels)
21501fe85006SKamal Heib {
2151db05815bSMaxim Mikityanskiy 	bool is_xsk = priv->xsk.ever_used;
21529d758d4aSTariq Toukan 	int max_nch = priv->stats_nch;
21531fe85006SKamal Heib 	int i, j, tc;
21541fe85006SKamal Heib 
215505909babSEran Ben Elisha 	for (i = 0; i < max_nch; i++)
215657d689a8SEran Ben Elisha 		for (j = 0; j < NUM_CH_STATS; j++)
215757d689a8SEran Ben Elisha 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
215857d689a8SEran Ben Elisha 				ch_stats_desc[j].format, i);
215957d689a8SEran Ben Elisha 
2160890388adSTariq Toukan 	for (i = 0; i < max_nch; i++) {
21611fe85006SKamal Heib 		for (j = 0; j < NUM_RQ_STATS; j++)
2162890388adSTariq Toukan 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
2163890388adSTariq Toukan 				rq_stats_desc[j].format, i);
2164db05815bSMaxim Mikityanskiy 		for (j = 0; j < NUM_XSKRQ_STATS * is_xsk; j++)
2165db05815bSMaxim Mikityanskiy 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
2166db05815bSMaxim Mikityanskiy 				xskrq_stats_desc[j].format, i);
2167890388adSTariq Toukan 		for (j = 0; j < NUM_RQ_XDPSQ_STATS; j++)
2168890388adSTariq Toukan 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
2169890388adSTariq Toukan 				rq_xdpsq_stats_desc[j].format, i);
2170890388adSTariq Toukan 	}
21711fe85006SKamal Heib 
217205909babSEran Ben Elisha 	for (tc = 0; tc < priv->max_opened_tc; tc++)
217305909babSEran Ben Elisha 		for (i = 0; i < max_nch; i++)
21741fe85006SKamal Heib 			for (j = 0; j < NUM_SQ_STATS; j++)
21751fe85006SKamal Heib 				sprintf(data + (idx++) * ETH_GSTRING_LEN,
21761fe85006SKamal Heib 					sq_stats_desc[j].format,
2177c55d8b10SEran Ben Elisha 					i + tc * max_nch);
21781fe85006SKamal Heib 
2179db05815bSMaxim Mikityanskiy 	for (i = 0; i < max_nch; i++) {
2180db05815bSMaxim Mikityanskiy 		for (j = 0; j < NUM_XSKSQ_STATS * is_xsk; j++)
2181db05815bSMaxim Mikityanskiy 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
2182db05815bSMaxim Mikityanskiy 				xsksq_stats_desc[j].format, i);
218358b99ee3STariq Toukan 		for (j = 0; j < NUM_XDPSQ_STATS; j++)
218458b99ee3STariq Toukan 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
218558b99ee3STariq Toukan 				xdpsq_stats_desc[j].format, i);
2186db05815bSMaxim Mikityanskiy 	}
218758b99ee3STariq Toukan 
21881fe85006SKamal Heib 	return idx;
21891fe85006SKamal Heib }
21901fe85006SKamal Heib 
219196b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(channels)
21921fe85006SKamal Heib {
2193db05815bSMaxim Mikityanskiy 	bool is_xsk = priv->xsk.ever_used;
21949d758d4aSTariq Toukan 	int max_nch = priv->stats_nch;
21951fe85006SKamal Heib 	int i, j, tc;
21961fe85006SKamal Heib 
219705909babSEran Ben Elisha 	for (i = 0; i < max_nch; i++)
219857d689a8SEran Ben Elisha 		for (j = 0; j < NUM_CH_STATS; j++)
219957d689a8SEran Ben Elisha 			data[idx++] =
220005909babSEran Ben Elisha 				MLX5E_READ_CTR64_CPU(&priv->channel_stats[i].ch,
220157d689a8SEran Ben Elisha 						     ch_stats_desc, j);
220257d689a8SEran Ben Elisha 
2203890388adSTariq Toukan 	for (i = 0; i < max_nch; i++) {
22041fe85006SKamal Heib 		for (j = 0; j < NUM_RQ_STATS; j++)
22051fe85006SKamal Heib 			data[idx++] =
220605909babSEran Ben Elisha 				MLX5E_READ_CTR64_CPU(&priv->channel_stats[i].rq,
22071fe85006SKamal Heib 						     rq_stats_desc, j);
2208db05815bSMaxim Mikityanskiy 		for (j = 0; j < NUM_XSKRQ_STATS * is_xsk; j++)
2209db05815bSMaxim Mikityanskiy 			data[idx++] =
2210db05815bSMaxim Mikityanskiy 				MLX5E_READ_CTR64_CPU(&priv->channel_stats[i].xskrq,
2211db05815bSMaxim Mikityanskiy 						     xskrq_stats_desc, j);
2212890388adSTariq Toukan 		for (j = 0; j < NUM_RQ_XDPSQ_STATS; j++)
2213890388adSTariq Toukan 			data[idx++] =
2214890388adSTariq Toukan 				MLX5E_READ_CTR64_CPU(&priv->channel_stats[i].rq_xdpsq,
2215890388adSTariq Toukan 						     rq_xdpsq_stats_desc, j);
2216890388adSTariq Toukan 	}
22171fe85006SKamal Heib 
221805909babSEran Ben Elisha 	for (tc = 0; tc < priv->max_opened_tc; tc++)
221905909babSEran Ben Elisha 		for (i = 0; i < max_nch; i++)
22201fe85006SKamal Heib 			for (j = 0; j < NUM_SQ_STATS; j++)
22211fe85006SKamal Heib 				data[idx++] =
222205909babSEran Ben Elisha 					MLX5E_READ_CTR64_CPU(&priv->channel_stats[i].sq[tc],
22231fe85006SKamal Heib 							     sq_stats_desc, j);
22241fe85006SKamal Heib 
2225db05815bSMaxim Mikityanskiy 	for (i = 0; i < max_nch; i++) {
2226db05815bSMaxim Mikityanskiy 		for (j = 0; j < NUM_XSKSQ_STATS * is_xsk; j++)
2227db05815bSMaxim Mikityanskiy 			data[idx++] =
2228db05815bSMaxim Mikityanskiy 				MLX5E_READ_CTR64_CPU(&priv->channel_stats[i].xsksq,
2229db05815bSMaxim Mikityanskiy 						     xsksq_stats_desc, j);
223058b99ee3STariq Toukan 		for (j = 0; j < NUM_XDPSQ_STATS; j++)
223158b99ee3STariq Toukan 			data[idx++] =
223258b99ee3STariq Toukan 				MLX5E_READ_CTR64_CPU(&priv->channel_stats[i].xdpsq,
223358b99ee3STariq Toukan 						     xdpsq_stats_desc, j);
2234db05815bSMaxim Mikityanskiy 	}
223558b99ee3STariq Toukan 
22361fe85006SKamal Heib 	return idx;
22371fe85006SKamal Heib }
22381fe85006SKamal Heib 
223996b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(channels) { return; }
224096b12796SSaeed Mahameed 
22412a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(sw, 0);
22422a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(qcnt, MLX5E_NDO_UPDATE_STATS);
22432a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(vnic_env, 0);
22442a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(vport, MLX5E_NDO_UPDATE_STATS);
22452a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(802_3, MLX5E_NDO_UPDATE_STATS);
22462a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(2863, 0);
22472a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(2819, 0);
22482a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(phy, 0);
22492a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(pcie, 0);
22502a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(per_prio, 0);
22512a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(pme, 0);
22522a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(channels, 0);
22532a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(per_port_buff_congest, 0);
22547c453526SVlad Buslov MLX5E_DEFINE_STATS_GRP(eth_ext, 0);
2255f0ff8e8cSSaeed Mahameed static MLX5E_DEFINE_STATS_GRP(tls, 0);
2256145e5637SEran Ben Elisha static MLX5E_DEFINE_STATS_GRP(ptp, 0);
2257214baf22SMaxim Mikityanskiy static MLX5E_DEFINE_STATS_GRP(qos, 0);
2258f0ff8e8cSSaeed Mahameed 
225919386177SKamal Heib /* The stats groups order is opposite to the update_stats() order calls */
2260f0ff8e8cSSaeed Mahameed mlx5e_stats_grp_t mlx5e_nic_stats_grps[] = {
2261f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(sw),
2262f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(qcnt),
2263f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(vnic_env),
2264f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(vport),
2265f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(802_3),
2266f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(2863),
2267f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(2819),
2268f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(phy),
2269f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(eth_ext),
2270f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(pcie),
2271f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(per_prio),
2272f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(pme),
22730aab3e1bSRaed Salem #ifdef CONFIG_MLX5_EN_IPSEC
22740aab3e1bSRaed Salem 	&MLX5E_STATS_GRP(ipsec_sw),
22750aab3e1bSRaed Salem 	&MLX5E_STATS_GRP(ipsec_hw),
22760aab3e1bSRaed Salem #endif
2277f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(tls),
2278f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(channels),
2279f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(per_port_buff_congest),
2280145e5637SEran Ben Elisha 	&MLX5E_STATS_GRP(ptp),
2281214baf22SMaxim Mikityanskiy 	&MLX5E_STATS_GRP(qos),
2282c0752f2bSKamal Heib };
2283c0752f2bSKamal Heib 
22843460c184SSaeed Mahameed unsigned int mlx5e_nic_stats_grps_num(struct mlx5e_priv *priv)
22853460c184SSaeed Mahameed {
22863460c184SSaeed Mahameed 	return ARRAY_SIZE(mlx5e_nic_stats_grps);
22873460c184SSaeed Mahameed }
2288