net/mlx5: add flow translate function
[dpdk.git] / drivers / net / mlx5 / mlx5.c
index 78a6922..7493180 100644 (file)
@@ -46,6 +46,7 @@
 #include "mlx5_defs.h"
 #include "mlx5_glue.h"
 #include "mlx5_mr.h"
+#include "mlx5_flow.h"
 
 /* Device parameter to enable RX completion queue compression. */
 #define MLX5_RXQ_CQE_COMP_EN "rxq_cqe_comp_en"
@@ -399,6 +400,10 @@ const struct eth_dev_ops mlx5_dev_ops_isolate = {
        .dev_set_link_down = mlx5_set_link_down,
        .dev_set_link_up = mlx5_set_link_up,
        .dev_close = mlx5_dev_close,
+       .promiscuous_enable = mlx5_promiscuous_enable,
+       .promiscuous_disable = mlx5_promiscuous_disable,
+       .allmulticast_enable = mlx5_allmulticast_enable,
+       .allmulticast_disable = mlx5_allmulticast_disable,
        .link_update = mlx5_link_update,
        .stats_get = mlx5_stats_get,
        .stats_reset = mlx5_stats_reset,
@@ -473,7 +478,7 @@ mlx5_args_check(const char *key, const char *val, void *opaque)
        } else if (strcmp(MLX5_TXQS_MIN_INLINE, key) == 0) {
                config->txqs_inline = tmp;
        } else if (strcmp(MLX5_TXQ_MPW_EN, key) == 0) {
-               config->mps = !!tmp ? config->mps : 0;
+               config->mps = !!tmp;
        } else if (strcmp(MLX5_TXQ_MPW_HDR_DSEG_EN, key) == 0) {
                config->mpw_hdr_dseg = !!tmp;
        } else if (strcmp(MLX5_TXQ_MAX_INLINE_LEN, key) == 0) {
@@ -564,11 +569,13 @@ static struct rte_pci_driver mlx5_driver;
 static void *uar_base;
 
 static int
-find_lower_va_bound(const struct rte_memseg_list *msl __rte_unused,
+find_lower_va_bound(const struct rte_memseg_list *msl,
                const struct rte_memseg *ms, void *arg)
 {
        void **addr = arg;
 
+       if (msl->external)
+               return 0;
        if (*addr == NULL)
                *addr = ms->addr;
        else
@@ -698,6 +705,7 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
        struct mlx5dv_context dv_attr = { .comp_mask = 0 };
        struct mlx5_dev_config config = {
                .vf = !!vf,
+               .mps = MLX5_ARG_UNSET,
                .tx_vec_en = 1,
                .rx_vec_en = 1,
                .mpw_hdr_dseg = 0,
@@ -787,7 +795,6 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
                DRV_LOG(DEBUG, "MPW isn't supported");
                mps = MLX5_MPW_DISABLED;
        }
-       config.mps = mps;
 #ifdef HAVE_IBV_MLX5_MOD_SWP
        if (dv_attr.comp_mask & MLX5DV_CONTEXT_MASK_SWP)
                swp = dv_attr.sw_parsing_caps.sw_parsing_offloads;
@@ -948,8 +955,8 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
                rte_spinlock_init(&priv->uar_lock[i]);
 #endif
        /* Some internal functions rely on Netlink sockets, open them now. */
-       priv->nl_socket_rdma = mlx5_nl_init(0, NETLINK_RDMA);
-       priv->nl_socket_route = mlx5_nl_init(RTMGRP_LINK, NETLINK_ROUTE);
+       priv->nl_socket_rdma = mlx5_nl_init(NETLINK_RDMA);
+       priv->nl_socket_route = mlx5_nl_init(NETLINK_ROUTE);
        priv->nl_sn = 0;
        priv->representor = !!switch_info->representor;
        priv->domain_id = RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID;
@@ -1031,13 +1038,15 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
                       (1 << IBV_QPT_RAW_PACKET)));
        if (config.tso)
                config.tso_max_payload_sz = attr.tso_caps.max_tso;
-       if (config.mps && !mps) {
-               DRV_LOG(ERR,
-                       "multi-packet send not supported on this device"
-                       " (" MLX5_TXQ_MPW_EN ")");
-               err = ENOTSUP;
-               goto error;
-       }
+       /*
+        * MPW is disabled by default, while the Enhanced MPW is enabled
+        * by default.
+        */
+       if (config.mps == MLX5_ARG_UNSET)
+               config.mps = (mps == MLX5_MPW_ENHANCED) ? MLX5_MPW_ENHANCED :
+                                                         MLX5_MPW_DISABLED;
+       else
+               config.mps = config.mps ? mps : MLX5_MPW_DISABLED;
        DRV_LOG(INFO, "%sMPS is %s",
                config.mps == MLX5_MPW_ENHANCED ? "enhanced " : "",
                config.mps != MLX5_MPW_DISABLED ? "enabled" : "disabled");
@@ -1179,6 +1188,7 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
        if (err < 0)
                goto error;
        priv->config.flow_prio = err;
+       mlx5_flow_init_driver_ops(eth_dev);
        /*
         * Once the device is added to the list of memory event
         * callback, its global MR cache table cannot be expanded
@@ -1318,8 +1328,8 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
        ibv_match[n] = NULL;
 
        struct mlx5_dev_spawn_data list[n];
-       int nl_route = n ? mlx5_nl_init(0, NETLINK_ROUTE) : -1;
-       int nl_rdma = n ? mlx5_nl_init(0, NETLINK_RDMA) : -1;
+       int nl_route = n ? mlx5_nl_init(NETLINK_ROUTE) : -1;
+       int nl_rdma = n ? mlx5_nl_init(NETLINK_RDMA) : -1;
        unsigned int i;
        unsigned int u;
 
@@ -1330,7 +1340,8 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
         * Netlink calls assuming kernel drivers are recent enough to
         * support them.
         *
-        * In the event of identification failure through Netlink, either:
+        * In the event of identification failure through Netlink, try again
+        * through sysfs, then either:
         *
         * 1. No device matches (n == 0), complain and bail out.
         * 2. A single IB device matches (n == 1) and is not a representor,
@@ -1349,7 +1360,9 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
                if (nl_route < 0 ||
                    !list[i].ifindex ||
                    mlx5_nl_switch_info(nl_route, list[i].ifindex,
-                                       &list[i].info)) {
+                                       &list[i].info) ||
+                   ((!list[i].info.representor && !list[i].info.master) &&
+                    mlx5_sysfs_switch_info(list[i].ifindex, &list[i].info))) {
                        list[i].ifindex = 0;
                        memset(&list[i].info, 0, sizeof(list[i].info));
                        continue;
@@ -1479,6 +1492,10 @@ static const struct rte_pci_id mlx5_pci_id_map[] = {
                RTE_PCI_DEVICE(PCI_VENDOR_ID_MELLANOX,
                               PCI_DEVICE_ID_MELLANOX_CONNECTX5BF)
        },
+       {
+               RTE_PCI_DEVICE(PCI_VENDOR_ID_MELLANOX,
+                              PCI_DEVICE_ID_MELLANOX_CONNECTX5BFVF)
+       },
        {
                .vendor_id = 0
        }