diff options
Diffstat (limited to 'drivers/net/phy/phy-c45.c')
| -rw-r--r-- | drivers/net/phy/phy-c45.c | 33 | 
1 files changed, 33 insertions, 0 deletions
diff --git a/drivers/net/phy/phy-c45.c b/drivers/net/phy/phy-c45.c index dada819c6b78..a4576859afae 100644 --- a/drivers/net/phy/phy-c45.c +++ b/drivers/net/phy/phy-c45.c @@ -233,6 +233,39 @@ int genphy_c45_read_pma(struct phy_device *phydev)  }  EXPORT_SYMBOL_GPL(genphy_c45_read_pma); +/** + * genphy_c45_read_mdix - read mdix status from PMA + * @phydev: target phy_device struct + */ +int genphy_c45_read_mdix(struct phy_device *phydev) +{ +	int val; + +	if (phydev->speed == SPEED_10000) { +		val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, +				   MDIO_PMA_10GBT_SWAPPOL); +		if (val < 0) +			return val; + +		switch (val) { +		case MDIO_PMA_10GBT_SWAPPOL_ABNX | MDIO_PMA_10GBT_SWAPPOL_CDNX: +			phydev->mdix = ETH_TP_MDI; +			break; + +		case 0: +			phydev->mdix = ETH_TP_MDI_X; +			break; + +		default: +			phydev->mdix = ETH_TP_MDI_INVALID; +			break; +		} +	} + +	return 0; +} +EXPORT_SYMBOL_GPL(genphy_c45_read_mdix); +  /* The gen10g_* functions are the old Clause 45 stub */  static int gen10g_config_aneg(struct phy_device *phydev)  | 
