net/sfc: receive prepared packets even in Rx exception case
[dpdk.git] / drivers / net / sfc / sfc_ef10_rx.c
index 1f0d6a0..5c0152d 100644 (file)
@@ -359,11 +359,11 @@ sfc_ef10_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
        uint16_t n_rx_pkts;
        efx_qword_t rx_ev;
 
+       n_rx_pkts = sfc_ef10_rx_prepared(rxq, rx_pkts, nb_pkts);
+
        if (unlikely(rxq->flags &
                     (SFC_EF10_RXQ_NOT_RUNNING | SFC_EF10_RXQ_EXCEPTION)))
-               return 0;
-
-       n_rx_pkts = sfc_ef10_rx_prepared(rxq, rx_pkts, nb_pkts);
+               goto done;
 
        evq_old_read_ptr = rxq->evq_read_ptr;
        while (n_rx_pkts != nb_pkts && sfc_ef10_rx_get_event(rxq, &rx_ev)) {
@@ -383,10 +383,11 @@ sfc_ef10_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
        /* It is not a problem if we refill in the case of exception */
        sfc_ef10_rx_qrefill(rxq);
 
+done:
        return n_rx_pkts;
 }
 
-static const uint32_t *
+const uint32_t *
 sfc_ef10_supported_ptypes_get(uint32_t tunnel_encaps)
 {
        static const uint32_t ef10_native_ptypes[] = {
@@ -594,8 +595,9 @@ sfc_ef10_rx_qstart(struct sfc_dp_rxq *dp_rxq, unsigned int evq_read_ptr)
 {
        struct sfc_ef10_rxq *rxq = sfc_ef10_rxq_by_dp_rxq(dp_rxq);
 
-       rxq->prepared = 0;
-       rxq->completed = rxq->added = 0;
+       SFC_ASSERT(rxq->prepared == 0);
+       SFC_ASSERT(rxq->completed == 0);
+       SFC_ASSERT(rxq->added == 0);
 
        sfc_ef10_rx_qrefill(rxq);
 
@@ -642,12 +644,16 @@ sfc_ef10_rx_qpurge(struct sfc_dp_rxq *dp_rxq)
        unsigned int i;
        struct sfc_ef10_rx_sw_desc *rxd;
 
+       rxq->prepared = 0;
+
        for (i = rxq->completed; i != rxq->added; ++i) {
                rxd = &rxq->sw_ring[i & rxq->ptr_mask];
                rte_mempool_put(rxq->refill_mb_pool, rxd->mbuf);
                rxd->mbuf = NULL;
        }
 
+       rxq->completed = rxq->added = 0;
+
        rxq->flags &= ~SFC_EF10_RXQ_STARTED;
 }
 
@@ -658,7 +664,8 @@ struct sfc_dp_rx sfc_ef10_rx = {
                .hw_fw_caps     = SFC_DP_HW_FW_CAP_EF10,
        },
        .features               = SFC_DP_RX_FEAT_MULTI_PROCESS |
-                                 SFC_DP_RX_FEAT_TUNNELS,
+                                 SFC_DP_RX_FEAT_TUNNELS |
+                                 SFC_DP_RX_FEAT_CHECKSUM,
        .get_dev_info           = sfc_ef10_rx_get_dev_info,
        .qsize_up_rings         = sfc_ef10_rx_qsize_up_rings,
        .qcreate                = sfc_ef10_rx_qcreate,