net/enetc: improve batching Rx ring refill
[dpdk.git] / drivers / net / enetc / enetc_rxtx.c
index b7ecb75..262ed8a 100644 (file)
@@ -14,8 +14,6 @@
 #include "enetc.h"
 #include "enetc_logs.h"
 
-#define ENETC_RXBD_BUNDLE 8 /* Number of BDs to update at once */
-
 static int
 enetc_clean_tx_ring(struct enetc_bdr *tx_ring)
 {
@@ -23,12 +21,15 @@ enetc_clean_tx_ring(struct enetc_bdr *tx_ring)
        struct enetc_swbd *tx_swbd;
        int i, hwci;
 
+       /* we don't need barriers here, we just want a relatively current value
+        * from HW.
+        */
+       hwci = (int)(rte_read32_relaxed(tx_ring->tcisr) &
+                    ENETC_TBCISR_IDX_MASK);
+
        i = tx_ring->next_to_clean;
        tx_swbd = &tx_ring->q_swbd[i];
 
-       hwci = (int)(enetc_rd_reg(tx_ring->tcisr) &
-                    ENETC_TBCISR_IDX_MASK);
-
        /* we're only reading the CI index once here, which means HW may update
         * it while we're doing clean-up.  We could read the register in a loop
         * but for now I assume it's OK to leave a few Tx frames for next call.
@@ -73,7 +74,6 @@ enetc_xmit_pkts(void *tx_queue,
 
        start = 0;
        while (nb_pkts--) {
-               enetc_clean_tx_ring(tx_ring);
                tx_ring->q_swbd[i].buffer_addr = tx_pkts[start];
                txbd = ENETC_TXBD(*tx_ring, i);
                tx_swbd = &tx_ring->q_swbd[i];
@@ -89,6 +89,14 @@ enetc_xmit_pkts(void *tx_queue,
                        i = 0;
        }
 
+       /* we're only cleaning up the Tx ring here, on the assumption that
+        * software is slower than hardware and hardware completed sending
+        * older frames out by now.
+        * We're also cleaning up the ring before kicking off Tx for the new
+        * batch to minimize chances of contention on the Tx ring
+        */
+       enetc_clean_tx_ring(tx_ring);
+
        tx_ring->next_to_use = i;
        enetc_wr_reg(tx_ring->tcir, i);
        return start;
@@ -295,12 +303,6 @@ enetc_clean_rx_ring(struct enetc_bdr *rx_ring,
                union enetc_rx_bd *rxbd;
                uint32_t bd_status;
 
-               if (cleaned_cnt >= ENETC_RXBD_BUNDLE) {
-                       int count = enetc_refill_rx_ring(rx_ring, cleaned_cnt);
-
-                       cleaned_cnt -= count;
-               }
-
                rxbd = ENETC_RXBD(*rx_ring, i);
                bd_status = rte_le_to_cpu_32(rxbd->r.lstatus);
                if (!bd_status)
@@ -327,6 +329,8 @@ enetc_clean_rx_ring(struct enetc_bdr *rx_ring,
                rx_frm_cnt++;
        }
 
+       enetc_refill_rx_ring(rx_ring, cleaned_cnt);
+
        return rx_frm_cnt;
 }