aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/mvebu/patches-4.9/409-net-phy-don-t-double-read-clause-45-status-register.patch
blob: ee53fe03806836dd69bd0155a04972f276d111cb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
From: Russell King <rmk+kernel@armlinux.org.uk>
Date: Thu, 5 Jan 2017 00:23:40 +0000
Subject: [PATCH] net: phy: don't double-read clause 45 status register

One of the design decisions behind the link status bit in the status
register is that it latches low on link loss.  This is so that link loss
events are not missed.  Double-reading the status register means that we
always read the current state of the link, clearing any link loss event.

This can cause problems - for example, if the link has negotiated a
different set of operating parameters, these will not be communicated
to the MAC as the PHY state machine will still think that the link has
remained active.

Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
---

--- a/drivers/net/phy/phy-c45.c
+++ b/drivers/net/phy/phy-c45.c
@@ -143,12 +143,9 @@ int genphy_c45_read_link(struct phy_devi
 		devad = __ffs(mmd_mask);
 		mmd_mask &= ~BIT(devad);
 
-		val = phy_read_mmd(phydev, devad, MDIO_STAT1);
-		if (val < 0)
-			return val;
-
-		/* Read twice because link state is latched and a
-		 * read moves the current state into the register
+		/* The link state is latched low so that momentary link
+		 * drops can be detected.  Do not double-read the status
+		 * register if the link is down.
 		 */
 		val = phy_read_mmd(phydev, devad, MDIO_STAT1);
 		if (val < 0)