]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
mlx4_core: Introduce restrictions for PD update
authorAjaykumar Hotchandani <ajaykumar.hotchandani@oracle.com>
Wed, 14 Oct 2015 23:38:11 +0000 (16:38 -0700)
committerMukesh Kacker <mukesh.kacker@oracle.com>
Wed, 21 Oct 2015 15:07:03 +0000 (08:07 -0700)
From 2.31.5350 firmware onwards,
- RDS with RDMA data transfer stopped working.
- Mellanox has introduced limitations related to PD updates.
  These imposed limitations are inline with PRM.

This patch makes driver in sync with these imposed limitations.
Mellanox R&D has approved this patch.

It's been tested on both old firmware (2.11.1280) and new firmware.

Mellanox case number is 179121.
OraBug: 22022389

v2: Change subject as per suggestion from Yuval

Tested-by: Pierre Orzechowski <pierre.e.orzechowski@oracle.com>
Tested-by: Kushagra Misra <kushagra.misra@oracle.com>
Signed-off-by: Ajaykumar Hotchandani <ajaykumar.hotchandani@oracle.com>
Signed-off-by: Qing Huang <qing.huang@oracle.com>
Reviewed-by: Yuval Shaia <yuval.shaia@oracle.com>
Signed-off-by: Mukesh Kacker <mukesh.kacker@oracle.com>
drivers/net/ethernet/mellanox/mlx4/mr.c

index 0e770fd753119359405d8895e445f1b71001bfc1..e6fb7e1c6a3b26e617a6956a423da22d255c8623 100644 (file)
@@ -1009,7 +1009,7 @@ EXPORT_SYMBOL_GPL(mlx4_set_fmr_pd);
 int mlx4_map_phys_fmr(struct mlx4_dev *dev, struct mlx4_fmr *fmr, u64 *page_list,
                      int npages, u64 iova, u32 *lkey, u32 *rkey)
 {
-       u32 key;
+       u32 key, pdflags;
        int i, err;
 
        err = mlx4_check_fmr(fmr, page_list, npages, iova);
@@ -1041,7 +1041,11 @@ int mlx4_map_phys_fmr(struct mlx4_dev *dev, struct mlx4_fmr *fmr, u64 *page_list
        fmr->mpt->length = cpu_to_be64(npages * (1ull << fmr->page_shift));
        fmr->mpt->start  = cpu_to_be64(iova);
 
-       fmr->mpt->pd_flags = cpu_to_be32(fmr->mr.pd | MLX4_MPT_PD_FLAG_EN_INV);
+       pdflags = be32_to_cpu(fmr->mpt->pd_flags) &  ~MLX4_MPT_PD_MASK;
+       if (mlx4_is_mfunc(dev))
+               pdflags &= ~MLX4_MPT_PD_VF_MASK;
+       fmr->mpt->pd_flags = cpu_to_be32(pdflags | fmr->mr.pd |
+                       MLX4_MPT_PD_FLAG_EN_INV);
        if (fmr->mr.mtt.order >= 0 && fmr->mr.mtt.page_shift == 0) {
                fmr->mpt->pd_flags |= cpu_to_be32(MLX4_MPT_PD_FLAG_FAST_REG |
                                                   MLX4_MPT_PD_FLAG_RAE);