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);
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);