Always check fxp(4) is running, see if it can accept frames from
upper stack in fxp_start_body(). fxp(4) drops driver lock in Rx path so check the fxp(4) is still running after reacquiring driver lock in Rx path. Also don't invoke fxp_intr_body if fxp(4) is not running. With this change there is no need to set suspend bit in device attach phase.
This commit is contained in:
parent
43d8b117e4
commit
c109e385f6
@ -992,7 +992,6 @@ fxp_detach(device_t dev)
|
||||
#endif
|
||||
|
||||
FXP_LOCK(sc);
|
||||
sc->suspended = 1; /* Do same thing as we do for suspend */
|
||||
/*
|
||||
* Stop DMA and drop transmit queue, but disable interrupts first.
|
||||
*/
|
||||
@ -1319,6 +1318,10 @@ fxp_start_body(struct ifnet *ifp)
|
||||
if (sc->need_mcsetup)
|
||||
return;
|
||||
|
||||
if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
|
||||
IFF_DRV_RUNNING)
|
||||
return;
|
||||
|
||||
if (sc->tx_queued > FXP_NTXCB_HIWAT)
|
||||
fxp_txeof(sc);
|
||||
/*
|
||||
@ -1727,7 +1730,8 @@ fxp_intr(void *xsc)
|
||||
* First ACK all the interrupts in this pass.
|
||||
*/
|
||||
CSR_WRITE_1(sc, FXP_CSR_SCB_STATACK, statack);
|
||||
fxp_intr_body(sc, ifp, statack, -1);
|
||||
if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0)
|
||||
fxp_intr_body(sc, ifp, statack, -1);
|
||||
}
|
||||
FXP_UNLOCK(sc);
|
||||
}
|
||||
@ -1987,6 +1991,8 @@ fxp_intr_body(struct fxp_softc *sc, struct ifnet *ifp, uint8_t statack,
|
||||
(*ifp->if_input)(ifp, m);
|
||||
FXP_LOCK(sc);
|
||||
rx_npkts++;
|
||||
if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
|
||||
return (rx_npkts);
|
||||
} else {
|
||||
/* Reuse RFA and loaded DMA map. */
|
||||
ifp->if_iqdrops++;
|
||||
@ -2070,7 +2076,8 @@ fxp_tick(void *xsc)
|
||||
*/
|
||||
if (sc->rx_idle_secs > FXP_MAX_RX_IDLE) {
|
||||
sc->rx_idle_secs = 0;
|
||||
fxp_mc_setup(sc);
|
||||
if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0)
|
||||
fxp_mc_setup(sc);
|
||||
}
|
||||
/*
|
||||
* If there is no pending command, start another stats
|
||||
|
Loading…
Reference in New Issue
Block a user