Skip to content

Commit eba2e4c

Browse files
eichenbergerPaolo Abeni
authored andcommitted
net: phy: c45: add a separate function to read BASE-T1 abilities
Add a separate function to read the BASE-T1 abilities. Some PHYs do not indicate the availability of the extended BASE-T1 ability register, so this function must be called separately. Signed-off-by: Stefan Eichenberger <eichest@gmail.com> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
1 parent 25108a8 commit eba2e4c

2 files changed

Lines changed: 32 additions & 13 deletions

File tree

drivers/net/phy/phy-c45.c

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -881,6 +881,36 @@ int genphy_c45_an_config_eee_aneg(struct phy_device *phydev)
881881
return genphy_c45_write_eee_adv(phydev, phydev->advertising_eee);
882882
}
883883

884+
/**
885+
* genphy_c45_pma_baset1_read_abilities - read supported baset1 link modes from PMA
886+
* @phydev: target phy_device struct
887+
*
888+
* Read the supported link modes from the extended BASE-T1 ability register
889+
*/
890+
int genphy_c45_pma_baset1_read_abilities(struct phy_device *phydev)
891+
{
892+
int val;
893+
894+
val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_PMD_BT1);
895+
if (val < 0)
896+
return val;
897+
898+
linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT1L_Full_BIT,
899+
phydev->supported,
900+
val & MDIO_PMA_PMD_BT1_B10L_ABLE);
901+
902+
val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_T1_STAT);
903+
if (val < 0)
904+
return val;
905+
906+
linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
907+
phydev->supported,
908+
val & MDIO_AN_STAT1_ABLE);
909+
910+
return 0;
911+
}
912+
EXPORT_SYMBOL_GPL(genphy_c45_pma_baset1_read_abilities);
913+
884914
/**
885915
* genphy_c45_pma_read_abilities - read supported link modes from PMA
886916
* @phydev: target phy_device struct
@@ -977,21 +1007,9 @@ int genphy_c45_pma_read_abilities(struct phy_device *phydev)
9771007
}
9781008

9791009
if (val & MDIO_PMA_EXTABLE_BT1) {
980-
val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_PMD_BT1);
1010+
val = genphy_c45_pma_baset1_read_abilities(phydev);
9811011
if (val < 0)
9821012
return val;
983-
984-
linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT1L_Full_BIT,
985-
phydev->supported,
986-
val & MDIO_PMA_PMD_BT1_B10L_ABLE);
987-
988-
val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_T1_STAT);
989-
if (val < 0)
990-
return val;
991-
992-
linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
993-
phydev->supported,
994-
val & MDIO_AN_STAT1_ABLE);
9951013
}
9961014
}
9971015

include/linux/phy.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1826,6 +1826,7 @@ int genphy_c45_an_config_aneg(struct phy_device *phydev);
18261826
int genphy_c45_an_disable_aneg(struct phy_device *phydev);
18271827
int genphy_c45_read_mdix(struct phy_device *phydev);
18281828
int genphy_c45_pma_read_abilities(struct phy_device *phydev);
1829+
int genphy_c45_pma_baset1_read_abilities(struct phy_device *phydev);
18291830
int genphy_c45_read_eee_abilities(struct phy_device *phydev);
18301831
int genphy_c45_pma_baset1_read_master_slave(struct phy_device *phydev);
18311832
int genphy_c45_read_status(struct phy_device *phydev);

0 commit comments

Comments
 (0)