diff options
author | yongari <yongari@FreeBSD.org> | 2008-09-22 06:17:21 +0000 |
---|---|---|
committer | yongari <yongari@FreeBSD.org> | 2008-09-22 06:17:21 +0000 |
commit | 514fd19ec3b25f4b0ae5633eb65c3edc1731f626 (patch) | |
tree | 4c425dfdd65105048146db11ffe66e27715be0d8 /sys/dev/jme/if_jme.c | |
parent | 24cc0f58d69f12c5c7dd9b02bb5e259f91824aef (diff) | |
download | FreeBSD-src-514fd19ec3b25f4b0ae5633eb65c3edc1731f626.zip FreeBSD-src-514fd19ec3b25f4b0ae5633eb65c3edc1731f626.tar.gz |
Add workaround for occasional packet loss issue of JMC250 A2
when it runs on half-duplex media.
While I'm here add register definition for GPREG1. ATM the GPREG1
register is only valid for JMC250 A1/A2.
Submitted by: Ethan at JMicron
Diffstat (limited to 'sys/dev/jme/if_jme.c')
-rw-r--r-- | sys/dev/jme/if_jme.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/sys/dev/jme/if_jme.c b/sys/dev/jme/if_jme.c index 231f65a..59b1bb7 100644 --- a/sys/dev/jme/if_jme.c +++ b/sys/dev/jme/if_jme.c @@ -1940,7 +1940,7 @@ static void jme_mac_config(struct jme_softc *sc) { struct mii_data *mii; - uint32_t ghc, rxmac, txmac, txpause; + uint32_t ghc, gpreg, rxmac, txmac, txpause; JME_LOCK_ASSERT(sc); @@ -1996,9 +1996,19 @@ jme_mac_config(struct jme_softc *sc) default: break; } - /* Workaround CRC errors at 100Mbps on JMC250 A2. */ if (sc->jme_rev == DEVICEID_JMC250 && sc->jme_chip_rev == DEVICEREVID_JMC250_A2) { + /* + * Workaround occasional packet loss issue of JMC250 A2 + * when it runs on half-duplex media. + */ + gpreg = CSR_READ_4(sc, JME_GPREG1); + if ((IFM_OPTIONS(mii->mii_media_active) & IFM_FDX) != 0) + gpreg &= ~GPREG1_HDPX_FIX; + else + gpreg |= GPREG1_HDPX_FIX; + CSR_WRITE_4(sc, JME_GPREG1, gpreg); + /* Workaround CRC errors at 100Mbps on JMC250 A2. */ if (IFM_SUBTYPE(mii->mii_media_active) == IFM_100_TX) { /* Extend interface FIFO depth. */ jme_miibus_writereg(sc->jme_dev, sc->jme_phyaddr, |