Skip to content

Commit 84383b5

Browse files
Raju Lakkarajukuba-moo
authored andcommitted
net: phy: micrel: Fix the KSZ9131 MDI-X status issue
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: b64e6a8 ("net: phy: micrel: Add PHY Auto/MDI/MDI-X set driver for KSZ9131") Signed-off-by: Raju Lakkaraju <[email protected]> Reviewed-by: Andrew Lunn <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 0aa3ca9 commit 84383b5

File tree

1 file changed

+19
-15
lines changed

1 file changed

+19
-15
lines changed

drivers/net/phy/micrel.c

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1389,6 +1389,8 @@ static int ksz9131_config_init(struct phy_device *phydev)
13891389
const struct device *dev_walker;
13901390
int ret;
13911391

1392+
phydev->mdix_ctrl = ETH_TP_MDI_AUTO;
1393+
13921394
dev_walker = &phydev->mdio.dev;
13931395
do {
13941396
of_node = dev_walker->of_node;
@@ -1438,28 +1440,30 @@ static int ksz9131_config_init(struct phy_device *phydev)
14381440
#define MII_KSZ9131_AUTO_MDIX 0x1C
14391441
#define MII_KSZ9131_AUTO_MDI_SET BIT(7)
14401442
#define MII_KSZ9131_AUTO_MDIX_SWAP_OFF BIT(6)
1443+
#define MII_KSZ9131_DIG_AXAN_STS 0x14
1444+
#define MII_KSZ9131_DIG_AXAN_STS_LINK_DET BIT(14)
1445+
#define MII_KSZ9131_DIG_AXAN_STS_A_SELECT BIT(12)
14411446

14421447
static int ksz9131_mdix_update(struct phy_device *phydev)
14431448
{
14441449
int ret;
14451450

1446-
ret = phy_read(phydev, MII_KSZ9131_AUTO_MDIX);
1447-
if (ret < 0)
1448-
return ret;
1449-
1450-
if (ret & MII_KSZ9131_AUTO_MDIX_SWAP_OFF) {
1451-
if (ret & MII_KSZ9131_AUTO_MDI_SET)
1452-
phydev->mdix_ctrl = ETH_TP_MDI;
1453-
else
1454-
phydev->mdix_ctrl = ETH_TP_MDI_X;
1451+
if (phydev->mdix_ctrl != ETH_TP_MDI_AUTO) {
1452+
phydev->mdix = phydev->mdix_ctrl;
14551453
} else {
1456-
phydev->mdix_ctrl = ETH_TP_MDI_AUTO;
1457-
}
1454+
ret = phy_read(phydev, MII_KSZ9131_DIG_AXAN_STS);
1455+
if (ret < 0)
1456+
return ret;
14581457

1459-
if (ret & MII_KSZ9131_AUTO_MDI_SET)
1460-
phydev->mdix = ETH_TP_MDI;
1461-
else
1462-
phydev->mdix = ETH_TP_MDI_X;
1458+
if (ret & MII_KSZ9131_DIG_AXAN_STS_LINK_DET) {
1459+
if (ret & MII_KSZ9131_DIG_AXAN_STS_A_SELECT)
1460+
phydev->mdix = ETH_TP_MDI;
1461+
else
1462+
phydev->mdix = ETH_TP_MDI_X;
1463+
} else {
1464+
phydev->mdix = ETH_TP_MDI_INVALID;
1465+
}
1466+
}
14631467

14641468
return 0;
14651469
}

0 commit comments

Comments
 (0)