@@ -919,6 +919,79 @@ int genphy_c45_pma_baset1_read_abilities(struct phy_device *phydev)
919919}
920920EXPORT_SYMBOL_GPL (genphy_c45_pma_baset1_read_abilities );
921921
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+
922995/**
923996 * genphy_c45_pma_read_abilities - read supported link modes from PMA
924997 * @phydev: target phy_device struct
@@ -962,63 +1035,9 @@ int genphy_c45_pma_read_abilities(struct phy_device *phydev)
9621035 val & MDIO_PMA_STAT2_10GBER );
9631036
9641037 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 );
9661039 if (val < 0 )
9671040 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- }
10221041 }
10231042
10241043 /* This is optional functionality. If not supported, we may get an error
0 commit comments