Skip to content

Commit 0c47615

Browse files
oleremkuba-moo
authored andcommitted
net: phy: c45: add genphy_c45_pma_read_ext_abilities() function
Move part of the genphy_c45_pma_read_abilities() code to a separate function. Some PHYs do not implement PMA/PMD status 2 register (Register 1.8) but do implement PMA/PMD extended ability register (Register 1.11). To make use of it, we need to be able to access this part of code separately. Signed-off-by: Oleksij Rempel <[email protected]> Reviewed-by: Andrew Lunn <[email protected]> Reviewed-by: Russell King (Oracle) <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent a25ebbf commit 0c47615

File tree

2 files changed

+75
-55
lines changed

2 files changed

+75
-55
lines changed

drivers/net/phy/phy-c45.c

Lines changed: 74 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -919,6 +919,79 @@ int genphy_c45_pma_baset1_read_abilities(struct phy_device *phydev)
919919
}
920920
EXPORT_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

include/linux/phy.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1866,6 +1866,7 @@ int genphy_c45_an_config_aneg(struct phy_device *phydev);
18661866
int genphy_c45_an_disable_aneg(struct phy_device *phydev);
18671867
int genphy_c45_read_mdix(struct phy_device *phydev);
18681868
int genphy_c45_pma_read_abilities(struct phy_device *phydev);
1869+
int genphy_c45_pma_read_ext_abilities(struct phy_device *phydev);
18691870
int genphy_c45_pma_baset1_read_abilities(struct phy_device *phydev);
18701871
int genphy_c45_read_eee_abilities(struct phy_device *phydev);
18711872
int genphy_c45_pma_baset1_read_master_slave(struct phy_device *phydev);

0 commit comments

Comments
 (0)