From: Gagandeep Singh <g.singh@nxp.com>
Add software based taildrop support.
Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
---
drivers/bus/fslmc/portal/dpaa2_hw_pvt.h | 2 +-
drivers/net/dpaa2/dpaa2_rxtx.c | 24 +++++++++++++++++++++++-
2 files changed, 24 insertions(+), 2 deletions(-)
@@ -179,7 +179,7 @@ struct __rte_cache_aligned dpaa2_queue {
struct dpaa2_queue *tx_conf_queue;
int32_t eventfd; /*!< Event Fd of this queue */
uint16_t nb_desc;
- uint16_t resv;
+ uint16_t tm_sw_td; /*!< TM software taildrop */
uint64_t offloads;
uint64_t lpbk_cntx;
};
@@ -1297,8 +1297,11 @@ dpaa2_dev_tx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
while (qbman_result_SCN_state(dpaa2_q->cscn)) {
retry_count++;
/* Retry for some time before giving up */
- if (retry_count > CONG_RETRY_COUNT)
+ if (retry_count > CONG_RETRY_COUNT) {
+ if (dpaa2_q->tm_sw_td)
+ goto sw_td;
goto skip_tx;
+ }
}
frames_to_send = (nb_pkts > dpaa2_eqcr_size) ?
@@ -1490,6 +1493,25 @@ dpaa2_dev_tx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
rte_pktmbuf_free_seg(buf_to_free[loop].seg);
}
+ return num_tx;
+sw_td:
+ loop = 0;
+ while (loop < num_tx) {
+ if (unlikely(RTE_MBUF_HAS_EXTBUF(*bufs)))
+ rte_pktmbuf_free(*bufs);
+ bufs++;
+ loop++;
+ }
+
+ /* free the pending buffers */
+ while (nb_pkts) {
+ rte_pktmbuf_free(*bufs);
+ bufs++;
+ nb_pkts--;
+ num_tx++;
+ }
+ dpaa2_q->tx_pkts += num_tx;
+
return num_tx;
}