From: Ajaykumar Hotchandani Date: Wed, 14 Oct 2015 23:38:11 +0000 (-0700) Subject: mlx4_core: Introduce restrictions for PD update X-Git-Tag: v4.1.12-92~251^2~1^2~1^2~2 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=624838d7e3e9660e605ddfa68daeff3a1370c647;p=users%2Fjedix%2Flinux-maple.git mlx4_core: Introduce restrictions for PD update 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 Tested-by: Kushagra Misra Signed-off-by: Ajaykumar Hotchandani Signed-off-by: Qing Huang Reviewed-by: Yuval Shaia Signed-off-by: Mukesh Kacker --- diff --git a/drivers/net/ethernet/mellanox/mlx4/mr.c b/drivers/net/ethernet/mellanox/mlx4/mr.c index 0e770fd75311..e6fb7e1c6a3b 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mr.c +++ b/drivers/net/ethernet/mellanox/mlx4/mr.c @@ -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);