Index: sys/dev/bfe/if_bfe.c =================================================================== RCS file: /usr/store/mlaier/fcvs/src/sys/dev/bfe/if_bfe.c,v retrieving revision 1.13 diff -u -r1.13 if_bfe.c --- sys/dev/bfe/if_bfe.c 30 May 2004 20:08:27 -0000 1.13 +++ sys/dev/bfe/if_bfe.c 2 Jul 2004 01:36:25 -0000 @@ -402,7 +402,9 @@ ifp->if_init = bfe_init; ifp->if_mtu = ETHERMTU; ifp->if_baudrate = 100000000; - ifp->if_snd.ifq_maxlen = BFE_TX_QLEN; + IFQ_SET_MAXLEN(&ifp->if_snd, BFE_TX_QLEN); + ifp->if_snd.ifq_drv_maxlen = BFE_TX_QLEN; + IFQ_SET_READY(&ifp->if_snd); bfe_get_config(sc); @@ -1256,7 +1258,7 @@ bfe_txeof(sc); /* We have packets pending, fire them out */ - if (ifp->if_flags & IFF_RUNNING && ifp->if_snd.ifq_head != NULL) + if (ifp->if_flags & IFF_RUNNING && !IFQ_DRV_IS_EMPTY(&ifp->if_snd)) bfe_start(ifp); BFE_UNLOCK(sc); @@ -1375,7 +1377,7 @@ } while(sc->bfe_tx_ring[idx].bfe_mbuf == NULL) { - IF_DEQUEUE(&ifp->if_snd, m_head); + IFQ_DRV_DEQUEUE(&ifp->if_snd, m_head); if(m_head == NULL) break; @@ -1384,7 +1386,7 @@ * enough room, let the chip drain the ring. */ if(bfe_encap(sc, m_head, &idx)) { - IF_PREPEND(&ifp->if_snd, m_head); + IFQ_DRV_PREPEND(&ifp->if_snd, m_head); ifp->if_flags |= IFF_OACTIVE; break; } Index: sys/dev/em/if_em.c =================================================================== RCS file: /usr/store/mlaier/fcvs/src/sys/dev/em/if_em.c,v retrieving revision 1.43 diff -u -r1.43 if_em.c --- sys/dev/em/if_em.c 4 Jun 2004 16:57:18 -0000 1.43 +++ sys/dev/em/if_em.c 2 Jul 2004 01:36:55 -0000 @@ -610,15 +610,15 @@ if (!adapter->link_active) return; - while (ifp->if_snd.ifq_head != NULL) { + while (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) { - IF_DEQUEUE(&ifp->if_snd, m_head); + IFQ_DRV_DEQUEUE(&ifp->if_snd, m_head); if (m_head == NULL) break; if (em_encap(adapter, m_head)) { ifp->if_flags |= IFF_OACTIVE; - IF_PREPEND(&ifp->if_snd, m_head); + IFQ_DRV_PREPEND(&ifp->if_snd, m_head); break; } @@ -918,7 +918,7 @@ em_clean_transmit_interrupts(adapter); } - if (ifp->if_flags & IFF_RUNNING && ifp->if_snd.ifq_head != NULL) + if (ifp->if_flags & IFF_RUNNING && !IFQ_DRV_IS_EMPTY(&ifp->if_snd)) em_start_locked(ifp); } @@ -988,7 +988,7 @@ loop_cnt--; } - if (ifp->if_flags & IFF_RUNNING && ifp->if_snd.ifq_head != NULL) + if (ifp->if_flags & IFF_RUNNING && IFQ_DRV_IS_EMPTY(&ifp->if_snd)) em_start_locked(ifp); EM_UNLOCK(adapter); @@ -1854,7 +1854,9 @@ ifp->if_ioctl = em_ioctl; ifp->if_start = em_start; ifp->if_watchdog = em_watchdog; - ifp->if_snd.ifq_maxlen = adapter->num_tx_desc - 1; + IFQ_SET_MAXLEN(&ifp->if_snd, adapter->num_tx_desc - 1); + ifp->if_snd.ifq_drv_maxlen = adapter->num_tx_desc - 1; + IFQ_SET_READY(&ifp->if_snd); #if __FreeBSD_version < 500000 ether_ifattach(ifp, ETHER_BPF_SUPPORTED); Index: sys/dev/fxp/if_fxp.c =================================================================== RCS file: /usr/store/mlaier/fcvs/src/sys/dev/fxp/if_fxp.c,v retrieving revision 1.215 diff -u -r1.215 if_fxp.c --- sys/dev/fxp/if_fxp.c 28 Jun 2004 20:26:20 -0000 1.215 +++ sys/dev/fxp/if_fxp.c 2 Jul 2004 01:37:16 -0000 @@ -796,7 +796,9 @@ * Let the system queue as many packets as we have available * TX descriptors. */ - ifp->if_snd.ifq_maxlen = FXP_NTXCB - 1; + IFQ_SET_MAXLEN(&ifp->if_snd, FXP_NTXCB - 1); + ifp->if_snd.ifq_drv_maxlen = FXP_NTXCB - 1; + IFQ_SET_READY(&ifp->if_snd); /* * Hook our interrupt after all initialization is complete. @@ -1278,12 +1280,15 @@ * NOTE: One TxCB is reserved to guarantee that fxp_mc_setup() can add * a NOP command when needed. */ - while (ifp->if_snd.ifq_head != NULL && sc->tx_queued < FXP_NTXCB - 1) { + while (!IFQ_DRV_IS_EMPTY(&ifp->if_snd) && + sc->tx_queued < FXP_NTXCB - 1) { /* * Grab a packet to transmit. */ - IF_DEQUEUE(&ifp->if_snd, mb_head); + IFQ_DRV_DEQUEUE(&ifp->if_snd, mb_head); + if (mb_head == NULL) + break; /* * Get pointer to next available tx desc. @@ -1634,7 +1639,7 @@ /* * Try to start more packets transmitting. */ - if (ifp->if_snd.ifq_head != NULL) + if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) fxp_start_body(ifp); } Index: sys/dev/lnc/if_lnc.c =================================================================== RCS file: /usr/store/mlaier/fcvs/src/sys/dev/lnc/if_lnc.c,v retrieving revision 1.108 diff -u -r1.108 if_lnc.c --- sys/dev/lnc/if_lnc.c 9 Jun 2004 14:34:00 -0000 1.108 +++ sys/dev/lnc/if_lnc.c 2 Jul 2004 01:37:38 -0000 @@ -863,7 +863,9 @@ sc->arpcom.ac_if.if_ioctl = lnc_ioctl; sc->arpcom.ac_if.if_watchdog = lnc_watchdog; sc->arpcom.ac_if.if_init = lnc_init; - sc->arpcom.ac_if.if_snd.ifq_maxlen = IFQ_MAXLEN; + IFQ_SET_MAXLEN(&sc->arpcom.ac_if.if_snd, IFQ_MAXLEN); + sc->arpcom.ac_if.if_snd.ifq_drv_maxlen = IFQ_MAXLEN; + IFQ_SET_READY(&sc->arpcom.ac_if.if_snd); /* Extract MAC address from PROM */ for (i = 0; i < ETHER_ADDR_LEN; i++) @@ -1213,7 +1215,7 @@ do { - IF_DEQUEUE(&sc->arpcom.ac_if.if_snd, head); + IFQ_DRV_DEQUEUE(&sc->arpcom.ac_if.if_snd, head); if (!head) return; Index: sys/net/if_tun.c =================================================================== RCS file: /usr/store/mlaier/fcvs/src/sys/net/if_tun.c,v retrieving revision 1.142 diff -u -r1.142 if_tun.c --- sys/net/if_tun.c 17 Jun 2004 17:16:50 -0000 1.142 +++ sys/net/if_tun.c 2 Jul 2004 01:38:15 -0000 @@ -220,6 +220,17 @@ tunstart(struct ifnet *ifp) { struct tun_softc *tp = ifp->if_softc; + struct mbuf *m; + + if (ALTQ_IS_ENABLED(&ifp->if_snd)) { + IFQ_LOCK(&ifp->if_snd); + IFQ_POLL_NOLOCK(&ifp->if_snd, m); + if (m == NULL) { + IFQ_UNLOCK(&ifp->if_snd); + return; + } + IFQ_UNLOCK(&ifp->if_snd); + } mtx_lock(&tp->tun_mtx); if (tp->tun_flags & TUN_RWAIT) { @@ -258,8 +269,11 @@ ifp->if_start = tunstart; ifp->if_flags = IFF_POINTOPOINT | IFF_MULTICAST; ifp->if_type = IFT_PPP; - ifp->if_snd.ifq_maxlen = ifqmaxlen; ifp->if_softc = sc; + IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen); + ifp->if_snd.ifq_drv_maxlen = 0; + IFQ_SET_READY(&ifp->if_snd); + if_attach(ifp); bpfattach(ifp, DLT_NULL, sizeof(u_int)); dev->si_drv1 = sc; @@ -319,12 +333,14 @@ mtx_lock(&tp->tun_mtx); tp->tun_flags &= ~TUN_OPEN; tp->tun_pid = 0; - mtx_unlock(&tp->tun_mtx); /* * junk all pending output */ - IF_DRAIN(&ifp->if_snd); + s = splimp(); + IFQ_PURGE(&ifp->if_snd); + splx(s); + mtx_unlock(&tp->tun_mtx); if (ifp->if_flags & IFF_UP) { s = splimp(); @@ -623,10 +639,13 @@ break; case FIONREAD: s = splimp(); - if (tp->tun_if.if_snd.ifq_head) { - struct mbuf *mb = tp->tun_if.if_snd.ifq_head; + if (!IFQ_IS_EMPTY(&tp->tun_if.if_snd)) { + struct mbuf *mb; + IFQ_LOCK(&tp->tun_if.if_snd); + IFQ_POLL_NOLOCK(&tp->tun_if.if_snd, mb); for( *(int *)data = 0; mb != 0; mb = mb->m_next) *(int *)data += mb->m_len; + IFQ_UNLOCK(&tp->tun_if.if_snd); } else *(int *)data = 0; splx(s); @@ -678,7 +697,7 @@ s = splimp(); do { - IF_DEQUEUE(&ifp->if_snd, m); + IFQ_DEQUEUE(&ifp->if_snd, m); if (m == NULL) { if (flag & IO_NDELAY) { splx(s); @@ -835,18 +854,22 @@ struct tun_softc *tp = dev->si_drv1; struct ifnet *ifp = &tp->tun_if; int revents = 0; + struct mbuf *m; s = splimp(); TUNDEBUG(ifp, "tunpoll\n"); if (events & (POLLIN | POLLRDNORM)) { - if (ifp->if_snd.ifq_len > 0) { + IFQ_LOCK(&ifp->if_snd); + IFQ_POLL_NOLOCK(&ifp->if_snd, m); + if (m != NULL) { TUNDEBUG(ifp, "tunpoll q=%d\n", ifp->if_snd.ifq_len); revents |= events & (POLLIN | POLLRDNORM); } else { TUNDEBUG(ifp, "tunpoll waiting\n"); selrecord(td, &tp->tun_rsel); } + IFQ_UNLOCK(&ifp->if_snd); } if (events & (POLLOUT | POLLWRNORM)) revents |= events & (POLLOUT | POLLWRNORM); Index: sys/pci/if_de.c =================================================================== RCS file: /usr/store/mlaier/fcvs/src/sys/pci/if_de.c,v retrieving revision 1.154 diff -u -r1.154 if_de.c --- sys/pci/if_de.c 9 Jun 2004 14:34:03 -0000 1.154 +++ sys/pci/if_de.c 2 Jul 2004 01:36:44 -0000 @@ -4619,15 +4619,17 @@ if ((sc->tulip_flags & (TULIP_WANTSETUP|TULIP_TXPROBE_ACTIVE)) == TULIP_WANTSETUP) tulip_txput_setup(sc); - while (sc->tulip_if.if_snd.ifq_head != NULL) { + while (!IFQ_DRV_IS_EMPTY(&sc->tulip_if.if_snd)) { struct mbuf *m; - IF_DEQUEUE(&sc->tulip_if.if_snd, m); + IFQ_DRV_DEQUEUE(&sc->tulip_if.if_snd, m); + if(m == NULL) + break; if ((m = tulip_txput(sc, m)) != NULL) { - IF_PREPEND(&sc->tulip_if.if_snd, m); + IFQ_DRV_PREPEND(&sc->tulip_if.if_snd, m); break; } } - if (sc->tulip_if.if_snd.ifq_head == NULL) + if (IFQ_DRV_IS_EMPTY(&sc->tulip_if.if_snd)) sc->tulip_if.if_start = tulip_ifstart_one; } @@ -4642,11 +4644,12 @@ tulip_softc_t * const sc = (tulip_softc_t *)ifp->if_softc; if ((sc->tulip_if.if_flags & IFF_RUNNING) - && sc->tulip_if.if_snd.ifq_head != NULL) { + && !IFQ_DRV_IS_EMPTY(&sc->tulip_if.if_snd)) { struct mbuf *m; - IF_DEQUEUE(&sc->tulip_if.if_snd, m); - if ((m = tulip_txput(sc, m)) != NULL) - IF_PREPEND(&sc->tulip_if.if_snd, m); + IFQ_DRV_DEQUEUE(&sc->tulip_if.if_snd, m); + if(m == NULL); + else if((m = tulip_txput(sc, m)) != NULL) + IFQ_DRV_PREPEND(&sc->tulip_if.if_snd, m); } TULIP_PERFEND(ifstart_one); } @@ -4788,7 +4791,9 @@ tulip_reset(sc); ether_ifattach(&(sc)->tulip_if, sc->tulip_enaddr); - ifp->if_snd.ifq_maxlen = ifqmaxlen; + IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen); + ifp->if_snd.ifq_drv_maxlen = ifqmaxlen; + IFQ_SET_READY(&ifp->if_snd); } #if defined(TULIP_BUS_DMA) Index: sys/pci/if_rl.c =================================================================== RCS file: /usr/store/mlaier/fcvs/src/sys/pci/if_rl.c,v retrieving revision 1.140 diff -u -r1.140 if_rl.c --- sys/pci/if_rl.c 28 Jun 2004 20:07:03 -0000 1.140 +++ sys/pci/if_rl.c 2 Jul 2004 01:37:50 -0000 @@ -1048,7 +1048,9 @@ ifp->if_capabilities |= IFCAP_POLLING; #endif ifp->if_capenable = ifp->if_capabilities; - ifp->if_snd.ifq_maxlen = IFQ_MAXLEN; + IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); + ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN; + IFQ_SET_READY(&ifp->if_snd); callout_handle_init(&sc->rl_stat_ch); @@ -1393,7 +1395,7 @@ sc->rxcycles = count; rl_rxeof(sc); rl_txeof(sc); - if (ifp->if_snd.ifq_head != NULL) + if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) rl_start(ifp); if (cmd == POLL_AND_CHECK_STATUS) { /* also check status register */ @@ -1475,7 +1477,7 @@ } - if (ifp->if_snd.ifq_head != NULL) + if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) rl_start(ifp); #ifdef DEVICE_POLLING @@ -1545,7 +1547,7 @@ RL_LOCK(sc); while(RL_CUR_TXMBUF(sc) == NULL) { - IF_DEQUEUE(&ifp->if_snd, m_head); + IFQ_DRV_DEQUEUE(&ifp->if_snd, m_head); if (m_head == NULL) break; Index: sys/pci/if_sis.c =================================================================== RCS file: /usr/store/mlaier/fcvs/src/sys/pci/if_sis.c,v retrieving revision 1.102 diff -u -r1.102 if_sis.c --- sys/pci/if_sis.c 28 Jun 2004 20:07:03 -0000 1.102 +++ sys/pci/if_sis.c 2 Jul 2004 01:38:00 -0000 @@ -1337,7 +1337,9 @@ ifp->if_watchdog = sis_watchdog; ifp->if_init = sis_init; ifp->if_baudrate = 10000000; - ifp->if_snd.ifq_maxlen = SIS_TX_LIST_CNT - 1; + IFQ_SET_MAXLEN(&ifp->if_snd, SIS_TX_LIST_CNT - 1); + ifp->if_snd.ifq_drv_maxlen = SIS_TX_LIST_CNT - 1; + IFQ_SET_READY(&ifp->if_snd); /* * Do MII setup. @@ -1727,7 +1729,7 @@ if (!sc->sis_link && mii->mii_media_status & IFM_ACTIVE && IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) { sc->sis_link++; - if (ifp->if_snd.ifq_head != NULL) + if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) sis_start(ifp); } @@ -1766,7 +1768,7 @@ sc->rxcycles = count; sis_rxeof(sc); sis_txeof(sc); - if (ifp->if_snd.ifq_head != NULL) + if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) sis_start(ifp); if (sc->rxcycles > 0 || cmd == POLL_AND_CHECK_STATUS) { @@ -1853,7 +1855,7 @@ /* Re-enable interrupts. */ CSR_WRITE_4(sc, SIS_IER, 1); - if (ifp->if_snd.ifq_head != NULL) + if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) sis_start(ifp); done: SIS_UNLOCK(sc); @@ -1970,12 +1972,12 @@ } while(sc->sis_ldata.sis_tx_list[idx].sis_mbuf == NULL) { - IF_DEQUEUE(&ifp->if_snd, m_head); + IFQ_DRV_DEQUEUE(&ifp->if_snd, m_head); if (m_head == NULL) break; if (sis_encap(sc, &m_head, &idx)) { - IF_PREPEND(&ifp->if_snd, m_head); + IFQ_DRV_PREPEND(&ifp->if_snd, m_head); ifp->if_flags |= IFF_OACTIVE; break; } @@ -2337,7 +2339,7 @@ sis_reset(sc); sis_init(sc); - if (ifp->if_snd.ifq_head != NULL) + if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) sis_start(ifp); SIS_UNLOCK(sc); Index: sys/pci/if_xl.c =================================================================== RCS file: /usr/store/mlaier/fcvs/src/sys/pci/if_xl.c,v retrieving revision 1.172 diff -u -r1.172 if_xl.c --- sys/pci/if_xl.c 28 Jun 2004 20:07:03 -0000 1.172 +++ sys/pci/if_xl.c 2 Jul 2004 01:38:26 -0000 @@ -933,7 +933,7 @@ mtod(m, unsigned char *)[15] = 0; mtod(m, unsigned char *)[16] = 0xE3; m->m_len = m->m_pkthdr.len = sizeof(struct ether_header) + 3; - IF_ENQUEUE(&ifp->if_snd, m); + IFQ_ENQUEUE(&ifp->if_snd, m); xl_start(ifp); return; @@ -1556,7 +1556,9 @@ ifp->if_watchdog = xl_watchdog; ifp->if_init = xl_init; ifp->if_baudrate = 10000000; - ifp->if_snd.ifq_maxlen = XL_TX_LIST_CNT - 1; + IFQ_SET_MAXLEN(&ifp->if_snd, XL_TX_LIST_CNT - 1); + ifp->if_snd.ifq_drv_maxlen = XL_TX_LIST_CNT - 1; + IFQ_SET_READY(&ifp->if_snd); ifp->if_capenable = ifp->if_capabilities; /* @@ -2337,7 +2339,7 @@ } } - if (ifp->if_snd.ifq_head != NULL) + if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) (*ifp->if_start)(ifp); XL_UNLOCK(sc); @@ -2513,7 +2515,7 @@ start_tx = sc->xl_cdata.xl_tx_free; while(sc->xl_cdata.xl_tx_free != NULL) { - IF_DEQUEUE(&ifp->if_snd, m_head); + IFQ_DRV_DEQUEUE(&ifp->if_snd, m_head); if (m_head == NULL) break; @@ -2646,7 +2648,7 @@ break; } - IF_DEQUEUE(&ifp->if_snd, m_head); + IFQ_DRV_DEQUEUE(&ifp->if_snd, m_head); if (m_head == NULL) break; @@ -3156,7 +3158,7 @@ xl_reset(sc); xl_init(sc); - if (ifp->if_snd.ifq_head != NULL) + if (IFQ_DRV_IS_EMPTY(&ifp->if_snd)) (*ifp->if_start)(ifp); XL_UNLOCK(sc);