From: Gagandeep Singh <g.si...@nxp.com>

Add software based taildrop support.

Signed-off-by: Gagandeep Singh <g.si...@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(-)

diff --git a/drivers/bus/fslmc/portal/dpaa2_hw_pvt.h 
b/drivers/bus/fslmc/portal/dpaa2_hw_pvt.h
index c5900bd06a..03b9088cc6 100644
--- a/drivers/bus/fslmc/portal/dpaa2_hw_pvt.h
+++ b/drivers/bus/fslmc/portal/dpaa2_hw_pvt.h
@@ -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;
 };
diff --git a/drivers/net/dpaa2/dpaa2_rxtx.c b/drivers/net/dpaa2/dpaa2_rxtx.c
index 4bb785aa49..065b219ffd 100644
--- a/drivers/net/dpaa2/dpaa2_rxtx.c
+++ b/drivers/net/dpaa2/dpaa2_rxtx.c
@@ -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;
 }
 
-- 
2.25.1

Reply via email to