@@ -32,6 +32,41 @@ struct enic_stat {
32
32
.index = offsetof(struct vnic_gen_stats, stat) / sizeof(u64)\
33
33
}
34
34
35
+ #define ENIC_PER_RQ_STAT (stat ) { \
36
+ .name = "rq[%d]_"#stat, \
37
+ .index = offsetof(struct enic_rq_stats, stat) / sizeof(u64) \
38
+ }
39
+
40
+ #define ENIC_PER_WQ_STAT (stat ) { \
41
+ .name = "wq[%d]_"#stat, \
42
+ .index = offsetof(struct enic_wq_stats, stat) / sizeof(u64) \
43
+ }
44
+
45
+ static const struct enic_stat enic_per_rq_stats [] = {
46
+ ENIC_PER_RQ_STAT (l4_rss_hash ),
47
+ ENIC_PER_RQ_STAT (l3_rss_hash ),
48
+ ENIC_PER_RQ_STAT (csum_unnecessary_encap ),
49
+ ENIC_PER_RQ_STAT (vlan_stripped ),
50
+ ENIC_PER_RQ_STAT (napi_complete ),
51
+ ENIC_PER_RQ_STAT (napi_repoll ),
52
+ ENIC_PER_RQ_STAT (no_skb ),
53
+ ENIC_PER_RQ_STAT (desc_skip ),
54
+ };
55
+
56
+ #define NUM_ENIC_PER_RQ_STATS ARRAY_SIZE(enic_per_rq_stats)
57
+
58
+ static const struct enic_stat enic_per_wq_stats [] = {
59
+ ENIC_PER_WQ_STAT (encap_tso ),
60
+ ENIC_PER_WQ_STAT (encap_csum ),
61
+ ENIC_PER_WQ_STAT (add_vlan ),
62
+ ENIC_PER_WQ_STAT (cq_work ),
63
+ ENIC_PER_WQ_STAT (cq_bytes ),
64
+ ENIC_PER_WQ_STAT (null_pkt ),
65
+ ENIC_PER_WQ_STAT (skb_linear_fail ),
66
+ ENIC_PER_WQ_STAT (desc_full_awake ),
67
+ };
68
+
69
+ #define NUM_ENIC_PER_WQ_STATS ARRAY_SIZE(enic_per_wq_stats)
35
70
static const struct enic_stat enic_tx_stats [] = {
36
71
ENIC_TX_STAT (tx_frames_ok ),
37
72
ENIC_TX_STAT (tx_unicast_frames_ok ),
@@ -143,7 +178,9 @@ static void enic_get_drvinfo(struct net_device *netdev,
143
178
static void enic_get_strings (struct net_device * netdev , u32 stringset ,
144
179
u8 * data )
145
180
{
181
+ struct enic * enic = netdev_priv (netdev );
146
182
unsigned int i ;
183
+ unsigned int j ;
147
184
148
185
switch (stringset ) {
149
186
case ETH_SS_STATS :
@@ -159,6 +196,20 @@ static void enic_get_strings(struct net_device *netdev, u32 stringset,
159
196
memcpy (data , enic_gen_stats [i ].name , ETH_GSTRING_LEN );
160
197
data += ETH_GSTRING_LEN ;
161
198
}
199
+ for (i = 0 ; i < enic -> rq_count ; i ++ ) {
200
+ for (j = 0 ; j < NUM_ENIC_PER_RQ_STATS ; j ++ ) {
201
+ snprintf (data , ETH_GSTRING_LEN ,
202
+ enic_per_rq_stats [j ].name , i );
203
+ data += ETH_GSTRING_LEN ;
204
+ }
205
+ }
206
+ for (i = 0 ; i < enic -> wq_count ; i ++ ) {
207
+ for (j = 0 ; j < NUM_ENIC_PER_WQ_STATS ; j ++ ) {
208
+ snprintf (data , ETH_GSTRING_LEN ,
209
+ enic_per_wq_stats [j ].name , i );
210
+ data += ETH_GSTRING_LEN ;
211
+ }
212
+ }
162
213
break ;
163
214
}
164
215
}
@@ -244,10 +295,19 @@ static int enic_set_ringparam(struct net_device *netdev,
244
295
245
296
static int enic_get_sset_count (struct net_device * netdev , int sset )
246
297
{
298
+ struct enic * enic = netdev_priv (netdev );
299
+ unsigned int n_per_rq_stats ;
300
+ unsigned int n_per_wq_stats ;
301
+ unsigned int n_stats ;
302
+
247
303
switch (sset ) {
248
304
case ETH_SS_STATS :
249
- return NUM_ENIC_TX_STATS + NUM_ENIC_RX_STATS +
250
- NUM_ENIC_GEN_STATS ;
305
+ n_per_rq_stats = NUM_ENIC_PER_RQ_STATS * enic -> rq_count ;
306
+ n_per_wq_stats = NUM_ENIC_PER_WQ_STATS * enic -> wq_count ;
307
+ n_stats = NUM_ENIC_TX_STATS + NUM_ENIC_RX_STATS +
308
+ NUM_ENIC_GEN_STATS +
309
+ n_per_rq_stats + n_per_wq_stats ;
310
+ return n_stats ;
251
311
default :
252
312
return - EOPNOTSUPP ;
253
313
}
@@ -259,6 +319,7 @@ static void enic_get_ethtool_stats(struct net_device *netdev,
259
319
struct enic * enic = netdev_priv (netdev );
260
320
struct vnic_stats * vstats ;
261
321
unsigned int i ;
322
+ unsigned int j ;
262
323
int err ;
263
324
264
325
err = enic_dev_stats_dump (enic , & vstats );
@@ -275,6 +336,24 @@ static void enic_get_ethtool_stats(struct net_device *netdev,
275
336
* (data ++ ) = ((u64 * )& vstats -> rx )[enic_rx_stats [i ].index ];
276
337
for (i = 0 ; i < NUM_ENIC_GEN_STATS ; i ++ )
277
338
* (data ++ ) = ((u64 * )& enic -> gen_stats )[enic_gen_stats [i ].index ];
339
+ for (i = 0 ; i < enic -> rq_count ; i ++ ) {
340
+ struct enic_rq_stats * rqstats = & enic -> rq_stats [i ];
341
+ int index ;
342
+
343
+ for (j = 0 ; j < NUM_ENIC_PER_RQ_STATS ; j ++ ) {
344
+ index = enic_per_rq_stats [j ].index ;
345
+ * (data ++ ) = ((u64 * )rqstats )[index ];
346
+ }
347
+ }
348
+ for (i = 0 ; i < enic -> wq_count ; i ++ ) {
349
+ struct enic_wq_stats * wqstats = & enic -> wq_stats [i ];
350
+ int index ;
351
+
352
+ for (j = 0 ; j < NUM_ENIC_PER_WQ_STATS ; j ++ ) {
353
+ index = enic_per_wq_stats [j ].index ;
354
+ * (data ++ ) = ((u64 * )wqstats )[index ];
355
+ }
356
+ }
278
357
}
279
358
280
359
static u32 enic_get_msglevel (struct net_device * netdev )
0 commit comments