bge: Enable hardware patch for TX MAC lockup on BCM5755+ and BCM5906
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Mon, 2 Jul 2012 07:49:22 +0000 (15:49 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Mon, 2 Jul 2012 08:46:02 +0000 (16:46 +0800)
Obtained-from: FreeBSD 214216

sys/dev/netif/bge/if_bge.c
sys/dev/netif/bge/if_bgereg.h

index 8bc47cc..e3183df 100644 (file)
@@ -3244,6 +3244,7 @@ bge_init(void *xsc)
        struct bge_softc *sc = xsc;
        struct ifnet *ifp = &sc->arpcom.ac_if;
        uint16_t *m;
+       uint32_t mode;
 
        ASSERT_SERIALIZED(ifp->if_serializer);
 
@@ -3316,8 +3317,12 @@ bge_init(void *xsc)
        /* 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);
index c18d5b8..f3c8c20 100644 (file)
 #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