crypto/dpaa2_sec: add check for session validity
[dpdk.git] / lib / librte_ethdev / rte_ethdev.c
index 56875bb..7743205 100644 (file)
@@ -37,8 +37,8 @@
 #include <rte_string_fns.h>
 #include <rte_kvargs.h>
 #include <rte_class.h>
+#include <rte_ether.h>
 
-#include "rte_ether.h"
 #include "rte_ethdev.h"
 #include "rte_ethdev_driver.h"
 #include "ethdev_profile.h"
@@ -166,6 +166,25 @@ static const struct {
 
 #undef RTE_TX_OFFLOAD_BIT2STR
 
+static const struct {
+       uint64_t option;
+       const char *name;
+} rte_burst_option_names[] = {
+       { RTE_ETH_BURST_SCALAR, "Scalar" },
+       { RTE_ETH_BURST_VECTOR, "Vector" },
+
+       { RTE_ETH_BURST_ALTIVEC, "AltiVec" },
+       { RTE_ETH_BURST_NEON, "Neon" },
+       { RTE_ETH_BURST_SSE, "SSE" },
+       { RTE_ETH_BURST_AVX2, "AVX2" },
+       { RTE_ETH_BURST_AVX512, "AVX512" },
+
+       { RTE_ETH_BURST_SCATTERED, "Scattered" },
+       { RTE_ETH_BURST_BULK_ALLOC, "Bulk Alloc" },
+       { RTE_ETH_BURST_SIMPLE, "Simple" },
+       { RTE_ETH_BURST_PER_QUEUE, "Per Queue" },
+};
+
 /**
  * The user application callback description.
  *
@@ -687,10 +706,11 @@ rte_eth_dev_owner_unset(const uint16_t port_id, const uint64_t owner_id)
        return ret;
 }
 
-void
+int
 rte_eth_dev_owner_delete(const uint64_t owner_id)
 {
        uint16_t port_id;
+       int ret = 0;
 
        rte_eth_dev_shared_data_prepare();
 
@@ -708,9 +728,12 @@ rte_eth_dev_owner_delete(const uint64_t owner_id)
                RTE_ETHDEV_LOG(ERR,
                               "Invalid owner id=%016"PRIx64"\n",
                               owner_id);
+               ret = -EINVAL;
        }
 
        rte_spinlock_unlock(&rte_eth_dev_shared_data->ownership_lock);
+
+       return ret;
 }
 
 int
@@ -1265,6 +1288,9 @@ rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
                goto rollback;
        }
 
+       dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf =
+               rte_eth_rss_hf_refine(dev_conf->rx_adv_conf.rss_conf.rss_hf);
+
        /* Check that device supports requested rss hash functions. */
        if ((dev_info.flow_type_rss_offloads |
             dev_conf->rx_adv_conf.rss_conf.rss_hf) !=
@@ -1418,10 +1444,31 @@ rte_eth_dev_config_restore(struct rte_eth_dev *dev,
        }
 
        /* replay all multicast configuration */
-       if (rte_eth_allmulticast_get(port_id) == 1)
-               rte_eth_allmulticast_enable(port_id);
-       else if (rte_eth_allmulticast_get(port_id) == 0)
-               rte_eth_allmulticast_disable(port_id);
+       /*
+        * use callbacks directly since we don't need port_id check and
+        * would like to bypass the same value set
+        */
+       if (rte_eth_allmulticast_get(port_id) == 1 &&
+           *dev->dev_ops->allmulticast_enable != NULL) {
+               ret = eth_err(port_id,
+                             (*dev->dev_ops->allmulticast_enable)(dev));
+               if (ret != 0 && ret != -ENOTSUP) {
+                       RTE_ETHDEV_LOG(ERR,
+                               "Failed to enable allmulticast mode for device (port %u): %s\n",
+                               port_id, rte_strerror(-ret));
+                       return ret;
+               }
+       } else if (rte_eth_allmulticast_get(port_id) == 0 &&
+                  *dev->dev_ops->allmulticast_disable != NULL) {
+               ret = eth_err(port_id,
+                             (*dev->dev_ops->allmulticast_disable)(dev));
+               if (ret != 0 && ret != -ENOTSUP) {
+                       RTE_ETHDEV_LOG(ERR,
+                               "Failed to disable allmulticast mode for device (port %u): %s\n",
+                               port_id, rte_strerror(-ret));
+                       return ret;
+               }
+       }
 
        return 0;
 }
@@ -1905,12 +1952,13 @@ rte_eth_promiscuous_enable(uint16_t port_id)
        RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
        dev = &rte_eth_devices[port_id];
 
+       if (dev->data->promiscuous == 1)
+               return 0;
+
        RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->promiscuous_enable, -ENOTSUP);
 
-       if (dev->data->promiscuous == 0) {
-               diag = (*dev->dev_ops->promiscuous_enable)(dev);
-               dev->data->promiscuous = (diag == 0) ? 1 : 0;
-       }
+       diag = (*dev->dev_ops->promiscuous_enable)(dev);
+       dev->data->promiscuous = (diag == 0) ? 1 : 0;
 
        return eth_err(port_id, diag);
 }
@@ -1924,14 +1972,15 @@ rte_eth_promiscuous_disable(uint16_t port_id)
        RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
        dev = &rte_eth_devices[port_id];
 
+       if (dev->data->promiscuous == 0)
+               return 0;
+
        RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->promiscuous_disable, -ENOTSUP);
 
