net/mlx5: drop useless support for several Verbs ports
[dpdk.git] / drivers / net / mlx5 / mlx5_ethdev.c
index 982d821..819f5ba 100644 (file)
@@ -34,6 +34,7 @@
 #include <rte_interrupts.h>
 #include <rte_malloc.h>
 #include <rte_string_fns.h>
+#include <rte_rwlock.h>
 
 #include "mlx5.h"
 #include "mlx5_glue.h"
@@ -165,7 +166,7 @@ try_dev_id:
                if (dev_port == dev_port_prev)
                        goto try_dev_id;
                dev_port_prev = dev_port;
-               if (dev_port == (priv->port - 1u))
+               if (dev_port == 0)
                        strlcpy(match, name, sizeof(match));
        }
        closedir(dir);
@@ -177,6 +178,33 @@ try_dev_id:
        return 0;
 }
 
+/**
+ * Get the interface index from device name.
+ *
+ * @param[in] dev
+ *   Pointer to Ethernet device.
+ *
+ * @return
+ *   Interface index on success, a negative errno value otherwise and
+ *   rte_errno is set.
+ */
+int
+mlx5_ifindex(const struct rte_eth_dev *dev)
+{
+       char ifname[IF_NAMESIZE];
+       unsigned int ret;
+
+       ret = mlx5_get_ifname(dev, &ifname);
+       if (ret)
+               return ret;
+       ret = if_nametoindex(ifname);
+       if (ret == 0) {
+               rte_errno = errno;
+               return -rte_errno;
+       }
+       return ret;
+}
+
 /**
  * Perform ifreq ioctl() on associated Ethernet device.
  *
@@ -303,30 +331,8 @@ mlx5_dev_configure(struct rte_eth_dev *dev)
        unsigned int reta_idx_n;
        const uint8_t use_app_rss_key =
                !!dev->data->dev_conf.rx_adv_conf.rss_conf.rss_key;
-       uint64_t supp_tx_offloads = mlx5_get_tx_port_offloads(dev);
-       uint64_t tx_offloads = dev->data->dev_conf.txmode.offloads;
-       uint64_t supp_rx_offloads =
-               (mlx5_get_rx_port_offloads() |
-                mlx5_get_rx_queue_offloads(dev));
-       uint64_t rx_offloads = dev->data->dev_conf.rxmode.offloads;
        int ret = 0;
 
-       if ((tx_offloads & supp_tx_offloads) != tx_offloads) {
-               DRV_LOG(ERR,
-                       "port %u some Tx offloads are not supported requested"
-                       " 0x%" PRIx64 " supported 0x%" PRIx64,
-                       dev->data->port_id, tx_offloads, supp_tx_offloads);
-               rte_errno = ENOTSUP;
-               return -rte_errno;
-       }
-       if ((rx_offloads & supp_rx_offloads) != rx_offloads) {
-               DRV_LOG(ERR,
-                       "port %u some Rx offloads are not supported requested"
-                       " 0x%" PRIx64 " supported 0x%" PRIx64,
-                       dev->data->port_id, rx_offloads, supp_rx_offloads);
-               rte_errno = ENOTSUP;
-               return -rte_errno;
-       }
        if (use_app_rss_key &&
            (dev->data->dev_conf.rx_adv_conf.rss_conf.rss_key_len !=
             rss_hash_default_key_len)) {
@@ -389,6 +395,45 @@ mlx5_dev_configure(struct rte_eth_dev *dev)
        return 0;
 }
 
+/**
+ * Sets default tuning parameters.
+ *
+ * @param dev
+ *   Pointer to Ethernet device.
+ * @param[out] info
+ *   Info structure output buffer.
+ */
+static void
+mlx5_set_default_params(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
+{
+       struct priv *priv = dev->data->dev_private;
+
+       /* Minimum CPU utilization. */
+       info->default_rxportconf.ring_size = 256;
+       info->default_txportconf.ring_size = 256;
+       info->default_rxportconf.burst_size = 64;
+       info->default_txportconf.burst_size = 64;
+       if (priv->link_speed_capa & ETH_LINK_SPEED_100G) {
+               info->default_rxportconf.nb_queues = 16;
+               info->default_txportconf.nb_queues = 16;
+               if (dev->data->nb_rx_queues > 2 ||
+                   dev->data->nb_tx_queues > 2) {
+                       /* Max Throughput. */
+                       info->default_rxportconf.ring_size = 2048;
+                       info->default_txportconf.ring_size = 2048;
+               }
+       } else {
+               info->default_rxportconf.nb_queues = 8;
+               info->default_txportconf.nb_queues = 8;
+               if (dev->data->nb_rx_queues > 2 ||
+                   dev->data->nb_tx_queues > 2) {
+                       /* Max Throughput. */
+                       info->default_rxportconf.ring_size = 4096;
+                       info->default_txportconf.ring_size = 4096;
+               }
+       }
+}
+
 /**
  * DPDK callback to get information about the device.
  *
@@ -405,7 +450,6 @@ mlx5_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
        unsigned int max;
        char ifname[IF_NAMESIZE];
 
-       info->pci_dev = RTE_ETH_DEV_TO_PCI(dev);
        /* FIXME: we should ask the device for these values. */
        info->min_rx_bufsize = 32;
        info->max_rx_pktlen = 65536;
@@ -420,7 +464,7 @@ mlx5_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
                max = 65535;
        info->max_rx_queues = max;
        info->max_tx_queues = max;
-       info->max_mac_addrs = RTE_DIM(priv->mac);
+       info->max_mac_addrs = MLX5_MAX_UC_MAC_ADDRESSES;
        info->rx_queue_offload_capa = mlx5_get_rx_queue_offloads(dev);
        info->rx_offload_capa = (mlx5_get_rx_port_offloads() |
                                 info->rx_queue_offload_capa);
@@ -432,6 +476,7 @@ mlx5_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
        info->hash_key_size = rss_hash_default_key_len;
        info->speed_capa = priv->link_speed_capa;
        info->flow_type_rss_offloads = ~MLX5_RSS_HF_MASK;
+       mlx5_set_default_params(dev, info);
 }
 
 /**
@@ -465,6 +510,7 @@ mlx5_dev_supported_ptypes_get(struct rte_eth_dev *dev)
        };
 
        if (dev->rx_pkt_burst == mlx5_rx_burst ||
+           dev->rx_pkt_burst == mlx5_rx_burst_mprq ||
            dev->rx_pkt_burst == mlx5_rx_burst_vec)
                return ptypes;
        return NULL;
@@ -513,7 +559,7 @@ mlx5_link_update_unlocked_gset(struct rte_eth_dev *dev,
        }
        link_speed = ethtool_cmd_speed(&edata);
        if (link_speed == -1)
-               dev_link.link_speed = 0;
+               dev_link.link_speed = ETH_SPEED_NUM_NONE;
        else
                dev_link.link_speed = link_speed;
        priv->link_speed_capa = 0;
@@ -671,9 +717,9 @@ mlx5_link_update(struct rte_eth_dev *dev, int wait_to_complete)
        time_t start_time = time(NULL);
 
        do {
-               ret = mlx5_link_update_unlocked_gset(dev, &dev_link);
+               ret = mlx5_link_update_unlocked_gs(dev, &dev_link);
                if (ret)
-                       ret = mlx5_link_update_unlocked_gs(dev, &dev_link);
+                       ret = mlx5_link_update_unlocked_gset(dev, &dev_link);
                if (ret == 0)
                        break;
                /* Handle wait to complete situation. */
