@@ -759,7 +759,9 @@ static void macb_tx_error_task(struct work_struct *work)
759
759
macb_tx_ring_wrap (bp , tail ),
760
760
skb -> data );
761
761
bp -> dev -> stats .tx_packets ++ ;
762
+ queue -> stats .tx_packets ++ ;
762
763
bp -> dev -> stats .tx_bytes += skb -> len ;
764
+ queue -> stats .tx_bytes += skb -> len ;
763
765
}
764
766
} else {
765
767
/* "Buffers exhausted mid-frame" errors may only happen
@@ -859,7 +861,9 @@ static void macb_tx_interrupt(struct macb_queue *queue)
859
861
macb_tx_ring_wrap (bp , tail ),
860
862
skb -> data );
861
863
bp -> dev -> stats .tx_packets ++ ;
864
+ queue -> stats .tx_packets ++ ;
862
865
bp -> dev -> stats .tx_bytes += skb -> len ;
866
+ queue -> stats .tx_bytes += skb -> len ;
863
867
}
864
868
865
869
/* Now we can safely release resources */
@@ -994,13 +998,15 @@ static int gem_rx(struct macb_queue *queue, int budget)
994
998
netdev_err (bp -> dev ,
995
999
"not whole frame pointed by descriptor\n" );
996
1000
bp -> dev -> stats .rx_dropped ++ ;
1001
+ queue -> stats .rx_dropped ++ ;
997
1002
break ;
998
1003
}
999
1004
skb = queue -> rx_skbuff [entry ];
1000
1005
if (unlikely (!skb )) {
1001
1006
netdev_err (bp -> dev ,
1002
1007
"inconsistent Rx descriptor chain\n" );
1003
1008
bp -> dev -> stats .rx_dropped ++ ;
1009
+ queue -> stats .rx_dropped ++ ;
1004
1010
break ;
1005
1011
}
1006
1012
/* now everything is ready for receiving packet */
@@ -1021,7 +1027,9 @@ static int gem_rx(struct macb_queue *queue, int budget)
1021
1027
skb -> ip_summed = CHECKSUM_UNNECESSARY ;
1022
1028
1023
1029
bp -> dev -> stats .rx_packets ++ ;
1030
+ queue -> stats .rx_packets ++ ;
1024
1031
bp -> dev -> stats .rx_bytes += skb -> len ;
1032
+ queue -> stats .rx_bytes += skb -> len ;
1025
1033
1026
1034
gem_ptp_do_rxstamp (bp , skb , desc );
1027
1035
@@ -2304,7 +2312,10 @@ static int macb_change_mtu(struct net_device *dev, int new_mtu)
2304
2312
2305
2313
static void gem_update_stats (struct macb * bp )
2306
2314
{
2307
- unsigned int i ;
2315
+ struct macb_queue * queue ;
2316
+ unsigned int i , q , idx ;
2317
+ unsigned long * stat ;
2318
+
2308
2319
u32 * p = & bp -> hw_stats .gem .tx_octets_31_0 ;
2309
2320
2310
2321
for (i = 0 ; i < GEM_STATS_LEN ; ++ i , ++ p ) {
@@ -2321,6 +2332,11 @@ static void gem_update_stats(struct macb *bp)
2321
2332
* (++ p ) += val ;
2322
2333
}
2323
2334
}
2335
+
2336
+ idx = GEM_STATS_LEN ;
2337
+ for (q = 0 , queue = bp -> queues ; q < bp -> num_queues ; ++ q , ++ queue )
2338
+ for (i = 0 , stat = & queue -> stats .first ; i < QUEUE_STATS_LEN ; ++ i , ++ stat )
2339
+ bp -> ethtool_stats [idx ++ ] = * stat ;
2324
2340
}
2325
2341
2326
2342
static struct net_device_stats * gem_get_stats (struct macb * bp )
@@ -2368,28 +2384,43 @@ static void gem_get_ethtool_stats(struct net_device *dev,
2368
2384
2369
2385
bp = netdev_priv (dev );
2370
2386
gem_update_stats (bp );
2371
- memcpy (data , & bp -> ethtool_stats , sizeof (u64 ) * GEM_STATS_LEN );
2387
+ memcpy (data , & bp -> ethtool_stats , sizeof (u64 )
2388
+ * (GEM_STATS_LEN + QUEUE_STATS_LEN * MACB_MAX_QUEUES ));
2372
2389
}
2373
2390
2374
2391
static int gem_get_sset_count (struct net_device * dev , int sset )
2375
2392
{
2393
+ struct macb * bp = netdev_priv (dev );
2394
+
2376
2395
switch (sset ) {
2377
2396
case ETH_SS_STATS :
2378
- return GEM_STATS_LEN ;
2397
+ return GEM_STATS_LEN + bp -> num_queues * QUEUE_STATS_LEN ;
2379
2398
default :
2380
2399
return - EOPNOTSUPP ;
2381
2400
}
2382
2401
}
2383
2402
2384
2403
static void gem_get_ethtool_strings (struct net_device * dev , u32 sset , u8 * p )
2385
2404
{
2405
+ char stat_string [ETH_GSTRING_LEN ];
2406
+ struct macb * bp = netdev_priv (dev );
2407
+ struct macb_queue * queue ;
2386
2408
unsigned int i ;
2409
+ unsigned int q ;
2387
2410
2388
2411
switch (sset ) {
2389
2412
case ETH_SS_STATS :
2390
2413
for (i = 0 ; i < GEM_STATS_LEN ; i ++ , p += ETH_GSTRING_LEN )
2391
2414
memcpy (p , gem_statistics [i ].stat_string ,
2392
2415
ETH_GSTRING_LEN );
2416
+
2417
+ for (q = 0 , queue = bp -> queues ; q < bp -> num_queues ; ++ q , ++ queue ) {
2418
+ for (i = 0 ; i < QUEUE_STATS_LEN ; i ++ , p += ETH_GSTRING_LEN ) {
2419
+ snprintf (stat_string , ETH_GSTRING_LEN , "q%d_%s" ,
2420
+ q , queue_statistics [i ].stat_string );
2421
+ memcpy (p , stat_string , ETH_GSTRING_LEN );
2422
+ }
2423
+ }
2393
2424
break ;
2394
2425
}
2395
2426
}
0 commit comments