git: 8f216d282c3d - main - Restore original MDC speed control register value after MAC reset, if it wasn't default
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 25 Apr 2022 01:59:50 UTC
The branch main has been updated by kevlo:
URL: https://cgit.FreeBSD.org/src/commit/?id=8f216d282c3d874bd0f73f55a2801b9d15451213
commit 8f216d282c3d874bd0f73f55a2801b9d15451213
Author: Kevin Lo <kevlo@FreeBSD.org>
AuthorDate: 2022-04-25 01:56:20 +0000
Commit: Kevin Lo <kevlo@FreeBSD.org>
CommitDate: 2022-04-25 01:56:20 +0000
Restore original MDC speed control register value after MAC reset, if it
wasn't default
Since vte_reset changes register value to MDCSC_DEFAULT value, which may not
be the original value, thus causing some phy registers read failures.
Restoring VTE_MDCSC value to original after reset solves the link state
flapping issue.
Thanks to jhb ("the code looks ok") for his review.
Reviewed by: jhb
Obtained from: NetBSD via Andrius V
Differential Revision: https://reviews.freebsd.org/D34956
---
sys/dev/vte/if_vte.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/sys/dev/vte/if_vte.c b/sys/dev/vte/if_vte.c
index b6bf909037e1..98e5a14e1399 100644
--- a/sys/dev/vte/if_vte.c
+++ b/sys/dev/vte/if_vte.c
@@ -1605,9 +1605,10 @@ vte_tick(void *arg)
static void
vte_reset(struct vte_softc *sc)
{
- uint16_t mcr;
+ uint16_t mcr, mdcsc;
int i;
+ mdcsc = CSR_READ_2(sc, VTE_MDCSC);
mcr = CSR_READ_2(sc, VTE_MCR1);
CSR_WRITE_2(sc, VTE_MCR1, mcr | MCR1_MAC_RESET);
for (i = VTE_RESET_TIMEOUT; i > 0; i--) {
@@ -1625,6 +1626,14 @@ vte_reset(struct vte_softc *sc)
CSR_WRITE_2(sc, VTE_MACSM, 0x0002);
CSR_WRITE_2(sc, VTE_MACSM, 0);
DELAY(5000);
+
+ /*
+ * On some SoCs (like Vortex86DX3) MDC speed control register value
+ * needs to be restored to original value instead of default one,
+ * otherwise some PHY registers may fail to be read.
+ */
+ if (mdcsc != MDCSC_DEFAULT)
+ CSR_WRITE_2(sc, VTE_MDCSC, mdcsc);
}
static void