]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: phy: marvell: Add mdix status reporting
authorPaul Davey <paul.davey@alliedtelesis.co.nz>
Thu, 17 Oct 2024 01:50:25 +0000 (14:50 +1300)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 22 Oct 2024 10:59:38 +0000 (12:59 +0200)
Report MDI-X resolved state after link up.

Tested on Linkstreet 88E6193X internal PHYs.

Signed-off-by: Paul Davey <paul.davey@alliedtelesis.co.nz>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Link: https://patch.msgid.link/20241017015026.255224-1-paul.davey@alliedtelesis.co.nz
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/phy/marvell.c

index 9964bf3dea2fb2a0e0dbf9725a88754c718f0f71..28aec37acd2ce37e1032a0e5ade23460744066b4 100644 (file)
 #define MII_M1011_PHY_STATUS_FULLDUPLEX        0x2000
 #define MII_M1011_PHY_STATUS_RESOLVED  0x0800
 #define MII_M1011_PHY_STATUS_LINK      0x0400
+#define MII_M1011_PHY_STATUS_MDIX      BIT(6)
 
 #define MII_88E3016_PHY_SPEC_CTRL      0x10
 #define MII_88E3016_DISABLE_SCRAMBLER  0x0200
@@ -1722,6 +1723,19 @@ static int marvell_read_status_page(struct phy_device *phydev, int page)
        phydev->duplex = DUPLEX_UNKNOWN;
        phydev->port = fiber ? PORT_FIBRE : PORT_TP;
 
+       if (fiber) {
+               phydev->mdix = ETH_TP_MDI_INVALID;
+       } else {
+               /* The MDI-X state is set regardless of Autoneg being enabled
+                * and reflects forced MDI-X state as well as auto resolution
+                */
+               if (status & MII_M1011_PHY_STATUS_RESOLVED)
+                       phydev->mdix = status & MII_M1011_PHY_STATUS_MDIX ?
+                               ETH_TP_MDI_X : ETH_TP_MDI;
+               else
+                       phydev->mdix = ETH_TP_MDI_INVALID;
+       }
+
        if (phydev->autoneg == AUTONEG_ENABLE)
                err = marvell_read_status_page_an(phydev, fiber, status);
        else