@@ -919,6 +919,79 @@ int genphy_c45_pma_baset1_read_abilities(struct phy_device *phydev)
919
919
}
920
920
EXPORT_SYMBOL_GPL (genphy_c45_pma_baset1_read_abilities );
921
921
922
+ /**
923
+ * genphy_c45_pma_read_ext_abilities - read supported link modes from PMA
924
+ * @phydev: target phy_device struct
925
+ *
926
+ * Read the supported link modes from the PMA/PMD extended ability register
927
+ * (Register 1.11).
928
+ */
929
+ int genphy_c45_pma_read_ext_abilities (struct phy_device * phydev )
930
+ {
931
+ int val ;
932
+
933
+ val = phy_read_mmd (phydev , MDIO_MMD_PMAPMD , MDIO_PMA_EXTABLE );
934
+ if (val < 0 )
935
+ return val ;
936
+
937
+ linkmode_mod_bit (ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT ,
938
+ phydev -> supported ,
939
+ val & MDIO_PMA_EXTABLE_10GBLRM );
940
+ linkmode_mod_bit (ETHTOOL_LINK_MODE_10000baseT_Full_BIT ,
941
+ phydev -> supported ,
942
+ val & MDIO_PMA_EXTABLE_10GBT );
943
+ linkmode_mod_bit (ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT ,
944
+ phydev -> supported ,
945
+ val & MDIO_PMA_EXTABLE_10GBKX4 );
946
+ linkmode_mod_bit (ETHTOOL_LINK_MODE_10000baseKR_Full_BIT ,
947
+ phydev -> supported ,
948
+ val & MDIO_PMA_EXTABLE_10GBKR );
949
+ linkmode_mod_bit (ETHTOOL_LINK_MODE_1000baseT_Full_BIT ,
950
+ phydev -> supported ,
951
+ val & MDIO_PMA_EXTABLE_1000BT );
952
+ linkmode_mod_bit (ETHTOOL_LINK_MODE_1000baseKX_Full_BIT ,
953
+ phydev -> supported ,
954
+ val & MDIO_PMA_EXTABLE_1000BKX );
955
+
956
+ linkmode_mod_bit (ETHTOOL_LINK_MODE_100baseT_Full_BIT ,
957
+ phydev -> supported ,
958
+ val & MDIO_PMA_EXTABLE_100BTX );
959
+ linkmode_mod_bit (ETHTOOL_LINK_MODE_100baseT_Half_BIT ,
960
+ phydev -> supported ,
961
+ val & MDIO_PMA_EXTABLE_100BTX );
962
+
963
+ linkmode_mod_bit (ETHTOOL_LINK_MODE_10baseT_Full_BIT ,
964
+ phydev -> supported ,
965
+ val & MDIO_PMA_EXTABLE_10BT );
966
+ linkmode_mod_bit (ETHTOOL_LINK_MODE_10baseT_Half_BIT ,
967
+ phydev -> supported ,
968
+ val & MDIO_PMA_EXTABLE_10BT );
969
+
970
+ if (val & MDIO_PMA_EXTABLE_NBT ) {
971
+ val = phy_read_mmd (phydev , MDIO_MMD_PMAPMD ,
972
+ MDIO_PMA_NG_EXTABLE );
973
+ if (val < 0 )
974
+ return val ;
975
+
976
+ linkmode_mod_bit (ETHTOOL_LINK_MODE_2500baseT_Full_BIT ,
977
+ phydev -> supported ,
978
+ val & MDIO_PMA_NG_EXTABLE_2_5GBT );
979
+
980
+ linkmode_mod_bit (ETHTOOL_LINK_MODE_5000baseT_Full_BIT ,
981
+ phydev -> supported ,
982
+ val & MDIO_PMA_NG_EXTABLE_5GBT );
983
+ }
984
+
985
+ if (val & MDIO_PMA_EXTABLE_BT1 ) {
986
+ val = genphy_c45_pma_baset1_read_abilities (phydev );
987
+ if (val < 0 )
988
+ return val ;
989
+ }
990
+
991
+ return 0 ;
992
+ }
993
+ EXPORT_SYMBOL_GPL (genphy_c45_pma_read_ext_abilities );
994
+
922
995
/**
923
996
* genphy_c45_pma_read_abilities - read supported link modes from PMA
924
997
* @phydev: target phy_device struct
@@ -962,63 +1035,9 @@ int genphy_c45_pma_read_abilities(struct phy_device *phydev)
962
1035
val & MDIO_PMA_STAT2_10GBER );
963
1036
964
1037
if (val & MDIO_PMA_STAT2_EXTABLE ) {
965
- val = phy_read_mmd (phydev , MDIO_MMD_PMAPMD , MDIO_PMA_EXTABLE );
1038
+ val = genphy_c45_pma_read_ext_abilities (phydev );
966
1039
if (val < 0 )
967
1040
return val ;
968
-
969
- linkmode_mod_bit (ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT ,
970
- phydev -> supported ,
971
- val & MDIO_PMA_EXTABLE_10GBLRM );
972
- linkmode_mod_bit (ETHTOOL_LINK_MODE_10000baseT_Full_BIT ,
973
- phydev -> supported ,
974
- val & MDIO_PMA_EXTABLE_10GBT );
975
- linkmode_mod_bit (ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT ,
976
- phydev -> supported ,
977
- val & MDIO_PMA_EXTABLE_10GBKX4 );
978
- linkmode_mod_bit (ETHTOOL_LINK_MODE_10000baseKR_Full_BIT ,
979
- phydev -> supported ,
980
- val & MDIO_PMA_EXTABLE_10GBKR );
981
- linkmode_mod_bit (ETHTOOL_LINK_MODE_1000baseT_Full_BIT ,
982
- phydev -> supported ,
983
- val & MDIO_PMA_EXTABLE_1000BT );
984
- linkmode_mod_bit (ETHTOOL_LINK_MODE_1000baseKX_Full_BIT ,
985
- phydev -> supported ,
986
- val & MDIO_PMA_EXTABLE_1000BKX );
987
-
988
- linkmode_mod_bit (ETHTOOL_LINK_MODE_100baseT_Full_BIT ,
989
- phydev -> supported ,
990
- val & MDIO_PMA_EXTABLE_100BTX );
991
- linkmode_mod_bit (ETHTOOL_LINK_MODE_100baseT_Half_BIT ,
992
- phydev -> supported ,
993
- val & MDIO_PMA_EXTABLE_100BTX );
994
-
995
- linkmode_mod_bit (ETHTOOL_LINK_MODE_10baseT_Full_BIT ,
996
- phydev -> supported ,
997
- val & MDIO_PMA_EXTABLE_10BT );
998
- linkmode_mod_bit (ETHTOOL_LINK_MODE_10baseT_Half_BIT ,
999
- phydev -> supported ,
1000
- val & MDIO_PMA_EXTABLE_10BT );
1001
-
1002
- if (val & MDIO_PMA_EXTABLE_NBT ) {
1003
- val = phy_read_mmd (phydev , MDIO_MMD_PMAPMD ,
1004
- MDIO_PMA_NG_EXTABLE );
1005
- if (val < 0 )
1006
- return val ;
1007
-
1008
- linkmode_mod_bit (ETHTOOL_LINK_MODE_2500baseT_Full_BIT ,
1009
- phydev -> supported ,
1010
- val & MDIO_PMA_NG_EXTABLE_2_5GBT );
1011
-
1012
- linkmode_mod_bit (ETHTOOL_LINK_MODE_5000baseT_Full_BIT ,
1013
- phydev -> supported ,
1014
- val & MDIO_PMA_NG_EXTABLE_5GBT );
1015
- }
1016
-
1017
- if (val & MDIO_PMA_EXTABLE_BT1 ) {
1018
- val = genphy_c45_pma_baset1_read_abilities (phydev );
1019
- if (val < 0 )
1020
- return val ;
1021
- }
1022
1041
}
1023
1042
1024
1043
/* This is optional functionality. If not supported, we may get an error
0 commit comments