@@ -453,6 +453,171 @@ static int ef100_reset(struct efx_nic *efx, enum reset_type reset_type)
453
453
return rc ;
454
454
}
455
455
456
+ static void ef100_common_stat_mask (unsigned long * mask )
457
+ {
458
+ __set_bit (EF100_STAT_port_rx_packets , mask );
459
+ __set_bit (EF100_STAT_port_tx_packets , mask );
460
+ __set_bit (EF100_STAT_port_rx_bytes , mask );
461
+ __set_bit (EF100_STAT_port_tx_bytes , mask );
462
+ __set_bit (EF100_STAT_port_rx_multicast , mask );
463
+ __set_bit (EF100_STAT_port_rx_bad , mask );
464
+ __set_bit (EF100_STAT_port_rx_align_error , mask );
465
+ __set_bit (EF100_STAT_port_rx_overflow , mask );
466
+ }
467
+
468
+ static void ef100_ethtool_stat_mask (unsigned long * mask )
469
+ {
470
+ __set_bit (EF100_STAT_port_tx_pause , mask );
471
+ __set_bit (EF100_STAT_port_tx_unicast , mask );
472
+ __set_bit (EF100_STAT_port_tx_multicast , mask );
473
+ __set_bit (EF100_STAT_port_tx_broadcast , mask );
474
+ __set_bit (EF100_STAT_port_tx_lt64 , mask );
475
+ __set_bit (EF100_STAT_port_tx_64 , mask );
476
+ __set_bit (EF100_STAT_port_tx_65_to_127 , mask );
477
+ __set_bit (EF100_STAT_port_tx_128_to_255 , mask );
478
+ __set_bit (EF100_STAT_port_tx_256_to_511 , mask );
479
+ __set_bit (EF100_STAT_port_tx_512_to_1023 , mask );
480
+ __set_bit (EF100_STAT_port_tx_1024_to_15xx , mask );
481
+ __set_bit (EF100_STAT_port_tx_15xx_to_jumbo , mask );
482
+ __set_bit (EF100_STAT_port_rx_good , mask );
483
+ __set_bit (EF100_STAT_port_rx_pause , mask );
484
+ __set_bit (EF100_STAT_port_rx_unicast , mask );
485
+ __set_bit (EF100_STAT_port_rx_broadcast , mask );
486
+ __set_bit (EF100_STAT_port_rx_lt64 , mask );
487
+ __set_bit (EF100_STAT_port_rx_64 , mask );
488
+ __set_bit (EF100_STAT_port_rx_65_to_127 , mask );
489
+ __set_bit (EF100_STAT_port_rx_128_to_255 , mask );
490
+ __set_bit (EF100_STAT_port_rx_256_to_511 , mask );
491
+ __set_bit (EF100_STAT_port_rx_512_to_1023 , mask );
492
+ __set_bit (EF100_STAT_port_rx_1024_to_15xx , mask );
493
+ __set_bit (EF100_STAT_port_rx_15xx_to_jumbo , mask );
494
+ __set_bit (EF100_STAT_port_rx_gtjumbo , mask );
495
+ __set_bit (EF100_STAT_port_rx_bad_gtjumbo , mask );
496
+ __set_bit (EF100_STAT_port_rx_length_error , mask );
497
+ __set_bit (EF100_STAT_port_rx_nodesc_drops , mask );
498
+ __set_bit (GENERIC_STAT_rx_nodesc_trunc , mask );
499
+ __set_bit (GENERIC_STAT_rx_noskb_drops , mask );
500
+ }
501
+
502
+ #define EF100_DMA_STAT (ext_name , mcdi_name ) \
503
+ [EF100_STAT_ ## ext_name] = \
504
+ { #ext_name, 64, 8 * MC_CMD_MAC_ ## mcdi_name }
505
+
506
+ static const struct efx_hw_stat_desc ef100_stat_desc [EF100_STAT_COUNT ] = {
507
+ EF100_DMA_STAT (port_tx_bytes , TX_BYTES ),
508
+ EF100_DMA_STAT (port_tx_packets , TX_PKTS ),
509
+ EF100_DMA_STAT (port_tx_pause , TX_PAUSE_PKTS ),
510
+ EF100_DMA_STAT (port_tx_unicast , TX_UNICAST_PKTS ),
511
+ EF100_DMA_STAT (port_tx_multicast , TX_MULTICAST_PKTS ),
512
+ EF100_DMA_STAT (port_tx_broadcast , TX_BROADCAST_PKTS ),
513
+ EF100_DMA_STAT (port_tx_lt64 , TX_LT64_PKTS ),
514
+ EF100_DMA_STAT (port_tx_64 , TX_64_PKTS ),
515
+ EF100_DMA_STAT (port_tx_65_to_127 , TX_65_TO_127_PKTS ),
516
+ EF100_DMA_STAT (port_tx_128_to_255 , TX_128_TO_255_PKTS ),
517
+ EF100_DMA_STAT (port_tx_256_to_511 , TX_256_TO_511_PKTS ),
518
+ EF100_DMA_STAT (port_tx_512_to_1023 , TX_512_TO_1023_PKTS ),
519
+ EF100_DMA_STAT (port_tx_1024_to_15xx , TX_1024_TO_15XX_PKTS ),
520
+ EF100_DMA_STAT (port_tx_15xx_to_jumbo , TX_15XX_TO_JUMBO_PKTS ),
521
+ EF100_DMA_STAT (port_rx_bytes , RX_BYTES ),
522
+ EF100_DMA_STAT (port_rx_packets , RX_PKTS ),
523
+ EF100_DMA_STAT (port_rx_good , RX_GOOD_PKTS ),
524
+ EF100_DMA_STAT (port_rx_bad , RX_BAD_FCS_PKTS ),
525
+ EF100_DMA_STAT (port_rx_pause , RX_PAUSE_PKTS ),
526
+ EF100_DMA_STAT (port_rx_unicast , RX_UNICAST_PKTS ),
527
+ EF100_DMA_STAT (port_rx_multicast , RX_MULTICAST_PKTS ),
528
+ EF100_DMA_STAT (port_rx_broadcast , RX_BROADCAST_PKTS ),
529
+ EF100_DMA_STAT (port_rx_lt64 , RX_UNDERSIZE_PKTS ),
530
+ EF100_DMA_STAT (port_rx_64 , RX_64_PKTS ),
531
+ EF100_DMA_STAT (port_rx_65_to_127 , RX_65_TO_127_PKTS ),
532
+ EF100_DMA_STAT (port_rx_128_to_255 , RX_128_TO_255_PKTS ),
533
+ EF100_DMA_STAT (port_rx_256_to_511 , RX_256_TO_511_PKTS ),
534
+ EF100_DMA_STAT (port_rx_512_to_1023 , RX_512_TO_1023_PKTS ),
535
+ EF100_DMA_STAT (port_rx_1024_to_15xx , RX_1024_TO_15XX_PKTS ),
536
+ EF100_DMA_STAT (port_rx_15xx_to_jumbo , RX_15XX_TO_JUMBO_PKTS ),
537
+ EF100_DMA_STAT (port_rx_gtjumbo , RX_GTJUMBO_PKTS ),
538
+ EF100_DMA_STAT (port_rx_bad_gtjumbo , RX_JABBER_PKTS ),
539
+ EF100_DMA_STAT (port_rx_align_error , RX_ALIGN_ERROR_PKTS ),
540
+ EF100_DMA_STAT (port_rx_length_error , RX_LENGTH_ERROR_PKTS ),
541
+ EF100_DMA_STAT (port_rx_overflow , RX_OVERFLOW_PKTS ),
542
+ EF100_DMA_STAT (port_rx_nodesc_drops , RX_NODESC_DROPS ),
543
+ EFX_GENERIC_SW_STAT (rx_nodesc_trunc ),
544
+ EFX_GENERIC_SW_STAT (rx_noskb_drops ),
545
+ };
546
+
547
+ static size_t ef100_describe_stats (struct efx_nic * efx , u8 * names )
548
+ {
549
+ DECLARE_BITMAP (mask , EF100_STAT_COUNT ) = {};
550
+
551
+ ef100_ethtool_stat_mask (mask );
552
+ return efx_nic_describe_stats (ef100_stat_desc , EF100_STAT_COUNT ,
553
+ mask , names );
554
+ }
555
+
556
+ static size_t ef100_update_stats_common (struct efx_nic * efx , u64 * full_stats ,
557
+ struct rtnl_link_stats64 * core_stats )
558
+ {
559
+ struct ef100_nic_data * nic_data = efx -> nic_data ;
560
+ DECLARE_BITMAP (mask , EF100_STAT_COUNT ) = {};
561
+ size_t stats_count = 0 , index ;
562
+ u64 * stats = nic_data -> stats ;
563
+
564
+ ef100_ethtool_stat_mask (mask );
565
+
566
+ if (full_stats ) {
567
+ for_each_set_bit (index , mask , EF100_STAT_COUNT ) {
568
+ if (ef100_stat_desc [index ].name ) {
569
+ * full_stats ++ = stats [index ];
570
+ ++ stats_count ;
571
+ }
572
+ }
573
+ }
574
+
575
+ if (!core_stats )
576
+ return stats_count ;
577
+
578
+ core_stats -> rx_packets = stats [EF100_STAT_port_rx_packets ];
579
+ core_stats -> tx_packets = stats [EF100_STAT_port_tx_packets ];
580
+ core_stats -> rx_bytes = stats [EF100_STAT_port_rx_bytes ];
581
+ core_stats -> tx_bytes = stats [EF100_STAT_port_tx_bytes ];
582
+ core_stats -> rx_dropped = stats [EF100_STAT_port_rx_nodesc_drops ] +
583
+ stats [GENERIC_STAT_rx_nodesc_trunc ] +
584
+ stats [GENERIC_STAT_rx_noskb_drops ];
585
+ core_stats -> multicast = stats [EF100_STAT_port_rx_multicast ];
586
+ core_stats -> rx_length_errors =
587
+ stats [EF100_STAT_port_rx_gtjumbo ] +
588
+ stats [EF100_STAT_port_rx_length_error ];
589
+ core_stats -> rx_crc_errors = stats [EF100_STAT_port_rx_bad ];
590
+ core_stats -> rx_frame_errors =
591
+ stats [EF100_STAT_port_rx_align_error ];
592
+ core_stats -> rx_fifo_errors = stats [EF100_STAT_port_rx_overflow ];
593
+ core_stats -> rx_errors = (core_stats -> rx_length_errors +
594
+ core_stats -> rx_crc_errors +
595
+ core_stats -> rx_frame_errors );
596
+
597
+ return stats_count ;
598
+ }
599
+
600
+ static size_t ef100_update_stats (struct efx_nic * efx ,
601
+ u64 * full_stats ,
602
+ struct rtnl_link_stats64 * core_stats )
603
+ {
604
+ __le64 * mc_stats = kmalloc (array_size (efx -> num_mac_stats , sizeof (__le64 )), GFP_ATOMIC );
605
+ struct ef100_nic_data * nic_data = efx -> nic_data ;
606
+ DECLARE_BITMAP (mask , EF100_STAT_COUNT ) = {};
607
+ u64 * stats = nic_data -> stats ;
608
+
609
+ ef100_common_stat_mask (mask );
610
+ ef100_ethtool_stat_mask (mask );
611
+
612
+ efx_nic_copy_stats (efx , mc_stats );
613
+ efx_nic_update_stats (ef100_stat_desc , EF100_STAT_COUNT , mask ,
614
+ stats , mc_stats , false);
615
+
616
+ kfree (mc_stats );
617
+
618
+ return ef100_update_stats_common (efx , full_stats , core_stats );
619
+ }
620
+
456
621
static int efx_ef100_get_phys_port_id (struct efx_nic * efx ,
457
622
struct netdev_phys_item_id * ppid )
458
623
{
@@ -557,6 +722,11 @@ const struct efx_nic_type ef100_pf_nic_type = {
557
722
.rx_restore_rss_contexts = efx_mcdi_rx_restore_rss_contexts ,
558
723
559
724
.reconfigure_mac = ef100_reconfigure_mac ,
725
+ .describe_stats = ef100_describe_stats ,
726
+ .start_stats = efx_mcdi_mac_start_stats ,
727
+ .update_stats = ef100_update_stats ,
728
+ .pull_stats = efx_mcdi_mac_pull_stats ,
729
+ .stop_stats = efx_mcdi_mac_stop_stats ,
560
730
561
731
/* Per-type bar/size configuration not used on ef100. Location of
562
732
* registers is defined by extended capabilities.
0 commit comments