net/i40e: fix parsing packet type for NEON
[dpdk.git] / drivers / net / bnxt / bnxt_rxr.c
index 30d22b7..7179c6c 100644 (file)
@@ -991,7 +991,9 @@ uint16_t bnxt_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
                                        cpr->cp_ring_struct->ring_mask,
                                        cpr->valid);
 
-               if ((CMP_TYPE(rxcmp) >= CMPL_BASE_TYPE_RX_TPA_START_V2) &&
+               if (CMP_TYPE(rxcmp) == CMPL_BASE_TYPE_HWRM_DONE) {
+                       PMD_DRV_LOG(ERR, "Rx flush done\n");
+               } else if ((CMP_TYPE(rxcmp) >= CMPL_BASE_TYPE_RX_TPA_START_V2) &&
                     (CMP_TYPE(rxcmp) <= RX_TPA_V2_ABUF_CMPL_TYPE_RX_TPA_AGG)) {
                        rc = bnxt_rx_pkt(&rx_pkts[nb_rx_pkts], rxq, &raw_cons);
                        if (!rc)
@@ -1016,9 +1018,6 @@ uint16_t bnxt_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
                raw_cons = NEXT_RAW_CMP(raw_cons);
                if (nb_rx_pkts == nb_pkts || nb_rep_rx_pkts == nb_pkts || evt)
                        break;
-               /* Post some Rx buf early in case of larger burst processing */
-               if (nb_rx_pkts == BNXT_RX_POST_THRESH)
-                       bnxt_db_write(&rxr->rx_db, rxr->rx_raw_prod);
        }
 
        cpr->cp_raw_cons = raw_cons;
@@ -1291,3 +1290,35 @@ int bnxt_init_one_rx_ring(struct bnxt_rx_queue *rxq)
 
        return 0;
 }
+
+/* Sweep the Rx completion queue till HWRM_DONE for ring flush is received.
+ * The mbufs will not be freed in this call.
+ * They will be freed during ring free as a part of mem cleanup.
+ */
+int bnxt_flush_rx_cmp(struct bnxt_cp_ring_info *cpr)
+{
+       struct bnxt_ring *cp_ring_struct = cpr->cp_ring_struct;
+       uint32_t ring_mask = cp_ring_struct->ring_mask;
+       uint32_t raw_cons = cpr->cp_raw_cons;
+       struct rx_pkt_cmpl *rxcmp;
+       uint32_t nb_rx = 0;
+       uint32_t cons;
+
+       do {
+               cons = RING_CMP(cpr->cp_ring_struct, raw_cons);
+               rxcmp = (struct rx_pkt_cmpl *)&cpr->cp_desc_ring[cons];
+
+               if (CMP_TYPE(rxcmp) == CMPL_BASE_TYPE_HWRM_DONE)
+                       return 1;
+
+               raw_cons = NEXT_RAW_CMP(raw_cons);
+               nb_rx++;
+       } while (nb_rx < ring_mask);
+
+       cpr->cp_raw_cons = raw_cons;
+
+       /* Ring the completion queue doorbell. */
+       bnxt_db_cq(cpr);
+
+       return 0;
+}