summaryrefslogtreecommitdiffstats
path: root/sys/dev/etherswitch
diff options
context:
space:
mode:
authoradrian <adrian@FreeBSD.org>2012-10-22 22:32:52 +0000
committeradrian <adrian@FreeBSD.org>2012-10-22 22:32:52 +0000
commit6fd43f620dd73915f4d09cb380be7ed4b2db49a0 (patch)
treed3a786cac987b56b345db8534f061df7a3a01689 /sys/dev/etherswitch
parent903b8e055153f2d99b3b39e94f86be748714ee8a (diff)
downloadFreeBSD-src-6fd43f620dd73915f4d09cb380be7ed4b2db49a0.zip
FreeBSD-src-6fd43f620dd73915f4d09cb380be7ed4b2db49a0.tar.gz
Don't try to cache the page setting - always set the page before
doing a switch register read/write. PR: kern/172968
Diffstat (limited to 'sys/dev/etherswitch')
-rw-r--r--sys/dev/etherswitch/arswitch/arswitch_reg.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/sys/dev/etherswitch/arswitch/arswitch_reg.c b/sys/dev/etherswitch/arswitch/arswitch_reg.c
index 4a2fa6a..4ec71ba 100644
--- a/sys/dev/etherswitch/arswitch/arswitch_reg.c
+++ b/sys/dev/etherswitch/arswitch/arswitch_reg.c
@@ -72,10 +72,17 @@ arswitch_split_setpage(device_t dev, uint32_t addr, uint16_t *phy,
*phy = (((addr) >> 6) & 0x07) | 0x10;
*reg = ((addr) >> 1) & 0x1f;
- if (sc->page != page) {
- MDIO_WRITEREG(device_get_parent(dev), 0x18, 0, page);
- sc->page = page;
- }
+ /*
+ * The earlier code would only switch the page
+ * over if the page were different. Experiments have
+ * shown that this is unstable.
+ *
+ * Hence, the page is always set here.
+ *
+ * See PR kern/172968
+ */
+ MDIO_WRITEREG(device_get_parent(dev), 0x18, 0, page);
+ sc->page = page;
}
/*
OpenPOWER on IntegriCloud