app/crypto-perf: support lookaside IPsec
[dpdk.git] / lib / ethdev / rte_ethdev.c
index c607eab..028907b 100644 (file)
@@ -214,7 +214,6 @@ rte_eth_iterator_init(struct rte_dev_iterator *iter, const char *devargs_str)
         *   - 0000:08:00.0,representor=[1-3]
         *   - pci:0000:06:00.0,representor=[0,5]
         *   - class=eth,mac=00:11:22:33:44:55
-        * A new syntax is in development (not yet supported):
         *   - bus=X,paramX=x/class=Y,paramY=y/driver=Z,paramZ=z
         */
 
@@ -890,6 +889,32 @@ eth_err(uint16_t port_id, int ret)
        return ret;
 }
 
+static void
+eth_dev_rxq_release(struct rte_eth_dev *dev, uint16_t qid)
+{
+       void **rxq = dev->data->rx_queues;
+
+       if (rxq[qid] == NULL)
+               return;
+
+       if (dev->dev_ops->rx_queue_release != NULL)
+               (*dev->dev_ops->rx_queue_release)(dev, qid);
+       rxq[qid] = NULL;
+}
+
+static void
+eth_dev_txq_release(struct rte_eth_dev *dev, uint16_t qid)
+{
+       void **txq = dev->data->tx_queues;
+
+       if (txq[qid] == NULL)
+               return;
+
+       if (dev->dev_ops->tx_queue_release != NULL)
+               (*dev->dev_ops->tx_queue_release)(dev, qid);
+       txq[qid] = NULL;
+}
+
 static int
 eth_dev_rx_queue_config(struct rte_eth_dev *dev, uint16_t nb_queues)
 {
@@ -906,12 +931,10 @@ eth_dev_rx_queue_config(struct rte_eth_dev *dev, uint16_t nb_queues)
                        return -(ENOMEM);
                }
        } else if (dev->data->rx_queues != NULL && nb_queues != 0) { /* re-configure */
-               RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_release, -ENOTSUP);
+               for (i = nb_queues; i < old_nb_queues; i++)
+                       eth_dev_rxq_release(dev, i);
 
                rxq = dev->data->rx_queues;
-
-               for (i = nb_queues; i < old_nb_queues; i++)
-                       (*dev->dev_ops->rx_queue_release)(rxq[i]);
                rxq = rte_realloc(rxq, sizeof(rxq[0]) * nb_queues,
                                RTE_CACHE_LINE_SIZE);
                if (rxq == NULL)
@@ -926,12 +949,8 @@ eth_dev_rx_queue_config(struct rte_eth_dev *dev, uint16_t nb_queues)
                dev->data->rx_queues = rxq;
 
        } else if (dev->data->rx_queues != NULL && nb_queues == 0) {
-               RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_release, -ENOTSUP);
-
-               rxq = dev->data->rx_queues;
-
                for (i = nb_queues; i < old_nb_queues; i++)
-                       (*dev->dev_ops->rx_queue_release)(rxq[i]);
+                       eth_dev_rxq_release(dev, i);
 
                rte_free(dev->data->rx_queues);
                dev->data->rx_queues = NULL;
@@ -1146,12 +1165,10 @@ eth_dev_tx_queue_config(struct rte_eth_dev *dev, uint16_t nb_queues)
                        return -(ENOMEM);
                }
        } else if (dev->data->tx_queues != NULL && nb_queues != 0) { /* re-configure */
-               RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->tx_queue_release, -ENOTSUP);
+               for (i = nb_queues; i < old_nb_queues; i++)
+                       eth_dev_txq_release(dev, i);
 
                txq = dev->data->tx_queues;
-
-               for (i = nb_queues; i < old_nb_queues; i++)
-                       (*dev->dev_ops->tx_queue_release)(txq[i]);
                txq = rte_realloc(txq, sizeof(txq[0]) * nb_queues,
                                  RTE_CACHE_LINE_SIZE);
                if (txq == NULL)
@@ -1166,12 +1183,8 @@ eth_dev_tx_queue_config(struct rte_eth_dev *dev, uint16_t nb_queues)
                dev->data->tx_queues = txq;
 
        } else if (dev->data->tx_queues != NULL && nb_queues == 0) {
-               RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->tx_queue_release, -ENOTSUP);
-
-               txq = dev->data->tx_queues;
-
                for (i = nb_queues; i < old_nb_queues; i++)
-                       (*dev->dev_ops->tx_queue_release)(txq[i]);
+                       eth_dev_txq_release(dev, i);
 
                rte_free(dev->data->tx_queues);
                dev->data->tx_queues = NULL;
@@ -1356,6 +1369,13 @@ rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
                return -EBUSY;
        }
 
