IB/mlx5: Support creation of a WQ with scatter FCS offload
authorNoa Osherovich <noaos@mellanox.com>
Wed, 18 Jan 2017 13:40:04 +0000 (15:40 +0200)
committerDoug Ledford <dledford@redhat.com>
Tue, 14 Feb 2017 16:41:15 +0000 (11:41 -0500)
Add support for creation of a WQ with scatter FCS capability, if
this capability is supported by the hardware.

Signed-off-by: Noa Osherovich <noaos@mellanox.com>
Reviewed-by: Majd Dibbiny <majd@mellanox.com>
Reviewed-by: Yishai Hadas <yishaih@mellanox.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/mlx5/qp.c

index 0b2b17d..fbfff12 100644 (file)
@@ -4604,6 +4604,7 @@ static int  create_rq(struct mlx5_ib_rwq *rwq, struct ib_pd *pd,
                      struct ib_wq_init_attr *init_attr)
 {
        struct mlx5_ib_dev *dev;
+       int has_net_offloads;
        __be64 *rq_pas0;
        void *in;
        void *rqc;
@@ -4635,9 +4636,9 @@ static int  create_rq(struct mlx5_ib_rwq *rwq, struct ib_pd *pd,
        MLX5_SET(wq, wq, log_wq_pg_sz, rwq->log_page_size);
        MLX5_SET(wq, wq, wq_signature, rwq->wq_sig);
        MLX5_SET64(wq, wq, dbr_addr, rwq->db.dma);
+       has_net_offloads = MLX5_CAP_GEN(dev->mdev, eth_net_offloads);
        if (init_attr->create_flags & IB_WQ_FLAGS_CVLAN_STRIPPING) {
-               if (!(MLX5_CAP_GEN(dev->mdev, eth_net_offloads) &&
-                     MLX5_CAP_ETH(dev->mdev, vlan_cap))) {
+               if (!(has_net_offloads && MLX5_CAP_ETH(dev->mdev, vlan_cap))) {
                        mlx5_ib_dbg(dev, "VLAN offloads are not supported\n");
                        err = -EOPNOTSUPP;
                        goto out;
@@ -4645,6 +4646,14 @@ static int  create_rq(struct mlx5_ib_rwq *rwq, struct ib_pd *pd,
        } else {
                MLX5_SET(rqc, rqc, vsd, 1);
        }
+       if (init_attr->create_flags & IB_WQ_FLAGS_SCATTER_FCS) {
+               if (!(has_net_offloads && MLX5_CAP_ETH(dev->mdev, scatter_fcs))) {
+                       mlx5_ib_dbg(dev, "Scatter FCS is not supported\n");
+                       err = -EOPNOTSUPP;
+                       goto out;
+               }
+               MLX5_SET(rqc, rqc, scatter_fcs, 1);
+       }
        rq_pas0 = (__be64 *)MLX5_ADDR_OF(wq, wq, pas);
        mlx5_ib_populate_pas(dev, rwq->umem, rwq->page_shift, rq_pas0, 0);
        err = mlx5_core_create_rq_tracked(dev->mdev, in, inlen, &rwq->core_qp);