diff options
Diffstat (limited to 'drivers/net/phy/microchip.c')
| -rw-r--r-- | drivers/net/phy/microchip.c | 39 | 
1 files changed, 36 insertions, 3 deletions
diff --git a/drivers/net/phy/microchip.c b/drivers/net/phy/microchip.c index 7c00e508a101..324fbf6ad8ff 100644 --- a/drivers/net/phy/microchip.c +++ b/drivers/net/phy/microchip.c @@ -106,21 +106,54 @@ static int lan88xx_set_wol(struct phy_device *phydev,  	return 0;  } +static void lan88xx_set_mdix(struct phy_device *phydev) +{ +	int buf; +	int val; + +	switch (phydev->mdix_ctrl) { +	case ETH_TP_MDI: +		val = LAN88XX_EXT_MODE_CTRL_MDI_; +		break; +	case ETH_TP_MDI_X: +		val = LAN88XX_EXT_MODE_CTRL_MDI_X_; +		break; +	case ETH_TP_MDI_AUTO: +		val = LAN88XX_EXT_MODE_CTRL_AUTO_MDIX_; +		break; +	default: +		return; +	} + +	phy_write(phydev, LAN88XX_EXT_PAGE_ACCESS, LAN88XX_EXT_PAGE_SPACE_1); +	buf = phy_read(phydev, LAN88XX_EXT_MODE_CTRL); +	buf &= ~LAN88XX_EXT_MODE_CTRL_MDIX_MASK_; +	buf |= val; +	phy_write(phydev, LAN88XX_EXT_MODE_CTRL, buf); +	phy_write(phydev, LAN88XX_EXT_PAGE_ACCESS, LAN88XX_EXT_PAGE_SPACE_0); +} + +static int lan88xx_config_aneg(struct phy_device *phydev) +{ +	lan88xx_set_mdix(phydev); + +	return genphy_config_aneg(phydev); +} +  static struct phy_driver microchip_phy_driver[] = {  {  	.phy_id		= 0x0007c130,  	.phy_id_mask	= 0xfffffff0,  	.name		= "Microchip LAN88xx", -	.features	= (PHY_GBIT_FEATURES | -			   SUPPORTED_Pause | SUPPORTED_Asym_Pause), +	.features	= PHY_GBIT_FEATURES,  	.flags		= PHY_HAS_INTERRUPT | PHY_HAS_MAGICANEG,  	.probe		= lan88xx_probe,  	.remove		= lan88xx_remove,  	.config_init	= genphy_config_init, -	.config_aneg	= genphy_config_aneg, +	.config_aneg	= lan88xx_config_aneg,  	.read_status	= genphy_read_status,  	.ack_interrupt	= lan88xx_phy_ack_interrupt,  |