Imported Upstream version 16.11.2
[deb_dpdk.git] / drivers / net / ena / ena_ethdev.c
index c1fd7bb..1fc3654 100644 (file)
@@ -908,7 +908,7 @@ static int ena_start(struct rte_eth_dev *dev)
 
 static int ena_queue_restart(struct ena_ring *ring)
 {
-       int rc;
+       int rc, bufs_num;
 
        ena_assert_msg(ring->configured == 1,
                       "Trying to restart unconfigured queue\n");
@@ -919,9 +919,10 @@ static int ena_queue_restart(struct ena_ring *ring)
        if (ring->type == ENA_RING_TYPE_TX)
                return 0;
 
-       rc = ena_populate_rx_queue(ring, ring->ring_size);
-       if ((unsigned int)rc != ring->ring_size) {
-               PMD_INIT_LOG(ERR, "Failed to populate rx ring !\n");
+       bufs_num = ring->ring_size - 1;
+       rc = ena_populate_rx_queue(ring, bufs_num);
+       if (rc != bufs_num) {
+               PMD_INIT_LOG(ERR, "Failed to populate rx ring !");
                return (-1);
        }
 
@@ -1132,7 +1133,7 @@ static int ena_populate_rx_queue(struct ena_ring *rxq, unsigned int count)
                return 0;
 
        in_use = rxq->next_to_use - rxq->next_to_clean;
-       ena_assert_msg(((in_use + count) <= ring_size), "bad ring state");
+       ena_assert_msg(((in_use + count) < ring_size), "bad ring state");
 
        count = RTE_MIN(count,
                        (uint16_t)(ring_size - (next_to_use & ring_mask)));
@@ -1160,6 +1161,8 @@ static int ena_populate_rx_queue(struct ena_ring *rxq, unsigned int count)
                rc = ena_com_add_single_rx_desc(rxq->ena_com_io_sq,
                                                &ebuf, next_to_use_masked);
                if (unlikely(rc)) {
+                       rte_mempool_put_bulk(rxq->mb_pool, (void **)(&mbuf),
+                                            count - i);
                        RTE_LOG(WARNING, PMD, "failed adding rx desc\n");
                        break;
                }
@@ -1556,12 +1559,13 @@ static uint16_t eth_ena_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
                recv_idx++;
        }
 
+       rx_ring->next_to_clean = next_to_clean;
+
+       desc_in_use = desc_in_use - completed + 1;
        /* Burst refill to save doorbells, memory barriers, const interval */
        if (ring_size - desc_in_use > ENA_RING_DESCS_RATIO(ring_size))
                ena_populate_rx_queue(rx_ring, ring_size - desc_in_use);
 
-       rx_ring->next_to_clean = next_to_clean;
-
        return recv_idx;
 }