Index: sys/dev/nfe/if_nfe.c =================================================================== --- sys/dev/nfe/if_nfe.c (revision 234048) +++ sys/dev/nfe/if_nfe.c (working copy) @@ -519,6 +519,7 @@ } nfe_power(sc); + nfe_disable_intr(sc); /* Check for reversed ethernet address */ if ((NFE_READ(sc, NFE_TX_UNK) & NFE_MAC_ADDR_INORDER) != 0) sc->nfe_flags |= NFE_CORRECT_MACADDR; @@ -832,16 +833,26 @@ static void nfe_power(struct nfe_softc *sc) { - uint32_t pwr; + uint32_t pwr, r1, r2, r3; if ((sc->nfe_flags & NFE_PWR_MGMT) == 0) return; NFE_WRITE(sc, NFE_RXTX_CTL, NFE_RXTX_RESET | NFE_RXTX_BIT2); + r1 = NFE_READ(sc, NFE_MACADDR_HI); + r2 = NFE_READ(sc, NFE_MACADDR_LO); + r3 = NFE_READ(sc, NFE_TX_UNK); NFE_WRITE(sc, NFE_MAC_RESET, NFE_MAC_RESET_MAGIC); + NFE_READ(sc, NFE_MAC_RESET); DELAY(100); NFE_WRITE(sc, NFE_MAC_RESET, 0); + NFE_READ(sc, NFE_MAC_RESET); DELAY(100); + NFE_WRITE(sc, NFE_MACADDR_HI, r1); + NFE_WRITE(sc, NFE_MACADDR_LO, r2); + NFE_WRITE(sc, NFE_TX_UNK, r3); NFE_WRITE(sc, NFE_RXTX_CTL, NFE_RXTX_BIT2); + NFE_READ(sc, NFE_RXTX_CTL); + pwr = NFE_READ(sc, NFE_PWR2_CTL); pwr &= ~NFE_PWR2_WAKEUP_MASK; if (sc->nfe_revid >= 0xa3 && @@ -2864,14 +2875,34 @@ callout_stop(&sc->nfe_stat_ch); - /* abort Tx */ - NFE_WRITE(sc, NFE_TX_CTL, 0); + /* Disable interrupts. */ + nfe_disable_intr(sc); - /* disable Rx */ + /* Disable RX MAC and wait until the end of active DMA cycles. */ NFE_WRITE(sc, NFE_RX_CTL, 0); + NFE_READ(sc, NFE_RX_CTL); + for (i = 0; i < NFE_TIMEOUT; i++) { + DELAY(100); + if ((NFE_READ(sc, NFE_RX_STATUS) & 0x0001) == 0) + break; + } + if (i == NFE_TIMEOUT) + device_printf(sc->nfe_dev, + "could not disable RX MAC(0x%08x)!\n", + NFE_READ(sc, NFE_RX_STATUS)); - /* disable interrupts */ - nfe_disable_intr(sc); + /* Disable TX MAC and wait until the end of active DMA cycles. */ + NFE_WRITE(sc, NFE_TX_CTL, 0); + NFE_READ(sc, NFE_TX_CTL); + for (i = 0; i < NFE_TIMEOUT; i++) { + DELAY(100); + if ((NFE_READ(sc, NFE_TX_STATUS) & 0x0001) == 0) + break; + } + if (i == NFE_TIMEOUT) + device_printf(sc->nfe_dev, + "could not disable TX MAC(0x%08x)!\n", + NFE_READ(sc, NFE_TX_STATUS)); sc->nfe_link = 0; Index: sys/dev/nfe/if_nfereg.h =================================================================== --- sys/dev/nfe/if_nfereg.h (revision 234048) +++ sys/dev/nfe/if_nfereg.h (working copy) @@ -51,7 +51,7 @@ #define NFE_MSI_MAP0 0x020 #define NFE_MSI_MAP1 0x024 #define NFE_MSI_IRQ_MASK 0x030 -#define NFE_MAC_RESET 0x03c +#define NFE_MAC_RESET 0x034 #define NFE_MISC1 0x080 #define NFE_TX_CTL 0x084 #define NFE_TX_STATUS 0x088