mlx5: Fix mlx5_ib_map_mr_sg mr length
[linux-2.6-microblaze.git] / drivers / infiniband / hw / mlx5 / mr.c
index 3c1f483..366433f 100644 (file)
@@ -966,7 +966,7 @@ int mlx5_ib_update_xlt(struct mlx5_ib_mr *mr, u64 idx, int npages,
                       int page_shift, int flags)
 {
        struct mlx5_ib_dev *dev = mr->dev;
-       struct device *ddev = dev->ib_dev.dma_device;
+       struct device *ddev = dev->ib_dev.dev.parent;
        struct mlx5_ib_ucontext *uctx = NULL;
        int size;
        void *xlt;
@@ -1009,7 +1009,7 @@ int mlx5_ib_update_xlt(struct mlx5_ib_mr *mr, u64 idx, int npages,
        }
 
        if (!xlt) {
-               uctx = to_mucontext(mr->ibmr.uobject->context);
+               uctx = to_mucontext(mr->ibmr.pd->uobject->context);
                mlx5_ib_warn(dev, "Using XLT emergency buffer\n");
                size = PAGE_SIZE;
                xlt = (void *)uctx->upd_xlt_page;
@@ -1045,8 +1045,9 @@ int mlx5_ib_update_xlt(struct mlx5_ib_mr *mr, u64 idx, int npages,
        for (pages_mapped = 0;
             pages_mapped < pages_to_map && !err;
             pages_mapped += pages_iter, idx += pages_iter) {
+               npages = min_t(int, pages_iter, pages_to_map - pages_mapped);
                dma_sync_single_for_cpu(ddev, dma, size, DMA_TO_DEVICE);
-               npages = populate_xlt(mr, idx, pages_iter, xlt,
+               npages = populate_xlt(mr, idx, npages, xlt,
                                      page_shift, size, flags);
 
                dma_sync_single_for_device(ddev, dma, size, DMA_TO_DEVICE);
@@ -1411,9 +1412,9 @@ mlx5_alloc_priv_descs(struct ib_device *device,
 
        mr->descs = PTR_ALIGN(mr->descs_alloc, MLX5_UMR_ALIGN);
 
-       mr->desc_map = dma_map_single(device->dma_device, mr->descs,
+       mr->desc_map = dma_map_single(device->dev.parent, mr->descs,
                                      size, DMA_TO_DEVICE);
-       if (dma_mapping_error(device->dma_device, mr->desc_map)) {
+       if (dma_mapping_error(device->dev.parent, mr->desc_map)) {
                ret = -ENOMEM;
                goto err;
        }
@@ -1432,7 +1433,7 @@ mlx5_free_priv_descs(struct mlx5_ib_mr *mr)
                struct ib_device *device = mr->ibmr.device;
                int size = mr->max_descs * mr->desc_size;
 
-               dma_unmap_single(device->dma_device, mr->desc_map,
+               dma_unmap_single(device->dev.parent, mr->desc_map,
                                 size, DMA_TO_DEVICE);
                kfree(mr->descs_alloc);
                mr->descs = NULL;
@@ -1687,6 +1688,7 @@ struct ib_mw *mlx5_ib_alloc_mw(struct ib_pd *pd, enum ib_mw_type type,
 
        mw->mmkey.type = MLX5_MKEY_MW;
        mw->ibmw.rkey = mw->mmkey.key;
+       mw->ndescs = ndescs;
 
        resp.response_length = min(offsetof(typeof(resp), response_length) +
                                   sizeof(resp.response_length), udata->outlen);
@@ -1782,7 +1784,7 @@ mlx5_ib_sg_to_klms(struct mlx5_ib_mr *mr,
                klms[i].va = cpu_to_be64(sg_dma_address(sg) + sg_offset);
                klms[i].bcount = cpu_to_be32(sg_dma_len(sg) - sg_offset);
                klms[i].key = cpu_to_be32(lkey);
-               mr->ibmr.length += sg_dma_len(sg);
+               mr->ibmr.length += sg_dma_len(sg) - sg_offset;
 
                sg_offset = 0;
        }