mirror of
https://github.com/nxp-imx/linux-imx.git
synced 2025-07-12 20:35:23 +02:00
net: phy: micrel: Fix the KSZ9131 MDI-X status issue
[ Upstream commit84383b5ef4
] The MDIX status is not accurately reflecting the current state after the link partner has manually altered its MDIX configuration while operating in forced mode. Access information about Auto mdix completion and pair selection from the KSZ9131's Auto/MDI/MDI-X status register Fixes:b64e6a8794
("net: phy: micrel: Add PHY Auto/MDI/MDI-X set driver for KSZ9131") Signed-off-by: Raju Lakkaraju <Raju.Lakkaraju@microchip.com> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Link: https://patch.msgid.link/20240725071125.13960-1-Raju.Lakkaraju@microchip.com Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
eb2926cad1
commit
2094996159
|
@ -1293,6 +1293,8 @@ static int ksz9131_config_init(struct phy_device *phydev)
|
|||
const struct device *dev_walker;
|
||||
int ret;
|
||||
|
||||
phydev->mdix_ctrl = ETH_TP_MDI_AUTO;
|
||||
|
||||
dev_walker = &phydev->mdio.dev;
|
||||
do {
|
||||
of_node = dev_walker->of_node;
|
||||
|
@ -1342,28 +1344,30 @@ static int ksz9131_config_init(struct phy_device *phydev)
|
|||
#define MII_KSZ9131_AUTO_MDIX 0x1C
|
||||
#define MII_KSZ9131_AUTO_MDI_SET BIT(7)
|
||||
#define MII_KSZ9131_AUTO_MDIX_SWAP_OFF BIT(6)
|
||||
#define MII_KSZ9131_DIG_AXAN_STS 0x14
|
||||
#define MII_KSZ9131_DIG_AXAN_STS_LINK_DET BIT(14)
|
||||
#define MII_KSZ9131_DIG_AXAN_STS_A_SELECT BIT(12)
|
||||
|
||||
static int ksz9131_mdix_update(struct phy_device *phydev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = phy_read(phydev, MII_KSZ9131_AUTO_MDIX);
|
||||
if (phydev->mdix_ctrl != ETH_TP_MDI_AUTO) {
|
||||
phydev->mdix = phydev->mdix_ctrl;
|
||||
} else {
|
||||
ret = phy_read(phydev, MII_KSZ9131_DIG_AXAN_STS);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (ret & MII_KSZ9131_AUTO_MDIX_SWAP_OFF) {
|
||||
if (ret & MII_KSZ9131_AUTO_MDI_SET)
|
||||
phydev->mdix_ctrl = ETH_TP_MDI;
|
||||
else
|
||||
phydev->mdix_ctrl = ETH_TP_MDI_X;
|
||||
} else {
|
||||
phydev->mdix_ctrl = ETH_TP_MDI_AUTO;
|
||||
}
|
||||
|
||||
if (ret & MII_KSZ9131_AUTO_MDI_SET)
|
||||
if (ret & MII_KSZ9131_DIG_AXAN_STS_LINK_DET) {
|
||||
if (ret & MII_KSZ9131_DIG_AXAN_STS_A_SELECT)
|
||||
phydev->mdix = ETH_TP_MDI;
|
||||
else
|
||||
phydev->mdix = ETH_TP_MDI_X;
|
||||
} else {
|
||||
phydev->mdix = ETH_TP_MDI_INVALID;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user