@@ -702,6 +702,36 @@ static void bcm54xx_get_stats(struct phy_device *phydev,
702
702
bcm_phy_get_stats (phydev , priv -> stats , stats , data );
703
703
}
704
704
705
+ static void bcm54xx_link_change_notify (struct phy_device * phydev )
706
+ {
707
+ u16 mask = MII_BCM54XX_EXP_EXP08_EARLY_DAC_WAKE |
708
+ MII_BCM54XX_EXP_EXP08_FORCE_DAC_WAKE ;
709
+ int ret ;
710
+
711
+ if (phydev -> state != PHY_RUNNING )
712
+ return ;
713
+
714
+ /* Don't change the DAC wake settings if auto power down
715
+ * is not requested.
716
+ */
717
+ if (!(phydev -> dev_flags & PHY_BRCM_AUTO_PWRDWN_ENABLE ))
718
+ return ;
719
+
720
+ ret = bcm_phy_read_exp (phydev , MII_BCM54XX_EXP_EXP08 );
721
+ if (ret < 0 )
722
+ return ;
723
+
724
+ /* Enable/disable 10BaseT auto and forced early DAC wake depending
725
+ * on the negotiated speed, those settings should only be done
726
+ * for 10Mbits/sec.
727
+ */
728
+ if (phydev -> speed == SPEED_10 )
729
+ ret |= mask ;
730
+ else
731
+ ret &= ~mask ;
732
+ bcm_phy_write_exp (phydev , MII_BCM54XX_EXP_EXP08 , ret );
733
+ }
734
+
705
735
static struct phy_driver broadcom_drivers [] = {
706
736
{
707
737
.phy_id = PHY_ID_BCM5411 ,
@@ -715,6 +745,7 @@ static struct phy_driver broadcom_drivers[] = {
715
745
.config_init = bcm54xx_config_init ,
716
746
.config_intr = bcm_phy_config_intr ,
717
747
.handle_interrupt = bcm_phy_handle_interrupt ,
748
+ .link_change_notify = bcm54xx_link_change_notify ,
718
749
}, {
719
750
.phy_id = PHY_ID_BCM5421 ,
720
751
.phy_id_mask = 0xfffffff0 ,
@@ -727,6 +758,7 @@ static struct phy_driver broadcom_drivers[] = {
727
758
.config_init = bcm54xx_config_init ,
728
759
.config_intr = bcm_phy_config_intr ,
729
760
.handle_interrupt = bcm_phy_handle_interrupt ,
761
+ .link_change_notify = bcm54xx_link_change_notify ,
730
762
}, {
731
763
.phy_id = PHY_ID_BCM54210E ,
732
764
.phy_id_mask = 0xfffffff0 ,
@@ -739,6 +771,7 @@ static struct phy_driver broadcom_drivers[] = {
739
771
.config_init = bcm54xx_config_init ,
740
772
.config_intr = bcm_phy_config_intr ,
741
773
.handle_interrupt = bcm_phy_handle_interrupt ,
774
+ .link_change_notify = bcm54xx_link_change_notify ,
742
775
}, {
743
776
.phy_id = PHY_ID_BCM5461 ,
744
777
.phy_id_mask = 0xfffffff0 ,
@@ -751,6 +784,7 @@ static struct phy_driver broadcom_drivers[] = {
751
784
.config_init = bcm54xx_config_init ,
752
785
.config_intr = bcm_phy_config_intr ,
753
786
.handle_interrupt = bcm_phy_handle_interrupt ,
787
+ .link_change_notify = bcm54xx_link_change_notify ,
754
788
}, {
755
789
.phy_id = PHY_ID_BCM54612E ,
756
790
.phy_id_mask = 0xfffffff0 ,
@@ -763,6 +797,7 @@ static struct phy_driver broadcom_drivers[] = {
763
797
.config_init = bcm54xx_config_init ,
764
798
.config_intr = bcm_phy_config_intr ,
765
799
.handle_interrupt = bcm_phy_handle_interrupt ,
800
+ .link_change_notify = bcm54xx_link_change_notify ,
766
801
}, {
767
802
.phy_id = PHY_ID_BCM54616S ,
768
803
.phy_id_mask = 0xfffffff0 ,
@@ -774,6 +809,7 @@ static struct phy_driver broadcom_drivers[] = {
774
809
.handle_interrupt = bcm_phy_handle_interrupt ,
775
810
.read_status = bcm54616s_read_status ,
776
811
.probe = bcm54616s_probe ,
812
+ .link_change_notify = bcm54xx_link_change_notify ,
777
813
}, {
778
814
.phy_id = PHY_ID_BCM5464 ,
779
815
.phy_id_mask = 0xfffffff0 ,
@@ -788,6 +824,7 @@ static struct phy_driver broadcom_drivers[] = {
788
824
.handle_interrupt = bcm_phy_handle_interrupt ,
789
825
.suspend = genphy_suspend ,
790
826
.resume = genphy_resume ,
827
+ .link_change_notify = bcm54xx_link_change_notify ,
791
828
}, {
792
829
.phy_id = PHY_ID_BCM5481 ,
793
830
.phy_id_mask = 0xfffffff0 ,
@@ -801,6 +838,7 @@ static struct phy_driver broadcom_drivers[] = {
801
838
.config_aneg = bcm5481_config_aneg ,
802
839
.config_intr = bcm_phy_config_intr ,
803
840
.handle_interrupt = bcm_phy_handle_interrupt ,
841
+ .link_change_notify = bcm54xx_link_change_notify ,
804
842
}, {
805
843
.phy_id = PHY_ID_BCM54810 ,
806
844
.phy_id_mask = 0xfffffff0 ,
@@ -816,6 +854,7 @@ static struct phy_driver broadcom_drivers[] = {
816
854
.handle_interrupt = bcm_phy_handle_interrupt ,
817
855
.suspend = genphy_suspend ,
818
856
.resume = bcm54xx_resume ,
857
+ .link_change_notify = bcm54xx_link_change_notify ,
819
858
}, {
820
859
.phy_id = PHY_ID_BCM54811 ,
821
860
.phy_id_mask = 0xfffffff0 ,
@@ -831,6 +870,7 @@ static struct phy_driver broadcom_drivers[] = {
831
870
.handle_interrupt = bcm_phy_handle_interrupt ,
832
871
.suspend = genphy_suspend ,
833
872
.resume = bcm54xx_resume ,
873
+ .link_change_notify = bcm54xx_link_change_notify ,
834
874
}, {
835
875
.phy_id = PHY_ID_BCM5482 ,
836
876
.phy_id_mask = 0xfffffff0 ,
@@ -843,6 +883,7 @@ static struct phy_driver broadcom_drivers[] = {
843
883
.config_init = bcm54xx_config_init ,
844
884
.config_intr = bcm_phy_config_intr ,
845
885
.handle_interrupt = bcm_phy_handle_interrupt ,
886
+ .link_change_notify = bcm54xx_link_change_notify ,
846
887
}, {
847
888
.phy_id = PHY_ID_BCM50610 ,
848
889
.phy_id_mask = 0xfffffff0 ,
@@ -855,6 +896,7 @@ static struct phy_driver broadcom_drivers[] = {
855
896
.config_init = bcm54xx_config_init ,
856
897
.config_intr = bcm_phy_config_intr ,
857
898
.handle_interrupt = bcm_phy_handle_interrupt ,
899
+ .link_change_notify = bcm54xx_link_change_notify ,
858
900
}, {
859
901
.phy_id = PHY_ID_BCM50610M ,
860
902
.phy_id_mask = 0xfffffff0 ,
@@ -867,6 +909,7 @@ static struct phy_driver broadcom_drivers[] = {
867
909
.config_init = bcm54xx_config_init ,
868
910
.config_intr = bcm_phy_config_intr ,
869
911
.handle_interrupt = bcm_phy_handle_interrupt ,
912
+ .link_change_notify = bcm54xx_link_change_notify ,
870
913
}, {
871
914
.phy_id = PHY_ID_BCM57780 ,
872
915
.phy_id_mask = 0xfffffff0 ,
@@ -879,6 +922,7 @@ static struct phy_driver broadcom_drivers[] = {
879
922
.config_init = bcm54xx_config_init ,
880
923
.config_intr = bcm_phy_config_intr ,
881
924
.handle_interrupt = bcm_phy_handle_interrupt ,
925
+ .link_change_notify = bcm54xx_link_change_notify ,
882
926
}, {
883
927
.phy_id = PHY_ID_BCMAC131 ,
884
928
.phy_id_mask = 0xfffffff0 ,
@@ -905,6 +949,7 @@ static struct phy_driver broadcom_drivers[] = {
905
949
.get_strings = bcm_phy_get_strings ,
906
950
.get_stats = bcm54xx_get_stats ,
907
951
.probe = bcm54xx_phy_probe ,
952
+ .link_change_notify = bcm54xx_link_change_notify ,
908
953
}, {
909
954
.phy_id = PHY_ID_BCM53125 ,
910
955
.phy_id_mask = 0xfffffff0 ,
@@ -918,6 +963,7 @@ static struct phy_driver broadcom_drivers[] = {
918
963
.config_init = bcm54xx_config_init ,
919
964
.config_intr = bcm_phy_config_intr ,
920
965
.handle_interrupt = bcm_phy_handle_interrupt ,
966
+ .link_change_notify = bcm54xx_link_change_notify ,
921
967
}, {
922
968
.phy_id = PHY_ID_BCM89610 ,
923
969
.phy_id_mask = 0xfffffff0 ,
@@ -930,6 +976,7 @@ static struct phy_driver broadcom_drivers[] = {
930
976
.config_init = bcm54xx_config_init ,
931
977
.config_intr = bcm_phy_config_intr ,
932
978
.handle_interrupt = bcm_phy_handle_interrupt ,
979
+ .link_change_notify = bcm54xx_link_change_notify ,
933
980
} };
934
981
935
982
module_phy_driver (broadcom_drivers );
0 commit comments