[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20250305094053.893577-1-viktar.palstsiuk@dewesoft.com>
Date: Wed, 5 Mar 2025 10:40:53 +0100
From: Viktar Palstsiuk <viktar.palstsiuk@...esoft.com>
To: andrew@...n.ch,
hkallweit1@...il.com
Cc: netdev@...r.kernel.org,
Viktar Palstsiuk <viktar.palstsiuk@...esoft.com>
Subject: [PATCH v2] net: phy: dp83869: fix status reporting for link downshift
Speed optimization, also known as link downshift, is enabled for the PHY,
but unlike the DP83867, the DP83869 driver does not take
the PHY status register into account.
Update link speed and duplex settings based on the DP83869 PHY status
register, which is necessary when link downshift occurs.
Signed-off-by: Viktar Palstsiuk <viktar.palstsiuk@...esoft.com>
---
drivers/net/phy/dp83869.c | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/drivers/net/phy/dp83869.c b/drivers/net/phy/dp83869.c
index a62cd838a9ea..fd61d4fbe81d 100644
--- a/drivers/net/phy/dp83869.c
+++ b/drivers/net/phy/dp83869.c
@@ -20,6 +20,7 @@
#define DP83869_DEVADDR 0x1f
#define MII_DP83869_PHYCTRL 0x10
+#define MII_DP83869_PHYSTS 0x11
#define MII_DP83869_MICR 0x12
#define MII_DP83869_ISR 0x13
#define DP83869_CFG2 0x14
@@ -123,6 +124,12 @@
#define DP83869_WOL_SEC_EN BIT(5)
#define DP83869_WOL_ENH_MAC BIT(7)
+/* PHY STS bits */
+#define DP83869_PHYSTS_1000 BIT(15)
+#define DP83869_PHYSTS_100 BIT(14)
+#define DP83869_PHYSTS_DUPLEX BIT(13)
+#define DP83869_PHYSTS_LINK BIT(10)
+
/* CFG2 bits */
#define DP83869_DOWNSHIFT_EN (BIT(8) | BIT(9))
#define DP83869_DOWNSHIFT_ATTEMPT_MASK (BIT(10) | BIT(11))
@@ -165,6 +172,7 @@ static int dp83869_config_aneg(struct phy_device *phydev)
static int dp83869_read_status(struct phy_device *phydev)
{
+ int status = phy_read(phydev, MII_DP83869_PHYSTS);
struct dp83869_private *dp83869 = phydev->priv;
bool changed;
int ret;
@@ -185,6 +193,21 @@ static int dp83869_read_status(struct phy_device *phydev)
}
}
+ if (status < 0)
+ return status;
+
+ if (status & DP83869_PHYSTS_DUPLEX)
+ phydev->duplex = DUPLEX_FULL;
+ else
+ phydev->duplex = DUPLEX_HALF;
+
+ if (status & DP83869_PHYSTS_1000)
+ phydev->speed = SPEED_1000;
+ else if (status & DP83869_PHYSTS_100)
+ phydev->speed = SPEED_100;
+ else
+ phydev->speed = SPEED_10;
+
return 0;
}
--
2.34.1
Powered by blists - more mailing lists