phy/marvell: Make non-aneg speed/duplex forcing work for 88E1111 PHYs
According to specs, when auto-negotiation is disabled, Marvell PHYs need a software reset after changing speed/duplex forcing bits. Otherwise, the modified bits have no effect. Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
a4b1164961
commit
8ff44985c7
@@ -155,8 +155,27 @@ static int marvell_config_aneg(struct phy_device *phydev)
|
|||||||
return err;
|
return err;
|
||||||
|
|
||||||
err = genphy_config_aneg(phydev);
|
err = genphy_config_aneg(phydev);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
|
||||||
return err;
|
if (phydev->autoneg != AUTONEG_ENABLE) {
|
||||||
|
int bmcr;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A write to speed/duplex bits (that is performed by
|
||||||
|
* genphy_config_aneg() call above) must be followed by
|
||||||
|
* a software reset. Otherwise, the write has no effect.
|
||||||
|
*/
|
||||||
|
bmcr = phy_read(phydev, MII_BMCR);
|
||||||
|
if (bmcr < 0)
|
||||||
|
return bmcr;
|
||||||
|
|
||||||
|
err = phy_write(phydev, MII_BMCR, bmcr | BMCR_RESET);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int m88e1121_config_aneg(struct phy_device *phydev)
|
static int m88e1121_config_aneg(struct phy_device *phydev)
|
||||||
|
Reference in New Issue
Block a user