@@ -32,6 +32,41 @@ struct enic_stat {
3232 .index = offsetof(struct vnic_gen_stats, stat) / sizeof(u64)\
3333}
3434
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)
3570static const struct enic_stat enic_tx_stats [] = {
3671 ENIC_TX_STAT (tx_frames_ok ),
3772 ENIC_TX_STAT (tx_unicast_frames_ok ),
@@ -143,7 +178,9 @@ static void enic_get_drvinfo(struct net_device *netdev,
143178static void enic_get_strings (struct net_device * netdev , u32 stringset ,
144179 u8 * data )
145180{
181+ struct enic * enic = netdev_priv (netdev );
146182 unsigned int i ;
183+ unsigned int j ;
147184
148185 switch (stringset ) {
149186 case ETH_SS_STATS :
@@ -159,6 +196,20 @@ static void enic_get_strings(struct net_device *netdev, u32 stringset,
159196 memcpy (data , enic_gen_stats [i ].name , ETH_GSTRING_LEN );
160197 data += ETH_GSTRING_LEN ;
161198 }
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+ }
162213 break ;
163214 }
164215}
@@ -244,10 +295,19 @@ static int enic_set_ringparam(struct net_device *netdev,
244295
245296static int enic_get_sset_count (struct net_device * netdev , int sset )
246297{
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+
247303 switch (sset ) {
248304 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 ;
251311 default :
252312 return - EOPNOTSUPP ;
253313 }
@@ -259,6 +319,7 @@ static void enic_get_ethtool_stats(struct net_device *netdev,
259319 struct enic * enic = netdev_priv (netdev );
260320 struct vnic_stats * vstats ;
261321 unsigned int i ;
322+ unsigned int j ;
262323 int err ;
263324
264325 err = enic_dev_stats_dump (enic , & vstats );
@@ -275,6 +336,24 @@ static void enic_get_ethtool_stats(struct net_device *netdev,
275336 * (data ++ ) = ((u64 * )& vstats -> rx )[enic_rx_stats [i ].index ];
276337 for (i = 0 ; i < NUM_ENIC_GEN_STATS ; i ++ )
277338 * (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+ }
278357}
279358
280359static u32 enic_get_msglevel (struct net_device * netdev )
0 commit comments