+       /*
+        * Ensure that "dev_configured" is always 0 each time prepare to do
+        * dev_configure() to avoid any non-anticipated behaviour.
+        * And set to 1 when dev_configure() is executed successfully.
+        */
+       dev->data->dev_configured = 0;
+
         /* Store original config, as rollback required on failure */
        memcpy(&orig_conf, &dev->data->dev_conf, sizeof(dev->data->dev_conf));
 
@@ -1605,6 +1625,7 @@ rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
                goto reset_queues;
        }
 
+       dev->data->dev_configured = 1;
        rte_ethdev_trace_configure(port_id, nb_rx_q, nb_tx_q, dev_conf, 0);
        return 0;
 reset_queues:
@@ -1751,6 +1772,13 @@ rte_eth_dev_start(uint16_t port_id)
 
        RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_start, -ENOTSUP);
 
+       if (dev->data->dev_configured == 0) {
+               RTE_ETHDEV_LOG(INFO,
+                       "Device with port_id=%"PRIu16" is not configured.\n",
+                       port_id);
+               return -EINVAL;
+       }
+
        if (dev->data->dev_started != 0) {
                RTE_ETHDEV_LOG(INFO,
                        "Device with port_id=%"PRIu16" already started\n",
@@ -1992,7 +2020,6 @@ rte_eth_rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
        struct rte_eth_dev *dev;
        struct rte_eth_dev_info dev_info;
        struct rte_eth_rxconf local_conf;
-       void **rxq;
 
        RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
        dev = &rte_eth_devices[port_id];
@@ -2096,13 +2123,7 @@ rte_eth_rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
                        RTE_ETH_QUEUE_STATE_STOPPED))
                return -EBUSY;
 
-       rxq = dev->data->rx_queues;
-       if (rxq[rx_queue_id]) {
-               RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_release,
-                                       -ENOTSUP);
-               (*dev->dev_ops->rx_queue_release)(rxq[rx_queue_id]);
-               rxq[rx_queue_id] = NULL;
-       }
+       eth_dev_rxq_release(dev, rx_queue_id);
 
        if (rx_conf == NULL)
                rx_conf = &dev_info.default_rxconf;
@@ -2175,7 +2196,6 @@ rte_eth_rx_hairpin_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
        int ret;
        struct rte_eth_dev *dev;
        struct rte_eth_hairpin_cap cap;
-       void **rxq;
        int i;
        int count;
 
@@ -2232,13 +2252,7 @@ rte_eth_rx_hairpin_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
        }
        if (dev->data->dev_started)
                return -EBUSY;
-       rxq = dev->data->rx_queues;
-       if (rxq[rx_queue_id] != NULL) {
-               RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_queue_release,
-                                       -ENOTSUP);
-               (*dev->dev_ops->rx_queue_release)(rxq[rx_queue_id]);
-               rxq[rx_queue_id] = NULL;
-       }
+       eth_dev_rxq_release(dev, rx_queue_id);
        ret = (*dev->dev_ops->rx_hairpin_queue_setup)(dev, rx_queue_id,
                                                      nb_rx_desc, conf);
        if (ret == 0)
@@ -2255,7 +2269,6 @@ rte_eth_tx_queue_setup(uint16_t port_id, uint16_t tx_queue_id,
        struct rte_eth_dev *dev;
        struct rte_eth_dev_info dev_info;
        struct rte_eth_txconf local_conf;
-       void **txq;
        int ret;
 
        RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
@@ -2300,13 +2313,7 @@ rte_eth_tx_queue_setup(uint16_t port_id, uint16_t tx_queue_id,
                        RTE_ETH_QUEUE_STATE_STOPPED))
                return -EBUSY;
 
-       txq = dev->data->tx_queues;
-       if (txq[tx_queue_id]) {
-               RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->tx_queue_release,
-                                       -ENOTSUP);
-               (*dev->dev_ops->tx_queue_release)(txq[tx_queue_id]);
-               txq[tx_queue_id] = NULL;
-       }
+       eth_dev_txq_release(dev, tx_queue_id);
 
        if (tx_conf == NULL)
                tx_conf = &dev_info.default_txconf;
