static uint16_t bnx2x_xmit_pkts(void *p_txq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) { struct bnx2x_tx_queue *txq; struct bnx2x_softc *sc; struct bnx2x_fastpath *fp; uint16_t nb_tx_pkts; uint16_t nb_pkt_sent = 0; uint32_t ret; txq = p_txq; sc = txq->sc; fp = &sc->fp[txq->queue_id]; if ((unlikely((txq->nb_tx_desc - txq->nb_tx_avail) > txq->tx_free_thresh))) bnx2x_txeof(sc, fp); nb_tx_pkts = RTE_MIN(nb_pkts, txq->nb_tx_avail / BDS_PER_TX_PKT); if (unlikely(nb_tx_pkts == 0)) return 0; while (nb_tx_pkts--) { struct rte_mbuf *m = *tx_pkts++; assert(m != NULL); ret = bnx2x_tx_encap(txq, m); fp->tx_db.data.prod += ret; nb_pkt_sent++; } bnx2x_update_fp_sb_idx(fp); mb(); DOORBELL(sc, txq->queue_id, fp->tx_db.raw); mb(); if ((txq->nb_tx_desc - txq->nb_tx_avail) > txq->tx_free_thresh) bnx2x_txeof(sc, fp); return nb_pkt_sent; }
static uint16_t bnx2x_xmit_pkts(void *p_txq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) { struct bnx2x_tx_queue *txq; struct bnx2x_softc *sc; struct bnx2x_fastpath *fp; uint32_t burst, nb_tx; struct rte_mbuf **m = tx_pkts; int ret; txq = p_txq; sc = txq->sc; fp = &sc->fp[txq->queue_id]; nb_tx = nb_pkts; do { burst = RTE_MIN(nb_pkts, RTE_PMD_BNX2X_TX_MAX_BURST); ret = bnx2x_tx_encap(txq, m, burst); if (unlikely(ret)) { PMD_TX_LOG(ERR, "tx_encap failed!"); } bnx2x_update_fp_sb_idx(fp); if ((txq->nb_tx_desc - txq->nb_tx_avail) > txq->tx_free_thresh) { bnx2x_txeof(sc, fp); } if (unlikely(ret == -ENOMEM)) { break; } m += burst; nb_pkts -= burst; } while (nb_pkts); return nb_tx - nb_pkts; }