73
73
74
74
#define PS_TO_REG 200
75
75
76
+ struct kszphy_hw_stat {
77
+ const char * string ;
78
+ u8 reg ;
79
+ u8 bits ;
80
+ };
81
+
82
+ static struct kszphy_hw_stat kszphy_hw_stats [] = {
83
+ { "phy_receive_errors" , 21 , 16 },
84
+ { "phy_idle_errors" , 10 , 8 },
85
+ };
86
+
76
87
struct kszphy_type {
77
88
u32 led_mode_reg ;
78
89
u16 interrupt_level_mask ;
@@ -86,6 +97,7 @@ struct kszphy_priv {
86
97
int led_mode ;
87
98
bool rmii_ref_clk_sel ;
88
99
bool rmii_ref_clk_sel_val ;
100
+ u64 stats [ARRAY_SIZE (kszphy_hw_stats )];
89
101
};
90
102
91
103
static const struct kszphy_type ksz8021_type = {
@@ -569,6 +581,51 @@ ksz9021_wr_mmd_phyreg(struct phy_device *phydev, int ptrad, int devnum,
569
581
{
570
582
}
571
583
584
+ static int kszphy_get_sset_count (struct phy_device * phydev )
585
+ {
586
+ return ARRAY_SIZE (kszphy_hw_stats );
587
+ }
588
+
589
+ static void kszphy_get_strings (struct phy_device * phydev , u8 * data )
590
+ {
591
+ int i ;
592
+
593
+ for (i = 0 ; i < ARRAY_SIZE (kszphy_hw_stats ); i ++ ) {
594
+ memcpy (data + i * ETH_GSTRING_LEN ,
595
+ kszphy_hw_stats [i ].string , ETH_GSTRING_LEN );
596
+ }
597
+ }
598
+
599
+ #ifndef UINT64_MAX
600
+ #define UINT64_MAX (u64)(~((u64)0))
601
+ #endif
602
+ static u64 kszphy_get_stat (struct phy_device * phydev , int i )
603
+ {
604
+ struct kszphy_hw_stat stat = kszphy_hw_stats [i ];
605
+ struct kszphy_priv * priv = phydev -> priv ;
606
+ u64 val ;
607
+
608
+ val = phy_read (phydev , stat .reg );
609
+ if (val < 0 ) {
610
+ val = UINT64_MAX ;
611
+ } else {
612
+ val = val & ((1 << stat .bits ) - 1 );
613
+ priv -> stats [i ] += val ;
614
+ val = priv -> stats [i ];
615
+ }
616
+
617
+ return val ;
618
+ }
619
+
620
+ static void kszphy_get_stats (struct phy_device * phydev ,
621
+ struct ethtool_stats * stats , u64 * data )
622
+ {
623
+ int i ;
624
+
625
+ for (i = 0 ; i < ARRAY_SIZE (kszphy_hw_stats ); i ++ )
626
+ data [i ] = kszphy_get_stat (phydev , i );
627
+ }
628
+
572
629
static int kszphy_probe (struct phy_device * phydev )
573
630
{
574
631
const struct kszphy_type * type = phydev -> drv -> driver_data ;
@@ -642,6 +699,9 @@ static struct phy_driver ksphy_driver[] = {
642
699
.read_status = genphy_read_status ,
643
700
.ack_interrupt = kszphy_ack_interrupt ,
644
701
.config_intr = kszphy_config_intr ,
702
+ .get_sset_count = kszphy_get_sset_count ,
703
+ .get_strings = kszphy_get_strings ,
704
+ .get_stats = kszphy_get_stats ,
645
705
.suspend = genphy_suspend ,
646
706
.resume = genphy_resume ,
647
707
.driver = { .owner = THIS_MODULE ,},
@@ -659,6 +719,9 @@ static struct phy_driver ksphy_driver[] = {
659
719
.read_status = genphy_read_status ,
660
720
.ack_interrupt = kszphy_ack_interrupt ,
661
721
.config_intr = kszphy_config_intr ,
722
+ .get_sset_count = kszphy_get_sset_count ,
723
+ .get_strings = kszphy_get_strings ,
724
+ .get_stats = kszphy_get_stats ,
662
725
.suspend = genphy_suspend ,
663
726
.resume = genphy_resume ,
664
727
.driver = { .owner = THIS_MODULE ,},
@@ -676,6 +739,9 @@ static struct phy_driver ksphy_driver[] = {
676
739
.read_status = genphy_read_status ,
677
740
.ack_interrupt = kszphy_ack_interrupt ,
678
741
.config_intr = kszphy_config_intr ,
742
+ .get_sset_count = kszphy_get_sset_count ,
743
+ .get_strings = kszphy_get_strings ,
744
+ .get_stats = kszphy_get_stats ,
679
745
.suspend = genphy_suspend ,
680
746
.resume = genphy_resume ,
681
747
.driver = { .owner = THIS_MODULE ,},
@@ -693,6 +759,9 @@ static struct phy_driver ksphy_driver[] = {
693
759
.read_status = genphy_read_status ,
694
760
.ack_interrupt = kszphy_ack_interrupt ,
695
761
.config_intr = kszphy_config_intr ,
762
+ .get_sset_count = kszphy_get_sset_count ,
763
+ .get_strings = kszphy_get_strings ,
764
+ .get_stats = kszphy_get_stats ,
696
765
.suspend = genphy_suspend ,
697
766
.resume = genphy_resume ,
698
767
.driver = { .owner = THIS_MODULE ,},
@@ -710,6 +779,9 @@ static struct phy_driver ksphy_driver[] = {
710
779
.read_status = genphy_read_status ,
711
780
.ack_interrupt = kszphy_ack_interrupt ,
712
781
.config_intr = kszphy_config_intr ,
782
+ .get_sset_count = kszphy_get_sset_count ,
783
+ .get_strings = kszphy_get_strings ,
784
+ .get_stats = kszphy_get_stats ,
713
785
.suspend = genphy_suspend ,
714
786
.resume = genphy_resume ,
715
787
.driver = { .owner = THIS_MODULE ,},
@@ -727,6 +799,9 @@ static struct phy_driver ksphy_driver[] = {
727
799
.read_status = genphy_read_status ,
728
800
.ack_interrupt = kszphy_ack_interrupt ,
729
801
.config_intr = kszphy_config_intr ,
802
+ .get_sset_count = kszphy_get_sset_count ,
803
+ .get_strings = kszphy_get_strings ,
804
+ .get_stats = kszphy_get_stats ,
730
805
.suspend = genphy_suspend ,
731
806
.resume = genphy_resume ,
732
807
.driver = { .owner = THIS_MODULE ,},
@@ -743,6 +818,9 @@ static struct phy_driver ksphy_driver[] = {
743
818
.read_status = genphy_read_status ,
744
819
.ack_interrupt = kszphy_ack_interrupt ,
745
820
.config_intr = kszphy_config_intr ,
821
+ .get_sset_count = kszphy_get_sset_count ,
822
+ .get_strings = kszphy_get_strings ,
823
+ .get_stats = kszphy_get_stats ,
746
824
.suspend = genphy_suspend ,
747
825
.resume = genphy_resume ,
748
826
.driver = { .owner = THIS_MODULE ,},
@@ -759,6 +837,9 @@ static struct phy_driver ksphy_driver[] = {
759
837
.read_status = genphy_read_status ,
760
838
.ack_interrupt = kszphy_ack_interrupt ,
761
839
.config_intr = kszphy_config_intr ,
840
+ .get_sset_count = kszphy_get_sset_count ,
841
+ .get_strings = kszphy_get_strings ,
842
+ .get_stats = kszphy_get_stats ,
762
843
.suspend = genphy_suspend ,
763
844
.resume = genphy_resume ,
764
845
.driver = { .owner = THIS_MODULE ,},
@@ -773,6 +854,9 @@ static struct phy_driver ksphy_driver[] = {
773
854
.read_status = genphy_read_status ,
774
855
.ack_interrupt = kszphy_ack_interrupt ,
775
856
.config_intr = kszphy_config_intr ,
857
+ .get_sset_count = kszphy_get_sset_count ,
858
+ .get_strings = kszphy_get_strings ,
859
+ .get_stats = kszphy_get_stats ,
776
860
.suspend = genphy_suspend ,
777
861
.resume = genphy_resume ,
778
862
.driver = { .owner = THIS_MODULE ,},
@@ -788,6 +872,9 @@ static struct phy_driver ksphy_driver[] = {
788
872
.read_status = genphy_read_status ,
789
873
.ack_interrupt = kszphy_ack_interrupt ,
790
874
.config_intr = kszphy_config_intr ,
875
+ .get_sset_count = kszphy_get_sset_count ,
876
+ .get_strings = kszphy_get_strings ,
877
+ .get_stats = kszphy_get_stats ,
791
878
.suspend = genphy_suspend ,
792
879
.resume = genphy_resume ,
793
880
.read_mmd_indirect = ksz9021_rd_mmd_phyreg ,
@@ -805,6 +892,9 @@ static struct phy_driver ksphy_driver[] = {
805
892
.read_status = ksz9031_read_status ,
806
893
.ack_interrupt = kszphy_ack_interrupt ,
807
894
.config_intr = kszphy_config_intr ,
895
+ .get_sset_count = kszphy_get_sset_count ,
896
+ .get_strings = kszphy_get_strings ,
897
+ .get_stats = kszphy_get_stats ,
808
898
.suspend = genphy_suspend ,
809
899
.resume = genphy_resume ,
810
900
.driver = { .owner = THIS_MODULE , },
@@ -817,6 +907,9 @@ static struct phy_driver ksphy_driver[] = {
817
907
.config_init = kszphy_config_init ,
818
908
.config_aneg = ksz8873mll_config_aneg ,
819
909
.read_status = ksz8873mll_read_status ,
910
+ .get_sset_count = kszphy_get_sset_count ,
911
+ .get_strings = kszphy_get_strings ,
912
+ .get_stats = kszphy_get_stats ,
820
913
.suspend = genphy_suspend ,
821
914
.resume = genphy_resume ,
822
915
.driver = { .owner = THIS_MODULE , },
@@ -829,6 +922,9 @@ static struct phy_driver ksphy_driver[] = {
829
922
.config_init = kszphy_config_init ,
830
923
.config_aneg = genphy_config_aneg ,
831
924
.read_status = genphy_read_status ,
925
+ .get_sset_count = kszphy_get_sset_count ,
926
+ .get_strings = kszphy_get_strings ,
927
+ .get_stats = kszphy_get_stats ,
832
928
.suspend = genphy_suspend ,
833
929
.resume = genphy_resume ,
834
930
.driver = { .owner = THIS_MODULE , },
0 commit comments