@@ -100,11 +100,7 @@ static const struct nfp_et_stat nfp_net_et_stats[] = {
100
100
};
101
101
102
102
#define NN_ET_GLOBAL_STATS_LEN ARRAY_SIZE(nfp_net_et_stats)
103
- #define NN_ET_RVEC_STATS_LEN (nn->dp.num_r_vecs * 3)
104
103
#define NN_ET_RVEC_GATHER_STATS 7
105
- #define NN_ET_QUEUE_STATS_LEN ((nn->dp.num_tx_rings + nn->dp.num_rx_rings) * 2)
106
- #define NN_ET_STATS_LEN (NN_ET_GLOBAL_STATS_LEN + NN_ET_RVEC_GATHER_STATS + \
107
- NN_ET_RVEC_STATS_LEN + NN_ET_QUEUE_STATS_LEN)
108
104
109
105
static void nfp_net_get_nspinfo (struct nfp_app * app , char * version )
110
106
{
@@ -346,96 +342,146 @@ static __printf(2, 3) u8 *nfp_pr_et(u8 *data, const char *fmt, ...)
346
342
return data + ETH_GSTRING_LEN ;
347
343
}
348
344
349
- static void nfp_net_get_strings (struct net_device * netdev ,
350
- u32 stringset , u8 * data )
345
+ static unsigned int nfp_vnic_get_sw_stats_count (struct net_device * netdev )
351
346
{
352
347
struct nfp_net * nn = netdev_priv (netdev );
353
- int i ;
354
348
355
- switch (stringset ) {
356
- case ETH_SS_STATS :
357
- for (i = 0 ; i < NN_ET_GLOBAL_STATS_LEN ; i ++ )
358
- data = nfp_pr_et (data , nfp_net_et_stats [i ].name );
349
+ return NN_ET_RVEC_GATHER_STATS + nn -> dp .num_r_vecs * 3 ;
350
+ }
359
351
360
- for (i = 0 ; i < nn -> dp .num_r_vecs ; i ++ ) {
361
- data = nfp_pr_et (data , "rvec_%u_rx_pkts" , i );
362
- data = nfp_pr_et (data , "rvec_%u_tx_pkts" , i );
363
- data = nfp_pr_et (data , "rvec_%u_tx_busy" , i );
364
- }
352
+ static u8 * nfp_vnic_get_sw_stats_strings (struct net_device * netdev , u8 * data )
353
+ {
354
+ struct nfp_net * nn = netdev_priv (netdev );
355
+ int i ;
365
356
366
- data = nfp_pr_et (data , "hw_rx_csum_ok" );
367
- data = nfp_pr_et (data , "hw_rx_csum_inner_ok" );
368
- data = nfp_pr_et (data , "hw_rx_csum_err" );
369
- data = nfp_pr_et (data , "hw_tx_csum" );
370
- data = nfp_pr_et (data , "hw_tx_inner_csum" );
371
- data = nfp_pr_et (data , "tx_gather" );
372
- data = nfp_pr_et (data , "tx_lso" );
373
-
374
- for (i = 0 ; i < nn -> dp .num_tx_rings ; i ++ ) {
375
- data = nfp_pr_et (data , "txq_%u_pkts" , i );
376
- data = nfp_pr_et (data , "txq_%u_bytes" , i );
377
- }
357
+ for (i = 0 ; i < nn -> dp .num_r_vecs ; i ++ ) {
358
+ data = nfp_pr_et (data , "rvec_%u_rx_pkts" , i );
359
+ data = nfp_pr_et (data , "rvec_%u_tx_pkts" , i );
360
+ data = nfp_pr_et (data , "rvec_%u_tx_busy" , i );
361
+ }
378
362
379
- for (i = 0 ; i < nn -> dp .num_rx_rings ; i ++ ) {
380
- data = nfp_pr_et (data , "rxq_%u_pkts" , i );
381
- data = nfp_pr_et (data , "rxq_%u_bytes" , i );
382
- }
363
+ data = nfp_pr_et (data , "hw_rx_csum_ok" );
364
+ data = nfp_pr_et (data , "hw_rx_csum_inner_ok" );
365
+ data = nfp_pr_et (data , "hw_rx_csum_err" );
366
+ data = nfp_pr_et (data , "hw_tx_csum" );
367
+ data = nfp_pr_et (data , "hw_tx_inner_csum" );
368
+ data = nfp_pr_et (data , "tx_gather" );
369
+ data = nfp_pr_et (data , "tx_lso" );
383
370
384
- break ;
385
- }
371
+ return data ;
386
372
}
387
373
388
- static void nfp_net_get_stats (struct net_device * netdev ,
389
- struct ethtool_stats * stats , u64 * data )
374
+ static u64 * nfp_vnic_get_sw_stats (struct net_device * netdev , u64 * data )
390
375
{
391
376
u64 gathered_stats [NN_ET_RVEC_GATHER_STATS ] = {};
392
377
struct nfp_net * nn = netdev_priv (netdev );
393
378
u64 tmp [NN_ET_RVEC_GATHER_STATS ];
394
- u8 __iomem * io_p ;
395
- int i , j , k ;
379
+ unsigned int i , j ;
396
380
397
- for (i = 0 ; i < NN_ET_GLOBAL_STATS_LEN ; i ++ ) {
398
- io_p = nn -> dp .ctrl_bar + nfp_net_et_stats [i ].off ;
399
- data [i ] = readq (io_p );
400
- }
401
- for (j = 0 ; j < nn -> dp .num_r_vecs ; j ++ ) {
381
+ for (i = 0 ; i < nn -> dp .num_r_vecs ; i ++ ) {
402
382
unsigned int start ;
403
383
404
384
do {
405
- start = u64_stats_fetch_begin (& nn -> r_vecs [j ].rx_sync );
406
- data [ i ++ ] = nn -> r_vecs [j ].rx_pkts ;
407
- tmp [0 ] = nn -> r_vecs [j ].hw_csum_rx_ok ;
408
- tmp [1 ] = nn -> r_vecs [j ].hw_csum_rx_inner_ok ;
409
- tmp [2 ] = nn -> r_vecs [j ].hw_csum_rx_error ;
410
- } while (u64_stats_fetch_retry (& nn -> r_vecs [j ].rx_sync , start ));
385
+ start = u64_stats_fetch_begin (& nn -> r_vecs [i ].rx_sync );
386
+ * data ++ = nn -> r_vecs [i ].rx_pkts ;
387
+ tmp [0 ] = nn -> r_vecs [i ].hw_csum_rx_ok ;
388
+ tmp [1 ] = nn -> r_vecs [i ].hw_csum_rx_inner_ok ;
389
+ tmp [2 ] = nn -> r_vecs [i ].hw_csum_rx_error ;
390
+ } while (u64_stats_fetch_retry (& nn -> r_vecs [i ].rx_sync , start ));
411
391
412
392
do {
413
- start = u64_stats_fetch_begin (& nn -> r_vecs [j ].tx_sync );
414
- data [ i ++ ] = nn -> r_vecs [j ].tx_pkts ;
415
- data [ i ++ ] = nn -> r_vecs [j ].tx_busy ;
416
- tmp [3 ] = nn -> r_vecs [j ].hw_csum_tx ;
417
- tmp [4 ] = nn -> r_vecs [j ].hw_csum_tx_inner ;
418
- tmp [5 ] = nn -> r_vecs [j ].tx_gather ;
419
- tmp [6 ] = nn -> r_vecs [j ].tx_lso ;
420
- } while (u64_stats_fetch_retry (& nn -> r_vecs [j ].tx_sync , start ));
421
-
422
- for (k = 0 ; k < NN_ET_RVEC_GATHER_STATS ; k ++ )
423
- gathered_stats [k ] += tmp [k ];
393
+ start = u64_stats_fetch_begin (& nn -> r_vecs [i ].tx_sync );
394
+ * data ++ = nn -> r_vecs [i ].tx_pkts ;
395
+ * data ++ = nn -> r_vecs [i ].tx_busy ;
396
+ tmp [3 ] = nn -> r_vecs [i ].hw_csum_tx ;
397
+ tmp [4 ] = nn -> r_vecs [i ].hw_csum_tx_inner ;
398
+ tmp [5 ] = nn -> r_vecs [i ].tx_gather ;
399
+ tmp [6 ] = nn -> r_vecs [i ].tx_lso ;
400
+ } while (u64_stats_fetch_retry (& nn -> r_vecs [i ].tx_sync , start ));
401
+
402
+ for (j = 0 ; j < NN_ET_RVEC_GATHER_STATS ; j ++ )
403
+ gathered_stats [j ] += tmp [j ];
424
404
}
405
+
425
406
for (j = 0 ; j < NN_ET_RVEC_GATHER_STATS ; j ++ )
426
- data [i ++ ] = gathered_stats [j ];
427
- for (j = 0 ; j < nn -> dp .num_tx_rings ; j ++ ) {
428
- io_p = nn -> dp .ctrl_bar + NFP_NET_CFG_TXR_STATS (j );
429
- data [i ++ ] = readq (io_p );
430
- io_p = nn -> dp .ctrl_bar + NFP_NET_CFG_TXR_STATS (j ) + 8 ;
431
- data [i ++ ] = readq (io_p );
407
+ * data ++ = gathered_stats [j ];
408
+
409
+ return data ;
410
+ }
411
+
412
+ static unsigned int
413
+ nfp_vnic_get_hw_stats_count (unsigned int rx_rings , unsigned int tx_rings )
414
+ {
415
+ return NN_ET_GLOBAL_STATS_LEN + (rx_rings + tx_rings ) * 2 ;
416
+ }
417
+
418
+ static u8 *
419
+ nfp_vnic_get_hw_stats_strings (u8 * data , unsigned int rx_rings ,
420
+ unsigned int tx_rings )
421
+ {
422
+ int i ;
423
+
424
+ for (i = 0 ; i < NN_ET_GLOBAL_STATS_LEN ; i ++ )
425
+ data = nfp_pr_et (data , nfp_net_et_stats [i ].name );
426
+
427
+ for (i = 0 ; i < tx_rings ; i ++ ) {
428
+ data = nfp_pr_et (data , "txq_%u_pkts" , i );
429
+ data = nfp_pr_et (data , "txq_%u_bytes" , i );
432
430
}
433
- for (j = 0 ; j < nn -> dp .num_rx_rings ; j ++ ) {
434
- io_p = nn -> dp .ctrl_bar + NFP_NET_CFG_RXR_STATS (j );
435
- data [i ++ ] = readq (io_p );
436
- io_p = nn -> dp .ctrl_bar + NFP_NET_CFG_RXR_STATS (j ) + 8 ;
437
- data [i ++ ] = readq (io_p );
431
+
432
+ for (i = 0 ; i < rx_rings ; i ++ ) {
433
+ data = nfp_pr_et (data , "rxq_%u_pkts" , i );
434
+ data = nfp_pr_et (data , "rxq_%u_bytes" , i );
438
435
}
436
+
437
+ return data ;
438
+ }
439
+
440
+ static u64 *
441
+ nfp_vnic_get_hw_stats (u64 * data , u8 __iomem * mem ,
442
+ unsigned int rx_rings , unsigned int tx_rings )
443
+ {
444
+ unsigned int i ;
445
+
446
+ for (i = 0 ; i < NN_ET_GLOBAL_STATS_LEN ; i ++ )
447
+ * data ++ = readq (mem + nfp_net_et_stats [i ].off );
448
+
449
+ for (i = 0 ; i < tx_rings ; i ++ ) {
450
+ * data ++ = readq (mem + NFP_NET_CFG_TXR_STATS (i ));
451
+ * data ++ = readq (mem + NFP_NET_CFG_TXR_STATS (i ) + 8 );
452
+ }
453
+
454
+ for (i = 0 ; i < rx_rings ; i ++ ) {
455
+ * data ++ = readq (mem + NFP_NET_CFG_RXR_STATS (i ));
456
+ * data ++ = readq (mem + NFP_NET_CFG_RXR_STATS (i ) + 8 );
457
+ }
458
+
459
+ return data ;
460
+ }
461
+
462
+ static void nfp_net_get_strings (struct net_device * netdev ,
463
+ u32 stringset , u8 * data )
464
+ {
465
+ struct nfp_net * nn = netdev_priv (netdev );
466
+
467
+ switch (stringset ) {
468
+ case ETH_SS_STATS :
469
+ data = nfp_vnic_get_sw_stats_strings (netdev , data );
470
+ data = nfp_vnic_get_hw_stats_strings (data , nn -> dp .num_rx_rings ,
471
+ nn -> dp .num_tx_rings );
472
+ break ;
473
+ }
474
+ }
475
+
476
+ static void
477
+ nfp_net_get_stats (struct net_device * netdev , struct ethtool_stats * stats ,
478
+ u64 * data )
479
+ {
480
+ struct nfp_net * nn = netdev_priv (netdev );
481
+
482
+ data = nfp_vnic_get_sw_stats (netdev , data );
483
+ data = nfp_vnic_get_hw_stats (data , nn -> dp .ctrl_bar ,
484
+ nn -> dp .num_rx_rings , nn -> dp .num_tx_rings );
439
485
}
440
486
441
487
static int nfp_net_get_sset_count (struct net_device * netdev , int sset )
@@ -444,7 +490,9 @@ static int nfp_net_get_sset_count(struct net_device *netdev, int sset)
444
490
445
491
switch (sset ) {
446
492
case ETH_SS_STATS :
447
- return NN_ET_STATS_LEN ;
493
+ return nfp_vnic_get_sw_stats_count (netdev ) +
494
+ nfp_vnic_get_hw_stats_count (nn -> dp .num_rx_rings ,
495
+ nn -> dp .num_tx_rings );
448
496
default :
449
497
return - EOPNOTSUPP ;
450
498
}
0 commit comments