app/testpmd: fix metering and policing command for RFC4115
[dpdk.git] / app / test / test_dmadev.c
index 1e327bd..2b097e0 100644 (file)
@@ -686,10 +686,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);
 
@@ -746,11 +747,15 @@ test_dmadev_instance(int16_t dev_id)
                        .nb_desc = TEST_RINGSIZE,
        };
        const int vchan = 0;
+       int ret;
+
+       ret = rte_dma_info_get(dev_id, &info);
+       if (ret != 0)
+               ERR_RETURN("Error with rte_dma_info_get()\n");
 
        printf("\n### Test dmadev instance %u [%s]\n",
-                       dev_id, rte_dma_devices[dev_id].data->dev_name);
+                       dev_id, info.dev_name);
 
-       rte_dma_info_get(dev_id, &info);
        if (info.max_vchans < 1)
                ERR_RETURN("Error, no channels available on device id %u\n", dev_id);
 
@@ -760,8 +765,8 @@ test_dmadev_instance(int16_t dev_id)
        if (rte_dma_vchan_setup(dev_id, vchan, &qconf) < 0)
                ERR_RETURN("Error with queue configuration\n");
 
-       rte_dma_info_get(dev_id, &info);
-       if (info.nb_vchans != 1)
+       ret = rte_dma_info_get(dev_id, &info);
+       if (ret != 0 || info.nb_vchans != 1)
                ERR_RETURN("Error, no configured queues reported on device id %u\n", dev_id);
 
        if (rte_dma_start(dev_id) != 0)
@@ -770,6 +775,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",
@@ -791,7 +799,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