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