summaryrefslogtreecommitdiffstats
path: root/sys/dev/bge
diff options
context:
space:
mode:
authoryongari <yongari@FreeBSD.org>2010-10-22 18:31:44 +0000
committeryongari <yongari@FreeBSD.org>2010-10-22 18:31:44 +0000
commitf5df7c7995b0bdeaaa3681ba58cdf8b1a8e098cc (patch)
tree9972af31c604dc870997bc69ec4b59ce5b6b84d8 /sys/dev/bge
parent49d686d4fcb098cb81b683dfa69ab06190fe2366 (diff)
downloadFreeBSD-src-f5df7c7995b0bdeaaa3681ba58cdf8b1a8e098cc.zip
FreeBSD-src-f5df7c7995b0bdeaaa3681ba58cdf8b1a8e098cc.tar.gz
Enable TX MAC state machine lockup fix for both BCM5755 or higher
and BCM5906. Publicly available data sheet just says it may happen due to corrupted TxMbuf.
Diffstat (limited to 'sys/dev/bge')
-rw-r--r--sys/dev/bge/if_bge.c7
-rw-r--r--sys/dev/bge/if_bgereg.h1
2 files changed, 7 insertions, 1 deletions
diff --git a/sys/dev/bge/if_bge.c b/sys/dev/bge/if_bge.c
index 5380931..139df3d 100644
--- a/sys/dev/bge/if_bge.c
+++ b/sys/dev/bge/if_bge.c
@@ -4409,6 +4409,7 @@ bge_init_locked(struct bge_softc *sc)
{
struct ifnet *ifp;
uint16_t *m;
+ uint32_t mode;
BGE_LOCK_ASSERT(sc);
@@ -4514,8 +4515,12 @@ bge_init_locked(struct bge_softc *sc)
/* Init TX ring. */
bge_init_tx_ring(sc);
+ /* Enable TX MAC state machine lockup fix. */
+ mode = CSR_READ_4(sc, BGE_TX_MODE);
+ if (BGE_IS_5755_PLUS(sc) || sc->bge_asicrev == BGE_ASICREV_BCM5906)
+ mode |= BGE_TXMODE_MBUF_LOCKUP_FIX;
/* Turn on transmitter. */
- BGE_SETBIT(sc, BGE_TX_MODE, BGE_TXMODE_ENABLE);
+ CSR_WRITE_4(sc, BGE_TX_MODE, mode | BGE_TXMODE_ENABLE);
/* Turn on receiver. */
BGE_SETBIT(sc, BGE_RX_MODE, BGE_RXMODE_ENABLE);
diff --git a/sys/dev/bge/if_bgereg.h b/sys/dev/bge/if_bgereg.h
index 8e337c6..8211df1 100644
--- a/sys/dev/bge/if_bgereg.h
+++ b/sys/dev/bge/if_bgereg.h
@@ -765,6 +765,7 @@
#define BGE_TXMODE_FLOWCTL_ENABLE 0x00000010
#define BGE_TXMODE_BIGBACKOFF_ENABLE 0x00000020
#define BGE_TXMODE_LONGPAUSE_ENABLE 0x00000040
+#define BGE_TXMODE_MBUF_LOCKUP_FIX 0x00000100
/* Transmit MAC status register */
#define BGE_TXSTAT_RX_XOFFED 0x00000001
OpenPOWER on IntegriCloud