xref: /OK3568_Linux_fs/kernel/drivers/net/ethernet/pensando/ionic/ionic_stats.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /* Copyright(c) 2017 - 2019 Pensando Systems, Inc */
3*4882a593Smuzhiyun 
4*4882a593Smuzhiyun #include <linux/kernel.h>
5*4882a593Smuzhiyun #include <linux/mutex.h>
6*4882a593Smuzhiyun #include <linux/netdevice.h>
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include "ionic.h"
9*4882a593Smuzhiyun #include "ionic_lif.h"
10*4882a593Smuzhiyun #include "ionic_stats.h"
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun static const struct ionic_stat_desc ionic_lif_stats_desc[] = {
13*4882a593Smuzhiyun 	IONIC_LIF_STAT_DESC(tx_packets),
14*4882a593Smuzhiyun 	IONIC_LIF_STAT_DESC(tx_bytes),
15*4882a593Smuzhiyun 	IONIC_LIF_STAT_DESC(rx_packets),
16*4882a593Smuzhiyun 	IONIC_LIF_STAT_DESC(rx_bytes),
17*4882a593Smuzhiyun 	IONIC_LIF_STAT_DESC(tx_tso),
18*4882a593Smuzhiyun 	IONIC_LIF_STAT_DESC(tx_tso_bytes),
19*4882a593Smuzhiyun 	IONIC_LIF_STAT_DESC(tx_csum_none),
20*4882a593Smuzhiyun 	IONIC_LIF_STAT_DESC(tx_csum),
21*4882a593Smuzhiyun 	IONIC_LIF_STAT_DESC(rx_csum_none),
22*4882a593Smuzhiyun 	IONIC_LIF_STAT_DESC(rx_csum_complete),
23*4882a593Smuzhiyun 	IONIC_LIF_STAT_DESC(rx_csum_error),
24*4882a593Smuzhiyun 	IONIC_LIF_STAT_DESC(hw_tx_dropped),
25*4882a593Smuzhiyun 	IONIC_LIF_STAT_DESC(hw_rx_dropped),
26*4882a593Smuzhiyun 	IONIC_LIF_STAT_DESC(hw_rx_over_errors),
27*4882a593Smuzhiyun 	IONIC_LIF_STAT_DESC(hw_rx_missed_errors),
28*4882a593Smuzhiyun 	IONIC_LIF_STAT_DESC(hw_tx_aborted_errors),
29*4882a593Smuzhiyun };
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun static const struct ionic_stat_desc ionic_port_stats_desc[] = {
32*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_ok),
33*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_all),
34*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_bad_fcs),
35*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_bad_all),
36*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(octets_rx_ok),
37*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(octets_rx_all),
38*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_unicast),
39*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_multicast),
40*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_broadcast),
41*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_pause),
42*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_bad_length),
43*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_undersized),
44*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_oversized),
45*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_fragments),
46*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_jabber),
47*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_pripause),
48*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_stomped_crc),
49*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_too_long),
50*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_vlan_good),
51*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_dropped),
52*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_less_than_64b),
53*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_64b),
54*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_65b_127b),
55*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_128b_255b),
56*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_256b_511b),
57*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_512b_1023b),
58*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_1024b_1518b),
59*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_1519b_2047b),
60*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_2048b_4095b),
61*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_4096b_8191b),
62*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_8192b_9215b),
63*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_other),
64*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_tx_ok),
65*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_tx_all),
66*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_tx_bad),
67*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(octets_tx_ok),
68*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(octets_tx_total),
69*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_tx_unicast),
70*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_tx_multicast),
71*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_tx_broadcast),
72*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_tx_pause),
73*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_tx_pripause),
74*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_tx_vlan),
75*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_tx_less_than_64b),
76*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_tx_64b),
77*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_tx_65b_127b),
78*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_tx_128b_255b),
79*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_tx_256b_511b),
80*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_tx_512b_1023b),
81*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_tx_1024b_1518b),
82*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_tx_1519b_2047b),
83*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_tx_2048b_4095b),
84*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_tx_4096b_8191b),
85*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_tx_8192b_9215b),
86*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_tx_other),
87*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_tx_pri_0),
88*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_tx_pri_1),
89*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_tx_pri_2),
90*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_tx_pri_3),
91*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_tx_pri_4),
92*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_tx_pri_5),
93*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_tx_pri_6),
94*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_tx_pri_7),
95*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_pri_0),
96*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_pri_1),
97*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_pri_2),
98*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_pri_3),
99*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_pri_4),
100*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_pri_5),
101*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_pri_6),
102*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_rx_pri_7),
103*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(tx_pripause_0_1us_count),
104*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(tx_pripause_1_1us_count),
105*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(tx_pripause_2_1us_count),
106*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(tx_pripause_3_1us_count),
107*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(tx_pripause_4_1us_count),
108*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(tx_pripause_5_1us_count),
109*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(tx_pripause_6_1us_count),
110*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(tx_pripause_7_1us_count),
111*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(rx_pripause_0_1us_count),
112*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(rx_pripause_1_1us_count),
113*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(rx_pripause_2_1us_count),
114*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(rx_pripause_3_1us_count),
115*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(rx_pripause_4_1us_count),
116*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(rx_pripause_5_1us_count),
117*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(rx_pripause_6_1us_count),
118*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(rx_pripause_7_1us_count),
119*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(rx_pause_1us_count),
120*4882a593Smuzhiyun 	IONIC_PORT_STAT_DESC(frames_tx_truncated),
121*4882a593Smuzhiyun };
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun static const struct ionic_stat_desc ionic_tx_stats_desc[] = {
124*4882a593Smuzhiyun 	IONIC_TX_STAT_DESC(pkts),
125*4882a593Smuzhiyun 	IONIC_TX_STAT_DESC(bytes),
126*4882a593Smuzhiyun 	IONIC_TX_STAT_DESC(clean),
127*4882a593Smuzhiyun 	IONIC_TX_STAT_DESC(dma_map_err),
128*4882a593Smuzhiyun 	IONIC_TX_STAT_DESC(linearize),
129*4882a593Smuzhiyun 	IONIC_TX_STAT_DESC(frags),
130*4882a593Smuzhiyun 	IONIC_TX_STAT_DESC(tso),
131*4882a593Smuzhiyun 	IONIC_TX_STAT_DESC(tso_bytes),
132*4882a593Smuzhiyun 	IONIC_TX_STAT_DESC(csum_none),
133*4882a593Smuzhiyun 	IONIC_TX_STAT_DESC(csum),
134*4882a593Smuzhiyun 	IONIC_TX_STAT_DESC(vlan_inserted),
135*4882a593Smuzhiyun };
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun static const struct ionic_stat_desc ionic_rx_stats_desc[] = {
138*4882a593Smuzhiyun 	IONIC_RX_STAT_DESC(pkts),
139*4882a593Smuzhiyun 	IONIC_RX_STAT_DESC(bytes),
140*4882a593Smuzhiyun 	IONIC_RX_STAT_DESC(dma_map_err),
141*4882a593Smuzhiyun 	IONIC_RX_STAT_DESC(alloc_err),
142*4882a593Smuzhiyun 	IONIC_RX_STAT_DESC(csum_none),
143*4882a593Smuzhiyun 	IONIC_RX_STAT_DESC(csum_complete),
144*4882a593Smuzhiyun 	IONIC_RX_STAT_DESC(csum_error),
145*4882a593Smuzhiyun 	IONIC_RX_STAT_DESC(dropped),
146*4882a593Smuzhiyun 	IONIC_RX_STAT_DESC(vlan_stripped),
147*4882a593Smuzhiyun };
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun static const struct ionic_stat_desc ionic_txq_stats_desc[] = {
150*4882a593Smuzhiyun 	IONIC_TX_Q_STAT_DESC(stop),
151*4882a593Smuzhiyun 	IONIC_TX_Q_STAT_DESC(wake),
152*4882a593Smuzhiyun 	IONIC_TX_Q_STAT_DESC(drop),
153*4882a593Smuzhiyun 	IONIC_TX_Q_STAT_DESC(dbell_count),
154*4882a593Smuzhiyun };
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun static const struct ionic_stat_desc ionic_dbg_cq_stats_desc[] = {
157*4882a593Smuzhiyun 	IONIC_CQ_STAT_DESC(compl_count),
158*4882a593Smuzhiyun };
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun static const struct ionic_stat_desc ionic_dbg_intr_stats_desc[] = {
161*4882a593Smuzhiyun 	IONIC_INTR_STAT_DESC(rearm_count),
162*4882a593Smuzhiyun };
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun static const struct ionic_stat_desc ionic_dbg_napi_stats_desc[] = {
165*4882a593Smuzhiyun 	IONIC_NAPI_STAT_DESC(poll_count),
166*4882a593Smuzhiyun };
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun #define IONIC_NUM_LIF_STATS ARRAY_SIZE(ionic_lif_stats_desc)
169*4882a593Smuzhiyun #define IONIC_NUM_PORT_STATS ARRAY_SIZE(ionic_port_stats_desc)
170*4882a593Smuzhiyun #define IONIC_NUM_TX_STATS ARRAY_SIZE(ionic_tx_stats_desc)
171*4882a593Smuzhiyun #define IONIC_NUM_RX_STATS ARRAY_SIZE(ionic_rx_stats_desc)
172*4882a593Smuzhiyun #define IONIC_NUM_TX_Q_STATS ARRAY_SIZE(ionic_txq_stats_desc)
173*4882a593Smuzhiyun #define IONIC_NUM_DBG_CQ_STATS ARRAY_SIZE(ionic_dbg_cq_stats_desc)
174*4882a593Smuzhiyun #define IONIC_NUM_DBG_INTR_STATS ARRAY_SIZE(ionic_dbg_intr_stats_desc)
175*4882a593Smuzhiyun #define IONIC_NUM_DBG_NAPI_STATS ARRAY_SIZE(ionic_dbg_napi_stats_desc)
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun #define MAX_Q(lif)   ((lif)->netdev->real_num_tx_queues)
178*4882a593Smuzhiyun 
ionic_get_lif_stats(struct ionic_lif * lif,struct ionic_lif_sw_stats * stats)179*4882a593Smuzhiyun static void ionic_get_lif_stats(struct ionic_lif *lif,
180*4882a593Smuzhiyun 				struct ionic_lif_sw_stats *stats)
181*4882a593Smuzhiyun {
182*4882a593Smuzhiyun 	struct ionic_tx_stats *txstats;
183*4882a593Smuzhiyun 	struct ionic_rx_stats *rxstats;
184*4882a593Smuzhiyun 	struct rtnl_link_stats64 ns;
185*4882a593Smuzhiyun 	int q_num;
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun 	memset(stats, 0, sizeof(*stats));
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun 	for (q_num = 0; q_num < MAX_Q(lif); q_num++) {
190*4882a593Smuzhiyun 		txstats = &lif->txqstats[q_num];
191*4882a593Smuzhiyun 		stats->tx_packets += txstats->pkts;
192*4882a593Smuzhiyun 		stats->tx_bytes += txstats->bytes;
193*4882a593Smuzhiyun 		stats->tx_tso += txstats->tso;
194*4882a593Smuzhiyun 		stats->tx_tso_bytes += txstats->tso_bytes;
195*4882a593Smuzhiyun 		stats->tx_csum_none += txstats->csum_none;
196*4882a593Smuzhiyun 		stats->tx_csum += txstats->csum;
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun 		rxstats = &lif->rxqstats[q_num];
199*4882a593Smuzhiyun 		stats->rx_packets += rxstats->pkts;
200*4882a593Smuzhiyun 		stats->rx_bytes += rxstats->bytes;
201*4882a593Smuzhiyun 		stats->rx_csum_none += rxstats->csum_none;
202*4882a593Smuzhiyun 		stats->rx_csum_complete += rxstats->csum_complete;
203*4882a593Smuzhiyun 		stats->rx_csum_error += rxstats->csum_error;
204*4882a593Smuzhiyun 	}
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun 	ionic_get_stats64(lif->netdev, &ns);
207*4882a593Smuzhiyun 	stats->hw_tx_dropped = ns.tx_dropped;
208*4882a593Smuzhiyun 	stats->hw_rx_dropped = ns.rx_dropped;
209*4882a593Smuzhiyun 	stats->hw_rx_over_errors = ns.rx_over_errors;
210*4882a593Smuzhiyun 	stats->hw_rx_missed_errors = ns.rx_missed_errors;
211*4882a593Smuzhiyun 	stats->hw_tx_aborted_errors = ns.tx_aborted_errors;
212*4882a593Smuzhiyun }
213*4882a593Smuzhiyun 
ionic_sw_stats_get_count(struct ionic_lif * lif)214*4882a593Smuzhiyun static u64 ionic_sw_stats_get_count(struct ionic_lif *lif)
215*4882a593Smuzhiyun {
216*4882a593Smuzhiyun 	u64 total = 0;
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun 	/* lif stats */
219*4882a593Smuzhiyun 	total += IONIC_NUM_LIF_STATS;
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun 	/* tx stats */
222*4882a593Smuzhiyun 	total += MAX_Q(lif) * IONIC_NUM_TX_STATS;
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun 	/* rx stats */
225*4882a593Smuzhiyun 	total += MAX_Q(lif) * IONIC_NUM_RX_STATS;
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun 	/* port stats */
228*4882a593Smuzhiyun 	total += IONIC_NUM_PORT_STATS;
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun 	if (test_bit(IONIC_LIF_F_UP, lif->state) &&
231*4882a593Smuzhiyun 	    test_bit(IONIC_LIF_F_SW_DEBUG_STATS, lif->state)) {
232*4882a593Smuzhiyun 		/* tx debug stats */
233*4882a593Smuzhiyun 		total += MAX_Q(lif) * (IONIC_NUM_DBG_CQ_STATS +
234*4882a593Smuzhiyun 				      IONIC_NUM_TX_Q_STATS +
235*4882a593Smuzhiyun 				      IONIC_NUM_DBG_INTR_STATS +
236*4882a593Smuzhiyun 				      IONIC_MAX_NUM_SG_CNTR);
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun 		/* rx debug stats */
239*4882a593Smuzhiyun 		total += MAX_Q(lif) * (IONIC_NUM_DBG_CQ_STATS +
240*4882a593Smuzhiyun 				      IONIC_NUM_DBG_INTR_STATS +
241*4882a593Smuzhiyun 				      IONIC_NUM_DBG_NAPI_STATS +
242*4882a593Smuzhiyun 				      IONIC_MAX_NUM_NAPI_CNTR);
243*4882a593Smuzhiyun 	}
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun 	return total;
246*4882a593Smuzhiyun }
247*4882a593Smuzhiyun 
ionic_sw_stats_get_strings(struct ionic_lif * lif,u8 ** buf)248*4882a593Smuzhiyun static void ionic_sw_stats_get_strings(struct ionic_lif *lif, u8 **buf)
249*4882a593Smuzhiyun {
250*4882a593Smuzhiyun 	int i, q_num;
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun 	for (i = 0; i < IONIC_NUM_LIF_STATS; i++) {
253*4882a593Smuzhiyun 		snprintf(*buf, ETH_GSTRING_LEN, ionic_lif_stats_desc[i].name);
254*4882a593Smuzhiyun 		*buf += ETH_GSTRING_LEN;
255*4882a593Smuzhiyun 	}
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun 	for (i = 0; i < IONIC_NUM_PORT_STATS; i++) {
258*4882a593Smuzhiyun 		snprintf(*buf, ETH_GSTRING_LEN,
259*4882a593Smuzhiyun 			 ionic_port_stats_desc[i].name);
260*4882a593Smuzhiyun 		*buf += ETH_GSTRING_LEN;
261*4882a593Smuzhiyun 	}
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun 	for (q_num = 0; q_num < MAX_Q(lif); q_num++) {
264*4882a593Smuzhiyun 		for (i = 0; i < IONIC_NUM_TX_STATS; i++) {
265*4882a593Smuzhiyun 			snprintf(*buf, ETH_GSTRING_LEN, "tx_%d_%s",
266*4882a593Smuzhiyun 				 q_num, ionic_tx_stats_desc[i].name);
267*4882a593Smuzhiyun 			*buf += ETH_GSTRING_LEN;
268*4882a593Smuzhiyun 		}
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun 		if (test_bit(IONIC_LIF_F_UP, lif->state) &&
271*4882a593Smuzhiyun 		    test_bit(IONIC_LIF_F_SW_DEBUG_STATS, lif->state)) {
272*4882a593Smuzhiyun 			for (i = 0; i < IONIC_NUM_TX_Q_STATS; i++) {
273*4882a593Smuzhiyun 				snprintf(*buf, ETH_GSTRING_LEN,
274*4882a593Smuzhiyun 					 "txq_%d_%s",
275*4882a593Smuzhiyun 					 q_num,
276*4882a593Smuzhiyun 					 ionic_txq_stats_desc[i].name);
277*4882a593Smuzhiyun 				*buf += ETH_GSTRING_LEN;
278*4882a593Smuzhiyun 			}
279*4882a593Smuzhiyun 			for (i = 0; i < IONIC_NUM_DBG_CQ_STATS; i++) {
280*4882a593Smuzhiyun 				snprintf(*buf, ETH_GSTRING_LEN,
281*4882a593Smuzhiyun 					 "txq_%d_cq_%s",
282*4882a593Smuzhiyun 					 q_num,
283*4882a593Smuzhiyun 					 ionic_dbg_cq_stats_desc[i].name);
284*4882a593Smuzhiyun 				*buf += ETH_GSTRING_LEN;
285*4882a593Smuzhiyun 			}
286*4882a593Smuzhiyun 			for (i = 0; i < IONIC_NUM_DBG_INTR_STATS; i++) {
287*4882a593Smuzhiyun 				snprintf(*buf, ETH_GSTRING_LEN,
288*4882a593Smuzhiyun 					 "txq_%d_intr_%s",
289*4882a593Smuzhiyun 					 q_num,
290*4882a593Smuzhiyun 					 ionic_dbg_intr_stats_desc[i].name);
291*4882a593Smuzhiyun 				*buf += ETH_GSTRING_LEN;
292*4882a593Smuzhiyun 			}
293*4882a593Smuzhiyun 			for (i = 0; i < IONIC_MAX_NUM_SG_CNTR; i++) {
294*4882a593Smuzhiyun 				snprintf(*buf, ETH_GSTRING_LEN,
295*4882a593Smuzhiyun 					 "txq_%d_sg_cntr_%d",
296*4882a593Smuzhiyun 					 q_num, i);
297*4882a593Smuzhiyun 				*buf += ETH_GSTRING_LEN;
298*4882a593Smuzhiyun 			}
299*4882a593Smuzhiyun 		}
300*4882a593Smuzhiyun 	}
301*4882a593Smuzhiyun 	for (q_num = 0; q_num < MAX_Q(lif); q_num++) {
302*4882a593Smuzhiyun 		for (i = 0; i < IONIC_NUM_RX_STATS; i++) {
303*4882a593Smuzhiyun 			snprintf(*buf, ETH_GSTRING_LEN,
304*4882a593Smuzhiyun 				 "rx_%d_%s",
305*4882a593Smuzhiyun 				 q_num, ionic_rx_stats_desc[i].name);
306*4882a593Smuzhiyun 			*buf += ETH_GSTRING_LEN;
307*4882a593Smuzhiyun 		}
308*4882a593Smuzhiyun 
309*4882a593Smuzhiyun 		if (test_bit(IONIC_LIF_F_UP, lif->state) &&
310*4882a593Smuzhiyun 		    test_bit(IONIC_LIF_F_SW_DEBUG_STATS, lif->state)) {
311*4882a593Smuzhiyun 			for (i = 0; i < IONIC_NUM_DBG_CQ_STATS; i++) {
312*4882a593Smuzhiyun 				snprintf(*buf, ETH_GSTRING_LEN,
313*4882a593Smuzhiyun 					 "rxq_%d_cq_%s",
314*4882a593Smuzhiyun 					 q_num,
315*4882a593Smuzhiyun 					 ionic_dbg_cq_stats_desc[i].name);
316*4882a593Smuzhiyun 				*buf += ETH_GSTRING_LEN;
317*4882a593Smuzhiyun 			}
318*4882a593Smuzhiyun 			for (i = 0; i < IONIC_NUM_DBG_INTR_STATS; i++) {
319*4882a593Smuzhiyun 				snprintf(*buf, ETH_GSTRING_LEN,
320*4882a593Smuzhiyun 					 "rxq_%d_intr_%s",
321*4882a593Smuzhiyun 					 q_num,
322*4882a593Smuzhiyun 					 ionic_dbg_intr_stats_desc[i].name);
323*4882a593Smuzhiyun 				*buf += ETH_GSTRING_LEN;
324*4882a593Smuzhiyun 			}
325*4882a593Smuzhiyun 			for (i = 0; i < IONIC_NUM_DBG_NAPI_STATS; i++) {
326*4882a593Smuzhiyun 				snprintf(*buf, ETH_GSTRING_LEN,
327*4882a593Smuzhiyun 					 "rxq_%d_napi_%s",
328*4882a593Smuzhiyun 					 q_num,
329*4882a593Smuzhiyun 					 ionic_dbg_napi_stats_desc[i].name);
330*4882a593Smuzhiyun 				*buf += ETH_GSTRING_LEN;
331*4882a593Smuzhiyun 			}
332*4882a593Smuzhiyun 			for (i = 0; i < IONIC_MAX_NUM_NAPI_CNTR; i++) {
333*4882a593Smuzhiyun 				snprintf(*buf, ETH_GSTRING_LEN,
334*4882a593Smuzhiyun 					 "rxq_%d_napi_work_done_%d",
335*4882a593Smuzhiyun 					 q_num, i);
336*4882a593Smuzhiyun 				*buf += ETH_GSTRING_LEN;
337*4882a593Smuzhiyun 			}
338*4882a593Smuzhiyun 		}
339*4882a593Smuzhiyun 	}
340*4882a593Smuzhiyun }
341*4882a593Smuzhiyun 
ionic_sw_stats_get_values(struct ionic_lif * lif,u64 ** buf)342*4882a593Smuzhiyun static void ionic_sw_stats_get_values(struct ionic_lif *lif, u64 **buf)
343*4882a593Smuzhiyun {
344*4882a593Smuzhiyun 	struct ionic_port_stats *port_stats;
345*4882a593Smuzhiyun 	struct ionic_lif_sw_stats lif_stats;
346*4882a593Smuzhiyun 	struct ionic_qcq *txqcq, *rxqcq;
347*4882a593Smuzhiyun 	struct ionic_tx_stats *txstats;
348*4882a593Smuzhiyun 	struct ionic_rx_stats *rxstats;
349*4882a593Smuzhiyun 	int i, q_num;
350*4882a593Smuzhiyun 
351*4882a593Smuzhiyun 	ionic_get_lif_stats(lif, &lif_stats);
352*4882a593Smuzhiyun 
353*4882a593Smuzhiyun 	for (i = 0; i < IONIC_NUM_LIF_STATS; i++) {
354*4882a593Smuzhiyun 		**buf = IONIC_READ_STAT64(&lif_stats, &ionic_lif_stats_desc[i]);
355*4882a593Smuzhiyun 		(*buf)++;
356*4882a593Smuzhiyun 	}
357*4882a593Smuzhiyun 
358*4882a593Smuzhiyun 	port_stats = &lif->ionic->idev.port_info->stats;
359*4882a593Smuzhiyun 	for (i = 0; i < IONIC_NUM_PORT_STATS; i++) {
360*4882a593Smuzhiyun 		**buf = IONIC_READ_STAT_LE64(port_stats,
361*4882a593Smuzhiyun 					     &ionic_port_stats_desc[i]);
362*4882a593Smuzhiyun 		(*buf)++;
363*4882a593Smuzhiyun 	}
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun 	for (q_num = 0; q_num < MAX_Q(lif); q_num++) {
366*4882a593Smuzhiyun 		txstats = &lif->txqstats[q_num];
367*4882a593Smuzhiyun 
368*4882a593Smuzhiyun 		for (i = 0; i < IONIC_NUM_TX_STATS; i++) {
369*4882a593Smuzhiyun 			**buf = IONIC_READ_STAT64(txstats,
370*4882a593Smuzhiyun 						  &ionic_tx_stats_desc[i]);
371*4882a593Smuzhiyun 			(*buf)++;
372*4882a593Smuzhiyun 		}
373*4882a593Smuzhiyun 
374*4882a593Smuzhiyun 		if (test_bit(IONIC_LIF_F_UP, lif->state) &&
375*4882a593Smuzhiyun 		    test_bit(IONIC_LIF_F_SW_DEBUG_STATS, lif->state)) {
376*4882a593Smuzhiyun 			txqcq = lif->txqcqs[q_num];
377*4882a593Smuzhiyun 			for (i = 0; i < IONIC_NUM_TX_Q_STATS; i++) {
378*4882a593Smuzhiyun 				**buf = IONIC_READ_STAT64(&txqcq->q,
379*4882a593Smuzhiyun 						      &ionic_txq_stats_desc[i]);
380*4882a593Smuzhiyun 				(*buf)++;
381*4882a593Smuzhiyun 			}
382*4882a593Smuzhiyun 			for (i = 0; i < IONIC_NUM_DBG_CQ_STATS; i++) {
383*4882a593Smuzhiyun 				**buf = IONIC_READ_STAT64(&txqcq->cq,
384*4882a593Smuzhiyun 						   &ionic_dbg_cq_stats_desc[i]);
385*4882a593Smuzhiyun 				(*buf)++;
386*4882a593Smuzhiyun 			}
387*4882a593Smuzhiyun 			for (i = 0; i < IONIC_NUM_DBG_INTR_STATS; i++) {
388*4882a593Smuzhiyun 				**buf = IONIC_READ_STAT64(&txqcq->intr,
389*4882a593Smuzhiyun 						 &ionic_dbg_intr_stats_desc[i]);
390*4882a593Smuzhiyun 				(*buf)++;
391*4882a593Smuzhiyun 			}
392*4882a593Smuzhiyun 			for (i = 0; i < IONIC_MAX_NUM_SG_CNTR; i++) {
393*4882a593Smuzhiyun 				**buf = txstats->sg_cntr[i];
394*4882a593Smuzhiyun 				(*buf)++;
395*4882a593Smuzhiyun 			}
396*4882a593Smuzhiyun 		}
397*4882a593Smuzhiyun 	}
398*4882a593Smuzhiyun 
399*4882a593Smuzhiyun 	for (q_num = 0; q_num < MAX_Q(lif); q_num++) {
400*4882a593Smuzhiyun 		rxstats = &lif->rxqstats[q_num];
401*4882a593Smuzhiyun 
402*4882a593Smuzhiyun 		for (i = 0; i < IONIC_NUM_RX_STATS; i++) {
403*4882a593Smuzhiyun 			**buf = IONIC_READ_STAT64(rxstats,
404*4882a593Smuzhiyun 						  &ionic_rx_stats_desc[i]);
405*4882a593Smuzhiyun 			(*buf)++;
406*4882a593Smuzhiyun 		}
407*4882a593Smuzhiyun 
408*4882a593Smuzhiyun 		if (test_bit(IONIC_LIF_F_UP, lif->state) &&
409*4882a593Smuzhiyun 		    test_bit(IONIC_LIF_F_SW_DEBUG_STATS, lif->state)) {
410*4882a593Smuzhiyun 			rxqcq = lif->rxqcqs[q_num];
411*4882a593Smuzhiyun 			for (i = 0; i < IONIC_NUM_DBG_CQ_STATS; i++) {
412*4882a593Smuzhiyun 				**buf = IONIC_READ_STAT64(&rxqcq->cq,
413*4882a593Smuzhiyun 						   &ionic_dbg_cq_stats_desc[i]);
414*4882a593Smuzhiyun 				(*buf)++;
415*4882a593Smuzhiyun 			}
416*4882a593Smuzhiyun 			for (i = 0; i < IONIC_NUM_DBG_INTR_STATS; i++) {
417*4882a593Smuzhiyun 				**buf = IONIC_READ_STAT64(&rxqcq->intr,
418*4882a593Smuzhiyun 						 &ionic_dbg_intr_stats_desc[i]);
419*4882a593Smuzhiyun 				(*buf)++;
420*4882a593Smuzhiyun 			}
421*4882a593Smuzhiyun 			for (i = 0; i < IONIC_NUM_DBG_NAPI_STATS; i++) {
422*4882a593Smuzhiyun 				**buf = IONIC_READ_STAT64(&rxqcq->napi_stats,
423*4882a593Smuzhiyun 						 &ionic_dbg_napi_stats_desc[i]);
424*4882a593Smuzhiyun 				(*buf)++;
425*4882a593Smuzhiyun 			}
426*4882a593Smuzhiyun 			for (i = 0; i < IONIC_MAX_NUM_NAPI_CNTR; i++) {
427*4882a593Smuzhiyun 				**buf = rxqcq->napi_stats.work_done_cntr[i];
428*4882a593Smuzhiyun 				(*buf)++;
429*4882a593Smuzhiyun 			}
430*4882a593Smuzhiyun 		}
431*4882a593Smuzhiyun 	}
432*4882a593Smuzhiyun }
433*4882a593Smuzhiyun 
434*4882a593Smuzhiyun const struct ionic_stats_group_intf ionic_stats_groups[] = {
435*4882a593Smuzhiyun 	/* SW Stats group */
436*4882a593Smuzhiyun 	{
437*4882a593Smuzhiyun 		.get_strings = ionic_sw_stats_get_strings,
438*4882a593Smuzhiyun 		.get_values = ionic_sw_stats_get_values,
439*4882a593Smuzhiyun 		.get_count = ionic_sw_stats_get_count,
440*4882a593Smuzhiyun 	},
441*4882a593Smuzhiyun 	/* Add more stat groups here */
442*4882a593Smuzhiyun };
443*4882a593Smuzhiyun 
444*4882a593Smuzhiyun const int ionic_num_stats_grps = ARRAY_SIZE(ionic_stats_groups);
445