Index: dev/e1000/if_igb.c =================================================================== --- dev/e1000/if_igb.c (revision 225402) +++ dev/e1000/if_igb.c (working copy) @@ -930,6 +930,7 @@ txr = &adapter->tx_rings[i]; que = &adapter->queues[i]; +#if 0 if (IGB_TX_TRYLOCK(txr)) { err = igb_mq_start_locked(ifp, txr, m); IGB_TX_UNLOCK(txr); @@ -937,6 +938,11 @@ err = drbr_enqueue(ifp, txr->br, m); taskqueue_enqueue(que->tq, &txr->txq_task); } +#else + IGB_TX_LOCK(txr); + err = igb_mq_start_locked(ifp, txr, m); + IGB_TX_UNLOCK(txr); +#endif return (err); } Index: dev/e1000/if_em.c =================================================================== --- dev/e1000/if_em.c (revision 225402) +++ dev/e1000/if_em.c (working copy) @@ -931,11 +931,17 @@ struct tx_ring *txr = adapter->tx_rings; int error; +#if 0 if (EM_TX_TRYLOCK(txr)) { error = em_mq_start_locked(ifp, txr, m); EM_TX_UNLOCK(txr); } else error = drbr_enqueue(ifp, txr->br, m); +#else + EM_TX_LOCK(txr); + error = em_mq_start_locked(ifp, txr, m); + EM_TX_UNLOCK(txr); +#endif return (error); } Index: dev/cxgbe/t4_main.c =================================================================== --- dev/cxgbe/t4_main.c (revision 225402) +++ dev/cxgbe/t4_main.c (working copy) @@ -140,7 +140,6 @@ /* ifnet + media interface */ static void cxgbe_init(void *); static int cxgbe_ioctl(struct ifnet *, unsigned long, caddr_t); -static void cxgbe_start(struct ifnet *); static int cxgbe_transmit(struct ifnet *, struct mbuf *); static void cxgbe_qflush(struct ifnet *); static int cxgbe_media_change(struct ifnet *); @@ -855,14 +854,9 @@ ifp->if_init = cxgbe_init; ifp->if_ioctl = cxgbe_ioctl; - ifp->if_start = cxgbe_start; ifp->if_transmit = cxgbe_transmit; ifp->if_qflush = cxgbe_qflush; - ifp->if_snd.ifq_drv_maxlen = 1024; - IFQ_SET_MAXLEN(&ifp->if_snd, ifp->if_snd.ifq_drv_maxlen); - IFQ_SET_READY(&ifp->if_snd); - ifp->if_capabilities = T4_CAP; ifp->if_capenable = T4_CAP_ENABLE; ifp->if_hwassist = CSUM_TCP | CSUM_UDP | CSUM_IP | CSUM_TSO; @@ -1129,21 +1123,6 @@ return (rc); } -static void -cxgbe_start(struct ifnet *ifp) -{ - struct port_info *pi = ifp->if_softc; - struct sge_txq *txq; - int i; - - for_each_txq(pi, i, txq) { - if (TXQ_TRYLOCK(txq)) { - txq_start(ifp, txq); - TXQ_UNLOCK(txq); - } - } -} - static int cxgbe_transmit(struct ifnet *ifp, struct mbuf *m) { @@ -1164,6 +1143,7 @@ txq += (m->m_pkthdr.flowid % pi->ntxq); br = txq->br; +#if 0 if (TXQ_TRYLOCK(txq) == 0) { /* * XXX: make sure that this packet really is sent out. There is @@ -1173,6 +1153,9 @@ return (drbr_enqueue(ifp, br, m)); } +#else + TXQ_LOCK(txq); +#endif /* * txq->m is the mbuf that is held up due to a temporary shortage of Index: dev/cxgb/cxgb_sge.c =================================================================== --- dev/cxgb/cxgb_sge.c (revision 225402) +++ dev/cxgb/cxgb_sge.c (working copy) @@ -1785,29 +1810,36 @@ qidx = (m->m_pkthdr.flowid % pi->nqsets) + pi->first_qset; qs = &pi->adapter->sge.qs[qidx]; - + +#if 1 + TXQ_LOCK(qs); + error = cxgb_transmit_locked(ifp, qs, m); + TXQ_UNLOCK(qs); +#endif +#if 0 if (TXQ_TRYLOCK(qs)) { /* XXX running */ error = cxgb_transmit_locked(ifp, qs, m); TXQ_UNLOCK(qs); - } else + } else { error = drbr_enqueue(ifp, qs->txq[TXQ_ETH].txq_mr, m); + TXQ_LOCK(qs); + if (!TXQ_RING_EMPTY(qs)) + cxgb_start_locked(qs); + TXQ_UNLOCK(qs); + } +#endif +#if 0 + if (TXQ_TRYLOCK(qs)) { + /* XXX running */ + error = cxgb_transmit_locked(ifp, qs, m); + TXQ_UNLOCK(qs); + } else + error = drbr_enqueue(ifp, qs->txq[TXQ_ETH].txq_mr, m); +#endif return (error); } -void -cxgb_start(struct ifnet *ifp) -{ - struct port_info *pi = ifp->if_softc; - struct sge_qset *qs = &pi->adapter->sge.qs[pi->first_qset]; - - if (!pi->link_config.link_ok) - return; - TXQ_LOCK(qs); - cxgb_start_locked(qs); - TXQ_UNLOCK(qs); -} - void cxgb_qflush(struct ifnet *ifp) { Index: dev/cxgb/cxgb_main.c =================================================================== --- dev/cxgb/cxgb_main.c (revision 225402) +++ dev/cxgb/cxgb_main.c (working copy) @@ -1175,12 +1175,9 @@ ifp->if_softc = p; ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; ifp->if_ioctl = cxgb_ioctl; - ifp->if_start = cxgb_start; + ifp->if_transmit = cxgb_transmit; + ifp->if_qflush = cxgb_qflush; - ifp->if_snd.ifq_drv_maxlen = max(cxgb_snd_queue_len, ifqmaxlen); - IFQ_SET_MAXLEN(&ifp->if_snd, ifp->if_snd.ifq_drv_maxlen); - IFQ_SET_READY(&ifp->if_snd); - ifp->if_capabilities = CXGB_CAP; ifp->if_capenable = CXGB_CAP_ENABLE; ifp->if_hwassist = CSUM_TCP | CSUM_UDP | CSUM_IP | CSUM_TSO; @@ -1195,8 +1192,6 @@ } ether_ifattach(ifp, p->hw_addr); - ifp->if_transmit = cxgb_transmit; - ifp->if_qflush = cxgb_qflush; #ifdef DEFAULT_JUMBO if (sc->params.nports <= 2) Index: dev/cxgb/cxgb_adapter.h =================================================================== --- dev/cxgb/cxgb_adapter.h (revision 225402) +++ dev/cxgb/cxgb_adapter.h (working copy) @@ -600,5 +600,4 @@ void cxgb_tx_watchdog(void *arg); int cxgb_transmit(struct ifnet *ifp, struct mbuf *m); void cxgb_qflush(struct ifnet *ifp); -void cxgb_start(struct ifnet *ifp); #endif