diff --git a/sys/dev/pci/if_vr.c b/sys/dev/pci/if_vr.c index afc610f0e6c..91803883741 100644 --- a/sys/dev/pci/if_vr.c +++ b/sys/dev/pci/if_vr.c @@ -418,27 +418,13 @@ vr_mii_statchg(struct ifnet *ifp) * register, we first have to put the transmit and/or receive logic * in the idle state. */ - if ((sc->vr_mii.mii_media_status & IFM_ACTIVE) && - IFM_SUBTYPE(sc->vr_mii.mii_media_active) != IFM_NONE) { - sc->vr_link = true; - - if (CSR_READ_2(sc, VR_COMMAND) & (VR_CMD_TX_ON | VR_CMD_RX_ON)) - VR_CLRBIT16(sc, VR_COMMAND, - (VR_CMD_TX_ON | VR_CMD_RX_ON)); - - if (sc->vr_mii.mii_media_active & IFM_FDX) - VR_SETBIT16(sc, VR_COMMAND, VR_CMD_FULLDUPLEX); - else - VR_CLRBIT16(sc, VR_COMMAND, VR_CMD_FULLDUPLEX); - - VR_SETBIT16(sc, VR_COMMAND, VR_CMD_TX_ON | VR_CMD_RX_ON); - } else { - sc->vr_link = false; + sc->vr_link = false; + if (CSR_READ_2(sc, VR_COMMAND) & (VR_CMD_TX_ON | VR_CMD_RX_ON)) { VR_CLRBIT16(sc, VR_COMMAND, VR_CMD_TX_ON | VR_CMD_RX_ON); for (i = VR_TIMEOUT; i > 0; i--) { delay(10); if (!(CSR_READ_2(sc, VR_COMMAND) & - (VR_CMD_TX_ON | VR_CMD_RX_ON))) + (VR_CMD_TX_ON | VR_CMD_RX_ON))) break; } if (i == 0) { @@ -446,8 +432,20 @@ vr_mii_statchg(struct ifnet *ifp) aprint_error_dev(sc->vr_dev, "rx shutdown error!\n"); #endif sc->vr_flags |= VR_F_RESTART; + return; } } + if ((sc->vr_mii.mii_media_status & IFM_ACTIVE) && + IFM_SUBTYPE(sc->vr_mii.mii_media_active) != IFM_NONE) { + sc->vr_link = true; + + if (sc->vr_mii.mii_media_active & IFM_FDX) + VR_SETBIT16(sc, VR_COMMAND, VR_CMD_FULLDUPLEX); + else + VR_CLRBIT16(sc, VR_COMMAND, VR_CMD_FULLDUPLEX); + + VR_SETBIT16(sc, VR_COMMAND, VR_CMD_TX_ON | VR_CMD_RX_ON); + } } #define vr_calchash(addr) \