@@ -805,14 +805,43 @@ static void stmmac_validate(struct phylink_config *config,
805
805
struct phylink_link_state * state )
806
806
{
807
807
struct stmmac_priv * priv = netdev_priv (to_net_dev (config -> dev ));
808
+ __ETHTOOL_DECLARE_LINK_MODE_MASK (mac_supported ) = { 0 , };
808
809
__ETHTOOL_DECLARE_LINK_MODE_MASK (mask ) = { 0 , };
809
810
int tx_cnt = priv -> plat -> tx_queues_to_use ;
810
811
int max_speed = priv -> plat -> max_speed ;
811
812
813
+ phylink_set (mac_supported , 10b aseT_Half );
814
+ phylink_set (mac_supported , 10b aseT_Full );
815
+ phylink_set (mac_supported , 100b aseT_Half );
816
+ phylink_set (mac_supported , 100b aseT_Full );
817
+
818
+ phylink_set (mac_supported , Autoneg );
819
+ phylink_set (mac_supported , Pause );
820
+ phylink_set (mac_supported , Asym_Pause );
821
+ phylink_set_port_modes (mac_supported );
822
+
823
+ if (priv -> plat -> has_gmac ||
824
+ priv -> plat -> has_gmac4 ||
825
+ priv -> plat -> has_xgmac ) {
826
+ phylink_set (mac_supported , 1000b aseT_Half );
827
+ phylink_set (mac_supported , 1000b aseT_Full );
828
+ phylink_set (mac_supported , 1000b aseKX_Full );
829
+ }
830
+
812
831
/* Cut down 1G if asked to */
813
832
if ((max_speed > 0 ) && (max_speed < 1000 )) {
814
833
phylink_set (mask , 1000b aseT_Full );
815
834
phylink_set (mask , 1000b aseX_Full );
835
+ } else if (priv -> plat -> has_xgmac ) {
836
+ phylink_set (mac_supported , 2500b aseT_Full );
837
+ phylink_set (mac_supported , 5000b aseT_Full );
838
+ phylink_set (mac_supported , 10000b aseSR_Full );
839
+ phylink_set (mac_supported , 10000b aseLR_Full );
840
+ phylink_set (mac_supported , 10000b aseER_Full );
841
+ phylink_set (mac_supported , 10000b aseLRM_Full );
842
+ phylink_set (mac_supported , 10000b aseT_Full );
843
+ phylink_set (mac_supported , 10000b aseKX4_Full );
844
+ phylink_set (mac_supported , 10000b aseKR_Full );
816
845
}
817
846
818
847
/* Half-Duplex can only work with single queue */
@@ -822,7 +851,12 @@ static void stmmac_validate(struct phylink_config *config,
822
851
phylink_set (mask , 1000b aseT_Half );
823
852
}
824
853
825
- bitmap_andnot (supported , supported , mask , __ETHTOOL_LINK_MODE_MASK_NBITS );
854
+ bitmap_and (supported , supported , mac_supported ,
855
+ __ETHTOOL_LINK_MODE_MASK_NBITS );
856
+ bitmap_andnot (supported , supported , mask ,
857
+ __ETHTOOL_LINK_MODE_MASK_NBITS );
858
+ bitmap_and (state -> advertising , state -> advertising , mac_supported ,
859
+ __ETHTOOL_LINK_MODE_MASK_NBITS );
826
860
bitmap_andnot (state -> advertising , state -> advertising , mask ,
827
861
__ETHTOOL_LINK_MODE_MASK_NBITS );
828
862
}
@@ -842,18 +876,37 @@ static void stmmac_mac_config(struct phylink_config *config, unsigned int mode,
842
876
ctrl = readl (priv -> ioaddr + MAC_CTRL_REG );
843
877
ctrl &= ~priv -> hw -> link .speed_mask ;
844
878
845
- switch (state -> speed ) {
846
- case SPEED_1000 :
847
- ctrl |= priv -> hw -> link .speed1000 ;
848
- break ;
849
- case SPEED_100 :
850
- ctrl |= priv -> hw -> link .speed100 ;
851
- break ;
852
- case SPEED_10 :
853
- ctrl |= priv -> hw -> link .speed10 ;
854
- break ;
855
- default :
856
- return ;
879
+ if (state -> interface == PHY_INTERFACE_MODE_USXGMII ) {
880
+ switch (state -> speed ) {
881
+ case SPEED_10000 :
882
+ ctrl |= priv -> hw -> link .xgmii .speed10000 ;
883
+ break ;
884
+ case SPEED_5000 :
885
+ ctrl |= priv -> hw -> link .xgmii .speed5000 ;
886
+ break ;
887
+ case SPEED_2500 :
888
+ ctrl |= priv -> hw -> link .xgmii .speed2500 ;
889
+ break ;
890
+ default :
891
+ return ;
892
+ }
893
+ } else {
894
+ switch (state -> speed ) {
895
+ case SPEED_2500 :
896
+ ctrl |= priv -> hw -> link .speed2500 ;
897
+ break ;
898
+ case SPEED_1000 :
899
+ ctrl |= priv -> hw -> link .speed1000 ;
900
+ break ;
901
+ case SPEED_100 :
902
+ ctrl |= priv -> hw -> link .speed100 ;
903
+ break ;
904
+ case SPEED_10 :
905
+ ctrl |= priv -> hw -> link .speed10 ;
906
+ break ;
907
+ default :
908
+ return ;
909
+ }
857
910
}
858
911
859
912
priv -> speed = state -> speed ;
0 commit comments