-       if (dev->data->promiscuous == 1) {
-               dev->data->promiscuous = 0;
-               diag = (*dev->dev_ops->promiscuous_disable)(dev);
-               if (diag != 0)
-                       dev->data->promiscuous = 1;
-       }
+       dev->data->promiscuous = 0;
+       diag = (*dev->dev_ops->promiscuous_disable)(dev);
+       if (diag != 0)
+               dev->data->promiscuous = 1;
 
        return eth_err(port_id, diag);
 }
@@ -1947,30 +1996,44 @@ rte_eth_promiscuous_get(uint16_t port_id)
        return dev->data->promiscuous;
 }
 
-void
+int
 rte_eth_allmulticast_enable(uint16_t port_id)
 {
        struct rte_eth_dev *dev;
+       int diag;
 
-       RTE_ETH_VALID_PORTID_OR_RET(port_id);
+       RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
        dev = &rte_eth_devices[port_id];
 
-       RTE_FUNC_PTR_OR_RET(*dev->dev_ops->allmulticast_enable);
-       (*dev->dev_ops->allmulticast_enable)(dev);
-       dev->data->all_multicast = 1;
+       if (dev->data->all_multicast == 1)
+               return 0;
+
+       RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->allmulticast_enable, -ENOTSUP);
+       diag = (*dev->dev_ops->allmulticast_enable)(dev);
+       dev->data->all_multicast = (diag == 0) ? 1 : 0;
+
+       return eth_err(port_id, diag);
 }
 
-void
+int
 rte_eth_allmulticast_disable(uint16_t port_id)
 {
        struct rte_eth_dev *dev;
+       int diag;
 
-       RTE_ETH_VALID_PORTID_OR_RET(port_id);
+       RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
        dev = &rte_eth_devices[port_id];
 
-       RTE_FUNC_PTR_OR_RET(*dev->dev_ops->allmulticast_disable);
+       if (dev->data->all_multicast == 0)
+               return 0;
+
+       RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->allmulticast_disable, -ENOTSUP);
        dev->data->all_multicast = 0;
-       (*dev->dev_ops->allmulticast_disable)(dev);
+       diag = (*dev->dev_ops->allmulticast_disable)(dev);
+       if (diag != 0)
+               dev->data->all_multicast = 1;
+
+       return eth_err(port_id, diag);
 }
 
 int
@@ -2897,7 +2960,7 @@ rte_eth_dev_get_vlan_offload(uint16_t port_id)
                ret |= ETH_VLAN_EXTEND_OFFLOAD;
 
        if (*dev_offloads & DEV_RX_OFFLOAD_QINQ_STRIP)
-               ret |= DEV_RX_OFFLOAD_QINQ_STRIP;
+               ret |= ETH_QINQ_STRIP_OFFLOAD;
 
        return ret;
 }
@@ -3073,6 +3136,8 @@ rte_eth_dev_rss_hash_update(uint16_t port_id,
        if (ret != 0)
                return ret;
 
+       rss_conf->rss_hf = rte_eth_rss_hf_refine(rss_conf->rss_hf);
+
        dev = &rte_eth_devices[port_id];
        if ((dev_info.flow_type_rss_offloads | rss_conf->rss_hf) !=
            dev_info.flow_type_rss_offloads) {
@@ -4171,6 +4236,70 @@ rte_eth_tx_queue_info_get(uint16_t port_id, uint16_t queue_id,
        return 0;
 }
 
+int
+rte_eth_rx_burst_mode_get(uint16_t port_id, uint16_t queue_id,
+                         struct rte_eth_burst_mode *mode)
+{
+       struct rte_eth_dev *dev;
+
+       RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
+
+       if (mode == NULL)
+               return -EINVAL;
+
+       dev = &rte_eth_devices[port_id];
+
+       if (queue_id >= dev->data->nb_rx_queues) {
+               RTE_ETHDEV_LOG(ERR, "Invalid RX queue_id=%u\n", queue_id);
+               return -EINVAL;
+       }
+
+       RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_burst_mode_get, -ENOTSUP);
+       memset(mode, 0, sizeof(*mode));
+       return eth_err(port_id,
+                      dev->dev_ops->rx_burst_mode_get(dev, queue_id, mode));
+}
+
+int
+rte_eth_tx_burst_mode_get(uint16_t port_id, uint16_t queue_id,
+                         struct rte_eth_burst_mode *mode)
+{
+       struct rte_eth_dev *dev;
+
+       RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
+
+       if (mode == NULL)
+               return -EINVAL;
+
+       dev = &rte_eth_devices[port_id];
+
+       if (queue_id >= dev->data->nb_tx_queues) {
+               RTE_ETHDEV_LOG(ERR, "Invalid TX queue_id=%u\n", queue_id);
+               return -EINVAL;
+       }
+
+       RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->tx_burst_mode_get, -ENOTSUP);
+       memset(mode, 0, sizeof(*mode));
+       return eth_err(port_id,
+                      dev->dev_ops->tx_burst_mode_get(dev, queue_id, mode));
+}
+
+const char *
+rte_eth_burst_mode_option_name(uint64_t option)
+{
+       const char *name = "";
+       unsigned int i;
+
+       for (i = 0; i < RTE_DIM(rte_burst_option_names); ++i) {
+               if (option == rte_burst_option_names[i].option) {
+                       name = rte_burst_option_names[i].name;
+                       break;
+               }
+       }
+
+       return name;
+}
+
 int
 rte_eth_dev_set_mc_addr_list(uint16_t port_id,
                             struct rte_ether_addr *mc_addr_set,