@@ -1063,12 +1109,17 @@ mlx5_select_tx_function(struct rte_eth_dev *dev)
        uint64_t tx_offloads = dev->data->dev_conf.txmode.offloads;
        int tso = !!(tx_offloads & (DEV_TX_OFFLOAD_TCP_TSO |
                                    DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
-                                   DEV_TX_OFFLOAD_GRE_TNL_TSO));
+                                   DEV_TX_OFFLOAD_GRE_TNL_TSO |
+                                   DEV_TX_OFFLOAD_IP_TNL_TSO |
+                                   DEV_TX_OFFLOAD_UDP_TNL_TSO));
+       int swp = !!(tx_offloads & (DEV_TX_OFFLOAD_IP_TNL_TSO |
+                                   DEV_TX_OFFLOAD_UDP_TNL_TSO |
+                                   DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM));
        int vlan_insert = !!(tx_offloads & DEV_TX_OFFLOAD_VLAN_INSERT);
 
        assert(priv != NULL);
        /* Select appropriate TX function. */
-       if (vlan_insert || tso)
+       if (vlan_insert || tso || swp)
                return tx_pkt_burst;
        if (config->mps == MLX5_MPW_ENHANCED) {
                if (mlx5_check_vec_tx_support(dev) > 0) {
@@ -1117,6 +1168,8 @@ mlx5_select_rx_function(struct rte_eth_dev *dev)
                rx_pkt_burst = mlx5_rx_burst_vec;
                DRV_LOG(DEBUG, "port %u selected Rx vectorized function",
                        dev->data->port_id);
+       } else if (mlx5_mprq_enabled(dev)) {
+               rx_pkt_burst = mlx5_rx_burst_mprq;
        }
        return rx_pkt_burst;
 }