net/mlx5: fix probe failure report
[dpdk.git] / drivers / net / mlx5 / mlx5.c
index 757c910..d7968f5 100644 (file)
 #pragma GCC diagnostic error "-Wpedantic"
 #endif
 
-/* DPDK headers don't like -pedantic. */
-#ifdef PEDANTIC
-#pragma GCC diagnostic ignored "-Wpedantic"
-#endif
 #include <rte_malloc.h>
 #include <rte_ethdev.h>
 #include <rte_ethdev_pci.h>
 #include <rte_pci.h>
 #include <rte_common.h>
 #include <rte_kvargs.h>
-#ifdef PEDANTIC
-#pragma GCC diagnostic error "-Wpedantic"
-#endif
 
 #include "mlx5.h"
 #include "mlx5_utils.h"
 /* Device parameter to enable hardware TSO offload. */
 #define MLX5_TSO "tso"
 
+/* Device parameter to enable hardware Tx vector. */
+#define MLX5_TX_VEC_EN "tx_vec_en"
+
+/* Device parameter to enable hardware Rx vector. */
+#define MLX5_RX_VEC_EN "rx_vec_en"
+
 /* Default PMD specific parameter value. */
 #define MLX5_ARG_UNSET (-1)
 
@@ -105,6 +104,8 @@ struct mlx5_args {
        int mpw_hdr_dseg;
        int inline_max_packet_sz;
        int tso;
+       int tx_vec_en;
+       int rx_vec_en;
 };
 /**
  * Retrieve integer value from environment variable.
@@ -324,6 +325,10 @@ mlx5_args_check(const char *key, const char *val, void *opaque)
                args->inline_max_packet_sz = tmp;
        } else if (strcmp(MLX5_TSO, key) == 0) {
                args->tso = !!tmp;
+       } else if (strcmp(MLX5_TX_VEC_EN, key) == 0) {
+               args->tx_vec_en = !!tmp;
+       } else if (strcmp(MLX5_RX_VEC_EN, key) == 0) {
+               args->rx_vec_en = !!tmp;
        } else {
                WARN("%s: unknown parameter", key);
                return -EINVAL;
@@ -353,6 +358,8 @@ mlx5_args(struct mlx5_args *args, struct rte_devargs *devargs)
                MLX5_TXQ_MPW_HDR_DSEG_EN,
                MLX5_TXQ_MAX_INLINE_LEN,
                MLX5_TSO,
+               MLX5_TX_VEC_EN,
+               MLX5_RX_VEC_EN,
                NULL,
        };
        struct rte_kvargs *kvlist;
@@ -408,6 +415,10 @@ mlx5_args_assign(struct priv *priv, struct mlx5_args *args)
                priv->inline_max_packet_sz = args->inline_max_packet_sz;
        if (args->tso != MLX5_ARG_UNSET)
                priv->tso = args->tso;
+       if (args->tx_vec_en != MLX5_ARG_UNSET)
+               priv->tx_vec_en = args->tx_vec_en;
+       if (args->rx_vec_en != MLX5_ARG_UNSET)
+               priv->rx_vec_en = args->rx_vec_en;
 }
 
 /**
@@ -553,6 +564,8 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
                        .mpw_hdr_dseg = MLX5_ARG_UNSET,
                        .inline_max_packet_sz = MLX5_ARG_UNSET,
                        .tso = MLX5_ARG_UNSET,
+                       .tx_vec_en = MLX5_ARG_UNSET,
+                       .rx_vec_en = MLX5_ARG_UNSET,
                };
 
                exp_device_attr.comp_mask =
@@ -566,8 +579,10 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
                DEBUG("using port %u (%08" PRIx32 ")", port, test);
 
                ctx = ibv_open_device(ibv_dev);
-               if (ctx == NULL)
+               if (ctx == NULL) {
+                       err = ENODEV;
                        goto port_error;
+               }
 
                /* Check port status. */
                err = ibv_query_port(ctx, port, &port_attr);
@@ -579,6 +594,7 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
                if (port_attr.link_layer != IBV_LINK_LAYER_ETHERNET) {
                        ERROR("port %d is not configured in Ethernet mode",
                              port);
+                       err = EINVAL;
                        goto port_error;
                }
 
@@ -615,6 +631,9 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
                priv->mps = mps; /* Enable MPW by default if supported. */
                priv->cqe_comp = 1; /* Enable compression by default. */
                priv->tunnel_en = tunnel_en;
+               /* Enable vector by default if supported. */
+               priv->tx_vec_en = 1;
+               priv->rx_vec_en = 1;
                err = mlx5_args(&args, pci_dev->device.devargs);
                if (err) {
                        ERROR("failed to process device arguments: %s",
@@ -624,6 +643,7 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
                mlx5_args_assign(priv, &args);
                if (ibv_exp_query_device(ctx, &exp_device_attr)) {
                        ERROR("ibv_exp_query_device() failed");
+                       err = ENODEV;
                        goto port_error;
                }
 
@@ -712,6 +732,7 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
                if (priv_get_mac(priv, &mac.addr_bytes)) {
                        ERROR("cannot get MAC address, is mlx5_en loaded?"
                              " (errno: %s)", strerror(errno));
+                       err = ENODEV;
                        goto port_error;
                }
                INFO("port %u MAC address is %02x:%02x:%02x:%02x:%02x:%02x",
@@ -755,37 +776,8 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
                        err = ENOMEM;
                        goto port_error;
                }
-
-               /* Secondary processes have to use local storage for their
-                * private data as well as a copy of eth_dev->data, but this
-                * pointer must not be modified before burst functions are
-                * actually called. */
-               if (mlx5_is_secondary()) {
-                       struct mlx5_secondary_data *sd =
-                               &mlx5_secondary_data[eth_dev->data->port_id];
-                       sd->primary_priv = eth_dev->data->dev_private;
-                       if (sd->primary_priv == NULL) {
-                               ERROR("no private data for port %u",
-                                               eth_dev->data->port_id);
-                               err = EINVAL;
-                               goto port_error;
-                       }
-                       sd->shared_dev_data = eth_dev->data;
-                       rte_spinlock_init(&sd->lock);
-                       memcpy(sd->data.name, sd->shared_dev_data->name,
-                                  sizeof(sd->data.name));
-                       sd->data.dev_private = priv;
-                       sd->data.rx_mbuf_alloc_failed = 0;
-                       sd->data.mtu = ETHER_MTU;
-                       sd->data.port_id = sd->shared_dev_data->port_id;
-                       sd->data.mac_addrs = priv->mac;
-                       eth_dev->tx_pkt_burst = mlx5_tx_burst_secondary_setup;
-                       eth_dev->rx_pkt_burst = mlx5_rx_burst_secondary_setup;
-               } else {
-                       eth_dev->data->dev_private = priv;
-                       eth_dev->data->mac_addrs = priv->mac;
-               }
-
+               eth_dev->data->dev_private = priv;
+               eth_dev->data->mac_addrs = priv->mac;
                eth_dev->device = &pci_dev->device;
                rte_eth_copy_pci_info(eth_dev, pci_dev);
                eth_dev->data->dev_flags |= RTE_ETH_DEV_DETACHABLE;
@@ -897,6 +889,8 @@ rte_mlx5_pmd_init(void)
         * using this PMD, which is not supported in forked processes.
         */
        setenv("RDMAV_HUGEPAGES_SAFE", "1", 1);
+       /* Don't map UAR to WC if BlueFlame is not used.*/
+       setenv("MLX5_SHUT_UP_BF", "1", 1);
        ibv_fork_init();
        rte_pci_register(&mlx5_driver);
 }