Index: if_fxp.c =================================================================== RCS file: /data/ncvs/src/sys/dev/fxp/if_fxp.c,v retrieving revision 1.194 diff -u -r1.194 if_fxp.c --- if_fxp.c 5 Sep 2003 22:37:31 -0000 1.194 +++ if_fxp.c 3 Oct 2003 16:43:11 -0000 @@ -1623,6 +1623,7 @@ fxp_intr_body(struct fxp_softc *sc, struct ifnet *ifp, u_int8_t statack, int count) { + struct mbuf *mqueue, *mqueue_tail; struct mbuf *m; struct fxp_rx *rxp; struct fxp_rfa *rfa; @@ -1685,6 +1686,7 @@ * record the pending RNR in the FXP_FLAG_DEFERRED_RNR flag so * that the info will be used in the subsequent polling cycle. */ + mqueue = mqueue_tail = NULL; for (;;) { rxp = sc->fxp_desc.rx_head; m = rxp->rx_mbuf; @@ -1766,10 +1768,21 @@ * packets received, dropping the lock, and then * calling if_input() on each one. */ - FXP_UNLOCK(sc); + if (mqueue != NULL) { + mqueue_tail->m_nextpkt = m; + mqueue_tail = m; + } else + mqueue = mqueue_tail = m; + } + } + if (mqueue != NULL) { + FXP_UNLOCK(sc); + while (mqueue != NULL) { + m = mqueue; + mqueue = mqueue->m_nextpkt; (*ifp->if_input)(ifp, m); - FXP_LOCK(sc); } + FXP_LOCK(sc); } if (rnr) { fxp_scb_wait(sc);