replace zero-length arrays with flexible ones
[dpdk.git] / app / test / test_dmadev.c
index b206db2..a7651a4 100644 (file)
@@ -177,6 +177,7 @@ do_multi_copies(int16_t dev_id, uint16_t vchan,
 static int
 test_enqueue_copies(int16_t dev_id, uint16_t vchan)
 {
+       enum rte_dma_status_code status;
        unsigned int i;
        uint16_t id;
 
@@ -215,6 +216,20 @@ test_enqueue_copies(int16_t dev_id, uint16_t vchan)
                        ERR_RETURN("Error:incorrect job id received, %u [expected %u]\n",
                                        id, id_count);
 
+               /* check for completed and id when no job done */
+               if (rte_dma_completed(dev_id, vchan, 1, &id, NULL) != 0)
+                       ERR_RETURN("Error with rte_dma_completed when no job done\n");
+               if (id != id_count)
+                       ERR_RETURN("Error:incorrect job id received when no job done, %u [expected %u]\n",
+                                       id, id_count);
+
+               /* check for completed_status and id when no job done */
+               if (rte_dma_completed_status(dev_id, vchan, 1, &id, &status) != 0)
+                       ERR_RETURN("Error with rte_dma_completed_status when no job done\n");
+               if (id != id_count)
+                       ERR_RETURN("Error:incorrect job id received when no job done, %u [expected %u]\n",
+                                       id, id_count);
+
                rte_pktmbuf_free(src);
                rte_pktmbuf_free(dst);
 
@@ -686,10 +701,11 @@ test_burst_capacity(int16_t dev_id, uint16_t vchan)
        /* to test capacity, we enqueue elements and check capacity is reduced
         * by one each time - rebaselining the expected value after each burst
         * as the capacity is only for a burst. We enqueue multiple bursts to
-        * fill up half the ring, before emptying it again. We do this twice to
-        * ensure that we get to test scenarios where we get ring wrap-around
+        * fill up half the ring, before emptying it again. We do this multiple
+        * times to ensure that we get to test scenarios where we get ring
+        * wrap-around and wrap-around of the ids returned (at UINT16_MAX).
         */
-       for (iter = 0; iter < 2; iter++) {
+       for (iter = 0; iter < 2 * (((int)UINT16_MAX + 1) / ring_space); iter++) {
                for (i = 0; i < (ring_space / (2 * CAP_TEST_BURST_SIZE)) + 1; i++) {
                        cap = rte_dma_burst_capacity(dev_id, vchan);
 
@@ -774,6 +790,9 @@ test_dmadev_instance(int16_t dev_id)
        if (rte_dma_stats_get(dev_id, vchan, &stats) != 0)
                ERR_RETURN("Error with rte_dma_stats_get()\n");
 
+       if (rte_dma_burst_capacity(dev_id, vchan) < 32)
+               ERR_RETURN("Error: Device does not have sufficient burst capacity to run tests");
+
        if (stats.completed != 0 || stats.submitted != 0 || stats.errors != 0)
                ERR_RETURN("Error device stats are not all zero: completed = %"PRIu64", "
                                "submitted = %"PRIu64", errors = %"PRIu64"\n",
@@ -795,7 +814,10 @@ test_dmadev_instance(int16_t dev_id)
                goto err;
 
        /* run some burst capacity tests */
-       if (runtest("burst capacity", test_burst_capacity, 1, dev_id, vchan, CHECK_ERRS) < 0)
+       if (rte_dma_burst_capacity(dev_id, vchan) < 64)
+               printf("DMA Dev %u: insufficient burst capacity (64 required), skipping tests\n",
+                               dev_id);
+       else if (runtest("burst capacity", test_burst_capacity, 1, dev_id, vchan, CHECK_ERRS) < 0)
                goto err;
 
        /* to test error handling we can provide null pointers for source or dest in copies. This