@@ -2354,7 +2361,6 @@ rte_eth_tx_hairpin_queue_setup(uint16_t port_id, uint16_t tx_queue_id,
 {
        struct rte_eth_dev *dev;
        struct rte_eth_hairpin_cap cap;
-       void **txq;
        int i;
        int count;
        int ret;
@@ -2412,13 +2418,7 @@ rte_eth_tx_hairpin_queue_setup(uint16_t port_id, uint16_t tx_queue_id,
        }
        if (dev->data->dev_started)
                return -EBUSY;
-       txq = dev->data->tx_queues;
-       if (txq[tx_queue_id] != NULL) {
-               RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->tx_queue_release,
-                                       -ENOTSUP);
-               (*dev->dev_ops->tx_queue_release)(txq[tx_queue_id]);
-               txq[tx_queue_id] = NULL;
-       }
+       eth_dev_txq_release(dev, tx_queue_id);
        ret = (*dev->dev_ops->tx_hairpin_queue_setup)
                (dev, tx_queue_id, nb_tx_desc, conf);
        if (ret == 0)
@@ -2852,12 +2852,6 @@ eth_dev_get_xstats_count(uint16_t port_id)
 
        RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
        dev = &rte_eth_devices[port_id];
-       if (dev->dev_ops->xstats_get_names_by_id != NULL) {
-               count = (*dev->dev_ops->xstats_get_names_by_id)(dev, NULL,
-                               NULL, 0);
-               if (count < 0)
-                       return eth_err(port_id, count);
-       }
        if (dev->dev_ops->xstats_get_names != NULL) {
                count = (*dev->dev_ops->xstats_get_names)(dev, NULL, 0);
                if (count < 0)
@@ -3015,7 +3009,7 @@ rte_eth_xstats_get_names_by_id(uint16_t port_id,
 
                if (no_basic_stat_requested)
                        return (*dev->dev_ops->xstats_get_names_by_id)(dev,
-                                       xstats_names, ids_copy, size);
+                                       ids_copy, xstats_names, size);
        }
 
        /* Retrieve all stats */
@@ -4511,67 +4505,6 @@ int rte_eth_set_queue_rate_limit(uint16_t port_id, uint16_t queue_idx,
                                                        queue_idx, tx_rate));
 }
 
-int
-rte_eth_mirror_rule_set(uint16_t port_id,
-                       struct rte_eth_mirror_conf *mirror_conf,
-                       uint8_t rule_id, uint8_t on)
-{
-       struct rte_eth_dev *dev;
-
-       RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-       dev = &rte_eth_devices[port_id];
-
-       if (mirror_conf == NULL) {
-               RTE_ETHDEV_LOG(ERR,
-                       "Cannot set ethdev port %u mirror rule from NULL config\n",
-                       port_id);
-               return -EINVAL;
-       }
-
-       if (mirror_conf->rule_type == 0) {
-               RTE_ETHDEV_LOG(ERR, "Mirror rule type can not be 0\n");
-               return -EINVAL;
-       }
-
-       if (mirror_conf->dst_pool >= ETH_64_POOLS) {
-               RTE_ETHDEV_LOG(ERR, "Invalid dst pool, pool id must be 0-%d\n",
-                       ETH_64_POOLS - 1);
-               return -EINVAL;
-       }
-
-       if ((mirror_conf->rule_type & (ETH_MIRROR_VIRTUAL_POOL_UP |
-            ETH_MIRROR_VIRTUAL_POOL_DOWN)) &&
-           (mirror_conf->pool_mask == 0)) {
-               RTE_ETHDEV_LOG(ERR,
-                       "Invalid mirror pool, pool mask can not be 0\n");
-               return -EINVAL;
-       }
-
-       if ((mirror_conf->rule_type & ETH_MIRROR_VLAN) &&
-           mirror_conf->vlan.vlan_mask == 0) {
-               RTE_ETHDEV_LOG(ERR,
-                       "Invalid vlan mask, vlan mask can not be 0\n");
-               return -EINVAL;
-       }
-
-       RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->mirror_rule_set, -ENOTSUP);
-
-       return eth_err(port_id, (*dev->dev_ops->mirror_rule_set)(dev,
-                                               mirror_conf, rule_id, on));
-}
-
-int
-rte_eth_mirror_rule_reset(uint16_t port_id, uint8_t rule_id)
-{
-       struct rte_eth_dev *dev;
-
-       RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-       dev = &rte_eth_devices[port_id];
-
-       RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->mirror_rule_reset, -ENOTSUP);
-       return eth_err(port_id, (*dev->dev_ops->mirror_rule_reset)(dev, rule_id));
-}
-
 RTE_INIT(eth_dev_init_cb_lists)
 {
        uint16_t i;
@@ -5987,7 +5920,8 @@ rte_eth_representor_id_get(const struct rte_eth_dev *ethdev,
                           int controller, int pf, int representor_port,
                           uint16_t *repr_id)
 {
-       int ret, n, i, count;
+       int ret, n, count;
+       uint32_t i;
        struct rte_eth_representor_info *info = NULL;
        size_t size;
 
@@ -6011,6 +5945,7 @@ rte_eth_representor_id_get(const struct rte_eth_dev *ethdev,
        info = calloc(1, size);
        if (info == NULL)
                return -ENOMEM;
+       info->nb_ranges_alloc = n;
        ret = rte_eth_representor_info_get(ethdev->data->port_id, info);
        if (ret < 0)
                goto out;
@@ -6023,7 +5958,7 @@ rte_eth_representor_id_get(const struct rte_eth_dev *ethdev,
 
        /* Locate representor ID. */
        ret = -ENOENT;
-       for (i = 0; i < n; ++i) {
+       for (i = 0; i < info->nb_ranges; ++i) {
                if (info->ranges[i].type != type)
                        continue;
                if (info->ranges[i].controller != controller)