Index: if_fec.c =================================================================== RCS file: /cvs/src/sys/arch/armv7/imx/if_fec.c,v retrieving revision 1.20 diff -u -p -r1.20 if_fec.c --- if_fec.c 22 Jan 2017 10:17:37 -0000 1.20 +++ if_fec.c 31 May 2017 10:41:45 -0000 @@ -799,18 +799,20 @@ fec_start(struct ifnet *ifp) return; for (;;) { - m_head = ifq_deq_begin(&ifp->if_snd); + if (sc->tx_desc_base[sc->cur_tx].status & ENET_TXD_READY) { + ifq_set_oactive(&ifp->if_snd); + break; + } + + m_head = ifq_dequeue(&ifp->if_snd); if (m_head == NULL) break; if (fec_encap(sc, m_head)) { - ifq_deq_rollback(&ifp->if_snd, m_head); - ifq_set_oactive(&ifp->if_snd); - break; + m_freem(m_head); + continue; } - ifq_deq_commit(&ifp->if_snd, m_head); - #if NBPFILTER > 0 if (ifp->if_bpf) bpf_mtap(ifp->if_bpf, m_head, BPF_DIRECTION_OUT); @@ -823,18 +825,12 @@ fec_start(struct ifnet *ifp) int fec_encap(struct fec_softc *sc, struct mbuf *m) { - if (sc->tx_desc_base[sc->cur_tx].status & ENET_TXD_READY) { - printf("fec: tx queue full!\n"); + if (m->m_pkthdr.len > ENET_MAX_PKT_SIZE) return EIO; - } - - if (m->m_pkthdr.len > ENET_MAX_PKT_SIZE) { - printf("fec: packet too big\n"); - return EIO; - } /* copy in the actual packet */ - m_copydata(m, 0, m->m_pkthdr.len, (caddr_t)sc->tx_buffer_base[sc->cur_tx].data); + m_copydata(m, 0, m->m_pkthdr.len, + (caddr_t)sc->tx_buffer_base[sc->cur_tx].data); sc->tx_desc_base[sc->cur_tx].data_length = m->m_pkthdr.len; @@ -908,10 +904,11 @@ fec_intr(void *arg) if (ifp->if_flags & IFF_RUNNING) fec_recv(sc); } - - /* Try to transmit. */ - if (ifp->if_flags & IFF_RUNNING && !IFQ_IS_EMPTY(&ifp->if_snd)) - fec_start(ifp); + if (ISSET(status, ENET_EIR_TXF)) { + /* Try to transmit. */ + if (ifq_is_oactive(&ifp->if_snd)) + ifq_restart(&ifp->if_snd); + } return 1; }