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 
332bd3b292SJuhee Kang #include "lib/events.h"
34c0752f2bSKamal Heib #include "en.h"
35943aa7bdSLeon Romanovsky #include "en_accel/ktls.h"
360aab3e1bSRaed Salem #include "en_accel/en_accel.h"
37dd1979cfSLama Kayal #include "en/ptp.h"
380a1498ebSLama Kayal #include "en/port.h"
39c0752f2bSKamal Heib 
40cc10e84bSJoe Damato #ifdef CONFIG_PAGE_POOL_STATS
41a9ca9f9cSYunsheng Lin #include <net/page_pool/helpers.h>
42cc10e84bSJoe Damato #endif
43cc10e84bSJoe Damato 
stats_grps_num(struct mlx5e_priv * priv)443460c184SSaeed Mahameed static unsigned int stats_grps_num(struct mlx5e_priv *priv)
453460c184SSaeed Mahameed {
463460c184SSaeed Mahameed 	return !priv->profile->stats_grps_num ? 0 :
473460c184SSaeed Mahameed 		priv->profile->stats_grps_num(priv);
483460c184SSaeed Mahameed }
493460c184SSaeed Mahameed 
mlx5e_stats_total_num(struct mlx5e_priv * priv)503460c184SSaeed Mahameed unsigned int mlx5e_stats_total_num(struct mlx5e_priv *priv)
513460c184SSaeed Mahameed {
52f0ff8e8cSSaeed Mahameed 	mlx5e_stats_grp_t *stats_grps = priv->profile->stats_grps;
533460c184SSaeed Mahameed 	const unsigned int num_stats_grps = stats_grps_num(priv);
543460c184SSaeed Mahameed 	unsigned int total = 0;
553460c184SSaeed Mahameed 	int i;
563460c184SSaeed Mahameed 
573460c184SSaeed Mahameed 	for (i = 0; i < num_stats_grps; i++)
58f0ff8e8cSSaeed Mahameed 		total += stats_grps[i]->get_num_stats(priv);
593460c184SSaeed Mahameed 
603460c184SSaeed Mahameed 	return total;
613460c184SSaeed Mahameed }
623460c184SSaeed Mahameed 
mlx5e_stats_update_ndo_stats(struct mlx5e_priv * priv)63b521105bSAlaa Hleihel void mlx5e_stats_update_ndo_stats(struct mlx5e_priv *priv)
64b521105bSAlaa Hleihel {
65b521105bSAlaa Hleihel 	mlx5e_stats_grp_t *stats_grps = priv->profile->stats_grps;
66b521105bSAlaa Hleihel 	const unsigned int num_stats_grps = stats_grps_num(priv);
67b521105bSAlaa Hleihel 	int i;
68b521105bSAlaa Hleihel 
69b521105bSAlaa Hleihel 	for (i = num_stats_grps - 1; i >= 0; i--)
70b521105bSAlaa Hleihel 		if (stats_grps[i]->update_stats &&
71b521105bSAlaa Hleihel 		    stats_grps[i]->update_stats_mask & MLX5E_NDO_UPDATE_STATS)
72b521105bSAlaa Hleihel 			stats_grps[i]->update_stats(priv);
73b521105bSAlaa Hleihel }
74b521105bSAlaa Hleihel 
mlx5e_stats_update(struct mlx5e_priv * priv)753460c184SSaeed Mahameed void mlx5e_stats_update(struct mlx5e_priv *priv)
763460c184SSaeed Mahameed {
77f0ff8e8cSSaeed Mahameed 	mlx5e_stats_grp_t *stats_grps = priv->profile->stats_grps;
783460c184SSaeed Mahameed 	const unsigned int num_stats_grps = stats_grps_num(priv);
793460c184SSaeed Mahameed 	int i;
803460c184SSaeed Mahameed 
813460c184SSaeed Mahameed 	for (i = num_stats_grps - 1; i >= 0; i--)
82f0ff8e8cSSaeed Mahameed 		if (stats_grps[i]->update_stats)
83f0ff8e8cSSaeed Mahameed 			stats_grps[i]->update_stats(priv);
843460c184SSaeed Mahameed }
853460c184SSaeed Mahameed 
mlx5e_stats_fill(struct mlx5e_priv * priv,u64 * data,int idx)863460c184SSaeed Mahameed void mlx5e_stats_fill(struct mlx5e_priv *priv, u64 *data, int idx)
873460c184SSaeed Mahameed {
88f0ff8e8cSSaeed Mahameed 	mlx5e_stats_grp_t *stats_grps = priv->profile->stats_grps;
893460c184SSaeed Mahameed 	const unsigned int num_stats_grps = stats_grps_num(priv);
903460c184SSaeed Mahameed 	int i;
913460c184SSaeed Mahameed 
923460c184SSaeed Mahameed 	for (i = 0; i < num_stats_grps; i++)
93f0ff8e8cSSaeed Mahameed 		idx = stats_grps[i]->fill_stats(priv, data, idx);
943460c184SSaeed Mahameed }
953460c184SSaeed Mahameed 
mlx5e_stats_fill_strings(struct mlx5e_priv * priv,u8 * data)963460c184SSaeed Mahameed void mlx5e_stats_fill_strings(struct mlx5e_priv *priv, u8 *data)
973460c184SSaeed Mahameed {
98f0ff8e8cSSaeed Mahameed 	mlx5e_stats_grp_t *stats_grps = priv->profile->stats_grps;
993460c184SSaeed Mahameed 	const unsigned int num_stats_grps = stats_grps_num(priv);
1003460c184SSaeed Mahameed 	int i, idx = 0;
1013460c184SSaeed Mahameed 
1023460c184SSaeed Mahameed 	for (i = 0; i < num_stats_grps; i++)
103f0ff8e8cSSaeed Mahameed 		idx = stats_grps[i]->fill_strings(priv, data, idx);
1043460c184SSaeed Mahameed }
1053460c184SSaeed Mahameed 
1063460c184SSaeed Mahameed /* Concrete NIC Stats */
1073460c184SSaeed Mahameed 
108c0752f2bSKamal Heib static const struct counter_desc sw_stats_desc[] = {
109c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_packets) },
110c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_bytes) },
111c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_packets) },
112c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_bytes) },
113c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tso_packets) },
114c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tso_bytes) },
115c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tso_inner_packets) },
116c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tso_inner_bytes) },
117f24686e8SGal Pressman 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_added_vlan_packets) },
1182ad9ecdbSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_nop) },
1195af75c74SMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_mpwqe_blks) },
1205af75c74SMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_mpwqe_pkts) },
121bf239741SIlya Lesokhin 
122bf239741SIlya Lesokhin #ifdef CONFIG_MLX5_EN_TLS
123d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_encrypted_packets) },
124d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_encrypted_bytes) },
125bf239741SIlya Lesokhin 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_ooo) },
126d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_dump_packets) },
127d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_dump_bytes) },
12846a3ea98STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_resync_bytes) },
12946a3ea98STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_skip_no_sync_data) },
13046a3ea98STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_drop_no_sync_data) },
13146a3ea98STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_tls_drop_bypass_req) },
132bf239741SIlya Lesokhin #endif
133bf239741SIlya Lesokhin 
134c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_lro_packets) },
135c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_lro_bytes) },
136def09e7bSKhalid Manaa 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_gro_packets) },
137def09e7bSKhalid Manaa 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_gro_bytes) },
138def09e7bSKhalid Manaa 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_gro_skbs) },
139def09e7bSKhalid Manaa 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_gro_match_packets) },
140def09e7bSKhalid Manaa 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_gro_large_hds) },
141f007c13dSNatali Shechtman 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_ecn_mark) },
142f24686e8SGal Pressman 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_removed_vlan_packets) },
143c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_unnecessary) },
144c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_none) },
145c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_complete) },
1460aa1d186SSaeed Mahameed 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_complete_tail) },
1470aa1d186SSaeed Mahameed 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_complete_tail_slow) },
148c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_csum_unnecessary_inner) },
149c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_drop) },
15086690b4bSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_redirect) },
151890388adSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_xmit) },
15273cab880SShay Agroskin 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_mpwqe) },
153c2273219SShay Agroskin 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_inlnw) },
1546c085a8aSShay Agroskin 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_nops) },
155c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_full) },
156890388adSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_err) },
157890388adSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xdp_tx_cqe) },
158c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_csum_none) },
159c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_csum_partial) },
160c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_csum_partial_inner) },
161c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_stopped) },
162c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_dropped) },
163c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xmit_more) },
164db75373cSEran Ben Elisha 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_recover) },
16586155656STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_cqes) },
166f65a59ffSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_wake) },
167f65a59ffSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_cqe_err) },
16858b99ee3STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_xmit) },
16973cab880SShay Agroskin 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_mpwqe) },
170c2273219SShay Agroskin 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_inlnw) },
1716c085a8aSShay Agroskin 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_nops) },
17258b99ee3STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_full) },
17358b99ee3STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_err) },
17458b99ee3STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xdp_cqes) },
175c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_wqe_err) },
176b71ba6b4STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_mpwqe_filler_cqes) },
177b71ba6b4STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_mpwqe_filler_strides) },
1780073c8f7SMoshe Shemesh 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_oversize_pkts_sw_drop) },
179c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_buff_alloc_err) },
180c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cqe_compress_blks) },
181c0752f2bSKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cqe_compress_pkts) },
182dc983f0eSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_congst_umr) },
183*f98e5158SAdham Faris #ifdef CONFIG_MLX5_EN_ARFS
184*f98e5158SAdham Faris 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_arfs_add) },
185*f98e5158SAdham Faris 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_arfs_request_in) },
186*f98e5158SAdham Faris 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_arfs_request_out) },
187*f98e5158SAdham Faris 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_arfs_expired) },
18894563847SEran Ben Elisha 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_arfs_err) },
189*f98e5158SAdham Faris #endif
190be5323c8SAya Levin 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_recover) },
191cc10e84bSJoe Damato #ifdef CONFIG_PAGE_POOL_STATS
192cc10e84bSJoe Damato 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_pp_alloc_fast) },
193cc10e84bSJoe Damato 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_pp_alloc_slow) },
194cc10e84bSJoe Damato 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_pp_alloc_slow_high_order) },
195cc10e84bSJoe Damato 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_pp_alloc_empty) },
196cc10e84bSJoe Damato 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_pp_alloc_refill) },
197cc10e84bSJoe Damato 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_pp_alloc_waive) },
198cc10e84bSJoe Damato 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_pp_recycle_cached) },
199cc10e84bSJoe Damato 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_pp_recycle_cache_full) },
200cc10e84bSJoe Damato 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_pp_recycle_ring) },
201cc10e84bSJoe Damato 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_pp_recycle_ring_full) },
202cc10e84bSJoe Damato 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_pp_recycle_released_ref) },
203cc10e84bSJoe Damato #endif
20476c1e1acSTariq Toukan #ifdef CONFIG_MLX5_EN_TLS
20576c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_decrypted_packets) },
20676c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_decrypted_bytes) },
20776c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_req_pkt) },
20876c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_req_start) },
20976c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_req_end) },
21076c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_req_skip) },
21176c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_res_ok) },
212e9ce991bSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_res_retry) },
21376c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_resync_res_skip) },
21476c1e1acSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_tls_err) },
21576c1e1acSTariq Toukan #endif
216a1bf74dcSTariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, ch_events) },
2172d7103c8STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, ch_poll) },
2182d7103c8STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, ch_arm) },
2192d7103c8STariq Toukan 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, ch_aff_change) },
220db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, ch_force_irq) },
22157d689a8SEran Ben Elisha 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, ch_eq_rearm) },
222db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_packets) },
223db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_bytes) },
224db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_csum_complete) },
225db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_csum_unnecessary) },
226db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_csum_unnecessary_inner) },
227db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_csum_none) },
228db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_ecn_mark) },
229db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_removed_vlan_packets) },
230db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_xdp_drop) },
231db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_xdp_redirect) },
232db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_wqe_err) },
233db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_mpwqe_filler_cqes) },
234db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_mpwqe_filler_strides) },
235db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_oversize_pkts_sw_drop) },
236db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_buff_alloc_err) },
237db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_cqe_compress_blks) },
238db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_cqe_compress_pkts) },
239db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_xsk_congst_umr) },
240db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xsk_xmit) },
241db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xsk_mpwqe) },
242db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xsk_inlnw) },
243db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xsk_full) },
244db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xsk_err) },
245db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xsk_cqes) },
246c0752f2bSKamal Heib };
247c0752f2bSKamal Heib 
248c0752f2bSKamal Heib #define NUM_SW_COUNTERS			ARRAY_SIZE(sw_stats_desc)
249c0752f2bSKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(sw)25096b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(sw)
251c0752f2bSKamal Heib {
252c0752f2bSKamal Heib 	return NUM_SW_COUNTERS;
253c0752f2bSKamal Heib }
254c0752f2bSKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(sw)25596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(sw)
256c0752f2bSKamal Heib {
257c0752f2bSKamal Heib 	int i;
258c0752f2bSKamal Heib 
259c0752f2bSKamal Heib 	for (i = 0; i < NUM_SW_COUNTERS; i++)
260c0752f2bSKamal Heib 		strcpy(data + (idx++) * ETH_GSTRING_LEN, sw_stats_desc[i].format);
261c0752f2bSKamal Heib 	return idx;
262c0752f2bSKamal Heib }
263c0752f2bSKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(sw)26496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(sw)
265c0752f2bSKamal Heib {
266c0752f2bSKamal Heib 	int i;
267c0752f2bSKamal Heib 
268c0752f2bSKamal Heib 	for (i = 0; i < NUM_SW_COUNTERS; i++)
269c0752f2bSKamal Heib 		data[idx++] = MLX5E_READ_CTR64_CPU(&priv->stats.sw, sw_stats_desc, i);
270c0752f2bSKamal Heib 	return idx;
271c0752f2bSKamal Heib }
272c0752f2bSKamal Heib 
mlx5e_stats_grp_sw_update_stats_xdp_red(struct mlx5e_sw_stats * s,struct mlx5e_xdpsq_stats * xdpsq_red_stats)2731a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_xdp_red(struct mlx5e_sw_stats *s,
2741a7f5124SEran Ben Elisha 						    struct mlx5e_xdpsq_stats *xdpsq_red_stats)
27519386177SKamal Heib {
2761a7f5124SEran Ben Elisha 	s->tx_xdp_xmit  += xdpsq_red_stats->xmit;
2771a7f5124SEran Ben Elisha 	s->tx_xdp_mpwqe += xdpsq_red_stats->mpwqe;
2781a7f5124SEran Ben Elisha 	s->tx_xdp_inlnw += xdpsq_red_stats->inlnw;
2791a7f5124SEran Ben Elisha 	s->tx_xdp_nops  += xdpsq_red_stats->nops;
2801a7f5124SEran Ben Elisha 	s->tx_xdp_full  += xdpsq_red_stats->full;
2811a7f5124SEran Ben Elisha 	s->tx_xdp_err   += xdpsq_red_stats->err;
2821a7f5124SEran Ben Elisha 	s->tx_xdp_cqes  += xdpsq_red_stats->cqes;
2831a7f5124SEran Ben Elisha }
28419386177SKamal Heib 
mlx5e_stats_grp_sw_update_stats_xdpsq(struct mlx5e_sw_stats * s,struct mlx5e_xdpsq_stats * xdpsq_stats)2851a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_xdpsq(struct mlx5e_sw_stats *s,
2861a7f5124SEran Ben Elisha 						  struct mlx5e_xdpsq_stats *xdpsq_stats)
2871a7f5124SEran Ben Elisha {
2881a7f5124SEran Ben Elisha 	s->rx_xdp_tx_xmit  += xdpsq_stats->xmit;
2891a7f5124SEran Ben Elisha 	s->rx_xdp_tx_mpwqe += xdpsq_stats->mpwqe;
2901a7f5124SEran Ben Elisha 	s->rx_xdp_tx_inlnw += xdpsq_stats->inlnw;
2911a7f5124SEran Ben Elisha 	s->rx_xdp_tx_nops  += xdpsq_stats->nops;
2921a7f5124SEran Ben Elisha 	s->rx_xdp_tx_full  += xdpsq_stats->full;
2931a7f5124SEran Ben Elisha 	s->rx_xdp_tx_err   += xdpsq_stats->err;
2941a7f5124SEran Ben Elisha 	s->rx_xdp_tx_cqe   += xdpsq_stats->cqes;
2951a7f5124SEran Ben Elisha }
29619386177SKamal Heib 
mlx5e_stats_grp_sw_update_stats_xsksq(struct mlx5e_sw_stats * s,struct mlx5e_xdpsq_stats * xsksq_stats)2971a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_xsksq(struct mlx5e_sw_stats *s,
2981a7f5124SEran Ben Elisha 						  struct mlx5e_xdpsq_stats *xsksq_stats)
2991a7f5124SEran Ben Elisha {
3001a7f5124SEran Ben Elisha 	s->tx_xsk_xmit  += xsksq_stats->xmit;
3011a7f5124SEran Ben Elisha 	s->tx_xsk_mpwqe += xsksq_stats->mpwqe;
3021a7f5124SEran Ben Elisha 	s->tx_xsk_inlnw += xsksq_stats->inlnw;
3031a7f5124SEran Ben Elisha 	s->tx_xsk_full  += xsksq_stats->full;
3041a7f5124SEran Ben Elisha 	s->tx_xsk_err   += xsksq_stats->err;
3051a7f5124SEran Ben Elisha 	s->tx_xsk_cqes  += xsksq_stats->cqes;
3061a7f5124SEran Ben Elisha }
30719386177SKamal Heib 
mlx5e_stats_grp_sw_update_stats_xskrq(struct mlx5e_sw_stats * s,struct mlx5e_rq_stats * xskrq_stats)3081a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_xskrq(struct mlx5e_sw_stats *s,
3091a7f5124SEran Ben Elisha 						  struct mlx5e_rq_stats *xskrq_stats)
3101a7f5124SEran Ben Elisha {
3111a7f5124SEran Ben Elisha 	s->rx_xsk_packets                += xskrq_stats->packets;
3121a7f5124SEran Ben Elisha 	s->rx_xsk_bytes                  += xskrq_stats->bytes;
3131a7f5124SEran Ben Elisha 	s->rx_xsk_csum_complete          += xskrq_stats->csum_complete;
3141a7f5124SEran Ben Elisha 	s->rx_xsk_csum_unnecessary       += xskrq_stats->csum_unnecessary;
3151a7f5124SEran Ben Elisha 	s->rx_xsk_csum_unnecessary_inner += xskrq_stats->csum_unnecessary_inner;
3161a7f5124SEran Ben Elisha 	s->rx_xsk_csum_none              += xskrq_stats->csum_none;
3171a7f5124SEran Ben Elisha 	s->rx_xsk_ecn_mark               += xskrq_stats->ecn_mark;
3181a7f5124SEran Ben Elisha 	s->rx_xsk_removed_vlan_packets   += xskrq_stats->removed_vlan_packets;
3191a7f5124SEran Ben Elisha 	s->rx_xsk_xdp_drop               += xskrq_stats->xdp_drop;
3201a7f5124SEran Ben Elisha 	s->rx_xsk_xdp_redirect           += xskrq_stats->xdp_redirect;
3211a7f5124SEran Ben Elisha 	s->rx_xsk_wqe_err                += xskrq_stats->wqe_err;
3221a7f5124SEran Ben Elisha 	s->rx_xsk_mpwqe_filler_cqes      += xskrq_stats->mpwqe_filler_cqes;
3231a7f5124SEran Ben Elisha 	s->rx_xsk_mpwqe_filler_strides   += xskrq_stats->mpwqe_filler_strides;
3241a7f5124SEran Ben Elisha 	s->rx_xsk_oversize_pkts_sw_drop  += xskrq_stats->oversize_pkts_sw_drop;
3251a7f5124SEran Ben Elisha 	s->rx_xsk_buff_alloc_err         += xskrq_stats->buff_alloc_err;
3261a7f5124SEran Ben Elisha 	s->rx_xsk_cqe_compress_blks      += xskrq_stats->cqe_compress_blks;
3271a7f5124SEran Ben Elisha 	s->rx_xsk_cqe_compress_pkts      += xskrq_stats->cqe_compress_pkts;
3281a7f5124SEran Ben Elisha 	s->rx_xsk_congst_umr             += xskrq_stats->congst_umr;
3291a7f5124SEran Ben Elisha }
3301a7f5124SEran Ben Elisha 
mlx5e_stats_grp_sw_update_stats_rq_stats(struct mlx5e_sw_stats * s,struct mlx5e_rq_stats * rq_stats)3311a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_rq_stats(struct mlx5e_sw_stats *s,
3321a7f5124SEran Ben Elisha 						     struct mlx5e_rq_stats *rq_stats)
3331a7f5124SEran Ben Elisha {
33419386177SKamal Heib 	s->rx_packets                 += rq_stats->packets;
33519386177SKamal Heib 	s->rx_bytes                   += rq_stats->bytes;
33619386177SKamal Heib 	s->rx_lro_packets             += rq_stats->lro_packets;
33719386177SKamal Heib 	s->rx_lro_bytes               += rq_stats->lro_bytes;
338def09e7bSKhalid Manaa 	s->rx_gro_packets             += rq_stats->gro_packets;
339def09e7bSKhalid Manaa 	s->rx_gro_bytes               += rq_stats->gro_bytes;
340def09e7bSKhalid Manaa 	s->rx_gro_skbs                += rq_stats->gro_skbs;
341def09e7bSKhalid Manaa 	s->rx_gro_match_packets       += rq_stats->gro_match_packets;
342def09e7bSKhalid Manaa 	s->rx_gro_large_hds           += rq_stats->gro_large_hds;
343f007c13dSNatali Shechtman 	s->rx_ecn_mark                += rq_stats->ecn_mark;
34419386177SKamal Heib 	s->rx_removed_vlan_packets    += rq_stats->removed_vlan_packets;
34519386177SKamal Heib 	s->rx_csum_none               += rq_stats->csum_none;
34619386177SKamal Heib 	s->rx_csum_complete           += rq_stats->csum_complete;
3470aa1d186SSaeed Mahameed 	s->rx_csum_complete_tail      += rq_stats->csum_complete_tail;
3480aa1d186SSaeed Mahameed 	s->rx_csum_complete_tail_slow += rq_stats->csum_complete_tail_slow;
34919386177SKamal Heib 	s->rx_csum_unnecessary        += rq_stats->csum_unnecessary;
35019386177SKamal Heib 	s->rx_csum_unnecessary_inner  += rq_stats->csum_unnecessary_inner;
35119386177SKamal Heib 	s->rx_xdp_drop                += rq_stats->xdp_drop;
35286690b4bSTariq Toukan 	s->rx_xdp_redirect            += rq_stats->xdp_redirect;
35319386177SKamal Heib 	s->rx_wqe_err                 += rq_stats->wqe_err;
354b71ba6b4STariq Toukan 	s->rx_mpwqe_filler_cqes       += rq_stats->mpwqe_filler_cqes;
355b71ba6b4STariq Toukan 	s->rx_mpwqe_filler_strides    += rq_stats->mpwqe_filler_strides;
3560073c8f7SMoshe Shemesh 	s->rx_oversize_pkts_sw_drop   += rq_stats->oversize_pkts_sw_drop;
35719386177SKamal Heib 	s->rx_buff_alloc_err          += rq_stats->buff_alloc_err;
35819386177SKamal Heib 	s->rx_cqe_compress_blks       += rq_stats->cqe_compress_blks;
35919386177SKamal Heib 	s->rx_cqe_compress_pkts       += rq_stats->cqe_compress_pkts;
360dc983f0eSTariq Toukan 	s->rx_congst_umr              += rq_stats->congst_umr;
361*f98e5158SAdham Faris #ifdef CONFIG_MLX5_EN_ARFS
362*f98e5158SAdham Faris 	s->rx_arfs_add                += rq_stats->arfs_add;
363*f98e5158SAdham Faris 	s->rx_arfs_request_in         += rq_stats->arfs_request_in;
364*f98e5158SAdham Faris 	s->rx_arfs_request_out        += rq_stats->arfs_request_out;
365*f98e5158SAdham Faris 	s->rx_arfs_expired            += rq_stats->arfs_expired;
36694563847SEran Ben Elisha 	s->rx_arfs_err                += rq_stats->arfs_err;
367*f98e5158SAdham Faris #endif
368be5323c8SAya Levin 	s->rx_recover                 += rq_stats->recover;
369cc10e84bSJoe Damato #ifdef CONFIG_PAGE_POOL_STATS
370cc10e84bSJoe Damato 	s->rx_pp_alloc_fast          += rq_stats->pp_alloc_fast;
371cc10e84bSJoe Damato 	s->rx_pp_alloc_slow          += rq_stats->pp_alloc_slow;
372cc10e84bSJoe Damato 	s->rx_pp_alloc_empty         += rq_stats->pp_alloc_empty;
373cc10e84bSJoe Damato 	s->rx_pp_alloc_refill        += rq_stats->pp_alloc_refill;
374cc10e84bSJoe Damato 	s->rx_pp_alloc_waive         += rq_stats->pp_alloc_waive;
375cc10e84bSJoe Damato 	s->rx_pp_alloc_slow_high_order		+= rq_stats->pp_alloc_slow_high_order;
376cc10e84bSJoe Damato 	s->rx_pp_recycle_cached			+= rq_stats->pp_recycle_cached;
377cc10e84bSJoe Damato 	s->rx_pp_recycle_cache_full		+= rq_stats->pp_recycle_cache_full;
378cc10e84bSJoe Damato 	s->rx_pp_recycle_ring			+= rq_stats->pp_recycle_ring;
379cc10e84bSJoe Damato 	s->rx_pp_recycle_ring_full		+= rq_stats->pp_recycle_ring_full;
380cc10e84bSJoe Damato 	s->rx_pp_recycle_released_ref		+= rq_stats->pp_recycle_released_ref;
381cc10e84bSJoe Damato #endif
38276c1e1acSTariq Toukan #ifdef CONFIG_MLX5_EN_TLS
38376c1e1acSTariq Toukan 	s->rx_tls_decrypted_packets   += rq_stats->tls_decrypted_packets;
38476c1e1acSTariq Toukan 	s->rx_tls_decrypted_bytes     += rq_stats->tls_decrypted_bytes;
38576c1e1acSTariq Toukan 	s->rx_tls_resync_req_pkt      += rq_stats->tls_resync_req_pkt;
38676c1e1acSTariq Toukan 	s->rx_tls_resync_req_start    += rq_stats->tls_resync_req_start;
38776c1e1acSTariq Toukan 	s->rx_tls_resync_req_end      += rq_stats->tls_resync_req_end;
38876c1e1acSTariq Toukan 	s->rx_tls_resync_req_skip     += rq_stats->tls_resync_req_skip;
38976c1e1acSTariq Toukan 	s->rx_tls_resync_res_ok       += rq_stats->tls_resync_res_ok;
390e9ce991bSTariq Toukan 	s->rx_tls_resync_res_retry    += rq_stats->tls_resync_res_retry;
39176c1e1acSTariq Toukan 	s->rx_tls_resync_res_skip     += rq_stats->tls_resync_res_skip;
39276c1e1acSTariq Toukan 	s->rx_tls_err                 += rq_stats->tls_err;
39376c1e1acSTariq Toukan #endif
3941a7f5124SEran Ben Elisha }
3951a7f5124SEran Ben Elisha 
mlx5e_stats_grp_sw_update_stats_ch_stats(struct mlx5e_sw_stats * s,struct mlx5e_ch_stats * ch_stats)3961a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_ch_stats(struct mlx5e_sw_stats *s,
3971a7f5124SEran Ben Elisha 						     struct mlx5e_ch_stats *ch_stats)
3981a7f5124SEran Ben Elisha {
399a1bf74dcSTariq Toukan 	s->ch_events      += ch_stats->events;
4002d7103c8STariq Toukan 	s->ch_poll        += ch_stats->poll;
4012d7103c8STariq Toukan 	s->ch_arm         += ch_stats->arm;
4022d7103c8STariq Toukan 	s->ch_aff_change  += ch_stats->aff_change;
403db05815bSMaxim Mikityanskiy 	s->ch_force_irq   += ch_stats->force_irq;
40419386177SKamal Heib 	s->ch_eq_rearm    += ch_stats->eq_rearm;
4051a7f5124SEran Ben Elisha }
40619386177SKamal Heib 
mlx5e_stats_grp_sw_update_stats_sq(struct mlx5e_sw_stats * s,struct mlx5e_sq_stats * sq_stats)4071a7f5124SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_sq(struct mlx5e_sw_stats *s,
4081a7f5124SEran Ben Elisha 					       struct mlx5e_sq_stats *sq_stats)
4091a7f5124SEran Ben Elisha {
41019386177SKamal Heib 	s->tx_packets               += sq_stats->packets;
41119386177SKamal Heib 	s->tx_bytes                 += sq_stats->bytes;
41219386177SKamal Heib 	s->tx_tso_packets           += sq_stats->tso_packets;
41319386177SKamal Heib 	s->tx_tso_bytes             += sq_stats->tso_bytes;
41419386177SKamal Heib 	s->tx_tso_inner_packets     += sq_stats->tso_inner_packets;
41519386177SKamal Heib 	s->tx_tso_inner_bytes       += sq_stats->tso_inner_bytes;
41619386177SKamal Heib 	s->tx_added_vlan_packets    += sq_stats->added_vlan_packets;
4172ad9ecdbSTariq Toukan 	s->tx_nop                   += sq_stats->nop;
4185af75c74SMaxim Mikityanskiy 	s->tx_mpwqe_blks            += sq_stats->mpwqe_blks;
4195af75c74SMaxim Mikityanskiy 	s->tx_mpwqe_pkts            += sq_stats->mpwqe_pkts;
42019386177SKamal Heib 	s->tx_queue_stopped         += sq_stats->stopped;
42119386177SKamal Heib 	s->tx_queue_wake            += sq_stats->wake;
42219386177SKamal Heib 	s->tx_queue_dropped         += sq_stats->dropped;
42316cc14d8SEran Ben Elisha 	s->tx_cqe_err               += sq_stats->cqe_err;
424db75373cSEran Ben Elisha 	s->tx_recover               += sq_stats->recover;
42519386177SKamal Heib 	s->tx_xmit_more             += sq_stats->xmit_more;
42619386177SKamal Heib 	s->tx_csum_partial_inner    += sq_stats->csum_partial_inner;
42719386177SKamal Heib 	s->tx_csum_none             += sq_stats->csum_none;
42819386177SKamal Heib 	s->tx_csum_partial          += sq_stats->csum_partial;
429bf239741SIlya Lesokhin #ifdef CONFIG_MLX5_EN_TLS
430d2ead1f3STariq Toukan 	s->tx_tls_encrypted_packets += sq_stats->tls_encrypted_packets;
431d2ead1f3STariq Toukan 	s->tx_tls_encrypted_bytes   += sq_stats->tls_encrypted_bytes;
432bf239741SIlya Lesokhin 	s->tx_tls_ooo               += sq_stats->tls_ooo;
433d2ead1f3STariq Toukan 	s->tx_tls_dump_bytes        += sq_stats->tls_dump_bytes;
434d2ead1f3STariq Toukan 	s->tx_tls_dump_packets      += sq_stats->tls_dump_packets;
43546a3ea98STariq Toukan 	s->tx_tls_resync_bytes      += sq_stats->tls_resync_bytes;
43646a3ea98STariq Toukan 	s->tx_tls_skip_no_sync_data += sq_stats->tls_skip_no_sync_data;
43746a3ea98STariq Toukan 	s->tx_tls_drop_no_sync_data += sq_stats->tls_drop_no_sync_data;
43846a3ea98STariq Toukan 	s->tx_tls_drop_bypass_req   += sq_stats->tls_drop_bypass_req;
439bf239741SIlya Lesokhin #endif
44086155656STariq Toukan 	s->tx_cqes                  += sq_stats->cqes;
4411a7f5124SEran Ben Elisha }
4421a7f5124SEran Ben Elisha 
mlx5e_stats_grp_sw_update_stats_ptp(struct mlx5e_priv * priv,struct mlx5e_sw_stats * s)443145e5637SEran Ben Elisha static void mlx5e_stats_grp_sw_update_stats_ptp(struct mlx5e_priv *priv,
444145e5637SEran Ben Elisha 						struct mlx5e_sw_stats *s)
445145e5637SEran Ben Elisha {
446145e5637SEran Ben Elisha 	int i;
447145e5637SEran Ben Elisha 
448a28359e9SAya Levin 	if (!priv->tx_ptp_opened && !priv->rx_ptp_opened)
449145e5637SEran Ben Elisha 		return;
450145e5637SEran Ben Elisha 
451b0d35de4SAya Levin 	mlx5e_stats_grp_sw_update_stats_ch_stats(s, &priv->ptp_stats.ch);
452145e5637SEran Ben Elisha 
453a28359e9SAya Levin 	if (priv->tx_ptp_opened) {
454145e5637SEran Ben Elisha 		for (i = 0; i < priv->max_opened_tc; i++) {
455b0d35de4SAya Levin 			mlx5e_stats_grp_sw_update_stats_sq(s, &priv->ptp_stats.sq[i]);
456145e5637SEran Ben Elisha 
457145e5637SEran Ben Elisha 			/* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92657 */
458145e5637SEran Ben Elisha 			barrier();
459145e5637SEran Ben Elisha 		}
460145e5637SEran Ben Elisha 	}
461a28359e9SAya Levin 	if (priv->rx_ptp_opened) {
462a28359e9SAya Levin 		mlx5e_stats_grp_sw_update_stats_rq_stats(s, &priv->ptp_stats.rq);
463a28359e9SAya Levin 
464a28359e9SAya Levin 		/* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92657 */
465a28359e9SAya Levin 		barrier();
466a28359e9SAya Levin 	}
467a28359e9SAya Levin }
468145e5637SEran Ben Elisha 
mlx5e_stats_grp_sw_update_stats_qos(struct mlx5e_priv * priv,struct mlx5e_sw_stats * s)469214baf22SMaxim Mikityanskiy static void mlx5e_stats_grp_sw_update_stats_qos(struct mlx5e_priv *priv,
470214baf22SMaxim Mikityanskiy 						struct mlx5e_sw_stats *s)
471214baf22SMaxim Mikityanskiy {
472214baf22SMaxim Mikityanskiy 	struct mlx5e_sq_stats **stats;
473214baf22SMaxim Mikityanskiy 	u16 max_qos_sqs;
474214baf22SMaxim Mikityanskiy 	int i;
475214baf22SMaxim Mikityanskiy 
476214baf22SMaxim Mikityanskiy 	/* Pairs with smp_store_release in mlx5e_open_qos_sq. */
477db83f24dSMoshe Tal 	max_qos_sqs = smp_load_acquire(&priv->htb_max_qos_sqs);
478db83f24dSMoshe Tal 	stats = READ_ONCE(priv->htb_qos_sq_stats);
479214baf22SMaxim Mikityanskiy 
480214baf22SMaxim Mikityanskiy 	for (i = 0; i < max_qos_sqs; i++) {
481214baf22SMaxim Mikityanskiy 		mlx5e_stats_grp_sw_update_stats_sq(s, READ_ONCE(stats[i]));
482214baf22SMaxim Mikityanskiy 
483214baf22SMaxim Mikityanskiy 		/* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92657 */
484214baf22SMaxim Mikityanskiy 		barrier();
485214baf22SMaxim Mikityanskiy 	}
486214baf22SMaxim Mikityanskiy }
487214baf22SMaxim Mikityanskiy 
488cc10e84bSJoe Damato #ifdef CONFIG_PAGE_POOL_STATS
mlx5e_stats_update_stats_rq_page_pool(struct mlx5e_channel * c)489cc10e84bSJoe Damato static void mlx5e_stats_update_stats_rq_page_pool(struct mlx5e_channel *c)
490cc10e84bSJoe Damato {
491cc10e84bSJoe Damato 	struct mlx5e_rq_stats *rq_stats = c->rq.stats;
492cc10e84bSJoe Damato 	struct page_pool *pool = c->rq.page_pool;
493cc10e84bSJoe Damato 	struct page_pool_stats stats = { 0 };
494cc10e84bSJoe Damato 
495cc10e84bSJoe Damato 	if (!page_pool_get_stats(pool, &stats))
496cc10e84bSJoe Damato 		return;
497cc10e84bSJoe Damato 
498cc10e84bSJoe Damato 	rq_stats->pp_alloc_fast = stats.alloc_stats.fast;
499cc10e84bSJoe Damato 	rq_stats->pp_alloc_slow = stats.alloc_stats.slow;
500cc10e84bSJoe Damato 	rq_stats->pp_alloc_slow_high_order = stats.alloc_stats.slow_high_order;
501cc10e84bSJoe Damato 	rq_stats->pp_alloc_empty = stats.alloc_stats.empty;
502cc10e84bSJoe Damato 	rq_stats->pp_alloc_waive = stats.alloc_stats.waive;
503cc10e84bSJoe Damato 	rq_stats->pp_alloc_refill = stats.alloc_stats.refill;
504cc10e84bSJoe Damato 
505cc10e84bSJoe Damato 	rq_stats->pp_recycle_cached = stats.recycle_stats.cached;
506cc10e84bSJoe Damato 	rq_stats->pp_recycle_cache_full = stats.recycle_stats.cache_full;
507cc10e84bSJoe Damato 	rq_stats->pp_recycle_ring = stats.recycle_stats.ring;
508cc10e84bSJoe Damato 	rq_stats->pp_recycle_ring_full = stats.recycle_stats.ring_full;
509cc10e84bSJoe Damato 	rq_stats->pp_recycle_released_ref = stats.recycle_stats.released_refcnt;
510cc10e84bSJoe Damato }
511cc10e84bSJoe Damato #else
mlx5e_stats_update_stats_rq_page_pool(struct mlx5e_channel * c)512cc10e84bSJoe Damato static void mlx5e_stats_update_stats_rq_page_pool(struct mlx5e_channel *c)
513cc10e84bSJoe Damato {
514cc10e84bSJoe Damato }
515cc10e84bSJoe Damato #endif
516cc10e84bSJoe Damato 
MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(sw)5171a7f5124SEran Ben Elisha static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(sw)
5181a7f5124SEran Ben Elisha {
5191a7f5124SEran Ben Elisha 	struct mlx5e_sw_stats *s = &priv->stats.sw;
5201a7f5124SEran Ben Elisha 	int i;
5211a7f5124SEran Ben Elisha 
5221a7f5124SEran Ben Elisha 	memset(s, 0, sizeof(*s));
5231a7f5124SEran Ben Elisha 
5248772cc49SSaeed Mahameed 	for (i = 0; i < priv->channels.num; i++) /* for active channels only */
5258772cc49SSaeed Mahameed 		mlx5e_stats_update_stats_rq_page_pool(priv->channels.c[i]);
5268772cc49SSaeed Mahameed 
5279d758d4aSTariq Toukan 	for (i = 0; i < priv->stats_nch; i++) {
5281a7f5124SEran Ben Elisha 		struct mlx5e_channel_stats *channel_stats =
529be98737aSTariq Toukan 			priv->channel_stats[i];
530cc10e84bSJoe Damato 
5311a7f5124SEran Ben Elisha 		int j;
5321a7f5124SEran Ben Elisha 
5331a7f5124SEran Ben Elisha 		mlx5e_stats_grp_sw_update_stats_rq_stats(s, &channel_stats->rq);
5341a7f5124SEran Ben Elisha 		mlx5e_stats_grp_sw_update_stats_xdpsq(s, &channel_stats->rq_xdpsq);
5351a7f5124SEran Ben Elisha 		mlx5e_stats_grp_sw_update_stats_ch_stats(s, &channel_stats->ch);
5361a7f5124SEran Ben Elisha 		/* xdp redirect */
5371a7f5124SEran Ben Elisha 		mlx5e_stats_grp_sw_update_stats_xdp_red(s, &channel_stats->xdpsq);
5381a7f5124SEran Ben Elisha 		/* AF_XDP zero-copy */
5391a7f5124SEran Ben Elisha 		mlx5e_stats_grp_sw_update_stats_xskrq(s, &channel_stats->xskrq);
5401a7f5124SEran Ben Elisha 		mlx5e_stats_grp_sw_update_stats_xsksq(s, &channel_stats->xsksq);
5411a7f5124SEran Ben Elisha 
5421a7f5124SEran Ben Elisha 		for (j = 0; j < priv->max_opened_tc; j++) {
5431a7f5124SEran Ben Elisha 			mlx5e_stats_grp_sw_update_stats_sq(s, &channel_stats->sq[j]);
54442ae1a5cSArnd Bergmann 
54542ae1a5cSArnd Bergmann 			/* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92657 */
54642ae1a5cSArnd Bergmann 			barrier();
54719386177SKamal Heib 		}
54819386177SKamal Heib 	}
549145e5637SEran Ben Elisha 	mlx5e_stats_grp_sw_update_stats_ptp(priv, s);
550214baf22SMaxim Mikityanskiy 	mlx5e_stats_grp_sw_update_stats_qos(priv, s);
55119386177SKamal Heib }
55219386177SKamal Heib 
553fd8dcdb8SKamal Heib static const struct counter_desc q_stats_desc[] = {
554fd8dcdb8SKamal Heib 	{ MLX5E_DECLARE_STAT(struct mlx5e_qcounter_stats, rx_out_of_buffer) },
555fd8dcdb8SKamal Heib };
556fd8dcdb8SKamal Heib 
5577cbaf9a3SMoshe Shemesh static const struct counter_desc drop_rq_stats_desc[] = {
5587cbaf9a3SMoshe Shemesh 	{ MLX5E_DECLARE_STAT(struct mlx5e_qcounter_stats, rx_if_down_packets) },
5597cbaf9a3SMoshe Shemesh };
5607cbaf9a3SMoshe Shemesh 
561fd8dcdb8SKamal Heib #define NUM_Q_COUNTERS			ARRAY_SIZE(q_stats_desc)
5627cbaf9a3SMoshe Shemesh #define NUM_DROP_RQ_COUNTERS		ARRAY_SIZE(drop_rq_stats_desc)
563fd8dcdb8SKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(qcnt)56496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(qcnt)
565fd8dcdb8SKamal Heib {
5667cbaf9a3SMoshe Shemesh 	int num_stats = 0;
5677cbaf9a3SMoshe Shemesh 
5687cbaf9a3SMoshe Shemesh 	if (priv->q_counter)
5697cbaf9a3SMoshe Shemesh 		num_stats += NUM_Q_COUNTERS;
5707cbaf9a3SMoshe Shemesh 
5717cbaf9a3SMoshe Shemesh 	if (priv->drop_rq_q_counter)
5727cbaf9a3SMoshe Shemesh 		num_stats += NUM_DROP_RQ_COUNTERS;
5737cbaf9a3SMoshe Shemesh 
5747cbaf9a3SMoshe Shemesh 	return num_stats;
575fd8dcdb8SKamal Heib }
576fd8dcdb8SKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(qcnt)57796b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(qcnt)
578fd8dcdb8SKamal Heib {
579fd8dcdb8SKamal Heib 	int i;
580fd8dcdb8SKamal Heib 
581fd8dcdb8SKamal Heib 	for (i = 0; i < NUM_Q_COUNTERS && priv->q_counter; i++)
5827cbaf9a3SMoshe Shemesh 		strcpy(data + (idx++) * ETH_GSTRING_LEN,
5837cbaf9a3SMoshe Shemesh 		       q_stats_desc[i].format);
5847cbaf9a3SMoshe Shemesh 
5857cbaf9a3SMoshe Shemesh 	for (i = 0; i < NUM_DROP_RQ_COUNTERS && priv->drop_rq_q_counter; i++)
5867cbaf9a3SMoshe Shemesh 		strcpy(data + (idx++) * ETH_GSTRING_LEN,
5877cbaf9a3SMoshe Shemesh 		       drop_rq_stats_desc[i].format);
5887cbaf9a3SMoshe Shemesh 
589fd8dcdb8SKamal Heib 	return idx;
590fd8dcdb8SKamal Heib }
591fd8dcdb8SKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(qcnt)59296b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(qcnt)
593fd8dcdb8SKamal Heib {
594fd8dcdb8SKamal Heib 	int i;
595fd8dcdb8SKamal Heib 
596fd8dcdb8SKamal Heib 	for (i = 0; i < NUM_Q_COUNTERS && priv->q_counter; i++)
5977cbaf9a3SMoshe Shemesh 		data[idx++] = MLX5E_READ_CTR32_CPU(&priv->stats.qcnt,
5987cbaf9a3SMoshe Shemesh 						   q_stats_desc, i);
5997cbaf9a3SMoshe Shemesh 	for (i = 0; i < NUM_DROP_RQ_COUNTERS && priv->drop_rq_q_counter; i++)
6007cbaf9a3SMoshe Shemesh 		data[idx++] = MLX5E_READ_CTR32_CPU(&priv->stats.qcnt,
6017cbaf9a3SMoshe Shemesh 						   drop_rq_stats_desc, i);
602fd8dcdb8SKamal Heib 	return idx;
603fd8dcdb8SKamal Heib }
604fd8dcdb8SKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(qcnt)60596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(qcnt)
60619386177SKamal Heib {
60719386177SKamal Heib 	struct mlx5e_qcounter_stats *qcnt = &priv->stats.qcnt;
60866247fbbSLeon Romanovsky 	u32 out[MLX5_ST_SZ_DW(query_q_counter_out)] = {};
60966247fbbSLeon Romanovsky 	u32 in[MLX5_ST_SZ_DW(query_q_counter_in)] = {};
61066247fbbSLeon Romanovsky 	int ret;
61119386177SKamal Heib 
61266247fbbSLeon Romanovsky 	MLX5_SET(query_q_counter_in, in, opcode, MLX5_CMD_OP_QUERY_Q_COUNTER);
61366247fbbSLeon Romanovsky 
61466247fbbSLeon Romanovsky 	if (priv->q_counter) {
61566247fbbSLeon Romanovsky 		MLX5_SET(query_q_counter_in, in, counter_set_id,
61666247fbbSLeon Romanovsky 			 priv->q_counter);
61766247fbbSLeon Romanovsky 		ret = mlx5_cmd_exec_inout(priv->mdev, query_q_counter, in, out);
61866247fbbSLeon Romanovsky 		if (!ret)
6197cbaf9a3SMoshe Shemesh 			qcnt->rx_out_of_buffer = MLX5_GET(query_q_counter_out,
6207cbaf9a3SMoshe Shemesh 							  out, out_of_buffer);
62166247fbbSLeon Romanovsky 	}
62266247fbbSLeon Romanovsky 
62366247fbbSLeon Romanovsky 	if (priv->drop_rq_q_counter) {
62466247fbbSLeon Romanovsky 		MLX5_SET(query_q_counter_in, in, counter_set_id,
62566247fbbSLeon Romanovsky 			 priv->drop_rq_q_counter);
62666247fbbSLeon Romanovsky 		ret = mlx5_cmd_exec_inout(priv->mdev, query_q_counter, in, out);
62766247fbbSLeon Romanovsky 		if (!ret)
62866247fbbSLeon Romanovsky 			qcnt->rx_if_down_packets = MLX5_GET(query_q_counter_out,
62966247fbbSLeon Romanovsky 							    out, out_of_buffer);
63066247fbbSLeon Romanovsky 	}
63119386177SKamal Heib }
63219386177SKamal Heib 
6335c298143SMoshe Shemesh #define VNIC_ENV_OFF(c) MLX5_BYTE_OFF(query_vnic_env_out, c)
6340cfafd4bSMoshe Shemesh static const struct counter_desc vnic_env_stats_steer_desc[] = {
6355c298143SMoshe Shemesh 	{ "rx_steer_missed_packets",
6365c298143SMoshe Shemesh 		VNIC_ENV_OFF(vport_env.nic_receive_steering_discard) },
6375c298143SMoshe Shemesh };
6385c298143SMoshe Shemesh 
6390cfafd4bSMoshe Shemesh static const struct counter_desc vnic_env_stats_dev_oob_desc[] = {
6400cfafd4bSMoshe Shemesh 	{ "dev_internal_queue_oob",
6410cfafd4bSMoshe Shemesh 		VNIC_ENV_OFF(vport_env.internal_rq_out_of_buffer) },
6420cfafd4bSMoshe Shemesh };
6430cfafd4bSMoshe Shemesh 
64416ab85e7SGal Pressman static const struct counter_desc vnic_env_stats_drop_desc[] = {
64516ab85e7SGal Pressman 	{ "rx_oversize_pkts_buffer",
64616ab85e7SGal Pressman 		VNIC_ENV_OFF(vport_env.eth_wqe_too_small) },
64716ab85e7SGal Pressman };
64816ab85e7SGal Pressman 
6490cfafd4bSMoshe Shemesh #define NUM_VNIC_ENV_STEER_COUNTERS(dev) \
6500cfafd4bSMoshe Shemesh 	(MLX5_CAP_GEN(dev, nic_receive_steering_discard) ? \
6510cfafd4bSMoshe Shemesh 	 ARRAY_SIZE(vnic_env_stats_steer_desc) : 0)
6520cfafd4bSMoshe Shemesh #define NUM_VNIC_ENV_DEV_OOB_COUNTERS(dev) \
6530cfafd4bSMoshe Shemesh 	(MLX5_CAP_GEN(dev, vnic_env_int_rq_oob) ? \
6540cfafd4bSMoshe Shemesh 	 ARRAY_SIZE(vnic_env_stats_dev_oob_desc) : 0)
65516ab85e7SGal Pressman #define NUM_VNIC_ENV_DROP_COUNTERS(dev) \
65616ab85e7SGal Pressman 	(MLX5_CAP_GEN(dev, eth_wqe_too_small) ? \
65716ab85e7SGal Pressman 	 ARRAY_SIZE(vnic_env_stats_drop_desc) : 0)
6585c298143SMoshe Shemesh 
MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(vnic_env)65996b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(vnic_env)
6605c298143SMoshe Shemesh {
6610cfafd4bSMoshe Shemesh 	return NUM_VNIC_ENV_STEER_COUNTERS(priv->mdev) +
66216ab85e7SGal Pressman 	       NUM_VNIC_ENV_DEV_OOB_COUNTERS(priv->mdev) +
66316ab85e7SGal Pressman 	       NUM_VNIC_ENV_DROP_COUNTERS(priv->mdev);
6645c298143SMoshe Shemesh }
6655c298143SMoshe Shemesh 
MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(vnic_env)66696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(vnic_env)
6675c298143SMoshe Shemesh {
6685c298143SMoshe Shemesh 	int i;
6695c298143SMoshe Shemesh 
6700cfafd4bSMoshe Shemesh 	for (i = 0; i < NUM_VNIC_ENV_STEER_COUNTERS(priv->mdev); i++)
6715c298143SMoshe Shemesh 		strcpy(data + (idx++) * ETH_GSTRING_LEN,
6720cfafd4bSMoshe Shemesh 		       vnic_env_stats_steer_desc[i].format);
6730cfafd4bSMoshe Shemesh 
6740cfafd4bSMoshe Shemesh 	for (i = 0; i < NUM_VNIC_ENV_DEV_OOB_COUNTERS(priv->mdev); i++)
6750cfafd4bSMoshe Shemesh 		strcpy(data + (idx++) * ETH_GSTRING_LEN,
6760cfafd4bSMoshe Shemesh 		       vnic_env_stats_dev_oob_desc[i].format);
67716ab85e7SGal Pressman 
67816ab85e7SGal Pressman 	for (i = 0; i < NUM_VNIC_ENV_DROP_COUNTERS(priv->mdev); i++)
67916ab85e7SGal Pressman 		strcpy(data + (idx++) * ETH_GSTRING_LEN,
68016ab85e7SGal Pressman 		       vnic_env_stats_drop_desc[i].format);
68116ab85e7SGal Pressman 
6825c298143SMoshe Shemesh 	return idx;
6835c298143SMoshe Shemesh }
6845c298143SMoshe Shemesh 
MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(vnic_env)68596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(vnic_env)
6865c298143SMoshe Shemesh {
6875c298143SMoshe Shemesh 	int i;
6885c298143SMoshe Shemesh 
6890cfafd4bSMoshe Shemesh 	for (i = 0; i < NUM_VNIC_ENV_STEER_COUNTERS(priv->mdev); i++)
6905c298143SMoshe Shemesh 		data[idx++] = MLX5E_READ_CTR64_BE(priv->stats.vnic.query_vnic_env_out,
6910cfafd4bSMoshe Shemesh 						  vnic_env_stats_steer_desc, i);
6920cfafd4bSMoshe Shemesh 
6930cfafd4bSMoshe Shemesh 	for (i = 0; i < NUM_VNIC_ENV_DEV_OOB_COUNTERS(priv->mdev); i++)
6940cfafd4bSMoshe Shemesh 		data[idx++] = MLX5E_READ_CTR32_BE(priv->stats.vnic.query_vnic_env_out,
6950cfafd4bSMoshe Shemesh 						  vnic_env_stats_dev_oob_desc, i);
69616ab85e7SGal Pressman 
69716ab85e7SGal Pressman 	for (i = 0; i < NUM_VNIC_ENV_DROP_COUNTERS(priv->mdev); i++)
69816ab85e7SGal Pressman 		data[idx++] = MLX5E_READ_CTR32_BE(priv->stats.vnic.query_vnic_env_out,
69916ab85e7SGal Pressman 						  vnic_env_stats_drop_desc, i);
70016ab85e7SGal Pressman 
7015c298143SMoshe Shemesh 	return idx;
7025c298143SMoshe Shemesh }
7035c298143SMoshe Shemesh 
MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(vnic_env)70496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(vnic_env)
7055c298143SMoshe Shemesh {
7065c298143SMoshe Shemesh 	u32 *out = (u32 *)priv->stats.vnic.query_vnic_env_out;
707a184cda1SLeon Romanovsky 	u32 in[MLX5_ST_SZ_DW(query_vnic_env_in)] = {};
7085c298143SMoshe Shemesh 	struct mlx5_core_dev *mdev = priv->mdev;
7095c298143SMoshe Shemesh 
710452133ddSGal Pressman 	if (!mlx5e_stats_grp_vnic_env_num_stats(priv))
7115c298143SMoshe Shemesh 		return;
7125c298143SMoshe Shemesh 
713a184cda1SLeon Romanovsky 	MLX5_SET(query_vnic_env_in, in, opcode, MLX5_CMD_OP_QUERY_VNIC_ENV);
714a184cda1SLeon Romanovsky 	mlx5_cmd_exec_inout(mdev, query_vnic_env, in, out);
7155c298143SMoshe Shemesh }
7165c298143SMoshe Shemesh 
71740cab9f1SKamal Heib #define VPORT_COUNTER_OFF(c) MLX5_BYTE_OFF(query_vport_counter_out, c)
71840cab9f1SKamal Heib static const struct counter_desc vport_stats_desc[] = {
71940cab9f1SKamal Heib 	{ "rx_vport_unicast_packets",
72040cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_eth_unicast.packets) },
72140cab9f1SKamal Heib 	{ "rx_vport_unicast_bytes",
72240cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_eth_unicast.octets) },
72340cab9f1SKamal Heib 	{ "tx_vport_unicast_packets",
72440cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_eth_unicast.packets) },
72540cab9f1SKamal Heib 	{ "tx_vport_unicast_bytes",
72640cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_eth_unicast.octets) },
72740cab9f1SKamal Heib 	{ "rx_vport_multicast_packets",
72840cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_eth_multicast.packets) },
72940cab9f1SKamal Heib 	{ "rx_vport_multicast_bytes",
73040cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_eth_multicast.octets) },
73140cab9f1SKamal Heib 	{ "tx_vport_multicast_packets",
73240cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_eth_multicast.packets) },
73340cab9f1SKamal Heib 	{ "tx_vport_multicast_bytes",
73440cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_eth_multicast.octets) },
73540cab9f1SKamal Heib 	{ "rx_vport_broadcast_packets",
73640cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_eth_broadcast.packets) },
73740cab9f1SKamal Heib 	{ "rx_vport_broadcast_bytes",
73840cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_eth_broadcast.octets) },
73940cab9f1SKamal Heib 	{ "tx_vport_broadcast_packets",
74040cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_eth_broadcast.packets) },
74140cab9f1SKamal Heib 	{ "tx_vport_broadcast_bytes",
74240cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_eth_broadcast.octets) },
74340cab9f1SKamal Heib 	{ "rx_vport_rdma_unicast_packets",
74440cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_ib_unicast.packets) },
74540cab9f1SKamal Heib 	{ "rx_vport_rdma_unicast_bytes",
74640cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_ib_unicast.octets) },
74740cab9f1SKamal Heib 	{ "tx_vport_rdma_unicast_packets",
74840cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_ib_unicast.packets) },
74940cab9f1SKamal Heib 	{ "tx_vport_rdma_unicast_bytes",
75040cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_ib_unicast.octets) },
75140cab9f1SKamal Heib 	{ "rx_vport_rdma_multicast_packets",
75240cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_ib_multicast.packets) },
75340cab9f1SKamal Heib 	{ "rx_vport_rdma_multicast_bytes",
75440cab9f1SKamal Heib 		VPORT_COUNTER_OFF(received_ib_multicast.octets) },
75540cab9f1SKamal Heib 	{ "tx_vport_rdma_multicast_packets",
75640cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_ib_multicast.packets) },
75740cab9f1SKamal Heib 	{ "tx_vport_rdma_multicast_bytes",
75840cab9f1SKamal Heib 		VPORT_COUNTER_OFF(transmitted_ib_multicast.octets) },
75940cab9f1SKamal Heib };
76040cab9f1SKamal Heib 
761c8013a1fSOr Har-Toov static const struct counter_desc vport_loopback_stats_desc[] = {
762c8013a1fSOr Har-Toov 	{ "vport_loopback_packets",
763c8013a1fSOr Har-Toov 		VPORT_COUNTER_OFF(local_loopback.packets) },
764c8013a1fSOr Har-Toov 	{ "vport_loopback_bytes",
765c8013a1fSOr Har-Toov 		VPORT_COUNTER_OFF(local_loopback.octets) },
766c8013a1fSOr Har-Toov };
767c8013a1fSOr Har-Toov 
76840cab9f1SKamal Heib #define NUM_VPORT_COUNTERS		ARRAY_SIZE(vport_stats_desc)
769c8013a1fSOr Har-Toov #define NUM_VPORT_LOOPBACK_COUNTERS(dev) \
770c8013a1fSOr Har-Toov 	(MLX5_CAP_GEN(dev, vport_counter_local_loopback) ? \
771c8013a1fSOr Har-Toov 	 ARRAY_SIZE(vport_loopback_stats_desc) : 0)
77240cab9f1SKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(vport)77396b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(vport)
77440cab9f1SKamal Heib {
775c8013a1fSOr Har-Toov 	return NUM_VPORT_COUNTERS +
776c8013a1fSOr Har-Toov 		NUM_VPORT_LOOPBACK_COUNTERS(priv->mdev);
77740cab9f1SKamal Heib }
77840cab9f1SKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(vport)77996b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(vport)
78040cab9f1SKamal Heib {
78140cab9f1SKamal Heib 	int i;
78240cab9f1SKamal Heib 
78340cab9f1SKamal Heib 	for (i = 0; i < NUM_VPORT_COUNTERS; i++)
78440cab9f1SKamal Heib 		strcpy(data + (idx++) * ETH_GSTRING_LEN, vport_stats_desc[i].format);
785c8013a1fSOr Har-Toov 
786c8013a1fSOr Har-Toov 	for (i = 0; i < NUM_VPORT_LOOPBACK_COUNTERS(priv->mdev); i++)
787c8013a1fSOr Har-Toov 		strcpy(data + (idx++) * ETH_GSTRING_LEN,
788c8013a1fSOr Har-Toov 		       vport_loopback_stats_desc[i].format);
789c8013a1fSOr Har-Toov 
79040cab9f1SKamal Heib 	return idx;
79140cab9f1SKamal Heib }
79240cab9f1SKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(vport)79396b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(vport)
79440cab9f1SKamal Heib {
79540cab9f1SKamal Heib 	int i;
79640cab9f1SKamal Heib 
79740cab9f1SKamal Heib 	for (i = 0; i < NUM_VPORT_COUNTERS; i++)
79840cab9f1SKamal Heib 		data[idx++] = MLX5E_READ_CTR64_BE(priv->stats.vport.query_vport_out,
79940cab9f1SKamal Heib 						  vport_stats_desc, i);
800c8013a1fSOr Har-Toov 
801c8013a1fSOr Har-Toov 	for (i = 0; i < NUM_VPORT_LOOPBACK_COUNTERS(priv->mdev); i++)
802c8013a1fSOr Har-Toov 		data[idx++] = MLX5E_READ_CTR64_BE(priv->stats.vport.query_vport_out,
803c8013a1fSOr Har-Toov 						  vport_loopback_stats_desc, i);
804c8013a1fSOr Har-Toov 
80540cab9f1SKamal Heib 	return idx;
80640cab9f1SKamal Heib }
80740cab9f1SKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(vport)80896b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(vport)
80919386177SKamal Heib {
81019386177SKamal Heib 	u32 *out = (u32 *)priv->stats.vport.query_vport_out;
811a184cda1SLeon Romanovsky 	u32 in[MLX5_ST_SZ_DW(query_vport_counter_in)] = {};
81219386177SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
81319386177SKamal Heib 
81419386177SKamal Heib 	MLX5_SET(query_vport_counter_in, in, opcode, MLX5_CMD_OP_QUERY_VPORT_COUNTER);
815a184cda1SLeon Romanovsky 	mlx5_cmd_exec_inout(mdev, query_vport_counter, in, out);
81619386177SKamal Heib }
81719386177SKamal Heib 
8186e6ef814SKamal Heib #define PPORT_802_3_OFF(c) \
8196e6ef814SKamal Heib 	MLX5_BYTE_OFF(ppcnt_reg, \
8206e6ef814SKamal Heib 		      counter_set.eth_802_3_cntrs_grp_data_layout.c##_high)
8216e6ef814SKamal Heib static const struct counter_desc pport_802_3_stats_desc[] = {
8226e6ef814SKamal Heib 	{ "tx_packets_phy", PPORT_802_3_OFF(a_frames_transmitted_ok) },
8236e6ef814SKamal Heib 	{ "rx_packets_phy", PPORT_802_3_OFF(a_frames_received_ok) },
8246e6ef814SKamal Heib 	{ "rx_crc_errors_phy", PPORT_802_3_OFF(a_frame_check_sequence_errors) },
8256e6ef814SKamal Heib 	{ "tx_bytes_phy", PPORT_802_3_OFF(a_octets_transmitted_ok) },
8266e6ef814SKamal Heib 	{ "rx_bytes_phy", PPORT_802_3_OFF(a_octets_received_ok) },
8276e6ef814SKamal Heib 	{ "tx_multicast_phy", PPORT_802_3_OFF(a_multicast_frames_xmitted_ok) },
8286e6ef814SKamal Heib 	{ "tx_broadcast_phy", PPORT_802_3_OFF(a_broadcast_frames_xmitted_ok) },
8296e6ef814SKamal Heib 	{ "rx_multicast_phy", PPORT_802_3_OFF(a_multicast_frames_received_ok) },
8306e6ef814SKamal Heib 	{ "rx_broadcast_phy", PPORT_802_3_OFF(a_broadcast_frames_received_ok) },
8316e6ef814SKamal Heib 	{ "rx_in_range_len_errors_phy", PPORT_802_3_OFF(a_in_range_length_errors) },
8326e6ef814SKamal Heib 	{ "rx_out_of_range_len_phy", PPORT_802_3_OFF(a_out_of_range_length_field) },
8336e6ef814SKamal Heib 	{ "rx_oversize_pkts_phy", PPORT_802_3_OFF(a_frame_too_long_errors) },
8346e6ef814SKamal Heib 	{ "rx_symbol_err_phy", PPORT_802_3_OFF(a_symbol_error_during_carrier) },
8356e6ef814SKamal Heib 	{ "tx_mac_control_phy", PPORT_802_3_OFF(a_mac_control_frames_transmitted) },
8366e6ef814SKamal Heib 	{ "rx_mac_control_phy", PPORT_802_3_OFF(a_mac_control_frames_received) },
8376e6ef814SKamal Heib 	{ "rx_unsupported_op_phy", PPORT_802_3_OFF(a_unsupported_opcodes_received) },
8386e6ef814SKamal Heib 	{ "rx_pause_ctrl_phy", PPORT_802_3_OFF(a_pause_mac_ctrl_frames_received) },
8396e6ef814SKamal Heib 	{ "tx_pause_ctrl_phy", PPORT_802_3_OFF(a_pause_mac_ctrl_frames_transmitted) },
8406e6ef814SKamal Heib };
8416e6ef814SKamal Heib 
8426e6ef814SKamal Heib #define NUM_PPORT_802_3_COUNTERS	ARRAY_SIZE(pport_802_3_stats_desc)
8436e6ef814SKamal Heib 
84496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(802_3)
8456e6ef814SKamal Heib {
8466e6ef814SKamal Heib 	return NUM_PPORT_802_3_COUNTERS;
8476e6ef814SKamal Heib }
8486e6ef814SKamal Heib 
84996b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(802_3)
8506e6ef814SKamal Heib {
8516e6ef814SKamal Heib 	int i;
8526e6ef814SKamal Heib 
8536e6ef814SKamal Heib 	for (i = 0; i < NUM_PPORT_802_3_COUNTERS; i++)
8546e6ef814SKamal Heib 		strcpy(data + (idx++) * ETH_GSTRING_LEN, pport_802_3_stats_desc[i].format);
8556e6ef814SKamal Heib 	return idx;
8566e6ef814SKamal Heib }
8576e6ef814SKamal Heib 
85896b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(802_3)
8596e6ef814SKamal Heib {
8606e6ef814SKamal Heib 	int i;
8616e6ef814SKamal Heib 
8626e6ef814SKamal Heib 	for (i = 0; i < NUM_PPORT_802_3_COUNTERS; i++)
8636e6ef814SKamal Heib 		data[idx++] = MLX5E_READ_CTR64_BE(&priv->stats.pport.IEEE_802_3_counters,
8646e6ef814SKamal Heib 						  pport_802_3_stats_desc, i);
8656e6ef814SKamal Heib 	return idx;
8666e6ef814SKamal Heib }
8676e6ef814SKamal Heib 
86875370eb0SEyal Davidovich #define MLX5_BASIC_PPCNT_SUPPORTED(mdev) \
86975370eb0SEyal Davidovich 	(MLX5_CAP_GEN(mdev, pcam_reg) ? MLX5_CAP_PCAM_REG(mdev, ppcnt) : 1)
87075370eb0SEyal Davidovich 
8717c453526SVlad Buslov static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(802_3)
87219386177SKamal Heib {
87319386177SKamal Heib 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
87419386177SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
87519386177SKamal Heib 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
87619386177SKamal Heib 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
87719386177SKamal Heib 	void *out;
87819386177SKamal Heib 
87975370eb0SEyal Davidovich 	if (!MLX5_BASIC_PPCNT_SUPPORTED(mdev))
88075370eb0SEyal Davidovich 		return;
88175370eb0SEyal Davidovich 
88219386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, local_port, 1);
88319386177SKamal Heib 	out = pstats->IEEE_802_3_counters;
88419386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, grp, MLX5_IEEE_802_3_COUNTERS_GROUP);
88519386177SKamal Heib 	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
88619386177SKamal Heib }
88719386177SKamal Heib 
8881703bb50SJakub Kicinski #define MLX5E_READ_CTR64_BE_F(ptr, set, c)		\
889098d9ed9SJakub Kicinski 	be64_to_cpu(*(__be64 *)((char *)ptr +		\
890098d9ed9SJakub Kicinski 		MLX5_BYTE_OFF(ppcnt_reg,		\
8911703bb50SJakub Kicinski 			      counter_set.set.c##_high)))
892098d9ed9SJakub Kicinski 
mlx5e_stats_get_ieee(struct mlx5_core_dev * mdev,u32 * ppcnt_ieee_802_3)893b572ec9fSJakub Kicinski static int mlx5e_stats_get_ieee(struct mlx5_core_dev *mdev,
894b572ec9fSJakub Kicinski 				u32 *ppcnt_ieee_802_3)
895b572ec9fSJakub Kicinski {
896b572ec9fSJakub Kicinski 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {};
897b572ec9fSJakub Kicinski 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
898b572ec9fSJakub Kicinski 
899b572ec9fSJakub Kicinski 	if (!MLX5_BASIC_PPCNT_SUPPORTED(mdev))
900b572ec9fSJakub Kicinski 		return -EOPNOTSUPP;
901b572ec9fSJakub Kicinski 
902b572ec9fSJakub Kicinski 	MLX5_SET(ppcnt_reg, in, local_port, 1);
903b572ec9fSJakub Kicinski 	MLX5_SET(ppcnt_reg, in, grp, MLX5_IEEE_802_3_COUNTERS_GROUP);
904b572ec9fSJakub Kicinski 	return mlx5_core_access_reg(mdev, in, sz, ppcnt_ieee_802_3,
905b572ec9fSJakub Kicinski 				    sz, MLX5_REG_PPCNT, 0, 0);
906b572ec9fSJakub Kicinski }
907b572ec9fSJakub Kicinski 
mlx5e_stats_pause_get(struct mlx5e_priv * priv,struct ethtool_pause_stats * pause_stats)908098d9ed9SJakub Kicinski void mlx5e_stats_pause_get(struct mlx5e_priv *priv,
909098d9ed9SJakub Kicinski 			   struct ethtool_pause_stats *pause_stats)
910098d9ed9SJakub Kicinski {
911098d9ed9SJakub Kicinski 	u32 ppcnt_ieee_802_3[MLX5_ST_SZ_DW(ppcnt_reg)];
912098d9ed9SJakub Kicinski 	struct mlx5_core_dev *mdev = priv->mdev;
913098d9ed9SJakub Kicinski 
914b572ec9fSJakub Kicinski 	if (mlx5e_stats_get_ieee(mdev, ppcnt_ieee_802_3))
915098d9ed9SJakub Kicinski 		return;
916098d9ed9SJakub Kicinski 
917098d9ed9SJakub Kicinski 	pause_stats->tx_pause_frames =
918098d9ed9SJakub Kicinski 		MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3,
9191703bb50SJakub Kicinski 				      eth_802_3_cntrs_grp_data_layout,
920098d9ed9SJakub Kicinski 				      a_pause_mac_ctrl_frames_transmitted);
921098d9ed9SJakub Kicinski 	pause_stats->rx_pause_frames =
922098d9ed9SJakub Kicinski 		MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3,
9231703bb50SJakub Kicinski 				      eth_802_3_cntrs_grp_data_layout,
924098d9ed9SJakub Kicinski 				      a_pause_mac_ctrl_frames_received);
925098d9ed9SJakub Kicinski }
926098d9ed9SJakub Kicinski 
mlx5e_stats_eth_phy_get(struct mlx5e_priv * priv,struct ethtool_eth_phy_stats * phy_stats)927b572ec9fSJakub Kicinski void mlx5e_stats_eth_phy_get(struct mlx5e_priv *priv,
928b572ec9fSJakub Kicinski 			     struct ethtool_eth_phy_stats *phy_stats)
929b572ec9fSJakub Kicinski {
930b572ec9fSJakub Kicinski 	u32 ppcnt_ieee_802_3[MLX5_ST_SZ_DW(ppcnt_reg)];
931b572ec9fSJakub Kicinski 	struct mlx5_core_dev *mdev = priv->mdev;
932b572ec9fSJakub Kicinski 
933b572ec9fSJakub Kicinski 	if (mlx5e_stats_get_ieee(mdev, ppcnt_ieee_802_3))
934b572ec9fSJakub Kicinski 		return;
935b572ec9fSJakub Kicinski 
936b572ec9fSJakub Kicinski 	phy_stats->SymbolErrorDuringCarrier =
937b572ec9fSJakub Kicinski 		MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3,
938b572ec9fSJakub Kicinski 				      eth_802_3_cntrs_grp_data_layout,
939b572ec9fSJakub Kicinski 				      a_symbol_error_during_carrier);
940b572ec9fSJakub Kicinski }
941b572ec9fSJakub Kicinski 
mlx5e_stats_eth_mac_get(struct mlx5e_priv * priv,struct ethtool_eth_mac_stats * mac_stats)942b572ec9fSJakub Kicinski void mlx5e_stats_eth_mac_get(struct mlx5e_priv *priv,
943b572ec9fSJakub Kicinski 			     struct ethtool_eth_mac_stats *mac_stats)
944b572ec9fSJakub Kicinski {
945b572ec9fSJakub Kicinski 	u32 ppcnt_ieee_802_3[MLX5_ST_SZ_DW(ppcnt_reg)];
946b572ec9fSJakub Kicinski 	struct mlx5_core_dev *mdev = priv->mdev;
947b572ec9fSJakub Kicinski 
948b572ec9fSJakub Kicinski 	if (mlx5e_stats_get_ieee(mdev, ppcnt_ieee_802_3))
949b572ec9fSJakub Kicinski 		return;
950b572ec9fSJakub Kicinski 
951b572ec9fSJakub Kicinski #define RD(name)							\
952b572ec9fSJakub Kicinski 	MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3,				\
953b572ec9fSJakub Kicinski 			      eth_802_3_cntrs_grp_data_layout,		\
954b572ec9fSJakub Kicinski 			      name)
955b572ec9fSJakub Kicinski 
956b572ec9fSJakub Kicinski 	mac_stats->FramesTransmittedOK	= RD(a_frames_transmitted_ok);
957b572ec9fSJakub Kicinski 	mac_stats->FramesReceivedOK	= RD(a_frames_received_ok);
958b572ec9fSJakub Kicinski 	mac_stats->FrameCheckSequenceErrors = RD(a_frame_check_sequence_errors);
959b572ec9fSJakub Kicinski 	mac_stats->OctetsTransmittedOK	= RD(a_octets_transmitted_ok);
960b572ec9fSJakub Kicinski 	mac_stats->OctetsReceivedOK	= RD(a_octets_received_ok);
961b572ec9fSJakub Kicinski 	mac_stats->MulticastFramesXmittedOK = RD(a_multicast_frames_xmitted_ok);
962b572ec9fSJakub Kicinski 	mac_stats->BroadcastFramesXmittedOK = RD(a_broadcast_frames_xmitted_ok);
963b572ec9fSJakub Kicinski 	mac_stats->MulticastFramesReceivedOK = RD(a_multicast_frames_received_ok);
964b572ec9fSJakub Kicinski 	mac_stats->BroadcastFramesReceivedOK = RD(a_broadcast_frames_received_ok);
965b572ec9fSJakub Kicinski 	mac_stats->InRangeLengthErrors	= RD(a_in_range_length_errors);
966b572ec9fSJakub Kicinski 	mac_stats->OutOfRangeLengthField = RD(a_out_of_range_length_field);
967b572ec9fSJakub Kicinski 	mac_stats->FrameTooLongErrors	= RD(a_frame_too_long_errors);
968b572ec9fSJakub Kicinski #undef RD
969b572ec9fSJakub Kicinski }
970b572ec9fSJakub Kicinski 
mlx5e_stats_eth_ctrl_get(struct mlx5e_priv * priv,struct ethtool_eth_ctrl_stats * ctrl_stats)971b572ec9fSJakub Kicinski void mlx5e_stats_eth_ctrl_get(struct mlx5e_priv *priv,
972b572ec9fSJakub Kicinski 			      struct ethtool_eth_ctrl_stats *ctrl_stats)
973b572ec9fSJakub Kicinski {
974b572ec9fSJakub Kicinski 	u32 ppcnt_ieee_802_3[MLX5_ST_SZ_DW(ppcnt_reg)];
975b572ec9fSJakub Kicinski 	struct mlx5_core_dev *mdev = priv->mdev;
976b572ec9fSJakub Kicinski 
977b572ec9fSJakub Kicinski 	if (mlx5e_stats_get_ieee(mdev, ppcnt_ieee_802_3))
978b572ec9fSJakub Kicinski 		return;
979b572ec9fSJakub Kicinski 
980b572ec9fSJakub Kicinski 	ctrl_stats->MACControlFramesTransmitted =
981b572ec9fSJakub Kicinski 		MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3,
982b572ec9fSJakub Kicinski 				      eth_802_3_cntrs_grp_data_layout,
983b572ec9fSJakub Kicinski 				      a_mac_control_frames_transmitted);
984b572ec9fSJakub Kicinski 	ctrl_stats->MACControlFramesReceived =
985b572ec9fSJakub Kicinski 		MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3,
986b572ec9fSJakub Kicinski 				      eth_802_3_cntrs_grp_data_layout,
987b572ec9fSJakub Kicinski 				      a_mac_control_frames_received);
988b572ec9fSJakub Kicinski 	ctrl_stats->UnsupportedOpcodesReceived =
989b572ec9fSJakub Kicinski 		MLX5E_READ_CTR64_BE_F(ppcnt_ieee_802_3,
990b572ec9fSJakub Kicinski 				      eth_802_3_cntrs_grp_data_layout,
991b572ec9fSJakub Kicinski 				      a_unsupported_opcodes_received);
992b572ec9fSJakub Kicinski }
993b572ec9fSJakub Kicinski 
994fc8e64a3SKamal Heib #define PPORT_2863_OFF(c) \
995fc8e64a3SKamal Heib 	MLX5_BYTE_OFF(ppcnt_reg, \
996fc8e64a3SKamal Heib 		      counter_set.eth_2863_cntrs_grp_data_layout.c##_high)
997fc8e64a3SKamal Heib static const struct counter_desc pport_2863_stats_desc[] = {
998fc8e64a3SKamal Heib 	{ "rx_discards_phy", PPORT_2863_OFF(if_in_discards) },
999fc8e64a3SKamal Heib 	{ "tx_discards_phy", PPORT_2863_OFF(if_out_discards) },
1000fc8e64a3SKamal Heib 	{ "tx_errors_phy", PPORT_2863_OFF(if_out_errors) },
1001fc8e64a3SKamal Heib };
1002fc8e64a3SKamal Heib 
1003fc8e64a3SKamal Heib #define NUM_PPORT_2863_COUNTERS		ARRAY_SIZE(pport_2863_stats_desc)
1004fc8e64a3SKamal Heib 
100596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(2863)
1006fc8e64a3SKamal Heib {
1007fc8e64a3SKamal Heib 	return NUM_PPORT_2863_COUNTERS;
1008fc8e64a3SKamal Heib }
1009fc8e64a3SKamal Heib 
101096b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(2863)
1011fc8e64a3SKamal Heib {
1012fc8e64a3SKamal Heib 	int i;
1013fc8e64a3SKamal Heib 
1014fc8e64a3SKamal Heib 	for (i = 0; i < NUM_PPORT_2863_COUNTERS; i++)
1015fc8e64a3SKamal Heib 		strcpy(data + (idx++) * ETH_GSTRING_LEN, pport_2863_stats_desc[i].format);
1016fc8e64a3SKamal Heib 	return idx;
1017fc8e64a3SKamal Heib }
1018fc8e64a3SKamal Heib 
101996b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(2863)
1020fc8e64a3SKamal Heib {
1021fc8e64a3SKamal Heib 	int i;
1022fc8e64a3SKamal Heib 
1023fc8e64a3SKamal Heib 	for (i = 0; i < NUM_PPORT_2863_COUNTERS; i++)
1024fc8e64a3SKamal Heib 		data[idx++] = MLX5E_READ_CTR64_BE(&priv->stats.pport.RFC_2863_counters,
1025fc8e64a3SKamal Heib 						  pport_2863_stats_desc, i);
1026fc8e64a3SKamal Heib 	return idx;
1027fc8e64a3SKamal Heib }
1028fc8e64a3SKamal Heib 
102996b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(2863)
103019386177SKamal Heib {
103119386177SKamal Heib 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
103219386177SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
103319386177SKamal Heib 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
103419386177SKamal Heib 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
103519386177SKamal Heib 	void *out;
103619386177SKamal Heib 
103719386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, local_port, 1);
103819386177SKamal Heib 	out = pstats->RFC_2863_counters;
103919386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, grp, MLX5_RFC_2863_COUNTERS_GROUP);
104019386177SKamal Heib 	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
104119386177SKamal Heib }
104219386177SKamal Heib 
1043e0e0def9SKamal Heib #define PPORT_2819_OFF(c) \
1044e0e0def9SKamal Heib 	MLX5_BYTE_OFF(ppcnt_reg, \
1045e0e0def9SKamal Heib 		      counter_set.eth_2819_cntrs_grp_data_layout.c##_high)
1046e0e0def9SKamal Heib static const struct counter_desc pport_2819_stats_desc[] = {
1047e0e0def9SKamal Heib 	{ "rx_undersize_pkts_phy", PPORT_2819_OFF(ether_stats_undersize_pkts) },
1048e0e0def9SKamal Heib 	{ "rx_fragments_phy", PPORT_2819_OFF(ether_stats_fragments) },
1049e0e0def9SKamal Heib 	{ "rx_jabbers_phy", PPORT_2819_OFF(ether_stats_jabbers) },
1050e0e0def9SKamal Heib 	{ "rx_64_bytes_phy", PPORT_2819_OFF(ether_stats_pkts64octets) },
1051e0e0def9SKamal Heib 	{ "rx_65_to_127_bytes_phy", PPORT_2819_OFF(ether_stats_pkts65to127octets) },
1052e0e0def9SKamal Heib 	{ "rx_128_to_255_bytes_phy", PPORT_2819_OFF(ether_stats_pkts128to255octets) },
1053e0e0def9SKamal Heib 	{ "rx_256_to_511_bytes_phy", PPORT_2819_OFF(ether_stats_pkts256to511octets) },
1054e0e0def9SKamal Heib 	{ "rx_512_to_1023_bytes_phy", PPORT_2819_OFF(ether_stats_pkts512to1023octets) },
1055e0e0def9SKamal Heib 	{ "rx_1024_to_1518_bytes_phy", PPORT_2819_OFF(ether_stats_pkts1024to1518octets) },
1056e0e0def9SKamal Heib 	{ "rx_1519_to_2047_bytes_phy", PPORT_2819_OFF(ether_stats_pkts1519to2047octets) },
1057e0e0def9SKamal Heib 	{ "rx_2048_to_4095_bytes_phy", PPORT_2819_OFF(ether_stats_pkts2048to4095octets) },
1058e0e0def9SKamal Heib 	{ "rx_4096_to_8191_bytes_phy", PPORT_2819_OFF(ether_stats_pkts4096to8191octets) },
1059e0e0def9SKamal Heib 	{ "rx_8192_to_10239_bytes_phy", PPORT_2819_OFF(ether_stats_pkts8192to10239octets) },
1060e0e0def9SKamal Heib };
1061e0e0def9SKamal Heib 
1062e0e0def9SKamal Heib #define NUM_PPORT_2819_COUNTERS		ARRAY_SIZE(pport_2819_stats_desc)
1063e0e0def9SKamal Heib 
106496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(2819)
1065e0e0def9SKamal Heib {
1066e0e0def9SKamal Heib 	return NUM_PPORT_2819_COUNTERS;
1067e0e0def9SKamal Heib }
1068e0e0def9SKamal Heib 
106996b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(2819)
1070e0e0def9SKamal Heib {
1071e0e0def9SKamal Heib 	int i;
1072e0e0def9SKamal Heib 
1073e0e0def9SKamal Heib 	for (i = 0; i < NUM_PPORT_2819_COUNTERS; i++)
1074e0e0def9SKamal Heib 		strcpy(data + (idx++) * ETH_GSTRING_LEN, pport_2819_stats_desc[i].format);
1075e0e0def9SKamal Heib 	return idx;
1076e0e0def9SKamal Heib }
1077e0e0def9SKamal Heib 
107896b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(2819)
1079e0e0def9SKamal Heib {
1080e0e0def9SKamal Heib 	int i;
1081e0e0def9SKamal Heib 
1082e0e0def9SKamal Heib 	for (i = 0; i < NUM_PPORT_2819_COUNTERS; i++)
1083e0e0def9SKamal Heib 		data[idx++] = MLX5E_READ_CTR64_BE(&priv->stats.pport.RFC_2819_counters,
1084e0e0def9SKamal Heib 						  pport_2819_stats_desc, i);
1085e0e0def9SKamal Heib 	return idx;
1086e0e0def9SKamal Heib }
1087e0e0def9SKamal Heib 
108896b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(2819)
108919386177SKamal Heib {
109019386177SKamal Heib 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
109119386177SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
109219386177SKamal Heib 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
109319386177SKamal Heib 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
109419386177SKamal Heib 	void *out;
109519386177SKamal Heib 
109675370eb0SEyal Davidovich 	if (!MLX5_BASIC_PPCNT_SUPPORTED(mdev))
109775370eb0SEyal Davidovich 		return;
109875370eb0SEyal Davidovich 
109919386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, local_port, 1);
110019386177SKamal Heib 	out = pstats->RFC_2819_counters;
110119386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, grp, MLX5_RFC_2819_COUNTERS_GROUP);
110219386177SKamal Heib 	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
110319386177SKamal Heib }
110419386177SKamal Heib 
1105b572ec9fSJakub Kicinski static const struct ethtool_rmon_hist_range mlx5e_rmon_ranges[] = {
1106b572ec9fSJakub Kicinski 	{    0,    64 },
1107b572ec9fSJakub Kicinski 	{   65,   127 },
1108b572ec9fSJakub Kicinski 	{  128,   255 },
1109b572ec9fSJakub Kicinski 	{  256,   511 },
1110b572ec9fSJakub Kicinski 	{  512,  1023 },
1111b572ec9fSJakub Kicinski 	{ 1024,  1518 },
1112b572ec9fSJakub Kicinski 	{ 1519,  2047 },
1113b572ec9fSJakub Kicinski 	{ 2048,  4095 },
1114b572ec9fSJakub Kicinski 	{ 4096,  8191 },
1115b572ec9fSJakub Kicinski 	{ 8192, 10239 },
1116b572ec9fSJakub Kicinski 	{}
1117b572ec9fSJakub Kicinski };
1118b572ec9fSJakub Kicinski 
mlx5e_stats_rmon_get(struct mlx5e_priv * priv,struct ethtool_rmon_stats * rmon,const struct ethtool_rmon_hist_range ** ranges)1119b572ec9fSJakub Kicinski void mlx5e_stats_rmon_get(struct mlx5e_priv *priv,
1120b572ec9fSJakub Kicinski 			  struct ethtool_rmon_stats *rmon,
1121b572ec9fSJakub Kicinski 			  const struct ethtool_rmon_hist_range **ranges)
1122b572ec9fSJakub Kicinski {
1123b572ec9fSJakub Kicinski 	u32 ppcnt_RFC_2819_counters[MLX5_ST_SZ_DW(ppcnt_reg)];
1124b572ec9fSJakub Kicinski 	struct mlx5_core_dev *mdev = priv->mdev;
1125b572ec9fSJakub Kicinski 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
1126b572ec9fSJakub Kicinski 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
1127b572ec9fSJakub Kicinski 
1128b572ec9fSJakub Kicinski 	MLX5_SET(ppcnt_reg, in, local_port, 1);
1129b572ec9fSJakub Kicinski 	MLX5_SET(ppcnt_reg, in, grp, MLX5_RFC_2819_COUNTERS_GROUP);
1130b572ec9fSJakub Kicinski 	if (mlx5_core_access_reg(mdev, in, sz, ppcnt_RFC_2819_counters,
1131b572ec9fSJakub Kicinski 				 sz, MLX5_REG_PPCNT, 0, 0))
1132b572ec9fSJakub Kicinski 		return;
1133b572ec9fSJakub Kicinski 
1134b572ec9fSJakub Kicinski #define RD(name)						\
1135b572ec9fSJakub Kicinski 	MLX5E_READ_CTR64_BE_F(ppcnt_RFC_2819_counters,		\
1136b572ec9fSJakub Kicinski 			      eth_2819_cntrs_grp_data_layout,	\
1137b572ec9fSJakub Kicinski 			      name)
1138b572ec9fSJakub Kicinski 
1139b572ec9fSJakub Kicinski 	rmon->undersize_pkts	= RD(ether_stats_undersize_pkts);
1140b572ec9fSJakub Kicinski 	rmon->fragments		= RD(ether_stats_fragments);
1141b572ec9fSJakub Kicinski 	rmon->jabbers		= RD(ether_stats_jabbers);
1142b572ec9fSJakub Kicinski 
1143b572ec9fSJakub Kicinski 	rmon->hist[0]		= RD(ether_stats_pkts64octets);
1144b572ec9fSJakub Kicinski 	rmon->hist[1]		= RD(ether_stats_pkts65to127octets);
1145b572ec9fSJakub Kicinski 	rmon->hist[2]		= RD(ether_stats_pkts128to255octets);
1146b572ec9fSJakub Kicinski 	rmon->hist[3]		= RD(ether_stats_pkts256to511octets);
1147b572ec9fSJakub Kicinski 	rmon->hist[4]		= RD(ether_stats_pkts512to1023octets);
1148b572ec9fSJakub Kicinski 	rmon->hist[5]		= RD(ether_stats_pkts1024to1518octets);
1149b572ec9fSJakub Kicinski 	rmon->hist[6]		= RD(ether_stats_pkts1519to2047octets);
1150b572ec9fSJakub Kicinski 	rmon->hist[7]		= RD(ether_stats_pkts2048to4095octets);
1151b572ec9fSJakub Kicinski 	rmon->hist[8]		= RD(ether_stats_pkts4096to8191octets);
1152b572ec9fSJakub Kicinski 	rmon->hist[9]		= RD(ether_stats_pkts8192to10239octets);
1153b572ec9fSJakub Kicinski #undef RD
1154b572ec9fSJakub Kicinski 
1155b572ec9fSJakub Kicinski 	*ranges = mlx5e_rmon_ranges;
1156b572ec9fSJakub Kicinski }
1157b572ec9fSJakub Kicinski 
11582e4df0b2SKamal Heib #define PPORT_PHY_STATISTICAL_OFF(c) \
11592e4df0b2SKamal Heib 	MLX5_BYTE_OFF(ppcnt_reg, \
11602e4df0b2SKamal Heib 		      counter_set.phys_layer_statistical_cntrs.c##_high)
11612e4df0b2SKamal Heib static const struct counter_desc pport_phy_statistical_stats_desc[] = {
11622e4df0b2SKamal Heib 	{ "rx_pcs_symbol_err_phy", PPORT_PHY_STATISTICAL_OFF(phy_symbol_errors) },
11632e4df0b2SKamal Heib 	{ "rx_corrected_bits_phy", PPORT_PHY_STATISTICAL_OFF(phy_corrected_bits) },
11642e4df0b2SKamal Heib };
11652e4df0b2SKamal Heib 
11664cb4e98eSShay Agroskin static const struct counter_desc
11674cb4e98eSShay Agroskin pport_phy_statistical_err_lanes_stats_desc[] = {
11684cb4e98eSShay Agroskin 	{ "rx_err_lane_0_phy", PPORT_PHY_STATISTICAL_OFF(phy_corrected_bits_lane0) },
11694cb4e98eSShay Agroskin 	{ "rx_err_lane_1_phy", PPORT_PHY_STATISTICAL_OFF(phy_corrected_bits_lane1) },
11704cb4e98eSShay Agroskin 	{ "rx_err_lane_2_phy", PPORT_PHY_STATISTICAL_OFF(phy_corrected_bits_lane2) },
11714cb4e98eSShay Agroskin 	{ "rx_err_lane_3_phy", PPORT_PHY_STATISTICAL_OFF(phy_corrected_bits_lane3) },
11724cb4e98eSShay Agroskin };
11734cb4e98eSShay Agroskin 
11744cb4e98eSShay Agroskin #define NUM_PPORT_PHY_STATISTICAL_COUNTERS \
11754cb4e98eSShay Agroskin 	ARRAY_SIZE(pport_phy_statistical_stats_desc)
11764cb4e98eSShay Agroskin #define NUM_PPORT_PHY_STATISTICAL_PER_LANE_COUNTERS \
11774cb4e98eSShay Agroskin 	ARRAY_SIZE(pport_phy_statistical_err_lanes_stats_desc)
11782e4df0b2SKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(phy)117996b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(phy)
11802e4df0b2SKamal Heib {
11814cb4e98eSShay Agroskin 	struct mlx5_core_dev *mdev = priv->mdev;
11824cb4e98eSShay Agroskin 	int num_stats;
11834cb4e98eSShay Agroskin 
11846ab75516SSaeed Mahameed 	/* "1" for link_down_events special counter */
11854cb4e98eSShay Agroskin 	num_stats = 1;
11864cb4e98eSShay Agroskin 
11874cb4e98eSShay Agroskin 	num_stats += MLX5_CAP_PCAM_FEATURE(mdev, ppcnt_statistical_group) ?
11884cb4e98eSShay Agroskin 		     NUM_PPORT_PHY_STATISTICAL_COUNTERS : 0;
11894cb4e98eSShay Agroskin 
11904cb4e98eSShay Agroskin 	num_stats += MLX5_CAP_PCAM_FEATURE(mdev, per_lane_error_counters) ?
11914cb4e98eSShay Agroskin 		     NUM_PPORT_PHY_STATISTICAL_PER_LANE_COUNTERS : 0;
11924cb4e98eSShay Agroskin 
11934cb4e98eSShay Agroskin 	return num_stats;
11942e4df0b2SKamal Heib }
11952e4df0b2SKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(phy)119696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(phy)
11972e4df0b2SKamal Heib {
11984cb4e98eSShay Agroskin 	struct mlx5_core_dev *mdev = priv->mdev;
11992e4df0b2SKamal Heib 	int i;
12002e4df0b2SKamal Heib 
12016ab75516SSaeed Mahameed 	strcpy(data + (idx++) * ETH_GSTRING_LEN, "link_down_events_phy");
12026ab75516SSaeed Mahameed 
12034cb4e98eSShay Agroskin 	if (!MLX5_CAP_PCAM_FEATURE(mdev, ppcnt_statistical_group))
12046ab75516SSaeed Mahameed 		return idx;
12056ab75516SSaeed Mahameed 
12066ab75516SSaeed Mahameed 	for (i = 0; i < NUM_PPORT_PHY_STATISTICAL_COUNTERS; i++)
12072e4df0b2SKamal Heib 		strcpy(data + (idx++) * ETH_GSTRING_LEN,
12082e4df0b2SKamal Heib 		       pport_phy_statistical_stats_desc[i].format);
12094cb4e98eSShay Agroskin 
12104cb4e98eSShay Agroskin 	if (MLX5_CAP_PCAM_FEATURE(mdev, per_lane_error_counters))
12114cb4e98eSShay Agroskin 		for (i = 0; i < NUM_PPORT_PHY_STATISTICAL_PER_LANE_COUNTERS; i++)
12124cb4e98eSShay Agroskin 			strcpy(data + (idx++) * ETH_GSTRING_LEN,
12134cb4e98eSShay Agroskin 			       pport_phy_statistical_err_lanes_stats_desc[i].format);
12144cb4e98eSShay Agroskin 
12152e4df0b2SKamal Heib 	return idx;
12162e4df0b2SKamal Heib }
12172e4df0b2SKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(phy)121896b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(phy)
12192e4df0b2SKamal Heib {
12204cb4e98eSShay Agroskin 	struct mlx5_core_dev *mdev = priv->mdev;
12212e4df0b2SKamal Heib 	int i;
12222e4df0b2SKamal Heib 
12236ab75516SSaeed Mahameed 	/* link_down_events_phy has special handling since it is not stored in __be64 format */
12246ab75516SSaeed Mahameed 	data[idx++] = MLX5_GET(ppcnt_reg, priv->stats.pport.phy_counters,
12256ab75516SSaeed Mahameed 			       counter_set.phys_layer_cntrs.link_down_events);
12266ab75516SSaeed Mahameed 
12274cb4e98eSShay Agroskin 	if (!MLX5_CAP_PCAM_FEATURE(mdev, ppcnt_statistical_group))
12286ab75516SSaeed Mahameed 		return idx;
12296ab75516SSaeed Mahameed 
12306ab75516SSaeed Mahameed 	for (i = 0; i < NUM_PPORT_PHY_STATISTICAL_COUNTERS; i++)
12312e4df0b2SKamal Heib 		data[idx++] =
12322e4df0b2SKamal Heib 			MLX5E_READ_CTR64_BE(&priv->stats.pport.phy_statistical_counters,
12332e4df0b2SKamal Heib 					    pport_phy_statistical_stats_desc, i);
12344cb4e98eSShay Agroskin 
12354cb4e98eSShay Agroskin 	if (MLX5_CAP_PCAM_FEATURE(mdev, per_lane_error_counters))
12364cb4e98eSShay Agroskin 		for (i = 0; i < NUM_PPORT_PHY_STATISTICAL_PER_LANE_COUNTERS; i++)
12374cb4e98eSShay Agroskin 			data[idx++] =
12384cb4e98eSShay Agroskin 				MLX5E_READ_CTR64_BE(&priv->stats.pport.phy_statistical_counters,
12394cb4e98eSShay Agroskin 						    pport_phy_statistical_err_lanes_stats_desc,
12404cb4e98eSShay Agroskin 						    i);
12412e4df0b2SKamal Heib 	return idx;
12422e4df0b2SKamal Heib }
12432e4df0b2SKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(phy)124496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(phy)
124519386177SKamal Heib {
124619386177SKamal Heib 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
124719386177SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
124819386177SKamal Heib 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
124919386177SKamal Heib 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
125019386177SKamal Heib 	void *out;
125119386177SKamal Heib 
125219386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, local_port, 1);
125319386177SKamal Heib 	out = pstats->phy_counters;
125419386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, grp, MLX5_PHYSICAL_LAYER_COUNTERS_GROUP);
125519386177SKamal Heib 	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
125619386177SKamal Heib 
125719386177SKamal Heib 	if (!MLX5_CAP_PCAM_FEATURE(mdev, ppcnt_statistical_group))
125819386177SKamal Heib 		return;
125919386177SKamal Heib 
126019386177SKamal Heib 	out = pstats->phy_statistical_counters;
126119386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, grp, MLX5_PHYSICAL_LAYER_STATISTICAL_GROUP);
126219386177SKamal Heib 	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
126319386177SKamal Heib }
126419386177SKamal Heib 
mlx5e_get_link_ext_stats(struct net_device * dev,struct ethtool_link_ext_stats * stats)1265e07c4924SSaeed Mahameed void mlx5e_get_link_ext_stats(struct net_device *dev,
1266e07c4924SSaeed Mahameed 			      struct ethtool_link_ext_stats *stats)
1267e07c4924SSaeed Mahameed {
1268e07c4924SSaeed Mahameed 	struct mlx5e_priv *priv = netdev_priv(dev);
1269e07c4924SSaeed Mahameed 	u32 out[MLX5_ST_SZ_DW(ppcnt_reg)] = {};
1270e07c4924SSaeed Mahameed 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {};
1271e07c4924SSaeed Mahameed 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
1272e07c4924SSaeed Mahameed 
1273e07c4924SSaeed Mahameed 	MLX5_SET(ppcnt_reg, in, local_port, 1);
1274e07c4924SSaeed Mahameed 	MLX5_SET(ppcnt_reg, in, grp, MLX5_PHYSICAL_LAYER_COUNTERS_GROUP);
1275e07c4924SSaeed Mahameed 	mlx5_core_access_reg(priv->mdev, in, sz, out,
1276e07c4924SSaeed Mahameed 			     MLX5_ST_SZ_BYTES(ppcnt_reg), MLX5_REG_PPCNT, 0, 0);
1277e07c4924SSaeed Mahameed 
1278e07c4924SSaeed Mahameed 	stats->link_down_events = MLX5_GET(ppcnt_reg, out,
1279e07c4924SSaeed Mahameed 					   counter_set.phys_layer_cntrs.link_down_events);
1280e07c4924SSaeed Mahameed }
1281e07c4924SSaeed Mahameed 
fec_num_lanes(struct mlx5_core_dev * dev)12820a1498ebSLama Kayal static int fec_num_lanes(struct mlx5_core_dev *dev)
12830a1498ebSLama Kayal {
12840a1498ebSLama Kayal 	u32 out[MLX5_ST_SZ_DW(pmlp_reg)] = {};
12850a1498ebSLama Kayal 	u32 in[MLX5_ST_SZ_DW(pmlp_reg)] = {};
12860a1498ebSLama Kayal 	int err;
12870a1498ebSLama Kayal 
12880a1498ebSLama Kayal 	MLX5_SET(pmlp_reg, in, local_port, 1);
12890a1498ebSLama Kayal 	err = mlx5_core_access_reg(dev, in, sizeof(in), out, sizeof(out),
12900a1498ebSLama Kayal 				   MLX5_REG_PMLP, 0, 0);
12910a1498ebSLama Kayal 	if (err)
12920a1498ebSLama Kayal 		return 0;
12930a1498ebSLama Kayal 
12940a1498ebSLama Kayal 	return MLX5_GET(pmlp_reg, out, width);
12950a1498ebSLama Kayal }
12960a1498ebSLama Kayal 
fec_active_mode(struct mlx5_core_dev * mdev)12970a1498ebSLama Kayal static int fec_active_mode(struct mlx5_core_dev *mdev)
12980a1498ebSLama Kayal {
12990a1498ebSLama Kayal 	unsigned long fec_active_long;
13000a1498ebSLama Kayal 	u32 fec_active;
13010a1498ebSLama Kayal 
13020a1498ebSLama Kayal 	if (mlx5e_get_fec_mode(mdev, &fec_active, NULL))
13030a1498ebSLama Kayal 		return MLX5E_FEC_NOFEC;
13040a1498ebSLama Kayal 
13050a1498ebSLama Kayal 	fec_active_long = fec_active;
13060a1498ebSLama Kayal 	return find_first_bit(&fec_active_long, sizeof(unsigned long) * BITS_PER_BYTE);
13070a1498ebSLama Kayal }
13080a1498ebSLama Kayal 
13090a1498ebSLama Kayal #define MLX5E_STATS_SET_FEC_BLOCK(idx) ({ \
13100a1498ebSLama Kayal 	fec_stats->corrected_blocks.lanes[(idx)] = \
13110a1498ebSLama Kayal 		MLX5E_READ_CTR64_BE_F(ppcnt, phys_layer_cntrs, \
13120a1498ebSLama Kayal 				      fc_fec_corrected_blocks_lane##idx); \
13130a1498ebSLama Kayal 	fec_stats->uncorrectable_blocks.lanes[(idx)] = \
13140a1498ebSLama Kayal 		MLX5E_READ_CTR64_BE_F(ppcnt, phys_layer_cntrs, \
13150a1498ebSLama Kayal 				      fc_fec_uncorrectable_blocks_lane##idx); \
13160a1498ebSLama Kayal })
13170a1498ebSLama Kayal 
fec_set_fc_stats(struct ethtool_fec_stats * fec_stats,u32 * ppcnt,u8 lanes)13180a1498ebSLama Kayal static void fec_set_fc_stats(struct ethtool_fec_stats *fec_stats,
13190a1498ebSLama Kayal 			     u32 *ppcnt, u8 lanes)
13200a1498ebSLama Kayal {
13210a1498ebSLama Kayal 	if (lanes > 3) { /* 4 lanes */
13220a1498ebSLama Kayal 		MLX5E_STATS_SET_FEC_BLOCK(3);
13230a1498ebSLama Kayal 		MLX5E_STATS_SET_FEC_BLOCK(2);
13240a1498ebSLama Kayal 	}
13250a1498ebSLama Kayal 	if (lanes > 1) /* 2 lanes */
13260a1498ebSLama Kayal 		MLX5E_STATS_SET_FEC_BLOCK(1);
13270a1498ebSLama Kayal 	if (lanes > 0) /* 1 lane */
13280a1498ebSLama Kayal 		MLX5E_STATS_SET_FEC_BLOCK(0);
13290a1498ebSLama Kayal }
13300a1498ebSLama Kayal 
fec_set_rs_stats(struct ethtool_fec_stats * fec_stats,u32 * ppcnt)13310a1498ebSLama Kayal static void fec_set_rs_stats(struct ethtool_fec_stats *fec_stats, u32 *ppcnt)
13320a1498ebSLama Kayal {
13330a1498ebSLama Kayal 	fec_stats->corrected_blocks.total =
13340a1498ebSLama Kayal 		MLX5E_READ_CTR64_BE_F(ppcnt, phys_layer_cntrs,
13350a1498ebSLama Kayal 				      rs_fec_corrected_blocks);
13360a1498ebSLama Kayal 	fec_stats->uncorrectable_blocks.total =
13370a1498ebSLama Kayal 		MLX5E_READ_CTR64_BE_F(ppcnt, phys_layer_cntrs,
13380a1498ebSLama Kayal 				      rs_fec_uncorrectable_blocks);
13390a1498ebSLama Kayal }
13400a1498ebSLama Kayal 
fec_set_block_stats(struct mlx5e_priv * priv,struct ethtool_fec_stats * fec_stats)13410a1498ebSLama Kayal static void fec_set_block_stats(struct mlx5e_priv *priv,
13420a1498ebSLama Kayal 				struct ethtool_fec_stats *fec_stats)
13430a1498ebSLama Kayal {
13440a1498ebSLama Kayal 	struct mlx5_core_dev *mdev = priv->mdev;
13450a1498ebSLama Kayal 	u32 out[MLX5_ST_SZ_DW(ppcnt_reg)] = {};
13460a1498ebSLama Kayal 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {};
13470a1498ebSLama Kayal 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
13480a1498ebSLama Kayal 	int mode = fec_active_mode(mdev);
13490a1498ebSLama Kayal 
13500a1498ebSLama Kayal 	if (mode == MLX5E_FEC_NOFEC)
13510a1498ebSLama Kayal 		return;
13520a1498ebSLama Kayal 
13530a1498ebSLama Kayal 	MLX5_SET(ppcnt_reg, in, local_port, 1);
13540a1498ebSLama Kayal 	MLX5_SET(ppcnt_reg, in, grp, MLX5_PHYSICAL_LAYER_COUNTERS_GROUP);
1355342402c4SJakub Kicinski 	if (mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0))
13560a1498ebSLama Kayal 		return;
13570a1498ebSLama Kayal 
13580a1498ebSLama Kayal 	switch (mode) {
13590a1498ebSLama Kayal 	case MLX5E_FEC_RS_528_514:
13600a1498ebSLama Kayal 	case MLX5E_FEC_RS_544_514:
13610a1498ebSLama Kayal 	case MLX5E_FEC_LLRS_272_257_1:
13620a1498ebSLama Kayal 		fec_set_rs_stats(fec_stats, out);
13630a1498ebSLama Kayal 		return;
13640a1498ebSLama Kayal 	case MLX5E_FEC_FIRECODE:
13650a1498ebSLama Kayal 		fec_set_fc_stats(fec_stats, out, fec_num_lanes(mdev));
13660a1498ebSLama Kayal 	}
13670a1498ebSLama Kayal }
13680a1498ebSLama Kayal 
fec_set_corrected_bits_total(struct mlx5e_priv * priv,struct ethtool_fec_stats * fec_stats)13690a1498ebSLama Kayal static void fec_set_corrected_bits_total(struct mlx5e_priv *priv,
13701703bb50SJakub Kicinski 					 struct ethtool_fec_stats *fec_stats)
13711703bb50SJakub Kicinski {
13721703bb50SJakub Kicinski 	u32 ppcnt_phy_statistical[MLX5_ST_SZ_DW(ppcnt_reg)];
13731703bb50SJakub Kicinski 	struct mlx5_core_dev *mdev = priv->mdev;
13740a1498ebSLama Kayal 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {};
13751703bb50SJakub Kicinski 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
13761703bb50SJakub Kicinski 
13771703bb50SJakub Kicinski 	MLX5_SET(ppcnt_reg, in, local_port, 1);
13781703bb50SJakub Kicinski 	MLX5_SET(ppcnt_reg, in, grp, MLX5_PHYSICAL_LAYER_STATISTICAL_GROUP);
13791703bb50SJakub Kicinski 	if (mlx5_core_access_reg(mdev, in, sz, ppcnt_phy_statistical,
13801703bb50SJakub Kicinski 				 sz, MLX5_REG_PPCNT, 0, 0))
13811703bb50SJakub Kicinski 		return;
13821703bb50SJakub Kicinski 
13831703bb50SJakub Kicinski 	fec_stats->corrected_bits.total =
13841703bb50SJakub Kicinski 		MLX5E_READ_CTR64_BE_F(ppcnt_phy_statistical,
13851703bb50SJakub Kicinski 				      phys_layer_statistical_cntrs,
13861703bb50SJakub Kicinski 				      phy_corrected_bits);
13871703bb50SJakub Kicinski }
13881703bb50SJakub Kicinski 
mlx5e_stats_fec_get(struct mlx5e_priv * priv,struct ethtool_fec_stats * fec_stats)13890a1498ebSLama Kayal void mlx5e_stats_fec_get(struct mlx5e_priv *priv,
13900a1498ebSLama Kayal 			 struct ethtool_fec_stats *fec_stats)
13910a1498ebSLama Kayal {
13927fac0529SLama Kayal 	if (!MLX5_CAP_PCAM_FEATURE(priv->mdev, ppcnt_statistical_group))
13937fac0529SLama Kayal 		return;
13947fac0529SLama Kayal 
13950a1498ebSLama Kayal 	fec_set_corrected_bits_total(priv, fec_stats);
13960a1498ebSLama Kayal 	fec_set_block_stats(priv, fec_stats);
13970a1498ebSLama Kayal }
13980a1498ebSLama Kayal 
13993488bd4cSKamal Heib #define PPORT_ETH_EXT_OFF(c) \
14003488bd4cSKamal Heib 	MLX5_BYTE_OFF(ppcnt_reg, \
14013488bd4cSKamal Heib 		      counter_set.eth_extended_cntrs_grp_data_layout.c##_high)
14023488bd4cSKamal Heib static const struct counter_desc pport_eth_ext_stats_desc[] = {
14033488bd4cSKamal Heib 	{ "rx_buffer_passed_thres_phy", PPORT_ETH_EXT_OFF(rx_buffer_almost_full) },
14043488bd4cSKamal Heib };
14053488bd4cSKamal Heib 
14063488bd4cSKamal Heib #define NUM_PPORT_ETH_EXT_COUNTERS	ARRAY_SIZE(pport_eth_ext_stats_desc)
14073488bd4cSKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(eth_ext)140896b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(eth_ext)
14093488bd4cSKamal Heib {
14103488bd4cSKamal Heib 	if (MLX5_CAP_PCAM_FEATURE((priv)->mdev, rx_buffer_fullness_counters))
14113488bd4cSKamal Heib 		return NUM_PPORT_ETH_EXT_COUNTERS;
14123488bd4cSKamal Heib 
14133488bd4cSKamal Heib 	return 0;
14143488bd4cSKamal Heib }
14153488bd4cSKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(eth_ext)141696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(eth_ext)
14173488bd4cSKamal Heib {
14183488bd4cSKamal Heib 	int i;
14193488bd4cSKamal Heib 
14203488bd4cSKamal Heib 	if (MLX5_CAP_PCAM_FEATURE((priv)->mdev, rx_buffer_fullness_counters))
14213488bd4cSKamal Heib 		for (i = 0; i < NUM_PPORT_ETH_EXT_COUNTERS; i++)
14223488bd4cSKamal Heib 			strcpy(data + (idx++) * ETH_GSTRING_LEN,
14233488bd4cSKamal Heib 			       pport_eth_ext_stats_desc[i].format);
14243488bd4cSKamal Heib 	return idx;
14253488bd4cSKamal Heib }
14263488bd4cSKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(eth_ext)142796b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(eth_ext)
14283488bd4cSKamal Heib {
14293488bd4cSKamal Heib 	int i;
14303488bd4cSKamal Heib 
14313488bd4cSKamal Heib 	if (MLX5_CAP_PCAM_FEATURE((priv)->mdev, rx_buffer_fullness_counters))
14323488bd4cSKamal Heib 		for (i = 0; i < NUM_PPORT_ETH_EXT_COUNTERS; i++)
14333488bd4cSKamal Heib 			data[idx++] =
14343488bd4cSKamal Heib 				MLX5E_READ_CTR64_BE(&priv->stats.pport.eth_ext_counters,
14353488bd4cSKamal Heib 						    pport_eth_ext_stats_desc, i);
14363488bd4cSKamal Heib 	return idx;
14373488bd4cSKamal Heib }
14383488bd4cSKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(eth_ext)143996b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(eth_ext)
144019386177SKamal Heib {
144119386177SKamal Heib 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
144219386177SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
144319386177SKamal Heib 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
144419386177SKamal Heib 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
144519386177SKamal Heib 	void *out;
144619386177SKamal Heib 
144719386177SKamal Heib 	if (!MLX5_CAP_PCAM_FEATURE(mdev, rx_buffer_fullness_counters))
144819386177SKamal Heib 		return;
144919386177SKamal Heib 
145019386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, local_port, 1);
145119386177SKamal Heib 	out = pstats->eth_ext_counters;
145219386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, grp, MLX5_ETHERNET_EXTENDED_COUNTERS_GROUP);
145319386177SKamal Heib 	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
145419386177SKamal Heib }
145519386177SKamal Heib 
14569fd2b5f1SKamal Heib #define PCIE_PERF_OFF(c) \
14579fd2b5f1SKamal Heib 	MLX5_BYTE_OFF(mpcnt_reg, counter_set.pcie_perf_cntrs_grp_data_layout.c)
14589fd2b5f1SKamal Heib static const struct counter_desc pcie_perf_stats_desc[] = {
14599fd2b5f1SKamal Heib 	{ "rx_pci_signal_integrity", PCIE_PERF_OFF(rx_errors) },
14609fd2b5f1SKamal Heib 	{ "tx_pci_signal_integrity", PCIE_PERF_OFF(tx_errors) },
14619fd2b5f1SKamal Heib };
14629fd2b5f1SKamal Heib 
14639fd2b5f1SKamal Heib #define PCIE_PERF_OFF64(c) \
14649fd2b5f1SKamal Heib 	MLX5_BYTE_OFF(mpcnt_reg, counter_set.pcie_perf_cntrs_grp_data_layout.c##_high)
14659fd2b5f1SKamal Heib static const struct counter_desc pcie_perf_stats_desc64[] = {
14669fd2b5f1SKamal Heib 	{ "outbound_pci_buffer_overflow", PCIE_PERF_OFF64(tx_overflow_buffer_pkt) },
14679fd2b5f1SKamal Heib };
14689fd2b5f1SKamal Heib 
14699fd2b5f1SKamal Heib static const struct counter_desc pcie_perf_stall_stats_desc[] = {
14709fd2b5f1SKamal Heib 	{ "outbound_pci_stalled_rd", PCIE_PERF_OFF(outbound_stalled_reads) },
14719fd2b5f1SKamal Heib 	{ "outbound_pci_stalled_wr", PCIE_PERF_OFF(outbound_stalled_writes) },
14729fd2b5f1SKamal Heib 	{ "outbound_pci_stalled_rd_events", PCIE_PERF_OFF(outbound_stalled_reads_events) },
14739fd2b5f1SKamal Heib 	{ "outbound_pci_stalled_wr_events", PCIE_PERF_OFF(outbound_stalled_writes_events) },
14749fd2b5f1SKamal Heib };
14759fd2b5f1SKamal Heib 
14769fd2b5f1SKamal Heib #define NUM_PCIE_PERF_COUNTERS		ARRAY_SIZE(pcie_perf_stats_desc)
14779fd2b5f1SKamal Heib #define NUM_PCIE_PERF_COUNTERS64	ARRAY_SIZE(pcie_perf_stats_desc64)
14789fd2b5f1SKamal Heib #define NUM_PCIE_PERF_STALL_COUNTERS	ARRAY_SIZE(pcie_perf_stall_stats_desc)
14799fd2b5f1SKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(pcie)148096b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(pcie)
14819fd2b5f1SKamal Heib {
14829fd2b5f1SKamal Heib 	int num_stats = 0;
14839fd2b5f1SKamal Heib 
14849fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_performance_group))
14859fd2b5f1SKamal Heib 		num_stats += NUM_PCIE_PERF_COUNTERS;
14869fd2b5f1SKamal Heib 
14879fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, tx_overflow_buffer_pkt))
14889fd2b5f1SKamal Heib 		num_stats += NUM_PCIE_PERF_COUNTERS64;
14899fd2b5f1SKamal Heib 
14909fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_outbound_stalled))
14919fd2b5f1SKamal Heib 		num_stats += NUM_PCIE_PERF_STALL_COUNTERS;
14929fd2b5f1SKamal Heib 
14939fd2b5f1SKamal Heib 	return num_stats;
14949fd2b5f1SKamal Heib }
14959fd2b5f1SKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(pcie)149696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(pcie)
14979fd2b5f1SKamal Heib {
14989fd2b5f1SKamal Heib 	int i;
14999fd2b5f1SKamal Heib 
15009fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_performance_group))
15019fd2b5f1SKamal Heib 		for (i = 0; i < NUM_PCIE_PERF_COUNTERS; i++)
15029fd2b5f1SKamal Heib 			strcpy(data + (idx++) * ETH_GSTRING_LEN,
15039fd2b5f1SKamal Heib 			       pcie_perf_stats_desc[i].format);
15049fd2b5f1SKamal Heib 
15059fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, tx_overflow_buffer_pkt))
15069fd2b5f1SKamal Heib 		for (i = 0; i < NUM_PCIE_PERF_COUNTERS64; i++)
15079fd2b5f1SKamal Heib 			strcpy(data + (idx++) * ETH_GSTRING_LEN,
15089fd2b5f1SKamal Heib 			       pcie_perf_stats_desc64[i].format);
15099fd2b5f1SKamal Heib 
15109fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_outbound_stalled))
15119fd2b5f1SKamal Heib 		for (i = 0; i < NUM_PCIE_PERF_STALL_COUNTERS; i++)
15129fd2b5f1SKamal Heib 			strcpy(data + (idx++) * ETH_GSTRING_LEN,
15139fd2b5f1SKamal Heib 			       pcie_perf_stall_stats_desc[i].format);
15149fd2b5f1SKamal Heib 	return idx;
15159fd2b5f1SKamal Heib }
15169fd2b5f1SKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(pcie)151796b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(pcie)
15189fd2b5f1SKamal Heib {
15199fd2b5f1SKamal Heib 	int i;
15209fd2b5f1SKamal Heib 
15219fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_performance_group))
15229fd2b5f1SKamal Heib 		for (i = 0; i < NUM_PCIE_PERF_COUNTERS; i++)
15239fd2b5f1SKamal Heib 			data[idx++] =
15249fd2b5f1SKamal Heib 				MLX5E_READ_CTR32_BE(&priv->stats.pcie.pcie_perf_counters,
15259fd2b5f1SKamal Heib 						    pcie_perf_stats_desc, i);
15269fd2b5f1SKamal Heib 
15279fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, tx_overflow_buffer_pkt))
15289fd2b5f1SKamal Heib 		for (i = 0; i < NUM_PCIE_PERF_COUNTERS64; i++)
15299fd2b5f1SKamal Heib 			data[idx++] =
15309fd2b5f1SKamal Heib 				MLX5E_READ_CTR64_BE(&priv->stats.pcie.pcie_perf_counters,
15319fd2b5f1SKamal Heib 						    pcie_perf_stats_desc64, i);
15329fd2b5f1SKamal Heib 
15339fd2b5f1SKamal Heib 	if (MLX5_CAP_MCAM_FEATURE((priv)->mdev, pcie_outbound_stalled))
15349fd2b5f1SKamal Heib 		for (i = 0; i < NUM_PCIE_PERF_STALL_COUNTERS; i++)
15359fd2b5f1SKamal Heib 			data[idx++] =
15369fd2b5f1SKamal Heib 				MLX5E_READ_CTR32_BE(&priv->stats.pcie.pcie_perf_counters,
15379fd2b5f1SKamal Heib 						    pcie_perf_stall_stats_desc, i);
15389fd2b5f1SKamal Heib 	return idx;
15399fd2b5f1SKamal Heib }
15409fd2b5f1SKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(pcie)154196b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(pcie)
154219386177SKamal Heib {
154319386177SKamal Heib 	struct mlx5e_pcie_stats *pcie_stats = &priv->stats.pcie;
154419386177SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
154519386177SKamal Heib 	u32 in[MLX5_ST_SZ_DW(mpcnt_reg)] = {0};
154619386177SKamal Heib 	int sz = MLX5_ST_SZ_BYTES(mpcnt_reg);
154719386177SKamal Heib 	void *out;
154819386177SKamal Heib 
154919386177SKamal Heib 	if (!MLX5_CAP_MCAM_FEATURE(mdev, pcie_performance_group))
155019386177SKamal Heib 		return;
155119386177SKamal Heib 
155219386177SKamal Heib 	out = pcie_stats->pcie_perf_counters;
155319386177SKamal Heib 	MLX5_SET(mpcnt_reg, in, grp, MLX5_PCIE_PERFORMANCE_COUNTERS_GROUP);
155419386177SKamal Heib 	mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_MPCNT, 0, 0);
155519386177SKamal Heib }
155619386177SKamal Heib 
15571297d97fSAya Levin #define PPORT_PER_TC_PRIO_OFF(c) \
15581297d97fSAya Levin 	MLX5_BYTE_OFF(ppcnt_reg, \
15591297d97fSAya Levin 		      counter_set.eth_per_tc_prio_grp_data_layout.c##_high)
15601297d97fSAya Levin 
15611297d97fSAya Levin static const struct counter_desc pport_per_tc_prio_stats_desc[] = {
15621297d97fSAya Levin 	{ "rx_prio%d_buf_discard", PPORT_PER_TC_PRIO_OFF(no_buffer_discard_uc) },
15631297d97fSAya Levin };
15641297d97fSAya Levin 
15651297d97fSAya Levin #define NUM_PPORT_PER_TC_PRIO_COUNTERS	ARRAY_SIZE(pport_per_tc_prio_stats_desc)
15661297d97fSAya Levin 
15671297d97fSAya Levin #define PPORT_PER_TC_CONGEST_PRIO_OFF(c) \
15681297d97fSAya Levin 	MLX5_BYTE_OFF(ppcnt_reg, \
15691297d97fSAya Levin 		      counter_set.eth_per_tc_congest_prio_grp_data_layout.c##_high)
15701297d97fSAya Levin 
15711297d97fSAya Levin static const struct counter_desc pport_per_tc_congest_prio_stats_desc[] = {
15721297d97fSAya Levin 	{ "rx_prio%d_cong_discard", PPORT_PER_TC_CONGEST_PRIO_OFF(wred_discard) },
15731297d97fSAya Levin 	{ "rx_prio%d_marked", PPORT_PER_TC_CONGEST_PRIO_OFF(ecn_marked_tc) },
15741297d97fSAya Levin };
15751297d97fSAya Levin 
15761297d97fSAya Levin #define NUM_PPORT_PER_TC_CONGEST_PRIO_COUNTERS \
15771297d97fSAya Levin 	ARRAY_SIZE(pport_per_tc_congest_prio_stats_desc)
15781297d97fSAya Levin 
mlx5e_grp_per_tc_prio_get_num_stats(struct mlx5e_priv * priv)15791297d97fSAya Levin static int mlx5e_grp_per_tc_prio_get_num_stats(struct mlx5e_priv *priv)
15801297d97fSAya Levin {
15811297d97fSAya Levin 	struct mlx5_core_dev *mdev = priv->mdev;
15821297d97fSAya Levin 
15831297d97fSAya Levin 	if (!MLX5_CAP_GEN(mdev, sbcam_reg))
15841297d97fSAya Levin 		return 0;
15851297d97fSAya Levin 
15861297d97fSAya Levin 	return NUM_PPORT_PER_TC_PRIO_COUNTERS * NUM_PPORT_PRIO;
15871297d97fSAya Levin }
15881297d97fSAya Levin 
MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(per_port_buff_congest)158996b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(per_port_buff_congest)
15901297d97fSAya Levin {
15911297d97fSAya Levin 	struct mlx5_core_dev *mdev = priv->mdev;
15921297d97fSAya Levin 	int i, prio;
15931297d97fSAya Levin 
15941297d97fSAya Levin 	if (!MLX5_CAP_GEN(mdev, sbcam_reg))
15951297d97fSAya Levin 		return idx;
15961297d97fSAya Levin 
15971297d97fSAya Levin 	for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
15981297d97fSAya Levin 		for (i = 0; i < NUM_PPORT_PER_TC_PRIO_COUNTERS; i++)
15991297d97fSAya Levin 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
16001297d97fSAya Levin 				pport_per_tc_prio_stats_desc[i].format, prio);
16011297d97fSAya Levin 		for (i = 0; i < NUM_PPORT_PER_TC_CONGEST_PRIO_COUNTERS; i++)
16021297d97fSAya Levin 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
16031297d97fSAya Levin 				pport_per_tc_congest_prio_stats_desc[i].format, prio);
16041297d97fSAya Levin 	}
16051297d97fSAya Levin 
16061297d97fSAya Levin 	return idx;
16071297d97fSAya Levin }
16081297d97fSAya Levin 
MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(per_port_buff_congest)160996b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(per_port_buff_congest)
16101297d97fSAya Levin {
16111297d97fSAya Levin 	struct mlx5e_pport_stats *pport = &priv->stats.pport;
16121297d97fSAya Levin 	struct mlx5_core_dev *mdev = priv->mdev;
16131297d97fSAya Levin 	int i, prio;
16141297d97fSAya Levin 
16151297d97fSAya Levin 	if (!MLX5_CAP_GEN(mdev, sbcam_reg))
16161297d97fSAya Levin 		return idx;
16171297d97fSAya Levin 
16181297d97fSAya Levin 	for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
16191297d97fSAya Levin 		for (i = 0; i < NUM_PPORT_PER_TC_PRIO_COUNTERS; i++)
16201297d97fSAya Levin 			data[idx++] =
16211297d97fSAya Levin 				MLX5E_READ_CTR64_BE(&pport->per_tc_prio_counters[prio],
16221297d97fSAya Levin 						    pport_per_tc_prio_stats_desc, i);
16231297d97fSAya Levin 		for (i = 0; i < NUM_PPORT_PER_TC_CONGEST_PRIO_COUNTERS ; i++)
16241297d97fSAya Levin 			data[idx++] =
16251297d97fSAya Levin 				MLX5E_READ_CTR64_BE(&pport->per_tc_congest_prio_counters[prio],
16261297d97fSAya Levin 						    pport_per_tc_congest_prio_stats_desc, i);
16271297d97fSAya Levin 	}
16281297d97fSAya Levin 
16291297d97fSAya Levin 	return idx;
16301297d97fSAya Levin }
16311297d97fSAya Levin 
mlx5e_grp_per_tc_prio_update_stats(struct mlx5e_priv * priv)16321297d97fSAya Levin static void mlx5e_grp_per_tc_prio_update_stats(struct mlx5e_priv *priv)
16331297d97fSAya Levin {
16341297d97fSAya Levin 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
16351297d97fSAya Levin 	struct mlx5_core_dev *mdev = priv->mdev;
16361297d97fSAya Levin 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {};
16371297d97fSAya Levin 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
16381297d97fSAya Levin 	void *out;
16391297d97fSAya Levin 	int prio;
16401297d97fSAya Levin 
16411297d97fSAya Levin 	if (!MLX5_CAP_GEN(mdev, sbcam_reg))
16421297d97fSAya Levin 		return;
16431297d97fSAya Levin 
16441297d97fSAya Levin 	MLX5_SET(ppcnt_reg, in, pnat, 2);
16451297d97fSAya Levin 	MLX5_SET(ppcnt_reg, in, grp, MLX5_PER_TRAFFIC_CLASS_COUNTERS_GROUP);
16461297d97fSAya Levin 	for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
16471297d97fSAya Levin 		out = pstats->per_tc_prio_counters[prio];
16481297d97fSAya Levin 		MLX5_SET(ppcnt_reg, in, prio_tc, prio);
16491297d97fSAya Levin 		mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
16501297d97fSAya Levin 	}
16511297d97fSAya Levin }
16521297d97fSAya Levin 
mlx5e_grp_per_tc_congest_prio_get_num_stats(struct mlx5e_priv * priv)16531297d97fSAya Levin static int mlx5e_grp_per_tc_congest_prio_get_num_stats(struct mlx5e_priv *priv)
16541297d97fSAya Levin {
16551297d97fSAya Levin 	struct mlx5_core_dev *mdev = priv->mdev;
16561297d97fSAya Levin 
16571297d97fSAya Levin 	if (!MLX5_CAP_GEN(mdev, sbcam_reg))
16581297d97fSAya Levin 		return 0;
16591297d97fSAya Levin 
16601297d97fSAya Levin 	return NUM_PPORT_PER_TC_CONGEST_PRIO_COUNTERS * NUM_PPORT_PRIO;
16611297d97fSAya Levin }
16621297d97fSAya Levin 
mlx5e_grp_per_tc_congest_prio_update_stats(struct mlx5e_priv * priv)16631297d97fSAya Levin static void mlx5e_grp_per_tc_congest_prio_update_stats(struct mlx5e_priv *priv)
16641297d97fSAya Levin {
16651297d97fSAya Levin 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
16661297d97fSAya Levin 	struct mlx5_core_dev *mdev = priv->mdev;
16671297d97fSAya Levin 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {};
16681297d97fSAya Levin 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
16691297d97fSAya Levin 	void *out;
16701297d97fSAya Levin 	int prio;
16711297d97fSAya Levin 
16721297d97fSAya Levin 	if (!MLX5_CAP_GEN(mdev, sbcam_reg))
16731297d97fSAya Levin 		return;
16741297d97fSAya Levin 
16751297d97fSAya Levin 	MLX5_SET(ppcnt_reg, in, pnat, 2);
16761297d97fSAya Levin 	MLX5_SET(ppcnt_reg, in, grp, MLX5_PER_TRAFFIC_CLASS_CONGESTION_GROUP);
16771297d97fSAya Levin 	for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
16781297d97fSAya Levin 		out = pstats->per_tc_congest_prio_counters[prio];
16791297d97fSAya Levin 		MLX5_SET(ppcnt_reg, in, prio_tc, prio);
16801297d97fSAya Levin 		mlx5_core_access_reg(mdev, in, sz, out, sz, MLX5_REG_PPCNT, 0, 0);
16811297d97fSAya Levin 	}
16821297d97fSAya Levin }
16831297d97fSAya Levin 
MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(per_port_buff_congest)168496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(per_port_buff_congest)
16851297d97fSAya Levin {
16861297d97fSAya Levin 	return mlx5e_grp_per_tc_prio_get_num_stats(priv) +
16871297d97fSAya Levin 		mlx5e_grp_per_tc_congest_prio_get_num_stats(priv);
16881297d97fSAya Levin }
16891297d97fSAya Levin 
MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(per_port_buff_congest)169096b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(per_port_buff_congest)
16911297d97fSAya Levin {
16921297d97fSAya Levin 	mlx5e_grp_per_tc_prio_update_stats(priv);
16931297d97fSAya Levin 	mlx5e_grp_per_tc_congest_prio_update_stats(priv);
16941297d97fSAya Levin }
16951297d97fSAya Levin 
16964377bea2SKamal Heib #define PPORT_PER_PRIO_OFF(c) \
16974377bea2SKamal Heib 	MLX5_BYTE_OFF(ppcnt_reg, \
16984377bea2SKamal Heib 		      counter_set.eth_per_prio_grp_data_layout.c##_high)
1699e6000651SKamal Heib static const struct counter_desc pport_per_prio_traffic_stats_desc[] = {
1700e6000651SKamal Heib 	{ "rx_prio%d_bytes", PPORT_PER_PRIO_OFF(rx_octets) },
1701e6000651SKamal Heib 	{ "rx_prio%d_packets", PPORT_PER_PRIO_OFF(rx_frames) },
1702827a8cb2SAharon Landau 	{ "rx_prio%d_discards", PPORT_PER_PRIO_OFF(rx_discards) },
1703e6000651SKamal Heib 	{ "tx_prio%d_bytes", PPORT_PER_PRIO_OFF(tx_octets) },
1704e6000651SKamal Heib 	{ "tx_prio%d_packets", PPORT_PER_PRIO_OFF(tx_frames) },
1705e6000651SKamal Heib };
1706e6000651SKamal Heib 
1707e6000651SKamal Heib #define NUM_PPORT_PER_PRIO_TRAFFIC_COUNTERS	ARRAY_SIZE(pport_per_prio_traffic_stats_desc)
1708e6000651SKamal Heib 
mlx5e_grp_per_prio_traffic_get_num_stats(void)170954c73f86SYuval Shaia static int mlx5e_grp_per_prio_traffic_get_num_stats(void)
1710e6000651SKamal Heib {
1711e6000651SKamal Heib 	return NUM_PPORT_PER_PRIO_TRAFFIC_COUNTERS * NUM_PPORT_PRIO;
1712e6000651SKamal Heib }
1713e6000651SKamal Heib 
mlx5e_grp_per_prio_traffic_fill_strings(struct mlx5e_priv * priv,u8 * data,int idx)1714e6000651SKamal Heib static int mlx5e_grp_per_prio_traffic_fill_strings(struct mlx5e_priv *priv,
1715e6000651SKamal Heib 						   u8 *data,
1716e6000651SKamal Heib 						   int idx)
1717e6000651SKamal Heib {
1718e6000651SKamal Heib 	int i, prio;
1719e6000651SKamal Heib 
1720e6000651SKamal Heib 	for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
1721e6000651SKamal Heib 		for (i = 0; i < NUM_PPORT_PER_PRIO_TRAFFIC_COUNTERS; i++)
1722e6000651SKamal Heib 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
1723e6000651SKamal Heib 				pport_per_prio_traffic_stats_desc[i].format, prio);
1724e6000651SKamal Heib 	}
1725e6000651SKamal Heib 
1726e6000651SKamal Heib 	return idx;
1727e6000651SKamal Heib }
1728e6000651SKamal Heib 
mlx5e_grp_per_prio_traffic_fill_stats(struct mlx5e_priv * priv,u64 * data,int idx)1729e6000651SKamal Heib static int mlx5e_grp_per_prio_traffic_fill_stats(struct mlx5e_priv *priv,
1730e6000651SKamal Heib 						 u64 *data,
1731e6000651SKamal Heib 						 int idx)
1732e6000651SKamal Heib {
1733e6000651SKamal Heib 	int i, prio;
1734e6000651SKamal Heib 
1735e6000651SKamal Heib 	for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
1736e6000651SKamal Heib 		for (i = 0; i < NUM_PPORT_PER_PRIO_TRAFFIC_COUNTERS; i++)
1737e6000651SKamal Heib 			data[idx++] =
1738e6000651SKamal Heib 				MLX5E_READ_CTR64_BE(&priv->stats.pport.per_prio_counters[prio],
1739e6000651SKamal Heib 						    pport_per_prio_traffic_stats_desc, i);
1740e6000651SKamal Heib 	}
1741e6000651SKamal Heib 
1742e6000651SKamal Heib 	return idx;
1743e6000651SKamal Heib }
1744e6000651SKamal Heib 
17454377bea2SKamal Heib static const struct counter_desc pport_per_prio_pfc_stats_desc[] = {
17464377bea2SKamal Heib 	/* %s is "global" or "prio{i}" */
17474377bea2SKamal Heib 	{ "rx_%s_pause", PPORT_PER_PRIO_OFF(rx_pause) },
17484377bea2SKamal Heib 	{ "rx_%s_pause_duration", PPORT_PER_PRIO_OFF(rx_pause_duration) },
17494377bea2SKamal Heib 	{ "tx_%s_pause", PPORT_PER_PRIO_OFF(tx_pause) },
17504377bea2SKamal Heib 	{ "tx_%s_pause_duration", PPORT_PER_PRIO_OFF(tx_pause_duration) },
17514377bea2SKamal Heib 	{ "rx_%s_pause_transition", PPORT_PER_PRIO_OFF(rx_pause_transition) },
17524377bea2SKamal Heib };
17534377bea2SKamal Heib 
17542fcb12dfSInbar Karmy static const struct counter_desc pport_pfc_stall_stats_desc[] = {
17552fcb12dfSInbar Karmy 	{ "tx_pause_storm_warning_events", PPORT_PER_PRIO_OFF(device_stall_minor_watermark_cnt) },
17562fcb12dfSInbar Karmy 	{ "tx_pause_storm_error_events", PPORT_PER_PRIO_OFF(device_stall_critical_watermark_cnt) },
17572fcb12dfSInbar Karmy };
17582fcb12dfSInbar Karmy 
17594377bea2SKamal Heib #define NUM_PPORT_PER_PRIO_PFC_COUNTERS		ARRAY_SIZE(pport_per_prio_pfc_stats_desc)
17602fcb12dfSInbar Karmy #define NUM_PPORT_PFC_STALL_COUNTERS(priv)	(ARRAY_SIZE(pport_pfc_stall_stats_desc) * \
17612fcb12dfSInbar Karmy 						 MLX5_CAP_PCAM_FEATURE((priv)->mdev, pfcc_mask) * \
17622fcb12dfSInbar Karmy 						 MLX5_CAP_DEBUG((priv)->mdev, stall_detect))
17634377bea2SKamal Heib 
mlx5e_query_pfc_combined(struct mlx5e_priv * priv)17644377bea2SKamal Heib static unsigned long mlx5e_query_pfc_combined(struct mlx5e_priv *priv)
17654377bea2SKamal Heib {
17664377bea2SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
17674377bea2SKamal Heib 	u8 pfc_en_tx;
17684377bea2SKamal Heib 	u8 pfc_en_rx;
17694377bea2SKamal Heib 	int err;
17704377bea2SKamal Heib 
17714377bea2SKamal Heib 	if (MLX5_CAP_GEN(mdev, port_type) != MLX5_CAP_PORT_TYPE_ETH)
17724377bea2SKamal Heib 		return 0;
17734377bea2SKamal Heib 
17744377bea2SKamal Heib 	err = mlx5_query_port_pfc(mdev, &pfc_en_tx, &pfc_en_rx);
17754377bea2SKamal Heib 
17764377bea2SKamal Heib 	return err ? 0 : pfc_en_tx | pfc_en_rx;
17774377bea2SKamal Heib }
17784377bea2SKamal Heib 
mlx5e_query_global_pause_combined(struct mlx5e_priv * priv)17794377bea2SKamal Heib static bool mlx5e_query_global_pause_combined(struct mlx5e_priv *priv)
17804377bea2SKamal Heib {
17814377bea2SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
17824377bea2SKamal Heib 	u32 rx_pause;
17834377bea2SKamal Heib 	u32 tx_pause;
17844377bea2SKamal Heib 	int err;
17854377bea2SKamal Heib 
17864377bea2SKamal Heib 	if (MLX5_CAP_GEN(mdev, port_type) != MLX5_CAP_PORT_TYPE_ETH)
17874377bea2SKamal Heib 		return false;
17884377bea2SKamal Heib 
17894377bea2SKamal Heib 	err = mlx5_query_port_pause(mdev, &rx_pause, &tx_pause);
17904377bea2SKamal Heib 
17914377bea2SKamal Heib 	return err ? false : rx_pause | tx_pause;
17924377bea2SKamal Heib }
17934377bea2SKamal Heib 
mlx5e_grp_per_prio_pfc_get_num_stats(struct mlx5e_priv * priv)17944377bea2SKamal Heib static int mlx5e_grp_per_prio_pfc_get_num_stats(struct mlx5e_priv *priv)
17954377bea2SKamal Heib {
17964377bea2SKamal Heib 	return (mlx5e_query_global_pause_combined(priv) +
17974377bea2SKamal Heib 		hweight8(mlx5e_query_pfc_combined(priv))) *
17982fcb12dfSInbar Karmy 		NUM_PPORT_PER_PRIO_PFC_COUNTERS +
17992fcb12dfSInbar Karmy 		NUM_PPORT_PFC_STALL_COUNTERS(priv);
18004377bea2SKamal Heib }
18014377bea2SKamal Heib 
mlx5e_grp_per_prio_pfc_fill_strings(struct mlx5e_priv * priv,u8 * data,int idx)18024377bea2SKamal Heib static int mlx5e_grp_per_prio_pfc_fill_strings(struct mlx5e_priv *priv,
18034377bea2SKamal Heib 					       u8 *data,
18044377bea2SKamal Heib 					       int idx)
18054377bea2SKamal Heib {
18064377bea2SKamal Heib 	unsigned long pfc_combined;
18074377bea2SKamal Heib 	int i, prio;
18084377bea2SKamal Heib 
18094377bea2SKamal Heib 	pfc_combined = mlx5e_query_pfc_combined(priv);
18104377bea2SKamal Heib 	for_each_set_bit(prio, &pfc_combined, NUM_PPORT_PRIO) {
18114377bea2SKamal Heib 		for (i = 0; i < NUM_PPORT_PER_PRIO_PFC_COUNTERS; i++) {
18124377bea2SKamal Heib 			char pfc_string[ETH_GSTRING_LEN];
18134377bea2SKamal Heib 
18144377bea2SKamal Heib 			snprintf(pfc_string, sizeof(pfc_string), "prio%d", prio);
18154377bea2SKamal Heib 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
18164377bea2SKamal Heib 				pport_per_prio_pfc_stats_desc[i].format, pfc_string);
18174377bea2SKamal Heib 		}
18184377bea2SKamal Heib 	}
18194377bea2SKamal Heib 
18204377bea2SKamal Heib 	if (mlx5e_query_global_pause_combined(priv)) {
18214377bea2SKamal Heib 		for (i = 0; i < NUM_PPORT_PER_PRIO_PFC_COUNTERS; i++) {
18224377bea2SKamal Heib 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
18234377bea2SKamal Heib 				pport_per_prio_pfc_stats_desc[i].format, "global");
18244377bea2SKamal Heib 		}
18254377bea2SKamal Heib 	}
18264377bea2SKamal Heib 
18272fcb12dfSInbar Karmy 	for (i = 0; i < NUM_PPORT_PFC_STALL_COUNTERS(priv); i++)
18282fcb12dfSInbar Karmy 		strcpy(data + (idx++) * ETH_GSTRING_LEN,
18292fcb12dfSInbar Karmy 		       pport_pfc_stall_stats_desc[i].format);
18302fcb12dfSInbar Karmy 
18314377bea2SKamal Heib 	return idx;
18324377bea2SKamal Heib }
18334377bea2SKamal Heib 
mlx5e_grp_per_prio_pfc_fill_stats(struct mlx5e_priv * priv,u64 * data,int idx)18344377bea2SKamal Heib static int mlx5e_grp_per_prio_pfc_fill_stats(struct mlx5e_priv *priv,
18354377bea2SKamal Heib 					     u64 *data,
18364377bea2SKamal Heib 					     int idx)
18374377bea2SKamal Heib {
18384377bea2SKamal Heib 	unsigned long pfc_combined;
18394377bea2SKamal Heib 	int i, prio;
18404377bea2SKamal Heib 
18414377bea2SKamal Heib 	pfc_combined = mlx5e_query_pfc_combined(priv);
18424377bea2SKamal Heib 	for_each_set_bit(prio, &pfc_combined, NUM_PPORT_PRIO) {
18434377bea2SKamal Heib 		for (i = 0; i < NUM_PPORT_PER_PRIO_PFC_COUNTERS; i++) {
18444377bea2SKamal Heib 			data[idx++] =
18454377bea2SKamal Heib 				MLX5E_READ_CTR64_BE(&priv->stats.pport.per_prio_counters[prio],
18464377bea2SKamal Heib 						    pport_per_prio_pfc_stats_desc, i);
18474377bea2SKamal Heib 		}
18484377bea2SKamal Heib 	}
18494377bea2SKamal Heib 
18504377bea2SKamal Heib 	if (mlx5e_query_global_pause_combined(priv)) {
18514377bea2SKamal Heib 		for (i = 0; i < NUM_PPORT_PER_PRIO_PFC_COUNTERS; i++) {
18524377bea2SKamal Heib 			data[idx++] =
18534377bea2SKamal Heib 				MLX5E_READ_CTR64_BE(&priv->stats.pport.per_prio_counters[0],
18544377bea2SKamal Heib 						    pport_per_prio_pfc_stats_desc, i);
18554377bea2SKamal Heib 		}
18564377bea2SKamal Heib 	}
18574377bea2SKamal Heib 
18582fcb12dfSInbar Karmy 	for (i = 0; i < NUM_PPORT_PFC_STALL_COUNTERS(priv); i++)
18592fcb12dfSInbar Karmy 		data[idx++] = MLX5E_READ_CTR64_BE(&priv->stats.pport.per_prio_counters[0],
18602fcb12dfSInbar Karmy 						  pport_pfc_stall_stats_desc, i);
18612fcb12dfSInbar Karmy 
18624377bea2SKamal Heib 	return idx;
18634377bea2SKamal Heib }
18644377bea2SKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(per_prio)186596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(per_prio)
1866a8984281SKamal Heib {
186754c73f86SYuval Shaia 	return mlx5e_grp_per_prio_traffic_get_num_stats() +
1868a8984281SKamal Heib 		mlx5e_grp_per_prio_pfc_get_num_stats(priv);
1869a8984281SKamal Heib }
1870a8984281SKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(per_prio)187196b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(per_prio)
1872a8984281SKamal Heib {
1873a8984281SKamal Heib 	idx = mlx5e_grp_per_prio_traffic_fill_strings(priv, data, idx);
1874a8984281SKamal Heib 	idx = mlx5e_grp_per_prio_pfc_fill_strings(priv, data, idx);
1875a8984281SKamal Heib 	return idx;
1876a8984281SKamal Heib }
1877a8984281SKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(per_prio)187896b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(per_prio)
1879a8984281SKamal Heib {
1880a8984281SKamal Heib 	idx = mlx5e_grp_per_prio_traffic_fill_stats(priv, data, idx);
1881a8984281SKamal Heib 	idx = mlx5e_grp_per_prio_pfc_fill_stats(priv, data, idx);
1882a8984281SKamal Heib 	return idx;
1883a8984281SKamal Heib }
1884a8984281SKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(per_prio)188596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(per_prio)
188619386177SKamal Heib {
188719386177SKamal Heib 	struct mlx5e_pport_stats *pstats = &priv->stats.pport;
188819386177SKamal Heib 	struct mlx5_core_dev *mdev = priv->mdev;
188919386177SKamal Heib 	u32 in[MLX5_ST_SZ_DW(ppcnt_reg)] = {0};
189019386177SKamal Heib 	int sz = MLX5_ST_SZ_BYTES(ppcnt_reg);
189119386177SKamal Heib 	int prio;
189219386177SKamal Heib 	void *out;
189319386177SKamal Heib 
189475370eb0SEyal Davidovich 	if (!MLX5_BASIC_PPCNT_SUPPORTED(mdev))
189575370eb0SEyal Davidovich 		return;
189675370eb0SEyal Davidovich 
189719386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, local_port, 1);
189819386177SKamal Heib 	MLX5_SET(ppcnt_reg, in, grp, MLX5_PER_PRIORITY_COUNTERS_GROUP);
189919386177SKamal Heib 	for (prio = 0; prio < NUM_PPORT_PRIO; prio++) {
190019386177SKamal Heib 		out = pstats->per_prio_counters[prio];
190119386177SKamal Heib 		MLX5_SET(ppcnt_reg, in, prio_tc, prio);
190219386177SKamal Heib 		mlx5_core_access_reg(mdev, in, sz, out, sz,
190319386177SKamal Heib 				     MLX5_REG_PPCNT, 0, 0);
190419386177SKamal Heib 	}
190519386177SKamal Heib }
190619386177SKamal Heib 
19070e6f01a4SKamal Heib static const struct counter_desc mlx5e_pme_status_desc[] = {
1908c2fb3db2SMikhael Goikhman 	{ "module_unplug",       sizeof(u64) * MLX5_MODULE_STATUS_UNPLUGGED },
19090e6f01a4SKamal Heib };
19100e6f01a4SKamal Heib 
19110e6f01a4SKamal Heib static const struct counter_desc mlx5e_pme_error_desc[] = {
1912c2fb3db2SMikhael Goikhman 	{ "module_bus_stuck",    sizeof(u64) * MLX5_MODULE_EVENT_ERROR_BUS_STUCK },
1913c2fb3db2SMikhael Goikhman 	{ "module_high_temp",    sizeof(u64) * MLX5_MODULE_EVENT_ERROR_HIGH_TEMPERATURE },
1914c2fb3db2SMikhael Goikhman 	{ "module_bad_shorted",  sizeof(u64) * MLX5_MODULE_EVENT_ERROR_BAD_CABLE },
19150e6f01a4SKamal Heib };
19160e6f01a4SKamal Heib 
19170e6f01a4SKamal Heib #define NUM_PME_STATUS_STATS		ARRAY_SIZE(mlx5e_pme_status_desc)
19180e6f01a4SKamal Heib #define NUM_PME_ERR_STATS		ARRAY_SIZE(mlx5e_pme_error_desc)
19190e6f01a4SKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(pme)192096b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(pme)
19210e6f01a4SKamal Heib {
19220e6f01a4SKamal Heib 	return NUM_PME_STATUS_STATS + NUM_PME_ERR_STATS;
19230e6f01a4SKamal Heib }
19240e6f01a4SKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(pme)192596b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(pme)
19260e6f01a4SKamal Heib {
19270e6f01a4SKamal Heib 	int i;
19280e6f01a4SKamal Heib 
19290e6f01a4SKamal Heib 	for (i = 0; i < NUM_PME_STATUS_STATS; i++)
19300e6f01a4SKamal Heib 		strcpy(data + (idx++) * ETH_GSTRING_LEN, mlx5e_pme_status_desc[i].format);
19310e6f01a4SKamal Heib 
19320e6f01a4SKamal Heib 	for (i = 0; i < NUM_PME_ERR_STATS; i++)
19330e6f01a4SKamal Heib 		strcpy(data + (idx++) * ETH_GSTRING_LEN, mlx5e_pme_error_desc[i].format);
19340e6f01a4SKamal Heib 
19350e6f01a4SKamal Heib 	return idx;
19360e6f01a4SKamal Heib }
19370e6f01a4SKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(pme)193896b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(pme)
19390e6f01a4SKamal Heib {
194069c1280bSSaeed Mahameed 	struct mlx5_pme_stats pme_stats;
19410e6f01a4SKamal Heib 	int i;
19420e6f01a4SKamal Heib 
194369c1280bSSaeed Mahameed 	mlx5_get_pme_stats(priv->mdev, &pme_stats);
194469c1280bSSaeed Mahameed 
19450e6f01a4SKamal Heib 	for (i = 0; i < NUM_PME_STATUS_STATS; i++)
194669c1280bSSaeed Mahameed 		data[idx++] = MLX5E_READ_CTR64_CPU(pme_stats.status_counters,
19470e6f01a4SKamal Heib 						   mlx5e_pme_status_desc, i);
19480e6f01a4SKamal Heib 
19490e6f01a4SKamal Heib 	for (i = 0; i < NUM_PME_ERR_STATS; i++)
195069c1280bSSaeed Mahameed 		data[idx++] = MLX5E_READ_CTR64_CPU(pme_stats.error_counters,
19510e6f01a4SKamal Heib 						   mlx5e_pme_error_desc, i);
19520e6f01a4SKamal Heib 
19530e6f01a4SKamal Heib 	return idx;
19540e6f01a4SKamal Heib }
19550e6f01a4SKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(pme)195696b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(pme) { return; }
195796b12796SSaeed Mahameed 
MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(tls)195896b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(tls)
195943585a41SIlya Lesokhin {
1960943aa7bdSLeon Romanovsky 	return mlx5e_ktls_get_count(priv);
196143585a41SIlya Lesokhin }
196243585a41SIlya Lesokhin 
MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(tls)196396b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(tls)
196443585a41SIlya Lesokhin {
1965943aa7bdSLeon Romanovsky 	return idx + mlx5e_ktls_get_strings(priv, data + idx * ETH_GSTRING_LEN);
196643585a41SIlya Lesokhin }
196743585a41SIlya Lesokhin 
MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(tls)196896b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(tls)
196943585a41SIlya Lesokhin {
1970943aa7bdSLeon Romanovsky 	return idx + mlx5e_ktls_get_stats(priv, data + idx);
197143585a41SIlya Lesokhin }
197243585a41SIlya Lesokhin 
MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(tls)197396b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(tls) { return; }
197496b12796SSaeed Mahameed 
19751fe85006SKamal Heib static const struct counter_desc rq_stats_desc[] = {
19761fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, packets) },
19771fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, bytes) },
19781fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_complete) },
19790aa1d186SSaeed Mahameed 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_complete_tail) },
19800aa1d186SSaeed Mahameed 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_complete_tail_slow) },
19811fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_unnecessary) },
19821fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_unnecessary_inner) },
19831fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, csum_none) },
19841fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, xdp_drop) },
198586690b4bSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, xdp_redirect) },
19861fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, lro_packets) },
19871fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, lro_bytes) },
1988def09e7bSKhalid Manaa 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, gro_packets) },
1989def09e7bSKhalid Manaa 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, gro_bytes) },
1990def09e7bSKhalid Manaa 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, gro_skbs) },
1991def09e7bSKhalid Manaa 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, gro_match_packets) },
1992def09e7bSKhalid Manaa 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, gro_large_hds) },
1993f007c13dSNatali Shechtman 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, ecn_mark) },
1994f24686e8SGal Pressman 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, removed_vlan_packets) },
19951fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, wqe_err) },
1996b71ba6b4STariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, mpwqe_filler_cqes) },
1997b71ba6b4STariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, mpwqe_filler_strides) },
19980073c8f7SMoshe Shemesh 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, oversize_pkts_sw_drop) },
19991fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, buff_alloc_err) },
20001fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, cqe_compress_blks) },
20011fe85006SKamal Heib 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, cqe_compress_pkts) },
2002dc983f0eSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, congst_umr) },
2003*f98e5158SAdham Faris #ifdef CONFIG_MLX5_EN_ARFS
2004*f98e5158SAdham Faris 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, arfs_add) },
2005*f98e5158SAdham Faris 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, arfs_request_in) },
2006*f98e5158SAdham Faris 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, arfs_request_out) },
2007*f98e5158SAdham Faris 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, arfs_expired) },
200894563847SEran Ben Elisha 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, arfs_err) },
2009*f98e5158SAdham Faris #endif
2010be5323c8SAya Levin 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, recover) },
2011cc10e84bSJoe Damato #ifdef CONFIG_PAGE_POOL_STATS
2012cc10e84bSJoe Damato 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, pp_alloc_fast) },
2013cc10e84bSJoe Damato 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, pp_alloc_slow) },
2014cc10e84bSJoe Damato 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, pp_alloc_slow_high_order) },
2015cc10e84bSJoe Damato 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, pp_alloc_empty) },
2016cc10e84bSJoe Damato 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, pp_alloc_refill) },
2017cc10e84bSJoe Damato 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, pp_alloc_waive) },
2018cc10e84bSJoe Damato 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, pp_recycle_cached) },
2019cc10e84bSJoe Damato 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, pp_recycle_cache_full) },
2020cc10e84bSJoe Damato 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, pp_recycle_ring) },
2021cc10e84bSJoe Damato 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, pp_recycle_ring_full) },
2022cc10e84bSJoe Damato 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, pp_recycle_released_ref) },
2023cc10e84bSJoe Damato #endif
202476c1e1acSTariq Toukan #ifdef CONFIG_MLX5_EN_TLS
202576c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_decrypted_packets) },
202676c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_decrypted_bytes) },
202776c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_req_pkt) },
202876c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_req_start) },
202976c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_req_end) },
203076c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_req_skip) },
203176c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_res_ok) },
2032e9ce991bSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_res_retry) },
203376c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_resync_res_skip) },
203476c1e1acSTariq Toukan 	{ MLX5E_DECLARE_RX_STAT(struct mlx5e_rq_stats, tls_err) },
203576c1e1acSTariq Toukan #endif
20361fe85006SKamal Heib };
20371fe85006SKamal Heib 
20381fe85006SKamal Heib static const struct counter_desc sq_stats_desc[] = {
20391fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, packets) },
20401fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, bytes) },
20411fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tso_packets) },
20421fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tso_bytes) },
20431fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tso_inner_packets) },
20441fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tso_inner_bytes) },
20451fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, csum_partial) },
20461fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, csum_partial_inner) },
2047f24686e8SGal Pressman 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, added_vlan_packets) },
20481fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, nop) },
20495af75c74SMaxim Mikityanskiy 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, mpwqe_blks) },
20505af75c74SMaxim Mikityanskiy 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, mpwqe_pkts) },
2051d2ead1f3STariq Toukan #ifdef CONFIG_MLX5_EN_TLS
2052d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_encrypted_packets) },
2053d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_encrypted_bytes) },
2054d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_ooo) },
2055d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_dump_packets) },
2056d2ead1f3STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_dump_bytes) },
205746a3ea98STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_resync_bytes) },
205846a3ea98STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_skip_no_sync_data) },
205946a3ea98STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_drop_no_sync_data) },
206046a3ea98STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, tls_drop_bypass_req) },
2061d2ead1f3STariq Toukan #endif
20621fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, csum_none) },
20631fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, stopped) },
20641fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, dropped) },
20651fe85006SKamal Heib 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, xmit_more) },
2066db75373cSEran Ben Elisha 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, recover) },
206786155656STariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, cqes) },
2068f65a59ffSTariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, wake) },
2069f65a59ffSTariq Toukan 	{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, cqe_err) },
20701fe85006SKamal Heib };
20711fe85006SKamal Heib 
2072890388adSTariq Toukan static const struct counter_desc rq_xdpsq_stats_desc[] = {
2073890388adSTariq Toukan 	{ MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, xmit) },
207473cab880SShay Agroskin 	{ MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, mpwqe) },
2075c2273219SShay Agroskin 	{ MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, inlnw) },
20766c085a8aSShay Agroskin 	{ MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, nops) },
2077890388adSTariq Toukan 	{ MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, full) },
2078890388adSTariq Toukan 	{ MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, err) },
2079890388adSTariq Toukan 	{ MLX5E_DECLARE_RQ_XDPSQ_STAT(struct mlx5e_xdpsq_stats, cqes) },
2080890388adSTariq Toukan };
2081890388adSTariq Toukan 
208258b99ee3STariq Toukan static const struct counter_desc xdpsq_stats_desc[] = {
208358b99ee3STariq Toukan 	{ MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, xmit) },
208473cab880SShay Agroskin 	{ MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, mpwqe) },
2085c2273219SShay Agroskin 	{ MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, inlnw) },
20866c085a8aSShay Agroskin 	{ MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, nops) },
208758b99ee3STariq Toukan 	{ MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, full) },
208858b99ee3STariq Toukan 	{ MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, err) },
208958b99ee3STariq Toukan 	{ MLX5E_DECLARE_XDPSQ_STAT(struct mlx5e_xdpsq_stats, cqes) },
209058b99ee3STariq Toukan };
209158b99ee3STariq Toukan 
2092db05815bSMaxim Mikityanskiy static const struct counter_desc xskrq_stats_desc[] = {
2093db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, packets) },
2094db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, bytes) },
2095db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, csum_complete) },
2096db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, csum_unnecessary) },
2097db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, csum_unnecessary_inner) },
2098db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, csum_none) },
2099db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, ecn_mark) },
2100db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, removed_vlan_packets) },
2101db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, xdp_drop) },
2102db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, xdp_redirect) },
2103db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, wqe_err) },
2104db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, mpwqe_filler_cqes) },
2105db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, mpwqe_filler_strides) },
2106db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, oversize_pkts_sw_drop) },
2107db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, buff_alloc_err) },
2108db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, cqe_compress_blks) },
2109db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, cqe_compress_pkts) },
2110db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKRQ_STAT(struct mlx5e_rq_stats, congst_umr) },
2111db05815bSMaxim Mikityanskiy };
2112db05815bSMaxim Mikityanskiy 
2113db05815bSMaxim Mikityanskiy static const struct counter_desc xsksq_stats_desc[] = {
2114db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKSQ_STAT(struct mlx5e_xdpsq_stats, xmit) },
2115db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKSQ_STAT(struct mlx5e_xdpsq_stats, mpwqe) },
2116db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKSQ_STAT(struct mlx5e_xdpsq_stats, inlnw) },
2117db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKSQ_STAT(struct mlx5e_xdpsq_stats, full) },
2118db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKSQ_STAT(struct mlx5e_xdpsq_stats, err) },
2119db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_XSKSQ_STAT(struct mlx5e_xdpsq_stats, cqes) },
2120db05815bSMaxim Mikityanskiy };
2121db05815bSMaxim Mikityanskiy 
212257d689a8SEran Ben Elisha static const struct counter_desc ch_stats_desc[] = {
2123a1bf74dcSTariq Toukan 	{ MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, events) },
21242d7103c8STariq Toukan 	{ MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, poll) },
21252d7103c8STariq Toukan 	{ MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, arm) },
21262d7103c8STariq Toukan 	{ MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, aff_change) },
2127db05815bSMaxim Mikityanskiy 	{ MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, force_irq) },
212857d689a8SEran Ben Elisha 	{ MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, eq_rearm) },
212957d689a8SEran Ben Elisha };
213057d689a8SEran Ben Elisha 
2131145e5637SEran Ben Elisha static const struct counter_desc ptp_sq_stats_desc[] = {
2132145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, packets) },
2133145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, bytes) },
2134145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, csum_partial) },
2135145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, csum_partial_inner) },
2136145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, added_vlan_packets) },
2137145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, nop) },
2138145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, csum_none) },
2139145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, stopped) },
2140145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, dropped) },
2141145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, xmit_more) },
2142145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, recover) },
2143145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, cqes) },
2144145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, wake) },
2145145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_TX_STAT(struct mlx5e_sq_stats, cqe_err) },
2146145e5637SEran Ben Elisha };
2147145e5637SEran Ben Elisha 
2148145e5637SEran Ben Elisha static const struct counter_desc ptp_ch_stats_desc[] = {
2149145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_CH_STAT(struct mlx5e_ch_stats, events) },
2150145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_CH_STAT(struct mlx5e_ch_stats, poll) },
2151145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_CH_STAT(struct mlx5e_ch_stats, arm) },
2152145e5637SEran Ben Elisha 	{ MLX5E_DECLARE_PTP_CH_STAT(struct mlx5e_ch_stats, eq_rearm) },
2153145e5637SEran Ben Elisha };
2154145e5637SEran Ben Elisha 
21551880bc4eSEran Ben Elisha static const struct counter_desc ptp_cq_stats_desc[] = {
21561880bc4eSEran Ben Elisha 	{ MLX5E_DECLARE_PTP_CQ_STAT(struct mlx5e_ptp_cq_stats, cqe) },
21571880bc4eSEran Ben Elisha 	{ MLX5E_DECLARE_PTP_CQ_STAT(struct mlx5e_ptp_cq_stats, err_cqe) },
21581880bc4eSEran Ben Elisha 	{ MLX5E_DECLARE_PTP_CQ_STAT(struct mlx5e_ptp_cq_stats, abort) },
21591880bc4eSEran Ben Elisha 	{ MLX5E_DECLARE_PTP_CQ_STAT(struct mlx5e_ptp_cq_stats, abort_abs_diff_ns) },
21603178308aSRahul Rameshbabu 	{ MLX5E_DECLARE_PTP_CQ_STAT(struct mlx5e_ptp_cq_stats, late_cqe) },
21611880bc4eSEran Ben Elisha };
21621880bc4eSEran Ben Elisha 
2163a28359e9SAya Levin static const struct counter_desc ptp_rq_stats_desc[] = {
2164a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, packets) },
2165a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, bytes) },
2166a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, csum_complete) },
2167a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, csum_complete_tail) },
2168a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, csum_complete_tail_slow) },
2169a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, csum_unnecessary) },
2170a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, csum_unnecessary_inner) },
2171a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, csum_none) },
2172a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, xdp_drop) },
2173a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, xdp_redirect) },
2174a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, lro_packets) },
2175a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, lro_bytes) },
2176a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, ecn_mark) },
2177a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, removed_vlan_packets) },
2178a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, wqe_err) },
2179a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, mpwqe_filler_cqes) },
2180a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, mpwqe_filler_strides) },
2181a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, oversize_pkts_sw_drop) },
2182a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, buff_alloc_err) },
2183a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, cqe_compress_blks) },
2184a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, cqe_compress_pkts) },
2185a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, congst_umr) },
2186a28359e9SAya Levin 	{ MLX5E_DECLARE_PTP_RQ_STAT(struct mlx5e_rq_stats, recover) },
2187a28359e9SAya Levin };
2188a28359e9SAya Levin 
2189214baf22SMaxim Mikityanskiy static const struct counter_desc qos_sq_stats_desc[] = {
2190214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, packets) },
2191214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, bytes) },
2192214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tso_packets) },
2193214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tso_bytes) },
2194214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tso_inner_packets) },
2195214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tso_inner_bytes) },
2196214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, csum_partial) },
2197214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, csum_partial_inner) },
2198214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, added_vlan_packets) },
2199214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, nop) },
2200214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, mpwqe_blks) },
2201214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, mpwqe_pkts) },
2202214baf22SMaxim Mikityanskiy #ifdef CONFIG_MLX5_EN_TLS
2203214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_encrypted_packets) },
2204214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_encrypted_bytes) },
2205214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_ooo) },
2206214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_dump_packets) },
2207214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_dump_bytes) },
2208214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_resync_bytes) },
2209214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_skip_no_sync_data) },
2210214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_drop_no_sync_data) },
2211214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, tls_drop_bypass_req) },
2212214baf22SMaxim Mikityanskiy #endif
2213214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, csum_none) },
2214214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, stopped) },
2215214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, dropped) },
2216214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, xmit_more) },
2217214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, recover) },
2218214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, cqes) },
2219214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, wake) },
2220214baf22SMaxim Mikityanskiy 	{ MLX5E_DECLARE_QOS_TX_STAT(struct mlx5e_sq_stats, cqe_err) },
2221214baf22SMaxim Mikityanskiy };
2222214baf22SMaxim Mikityanskiy 
22231fe85006SKamal Heib #define NUM_RQ_STATS			ARRAY_SIZE(rq_stats_desc)
22241fe85006SKamal Heib #define NUM_SQ_STATS			ARRAY_SIZE(sq_stats_desc)
222558b99ee3STariq Toukan #define NUM_XDPSQ_STATS			ARRAY_SIZE(xdpsq_stats_desc)
2226890388adSTariq Toukan #define NUM_RQ_XDPSQ_STATS		ARRAY_SIZE(rq_xdpsq_stats_desc)
2227db05815bSMaxim Mikityanskiy #define NUM_XSKRQ_STATS			ARRAY_SIZE(xskrq_stats_desc)
2228db05815bSMaxim Mikityanskiy #define NUM_XSKSQ_STATS			ARRAY_SIZE(xsksq_stats_desc)
222957d689a8SEran Ben Elisha #define NUM_CH_STATS			ARRAY_SIZE(ch_stats_desc)
2230145e5637SEran Ben Elisha #define NUM_PTP_SQ_STATS		ARRAY_SIZE(ptp_sq_stats_desc)
2231145e5637SEran Ben Elisha #define NUM_PTP_CH_STATS		ARRAY_SIZE(ptp_ch_stats_desc)
22321880bc4eSEran Ben Elisha #define NUM_PTP_CQ_STATS		ARRAY_SIZE(ptp_cq_stats_desc)
2233a28359e9SAya Levin #define NUM_PTP_RQ_STATS                ARRAY_SIZE(ptp_rq_stats_desc)
2234214baf22SMaxim Mikityanskiy #define NUM_QOS_SQ_STATS		ARRAY_SIZE(qos_sq_stats_desc)
2235214baf22SMaxim Mikityanskiy 
MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(qos)2236214baf22SMaxim Mikityanskiy static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(qos)
2237214baf22SMaxim Mikityanskiy {
2238214baf22SMaxim Mikityanskiy 	/* Pairs with smp_store_release in mlx5e_open_qos_sq. */
2239db83f24dSMoshe Tal 	return NUM_QOS_SQ_STATS * smp_load_acquire(&priv->htb_max_qos_sqs);
2240214baf22SMaxim Mikityanskiy }
2241214baf22SMaxim Mikityanskiy 
MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(qos)2242214baf22SMaxim Mikityanskiy static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(qos)
2243214baf22SMaxim Mikityanskiy {
2244214baf22SMaxim Mikityanskiy 	/* Pairs with smp_store_release in mlx5e_open_qos_sq. */
2245db83f24dSMoshe Tal 	u16 max_qos_sqs = smp_load_acquire(&priv->htb_max_qos_sqs);
2246214baf22SMaxim Mikityanskiy 	int i, qid;
2247214baf22SMaxim Mikityanskiy 
2248214baf22SMaxim Mikityanskiy 	for (qid = 0; qid < max_qos_sqs; qid++)
2249214baf22SMaxim Mikityanskiy 		for (i = 0; i < NUM_QOS_SQ_STATS; i++)
2250214baf22SMaxim Mikityanskiy 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
2251214baf22SMaxim Mikityanskiy 				qos_sq_stats_desc[i].format, qid);
2252214baf22SMaxim Mikityanskiy 
2253214baf22SMaxim Mikityanskiy 	return idx;
2254214baf22SMaxim Mikityanskiy }
2255214baf22SMaxim Mikityanskiy 
MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(qos)2256214baf22SMaxim Mikityanskiy static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(qos)
2257214baf22SMaxim Mikityanskiy {
2258214baf22SMaxim Mikityanskiy 	struct mlx5e_sq_stats **stats;
2259214baf22SMaxim Mikityanskiy 	u16 max_qos_sqs;
2260214baf22SMaxim Mikityanskiy 	int i, qid;
2261214baf22SMaxim Mikityanskiy 
2262214baf22SMaxim Mikityanskiy 	/* Pairs with smp_store_release in mlx5e_open_qos_sq. */
2263db83f24dSMoshe Tal 	max_qos_sqs = smp_load_acquire(&priv->htb_max_qos_sqs);
2264db83f24dSMoshe Tal 	stats = READ_ONCE(priv->htb_qos_sq_stats);
2265214baf22SMaxim Mikityanskiy 
2266214baf22SMaxim Mikityanskiy 	for (qid = 0; qid < max_qos_sqs; qid++) {
2267214baf22SMaxim Mikityanskiy 		struct mlx5e_sq_stats *s = READ_ONCE(stats[qid]);
2268214baf22SMaxim Mikityanskiy 
2269214baf22SMaxim Mikityanskiy 		for (i = 0; i < NUM_QOS_SQ_STATS; i++)
2270214baf22SMaxim Mikityanskiy 			data[idx++] = MLX5E_READ_CTR64_CPU(s, qos_sq_stats_desc, i);
2271214baf22SMaxim Mikityanskiy 	}
2272214baf22SMaxim Mikityanskiy 
2273214baf22SMaxim Mikityanskiy 	return idx;
2274214baf22SMaxim Mikityanskiy }
2275214baf22SMaxim Mikityanskiy 
MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(qos)2276214baf22SMaxim Mikityanskiy static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(qos) { return; }
2277145e5637SEran Ben Elisha 
MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(ptp)2278145e5637SEran Ben Elisha static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(ptp)
2279145e5637SEran Ben Elisha {
2280a28359e9SAya Levin 	int num = NUM_PTP_CH_STATS;
2281a28359e9SAya Levin 
2282a28359e9SAya Levin 	if (!priv->tx_ptp_opened && !priv->rx_ptp_opened)
2283a28359e9SAya Levin 		return 0;
2284a28359e9SAya Levin 
2285a28359e9SAya Levin 	if (priv->tx_ptp_opened)
2286a28359e9SAya Levin 		num += (NUM_PTP_SQ_STATS + NUM_PTP_CQ_STATS) * priv->max_opened_tc;
2287a28359e9SAya Levin 	if (priv->rx_ptp_opened)
2288a28359e9SAya Levin 		num += NUM_PTP_RQ_STATS;
2289a28359e9SAya Levin 
2290a28359e9SAya Levin 	return num;
2291145e5637SEran Ben Elisha }
2292145e5637SEran Ben Elisha 
MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(ptp)2293145e5637SEran Ben Elisha static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(ptp)
2294145e5637SEran Ben Elisha {
2295145e5637SEran Ben Elisha 	int i, tc;
2296145e5637SEran Ben Elisha 
2297a28359e9SAya Levin 	if (!priv->tx_ptp_opened && !priv->rx_ptp_opened)
2298145e5637SEran Ben Elisha 		return idx;
2299145e5637SEran Ben Elisha 
2300145e5637SEran Ben Elisha 	for (i = 0; i < NUM_PTP_CH_STATS; i++)
2301145e5637SEran Ben Elisha 		sprintf(data + (idx++) * ETH_GSTRING_LEN,
2302aef0f8c6SSaeed Mahameed 			"%s", ptp_ch_stats_desc[i].format);
2303145e5637SEran Ben Elisha 
2304a28359e9SAya Levin 	if (priv->tx_ptp_opened) {
2305145e5637SEran Ben Elisha 		for (tc = 0; tc < priv->max_opened_tc; tc++)
2306145e5637SEran Ben Elisha 			for (i = 0; i < NUM_PTP_SQ_STATS; i++)
2307145e5637SEran Ben Elisha 				sprintf(data + (idx++) * ETH_GSTRING_LEN,
2308145e5637SEran Ben Elisha 					ptp_sq_stats_desc[i].format, tc);
2309145e5637SEran Ben Elisha 
23101880bc4eSEran Ben Elisha 		for (tc = 0; tc < priv->max_opened_tc; tc++)
23111880bc4eSEran Ben Elisha 			for (i = 0; i < NUM_PTP_CQ_STATS; i++)
23121880bc4eSEran Ben Elisha 				sprintf(data + (idx++) * ETH_GSTRING_LEN,
23131880bc4eSEran Ben Elisha 					ptp_cq_stats_desc[i].format, tc);
2314a28359e9SAya Levin 	}
2315a28359e9SAya Levin 	if (priv->rx_ptp_opened) {
2316a28359e9SAya Levin 		for (i = 0; i < NUM_PTP_RQ_STATS; i++)
2317a28359e9SAya Levin 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
2318dd1979cfSLama Kayal 				ptp_rq_stats_desc[i].format, MLX5E_PTP_CHANNEL_IX);
2319a28359e9SAya Levin 	}
2320145e5637SEran Ben Elisha 	return idx;
2321145e5637SEran Ben Elisha }
2322145e5637SEran Ben Elisha 
MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(ptp)2323145e5637SEran Ben Elisha static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(ptp)
2324145e5637SEran Ben Elisha {
2325145e5637SEran Ben Elisha 	int i, tc;
2326145e5637SEran Ben Elisha 
2327a28359e9SAya Levin 	if (!priv->tx_ptp_opened && !priv->rx_ptp_opened)
2328145e5637SEran Ben Elisha 		return idx;
2329145e5637SEran Ben Elisha 
2330145e5637SEran Ben Elisha 	for (i = 0; i < NUM_PTP_CH_STATS; i++)
2331145e5637SEran Ben Elisha 		data[idx++] =
2332b0d35de4SAya Levin 			MLX5E_READ_CTR64_CPU(&priv->ptp_stats.ch,
2333145e5637SEran Ben Elisha 					     ptp_ch_stats_desc, i);
2334145e5637SEran Ben Elisha 
2335a28359e9SAya Levin 	if (priv->tx_ptp_opened) {
2336145e5637SEran Ben Elisha 		for (tc = 0; tc < priv->max_opened_tc; tc++)
2337145e5637SEran Ben Elisha 			for (i = 0; i < NUM_PTP_SQ_STATS; i++)
2338145e5637SEran Ben Elisha 				data[idx++] =
2339b0d35de4SAya Levin 					MLX5E_READ_CTR64_CPU(&priv->ptp_stats.sq[tc],
2340145e5637SEran Ben Elisha 							     ptp_sq_stats_desc, i);
2341145e5637SEran Ben Elisha 
23421880bc4eSEran Ben Elisha 		for (tc = 0; tc < priv->max_opened_tc; tc++)
23431880bc4eSEran Ben Elisha 			for (i = 0; i < NUM_PTP_CQ_STATS; i++)
23441880bc4eSEran Ben Elisha 				data[idx++] =
2345b0d35de4SAya Levin 					MLX5E_READ_CTR64_CPU(&priv->ptp_stats.cq[tc],
23461880bc4eSEran Ben Elisha 							     ptp_cq_stats_desc, i);
2347a28359e9SAya Levin 	}
2348a28359e9SAya Levin 	if (priv->rx_ptp_opened) {
2349a28359e9SAya Levin 		for (i = 0; i < NUM_PTP_RQ_STATS; i++)
2350a28359e9SAya Levin 			data[idx++] =
2351a28359e9SAya Levin 				MLX5E_READ_CTR64_CPU(&priv->ptp_stats.rq,
2352a28359e9SAya Levin 						     ptp_rq_stats_desc, i);
2353a28359e9SAya Levin 	}
2354145e5637SEran Ben Elisha 	return idx;
2355145e5637SEran Ben Elisha }
2356145e5637SEran Ben Elisha 
MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(ptp)2357145e5637SEran Ben Elisha static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(ptp) { return; }
23581fe85006SKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(channels)235996b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(channels)
23601fe85006SKamal Heib {
23619d758d4aSTariq Toukan 	int max_nch = priv->stats_nch;
236205909babSEran Ben Elisha 
236305909babSEran Ben Elisha 	return (NUM_RQ_STATS * max_nch) +
236405909babSEran Ben Elisha 	       (NUM_CH_STATS * max_nch) +
2365890388adSTariq Toukan 	       (NUM_SQ_STATS * max_nch * priv->max_opened_tc) +
236658b99ee3STariq Toukan 	       (NUM_RQ_XDPSQ_STATS * max_nch) +
2367db05815bSMaxim Mikityanskiy 	       (NUM_XDPSQ_STATS * max_nch) +
2368db05815bSMaxim Mikityanskiy 	       (NUM_XSKRQ_STATS * max_nch * priv->xsk.ever_used) +
2369db05815bSMaxim Mikityanskiy 	       (NUM_XSKSQ_STATS * max_nch * priv->xsk.ever_used);
23701fe85006SKamal Heib }
23711fe85006SKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(channels)237296b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(channels)
23731fe85006SKamal Heib {
2374db05815bSMaxim Mikityanskiy 	bool is_xsk = priv->xsk.ever_used;
23759d758d4aSTariq Toukan 	int max_nch = priv->stats_nch;
23761fe85006SKamal Heib 	int i, j, tc;
23771fe85006SKamal Heib 
237805909babSEran Ben Elisha 	for (i = 0; i < max_nch; i++)
237957d689a8SEran Ben Elisha 		for (j = 0; j < NUM_CH_STATS; j++)
238057d689a8SEran Ben Elisha 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
238157d689a8SEran Ben Elisha 				ch_stats_desc[j].format, i);
238257d689a8SEran Ben Elisha 
2383890388adSTariq Toukan 	for (i = 0; i < max_nch; i++) {
23841fe85006SKamal Heib 		for (j = 0; j < NUM_RQ_STATS; j++)
2385890388adSTariq Toukan 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
2386890388adSTariq Toukan 				rq_stats_desc[j].format, i);
2387db05815bSMaxim Mikityanskiy 		for (j = 0; j < NUM_XSKRQ_STATS * is_xsk; j++)
2388db05815bSMaxim Mikityanskiy 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
2389db05815bSMaxim Mikityanskiy 				xskrq_stats_desc[j].format, i);
2390890388adSTariq Toukan 		for (j = 0; j < NUM_RQ_XDPSQ_STATS; j++)
2391890388adSTariq Toukan 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
2392890388adSTariq Toukan 				rq_xdpsq_stats_desc[j].format, i);
2393890388adSTariq Toukan 	}
23941fe85006SKamal Heib 
239505909babSEran Ben Elisha 	for (tc = 0; tc < priv->max_opened_tc; tc++)
239605909babSEran Ben Elisha 		for (i = 0; i < max_nch; i++)
23971fe85006SKamal Heib 			for (j = 0; j < NUM_SQ_STATS; j++)
23981fe85006SKamal Heib 				sprintf(data + (idx++) * ETH_GSTRING_LEN,
23991fe85006SKamal Heib 					sq_stats_desc[j].format,
2400c55d8b10SEran Ben Elisha 					i + tc * max_nch);
24011fe85006SKamal Heib 
2402db05815bSMaxim Mikityanskiy 	for (i = 0; i < max_nch; i++) {
2403db05815bSMaxim Mikityanskiy 		for (j = 0; j < NUM_XSKSQ_STATS * is_xsk; j++)
2404db05815bSMaxim Mikityanskiy 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
2405db05815bSMaxim Mikityanskiy 				xsksq_stats_desc[j].format, i);
240658b99ee3STariq Toukan 		for (j = 0; j < NUM_XDPSQ_STATS; j++)
240758b99ee3STariq Toukan 			sprintf(data + (idx++) * ETH_GSTRING_LEN,
240858b99ee3STariq Toukan 				xdpsq_stats_desc[j].format, i);
2409db05815bSMaxim Mikityanskiy 	}
241058b99ee3STariq Toukan 
24111fe85006SKamal Heib 	return idx;
24121fe85006SKamal Heib }
24131fe85006SKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(channels)241496b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(channels)
24151fe85006SKamal Heib {
2416db05815bSMaxim Mikityanskiy 	bool is_xsk = priv->xsk.ever_used;
24179d758d4aSTariq Toukan 	int max_nch = priv->stats_nch;
24181fe85006SKamal Heib 	int i, j, tc;
24191fe85006SKamal Heib 
242005909babSEran Ben Elisha 	for (i = 0; i < max_nch; i++)
242157d689a8SEran Ben Elisha 		for (j = 0; j < NUM_CH_STATS; j++)
242257d689a8SEran Ben Elisha 			data[idx++] =
2423be98737aSTariq Toukan 				MLX5E_READ_CTR64_CPU(&priv->channel_stats[i]->ch,
242457d689a8SEran Ben Elisha 						     ch_stats_desc, j);
242557d689a8SEran Ben Elisha 
2426890388adSTariq Toukan 	for (i = 0; i < max_nch; i++) {
24271fe85006SKamal Heib 		for (j = 0; j < NUM_RQ_STATS; j++)
24281fe85006SKamal Heib 			data[idx++] =
2429be98737aSTariq Toukan 				MLX5E_READ_CTR64_CPU(&priv->channel_stats[i]->rq,
24301fe85006SKamal Heib 						     rq_stats_desc, j);
2431db05815bSMaxim Mikityanskiy 		for (j = 0; j < NUM_XSKRQ_STATS * is_xsk; j++)
2432db05815bSMaxim Mikityanskiy 			data[idx++] =
2433be98737aSTariq Toukan 				MLX5E_READ_CTR64_CPU(&priv->channel_stats[i]->xskrq,
2434db05815bSMaxim Mikityanskiy 						     xskrq_stats_desc, j);
2435890388adSTariq Toukan 		for (j = 0; j < NUM_RQ_XDPSQ_STATS; j++)
2436890388adSTariq Toukan 			data[idx++] =
2437be98737aSTariq Toukan 				MLX5E_READ_CTR64_CPU(&priv->channel_stats[i]->rq_xdpsq,
2438890388adSTariq Toukan 						     rq_xdpsq_stats_desc, j);
2439890388adSTariq Toukan 	}
24401fe85006SKamal Heib 
244105909babSEran Ben Elisha 	for (tc = 0; tc < priv->max_opened_tc; tc++)
244205909babSEran Ben Elisha 		for (i = 0; i < max_nch; i++)
24431fe85006SKamal Heib 			for (j = 0; j < NUM_SQ_STATS; j++)
24441fe85006SKamal Heib 				data[idx++] =
2445be98737aSTariq Toukan 					MLX5E_READ_CTR64_CPU(&priv->channel_stats[i]->sq[tc],
24461fe85006SKamal Heib 							     sq_stats_desc, j);
24471fe85006SKamal Heib 
2448db05815bSMaxim Mikityanskiy 	for (i = 0; i < max_nch; i++) {
2449db05815bSMaxim Mikityanskiy 		for (j = 0; j < NUM_XSKSQ_STATS * is_xsk; j++)
2450db05815bSMaxim Mikityanskiy 			data[idx++] =
2451be98737aSTariq Toukan 				MLX5E_READ_CTR64_CPU(&priv->channel_stats[i]->xsksq,
2452db05815bSMaxim Mikityanskiy 						     xsksq_stats_desc, j);
245358b99ee3STariq Toukan 		for (j = 0; j < NUM_XDPSQ_STATS; j++)
245458b99ee3STariq Toukan 			data[idx++] =
2455be98737aSTariq Toukan 				MLX5E_READ_CTR64_CPU(&priv->channel_stats[i]->xdpsq,
245658b99ee3STariq Toukan 						     xdpsq_stats_desc, j);
2457db05815bSMaxim Mikityanskiy 	}
245858b99ee3STariq Toukan 
24591fe85006SKamal Heib 	return idx;
24601fe85006SKamal Heib }
24611fe85006SKamal Heib 
MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(channels)246296b12796SSaeed Mahameed static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(channels) { return; }
246396b12796SSaeed Mahameed 
24642a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(sw, 0);
24652a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(qcnt, MLX5E_NDO_UPDATE_STATS);
24662a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(vnic_env, 0);
24672a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(vport, MLX5E_NDO_UPDATE_STATS);
24682a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(802_3, MLX5E_NDO_UPDATE_STATS);
24692a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(2863, 0);
24702a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(2819, 0);
24712a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(phy, 0);
24722a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(pcie, 0);
24732a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(per_prio, 0);
24742a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(pme, 0);
24752a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(channels, 0);
24762a303f13SSaeed Mahameed MLX5E_DEFINE_STATS_GRP(per_port_buff_congest, 0);
24777c453526SVlad Buslov MLX5E_DEFINE_STATS_GRP(eth_ext, 0);
2478f0ff8e8cSSaeed Mahameed static MLX5E_DEFINE_STATS_GRP(tls, 0);
24797c5f940dSAya Levin MLX5E_DEFINE_STATS_GRP(ptp, 0);
2480214baf22SMaxim Mikityanskiy static MLX5E_DEFINE_STATS_GRP(qos, 0);
2481f0ff8e8cSSaeed Mahameed 
248219386177SKamal Heib /* The stats groups order is opposite to the update_stats() order calls */
2483f0ff8e8cSSaeed Mahameed mlx5e_stats_grp_t mlx5e_nic_stats_grps[] = {
2484f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(sw),
2485f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(qcnt),
2486f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(vnic_env),
2487f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(vport),
2488f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(802_3),
2489f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(2863),
2490f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(2819),
2491f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(phy),
2492f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(eth_ext),
2493f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(pcie),
2494f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(per_prio),
2495f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(pme),
24960aab3e1bSRaed Salem #ifdef CONFIG_MLX5_EN_IPSEC
249781f8fba5SRaed Salem 	&MLX5E_STATS_GRP(ipsec_hw),
24980aab3e1bSRaed Salem 	&MLX5E_STATS_GRP(ipsec_sw),
24990aab3e1bSRaed Salem #endif
2500f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(tls),
2501f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(channels),
2502f0ff8e8cSSaeed Mahameed 	&MLX5E_STATS_GRP(per_port_buff_congest),
2503145e5637SEran Ben Elisha 	&MLX5E_STATS_GRP(ptp),
2504214baf22SMaxim Mikityanskiy 	&MLX5E_STATS_GRP(qos),
2505807a1b76SLior Nahmanson #ifdef CONFIG_MLX5_MACSEC
2506807a1b76SLior Nahmanson 	&MLX5E_STATS_GRP(macsec_hw),
2507807a1b76SLior Nahmanson #endif
2508c0752f2bSKamal Heib };
2509c0752f2bSKamal Heib 
mlx5e_nic_stats_grps_num(struct mlx5e_priv * priv)25103460c184SSaeed Mahameed unsigned int mlx5e_nic_stats_grps_num(struct mlx5e_priv *priv)
25113460c184SSaeed Mahameed {
25123460c184SSaeed Mahameed 	return ARRAY_SIZE(mlx5e_nic_stats_grps);
25133460c184SSaeed Mahameed }
2514