| From ddd7f2f6f63569e73311f46d3b105d7a2c16e2c2 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 19 Oct 2021 21:16:47 +0200 |
| Subject: phy: micrel: ksz8041nl: do not use power down mode |
| |
| From: Stefan Agner <stefan@agner.ch> |
| |
| [ Upstream commit 2641b62d2fab52648e34cdc6994b2eacde2d27c1 ] |
| |
| Some Micrel KSZ8041NL PHY chips exhibit continuous RX errors after using |
| the power down mode bit (0.11). If the PHY is taken out of power down |
| mode in a certain temperature range, the PHY enters a weird state which |
| leads to continuously reporting RX errors. In that state, the MAC is not |
| able to receive or send any Ethernet frames and the activity LED is |
| constantly blinking. Since Linux is using the suspend callback when the |
| interface is taken down, ending up in that state can easily happen |
| during a normal startup. |
| |
| Micrel confirmed the issue in errata DS80000700A [*], caused by abnormal |
| clock recovery when using power down mode. Even the latest revision (A4, |
| Revision ID 0x1513) seems to suffer that problem, and according to the |
| errata is not going to be fixed. |
| |
| Remove the suspend/resume callback to avoid using the power down mode |
| completely. |
| |
| [*] https://ww1.microchip.com/downloads/en/DeviceDoc/80000700A.pdf |
| |
| Fixes: 1a5465f5d6a2 ("phy/micrel: Add suspend/resume support to Micrel PHYs") |
| Signed-off-by: Stefan Agner <stefan@agner.ch> |
| Acked-by: Marcel Ziswiler <marcel.ziswiler@toradex.com> |
| Signed-off-by: Francesco Dolcini <francesco.dolcini@toradex.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/phy/micrel.c | 5 +++-- |
| 1 file changed, 3 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c |
| index f95bd1b0fb965..0b61d80ea3f8c 100644 |
| --- a/drivers/net/phy/micrel.c |
| +++ b/drivers/net/phy/micrel.c |
| @@ -1040,8 +1040,9 @@ static struct phy_driver ksphy_driver[] = { |
| .get_sset_count = kszphy_get_sset_count, |
| .get_strings = kszphy_get_strings, |
| .get_stats = kszphy_get_stats, |
| - .suspend = genphy_suspend, |
| - .resume = genphy_resume, |
| + /* No suspend/resume callbacks because of errata DS80000700A, |
| + * receiver error following software power down. |
| + */ |
| }, { |
| .phy_id = PHY_ID_KSZ8041RNLI, |
| .phy_id_mask = MICREL_PHY_ID_MASK, |
| -- |
| 2.33.0 |
| |