1e470355bSShannon Nelson // SPDX-License-Identifier: GPL-2.0
2e470355bSShannon Nelson /* Copyright(c) 2017 - 2019 Pensando Systems, Inc */
3e470355bSShannon Nelson
4cc69837fSJakub Kicinski #include <linux/ethtool.h>
5e470355bSShannon Nelson #include <linux/kernel.h>
6e470355bSShannon Nelson #include <linux/mutex.h>
7e470355bSShannon Nelson #include <linux/netdevice.h>
8e470355bSShannon Nelson
9e470355bSShannon Nelson #include "ionic.h"
10e470355bSShannon Nelson #include "ionic_lif.h"
11e470355bSShannon Nelson #include "ionic_stats.h"
12e470355bSShannon Nelson
13e470355bSShannon Nelson static const struct ionic_stat_desc ionic_lif_stats_desc[] = {
14e470355bSShannon Nelson IONIC_LIF_STAT_DESC(tx_packets),
15e470355bSShannon Nelson IONIC_LIF_STAT_DESC(tx_bytes),
16e470355bSShannon Nelson IONIC_LIF_STAT_DESC(rx_packets),
17e470355bSShannon Nelson IONIC_LIF_STAT_DESC(rx_bytes),
18e470355bSShannon Nelson IONIC_LIF_STAT_DESC(tx_tso),
19f64e0c56SShannon Nelson IONIC_LIF_STAT_DESC(tx_tso_bytes),
20f64e0c56SShannon Nelson IONIC_LIF_STAT_DESC(tx_csum_none),
21e470355bSShannon Nelson IONIC_LIF_STAT_DESC(tx_csum),
22e470355bSShannon Nelson IONIC_LIF_STAT_DESC(rx_csum_none),
23e470355bSShannon Nelson IONIC_LIF_STAT_DESC(rx_csum_complete),
24e470355bSShannon Nelson IONIC_LIF_STAT_DESC(rx_csum_error),
25f64e0c56SShannon Nelson IONIC_LIF_STAT_DESC(hw_tx_dropped),
26f64e0c56SShannon Nelson IONIC_LIF_STAT_DESC(hw_rx_dropped),
27f64e0c56SShannon Nelson IONIC_LIF_STAT_DESC(hw_rx_over_errors),
28f64e0c56SShannon Nelson IONIC_LIF_STAT_DESC(hw_rx_missed_errors),
29f64e0c56SShannon Nelson IONIC_LIF_STAT_DESC(hw_tx_aborted_errors),
30f64e0c56SShannon Nelson };
31f64e0c56SShannon Nelson
32f64e0c56SShannon Nelson static const struct ionic_stat_desc ionic_port_stats_desc[] = {
33f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_ok),
34f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_all),
35f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_bad_fcs),
36f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_bad_all),
37f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(octets_rx_ok),
38f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(octets_rx_all),
39f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_unicast),
40f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_multicast),
41f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_broadcast),
42f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_pause),
43f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_bad_length),
44f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_undersized),
45f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_oversized),
46f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_fragments),
47f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_jabber),
48f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_pripause),
49f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_stomped_crc),
50f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_too_long),
51f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_vlan_good),
52f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_dropped),
53f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_less_than_64b),
54f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_64b),
55f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_65b_127b),
56f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_128b_255b),
57f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_256b_511b),
58f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_512b_1023b),
59f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_1024b_1518b),
60f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_1519b_2047b),
61f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_2048b_4095b),
62f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_4096b_8191b),
63f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_8192b_9215b),
64f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_other),
65f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_tx_ok),
66f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_tx_all),
67f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_tx_bad),
68f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(octets_tx_ok),
69f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(octets_tx_total),
70f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_tx_unicast),
71f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_tx_multicast),
72f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_tx_broadcast),
73f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_tx_pause),
74f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_tx_pripause),
75f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_tx_vlan),
76f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_tx_less_than_64b),
77f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_tx_64b),
78f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_tx_65b_127b),
79f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_tx_128b_255b),
80f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_tx_256b_511b),
81f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_tx_512b_1023b),
82f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_tx_1024b_1518b),
83f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_tx_1519b_2047b),
84f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_tx_2048b_4095b),
85f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_tx_4096b_8191b),
86f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_tx_8192b_9215b),
87f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_tx_other),
88f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_tx_pri_0),
89f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_tx_pri_1),
90f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_tx_pri_2),
91f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_tx_pri_3),
92f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_tx_pri_4),
93f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_tx_pri_5),
94f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_tx_pri_6),
95f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_tx_pri_7),
96f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_pri_0),
97f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_pri_1),
98f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_pri_2),
99f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_pri_3),
100f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_pri_4),
101f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_pri_5),
102f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_pri_6),
103f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_rx_pri_7),
104f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(tx_pripause_0_1us_count),
105f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(tx_pripause_1_1us_count),
106f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(tx_pripause_2_1us_count),
107f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(tx_pripause_3_1us_count),
108f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(tx_pripause_4_1us_count),
109f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(tx_pripause_5_1us_count),
110f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(tx_pripause_6_1us_count),
111f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(tx_pripause_7_1us_count),
112f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(rx_pripause_0_1us_count),
113f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(rx_pripause_1_1us_count),
114f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(rx_pripause_2_1us_count),
115f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(rx_pripause_3_1us_count),
116f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(rx_pripause_4_1us_count),
117f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(rx_pripause_5_1us_count),
118f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(rx_pripause_6_1us_count),
119f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(rx_pripause_7_1us_count),
120f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(rx_pause_1us_count),
121f64e0c56SShannon Nelson IONIC_PORT_STAT_DESC(frames_tx_truncated),
122e470355bSShannon Nelson };
123e470355bSShannon Nelson
124e470355bSShannon Nelson static const struct ionic_stat_desc ionic_tx_stats_desc[] = {
125e470355bSShannon Nelson IONIC_TX_STAT_DESC(pkts),
126e470355bSShannon Nelson IONIC_TX_STAT_DESC(bytes),
127e470355bSShannon Nelson IONIC_TX_STAT_DESC(clean),
128e470355bSShannon Nelson IONIC_TX_STAT_DESC(dma_map_err),
129e470355bSShannon Nelson IONIC_TX_STAT_DESC(linearize),
130e470355bSShannon Nelson IONIC_TX_STAT_DESC(frags),
131f64e0c56SShannon Nelson IONIC_TX_STAT_DESC(tso),
132f64e0c56SShannon Nelson IONIC_TX_STAT_DESC(tso_bytes),
133*196f56c0SShannon Nelson IONIC_TX_STAT_DESC(hwstamp_valid),
134*196f56c0SShannon Nelson IONIC_TX_STAT_DESC(hwstamp_invalid),
135f64e0c56SShannon Nelson IONIC_TX_STAT_DESC(csum_none),
136f64e0c56SShannon Nelson IONIC_TX_STAT_DESC(csum),
137f64e0c56SShannon Nelson IONIC_TX_STAT_DESC(vlan_inserted),
138e470355bSShannon Nelson };
139e470355bSShannon Nelson
140e470355bSShannon Nelson static const struct ionic_stat_desc ionic_rx_stats_desc[] = {
141e470355bSShannon Nelson IONIC_RX_STAT_DESC(pkts),
142e470355bSShannon Nelson IONIC_RX_STAT_DESC(bytes),
143e470355bSShannon Nelson IONIC_RX_STAT_DESC(dma_map_err),
144e470355bSShannon Nelson IONIC_RX_STAT_DESC(alloc_err),
145e470355bSShannon Nelson IONIC_RX_STAT_DESC(csum_none),
146e470355bSShannon Nelson IONIC_RX_STAT_DESC(csum_complete),
147e470355bSShannon Nelson IONIC_RX_STAT_DESC(csum_error),
148*196f56c0SShannon Nelson IONIC_RX_STAT_DESC(hwstamp_valid),
149*196f56c0SShannon Nelson IONIC_RX_STAT_DESC(hwstamp_invalid),
15024cfa8c7SShannon Nelson IONIC_RX_STAT_DESC(dropped),
151f64e0c56SShannon Nelson IONIC_RX_STAT_DESC(vlan_stripped),
152e470355bSShannon Nelson };
153e470355bSShannon Nelson
154e470355bSShannon Nelson #define IONIC_NUM_LIF_STATS ARRAY_SIZE(ionic_lif_stats_desc)
155f64e0c56SShannon Nelson #define IONIC_NUM_PORT_STATS ARRAY_SIZE(ionic_port_stats_desc)
156e470355bSShannon Nelson #define IONIC_NUM_TX_STATS ARRAY_SIZE(ionic_tx_stats_desc)
157e470355bSShannon Nelson #define IONIC_NUM_RX_STATS ARRAY_SIZE(ionic_rx_stats_desc)
158e470355bSShannon Nelson
159e470355bSShannon Nelson #define MAX_Q(lif) ((lif)->netdev->real_num_tx_queues)
160e470355bSShannon Nelson
ionic_add_lif_txq_stats(struct ionic_lif * lif,int q_num,struct ionic_lif_sw_stats * stats)161aa620993SShannon Nelson static void ionic_add_lif_txq_stats(struct ionic_lif *lif, int q_num,
162e470355bSShannon Nelson struct ionic_lif_sw_stats *stats)
163e470355bSShannon Nelson {
164aa620993SShannon Nelson struct ionic_tx_stats *txstats = &lif->txqstats[q_num];
165e470355bSShannon Nelson
16634dec947SShannon Nelson stats->tx_packets += txstats->pkts;
16734dec947SShannon Nelson stats->tx_bytes += txstats->bytes;
16834dec947SShannon Nelson stats->tx_tso += txstats->tso;
16934dec947SShannon Nelson stats->tx_tso_bytes += txstats->tso_bytes;
17034dec947SShannon Nelson stats->tx_csum_none += txstats->csum_none;
17134dec947SShannon Nelson stats->tx_csum += txstats->csum;
172*196f56c0SShannon Nelson stats->tx_hwstamp_valid += txstats->hwstamp_valid;
173*196f56c0SShannon Nelson stats->tx_hwstamp_invalid += txstats->hwstamp_invalid;
174aa620993SShannon Nelson }
175e470355bSShannon Nelson
ionic_add_lif_rxq_stats(struct ionic_lif * lif,int q_num,struct ionic_lif_sw_stats * stats)176aa620993SShannon Nelson static void ionic_add_lif_rxq_stats(struct ionic_lif *lif, int q_num,
177aa620993SShannon Nelson struct ionic_lif_sw_stats *stats)
178aa620993SShannon Nelson {
179aa620993SShannon Nelson struct ionic_rx_stats *rxstats = &lif->rxqstats[q_num];
180aa620993SShannon Nelson
18134dec947SShannon Nelson stats->rx_packets += rxstats->pkts;
18234dec947SShannon Nelson stats->rx_bytes += rxstats->bytes;
18334dec947SShannon Nelson stats->rx_csum_none += rxstats->csum_none;
18434dec947SShannon Nelson stats->rx_csum_complete += rxstats->csum_complete;
18534dec947SShannon Nelson stats->rx_csum_error += rxstats->csum_error;
186*196f56c0SShannon Nelson stats->rx_hwstamp_valid += rxstats->hwstamp_valid;
187*196f56c0SShannon Nelson stats->rx_hwstamp_invalid += rxstats->hwstamp_invalid;
188e470355bSShannon Nelson }
189f64e0c56SShannon Nelson
ionic_get_lif_stats(struct ionic_lif * lif,struct ionic_lif_sw_stats * stats)190aa620993SShannon Nelson static void ionic_get_lif_stats(struct ionic_lif *lif,
191aa620993SShannon Nelson struct ionic_lif_sw_stats *stats)
192aa620993SShannon Nelson {
193aa620993SShannon Nelson struct rtnl_link_stats64 ns;
194aa620993SShannon Nelson int q_num;
195aa620993SShannon Nelson
196aa620993SShannon Nelson memset(stats, 0, sizeof(*stats));
197aa620993SShannon Nelson
198aa620993SShannon Nelson for (q_num = 0; q_num < MAX_Q(lif); q_num++) {
199aa620993SShannon Nelson ionic_add_lif_txq_stats(lif, q_num, stats);
200aa620993SShannon Nelson ionic_add_lif_rxq_stats(lif, q_num, stats);
201aa620993SShannon Nelson }
202aa620993SShannon Nelson
203*196f56c0SShannon Nelson if (lif->hwstamp_txq)
204*196f56c0SShannon Nelson ionic_add_lif_txq_stats(lif, lif->hwstamp_txq->q.index, stats);
205*196f56c0SShannon Nelson
206*196f56c0SShannon Nelson if (lif->hwstamp_rxq)
207*196f56c0SShannon Nelson ionic_add_lif_rxq_stats(lif, lif->hwstamp_rxq->q.index, stats);
208*196f56c0SShannon Nelson
209f64e0c56SShannon Nelson ionic_get_stats64(lif->netdev, &ns);
210f64e0c56SShannon Nelson stats->hw_tx_dropped = ns.tx_dropped;
211f64e0c56SShannon Nelson stats->hw_rx_dropped = ns.rx_dropped;
212f64e0c56SShannon Nelson stats->hw_rx_over_errors = ns.rx_over_errors;
213f64e0c56SShannon Nelson stats->hw_rx_missed_errors = ns.rx_missed_errors;
214f64e0c56SShannon Nelson stats->hw_tx_aborted_errors = ns.tx_aborted_errors;
215e470355bSShannon Nelson }
216e470355bSShannon Nelson
ionic_sw_stats_get_count(struct ionic_lif * lif)217e470355bSShannon Nelson static u64 ionic_sw_stats_get_count(struct ionic_lif *lif)
218e470355bSShannon Nelson {
219aa620993SShannon Nelson u64 total = 0, tx_queues = MAX_Q(lif), rx_queues = MAX_Q(lif);
220e470355bSShannon Nelson
221*196f56c0SShannon Nelson if (lif->hwstamp_txq)
222*196f56c0SShannon Nelson tx_queues += 1;
223*196f56c0SShannon Nelson
224*196f56c0SShannon Nelson if (lif->hwstamp_rxq)
225*196f56c0SShannon Nelson rx_queues += 1;
226*196f56c0SShannon Nelson
227e470355bSShannon Nelson total += IONIC_NUM_LIF_STATS;
228*196f56c0SShannon Nelson total += IONIC_NUM_PORT_STATS;
229*196f56c0SShannon Nelson
230aa620993SShannon Nelson total += tx_queues * IONIC_NUM_TX_STATS;
231aa620993SShannon Nelson total += rx_queues * IONIC_NUM_RX_STATS;
232e470355bSShannon Nelson
233e470355bSShannon Nelson return total;
234e470355bSShannon Nelson }
235e470355bSShannon Nelson
ionic_sw_stats_get_tx_strings(struct ionic_lif * lif,u8 ** buf,int q_num)236acebe5b6SAlexander Duyck static void ionic_sw_stats_get_tx_strings(struct ionic_lif *lif, u8 **buf,
237acebe5b6SAlexander Duyck int q_num)
238acebe5b6SAlexander Duyck {
239acebe5b6SAlexander Duyck int i;
240acebe5b6SAlexander Duyck
241acebe5b6SAlexander Duyck for (i = 0; i < IONIC_NUM_TX_STATS; i++)
242acebe5b6SAlexander Duyck ethtool_sprintf(buf, "tx_%d_%s", q_num,
243acebe5b6SAlexander Duyck ionic_tx_stats_desc[i].name);
244acebe5b6SAlexander Duyck }
245acebe5b6SAlexander Duyck
ionic_sw_stats_get_rx_strings(struct ionic_lif * lif,u8 ** buf,int q_num)246acebe5b6SAlexander Duyck static void ionic_sw_stats_get_rx_strings(struct ionic_lif *lif, u8 **buf,
247acebe5b6SAlexander Duyck int q_num)
248acebe5b6SAlexander Duyck {
249acebe5b6SAlexander Duyck int i;
250acebe5b6SAlexander Duyck
251acebe5b6SAlexander Duyck for (i = 0; i < IONIC_NUM_RX_STATS; i++)
252acebe5b6SAlexander Duyck ethtool_sprintf(buf, "rx_%d_%s", q_num,
253acebe5b6SAlexander Duyck ionic_rx_stats_desc[i].name);
254acebe5b6SAlexander Duyck }
255acebe5b6SAlexander Duyck
ionic_sw_stats_get_strings(struct ionic_lif * lif,u8 ** buf)256e470355bSShannon Nelson static void ionic_sw_stats_get_strings(struct ionic_lif *lif, u8 **buf)
257e470355bSShannon Nelson {
258e470355bSShannon Nelson int i, q_num;
259e470355bSShannon Nelson
260acebe5b6SAlexander Duyck for (i = 0; i < IONIC_NUM_LIF_STATS; i++)
261acebe5b6SAlexander Duyck ethtool_sprintf(buf, ionic_lif_stats_desc[i].name);
262f64e0c56SShannon Nelson
263acebe5b6SAlexander Duyck for (i = 0; i < IONIC_NUM_PORT_STATS; i++)
264acebe5b6SAlexander Duyck ethtool_sprintf(buf, ionic_port_stats_desc[i].name);
265f64e0c56SShannon Nelson
266acebe5b6SAlexander Duyck for (q_num = 0; q_num < MAX_Q(lif); q_num++)
267acebe5b6SAlexander Duyck ionic_sw_stats_get_tx_strings(lif, buf, q_num);
268e470355bSShannon Nelson
269*196f56c0SShannon Nelson if (lif->hwstamp_txq)
270*196f56c0SShannon Nelson ionic_sw_stats_get_tx_strings(lif, buf, lif->hwstamp_txq->q.index);
271*196f56c0SShannon Nelson
272acebe5b6SAlexander Duyck for (q_num = 0; q_num < MAX_Q(lif); q_num++)
273acebe5b6SAlexander Duyck ionic_sw_stats_get_rx_strings(lif, buf, q_num);
274*196f56c0SShannon Nelson
275*196f56c0SShannon Nelson if (lif->hwstamp_rxq)
276*196f56c0SShannon Nelson ionic_sw_stats_get_rx_strings(lif, buf, lif->hwstamp_rxq->q.index);
277e470355bSShannon Nelson }
278e470355bSShannon Nelson
ionic_sw_stats_get_txq_values(struct ionic_lif * lif,u64 ** buf,int q_num)279aa620993SShannon Nelson static void ionic_sw_stats_get_txq_values(struct ionic_lif *lif, u64 **buf,
280aa620993SShannon Nelson int q_num)
281e470355bSShannon Nelson {
2824b514936SShannon Nelson struct ionic_tx_stats *txstats;
283aa620993SShannon Nelson int i;
284e470355bSShannon Nelson
28534dec947SShannon Nelson txstats = &lif->txqstats[q_num];
286e470355bSShannon Nelson
287e470355bSShannon Nelson for (i = 0; i < IONIC_NUM_TX_STATS; i++) {
288aa620993SShannon Nelson **buf = IONIC_READ_STAT64(txstats, &ionic_tx_stats_desc[i]);
289e470355bSShannon Nelson (*buf)++;
290e470355bSShannon Nelson }
291e470355bSShannon Nelson }
292e470355bSShannon Nelson
ionic_sw_stats_get_rxq_values(struct ionic_lif * lif,u64 ** buf,int q_num)293aa620993SShannon Nelson static void ionic_sw_stats_get_rxq_values(struct ionic_lif *lif, u64 **buf,
294aa620993SShannon Nelson int q_num)
295aa620993SShannon Nelson {
296aa620993SShannon Nelson struct ionic_rx_stats *rxstats;
297aa620993SShannon Nelson int i;
298aa620993SShannon Nelson
29934dec947SShannon Nelson rxstats = &lif->rxqstats[q_num];
300e470355bSShannon Nelson
301e470355bSShannon Nelson for (i = 0; i < IONIC_NUM_RX_STATS; i++) {
302aa620993SShannon Nelson **buf = IONIC_READ_STAT64(rxstats, &ionic_rx_stats_desc[i]);
303e470355bSShannon Nelson (*buf)++;
304e470355bSShannon Nelson }
305e470355bSShannon Nelson }
306aa620993SShannon Nelson
ionic_sw_stats_get_values(struct ionic_lif * lif,u64 ** buf)307aa620993SShannon Nelson static void ionic_sw_stats_get_values(struct ionic_lif *lif, u64 **buf)
308aa620993SShannon Nelson {
309aa620993SShannon Nelson struct ionic_port_stats *port_stats;
310aa620993SShannon Nelson struct ionic_lif_sw_stats lif_stats;
311aa620993SShannon Nelson int i, q_num;
312aa620993SShannon Nelson
313aa620993SShannon Nelson ionic_get_lif_stats(lif, &lif_stats);
314aa620993SShannon Nelson
315aa620993SShannon Nelson for (i = 0; i < IONIC_NUM_LIF_STATS; i++) {
316aa620993SShannon Nelson **buf = IONIC_READ_STAT64(&lif_stats, &ionic_lif_stats_desc[i]);
317aa620993SShannon Nelson (*buf)++;
318e470355bSShannon Nelson }
319aa620993SShannon Nelson
320aa620993SShannon Nelson port_stats = &lif->ionic->idev.port_info->stats;
321aa620993SShannon Nelson for (i = 0; i < IONIC_NUM_PORT_STATS; i++) {
322aa620993SShannon Nelson **buf = IONIC_READ_STAT_LE64(port_stats,
323aa620993SShannon Nelson &ionic_port_stats_desc[i]);
324aa620993SShannon Nelson (*buf)++;
325aa620993SShannon Nelson }
326aa620993SShannon Nelson
327aa620993SShannon Nelson for (q_num = 0; q_num < MAX_Q(lif); q_num++)
328aa620993SShannon Nelson ionic_sw_stats_get_txq_values(lif, buf, q_num);
329aa620993SShannon Nelson
330*196f56c0SShannon Nelson if (lif->hwstamp_txq)
331*196f56c0SShannon Nelson ionic_sw_stats_get_txq_values(lif, buf, lif->hwstamp_txq->q.index);
332*196f56c0SShannon Nelson
333aa620993SShannon Nelson for (q_num = 0; q_num < MAX_Q(lif); q_num++)
334aa620993SShannon Nelson ionic_sw_stats_get_rxq_values(lif, buf, q_num);
335*196f56c0SShannon Nelson
336*196f56c0SShannon Nelson if (lif->hwstamp_rxq)
337*196f56c0SShannon Nelson ionic_sw_stats_get_rxq_values(lif, buf, lif->hwstamp_rxq->q.index);
338e470355bSShannon Nelson }
339e470355bSShannon Nelson
340e470355bSShannon Nelson const struct ionic_stats_group_intf ionic_stats_groups[] = {
341e470355bSShannon Nelson /* SW Stats group */
342e470355bSShannon Nelson {
343e470355bSShannon Nelson .get_strings = ionic_sw_stats_get_strings,
344e470355bSShannon Nelson .get_values = ionic_sw_stats_get_values,
345e470355bSShannon Nelson .get_count = ionic_sw_stats_get_count,
346e470355bSShannon Nelson },
347e470355bSShannon Nelson /* Add more stat groups here */
348e470355bSShannon Nelson };
349e470355bSShannon Nelson
350e470355bSShannon Nelson const int ionic_num_stats_grps = ARRAY_SIZE(ionic_stats_groups);
351