RDMA/cxgb4: Use for_each_sg_dma_page iterator on umem SGL
[linux-2.6-microblaze.git] / drivers / infiniband / hw / cxgb4 / mem.c
index 96760a3..8d1ab82 100644 (file)
@@ -502,10 +502,9 @@ struct ib_mr *c4iw_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
                               u64 virt, int acc, struct ib_udata *udata)
 {
        __be64 *pages;
-       int shift, n, len;
-       int i, k, entry;
+       int shift, n, i;
        int err = -ENOMEM;
-       struct scatterlist *sg;
+       struct sg_dma_page_iter sg_iter;
        struct c4iw_dev *rhp;
        struct c4iw_pd *php;
        struct c4iw_mr *mhp;
@@ -541,7 +540,7 @@ struct ib_mr *c4iw_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
        if (IS_ERR(mhp->umem))
                goto err_free_skb;
 
-       shift = mhp->umem->page_shift;
+       shift = PAGE_SHIFT;
 
        n = mhp->umem->nmap;
        err = alloc_pbl(mhp, n);
@@ -556,21 +555,16 @@ struct ib_mr *c4iw_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
 
        i = n = 0;
 
-       for_each_sg(mhp->umem->sg_head.sgl, sg, mhp->umem->nmap, entry) {
-               len = sg_dma_len(sg) >> shift;
-               for (k = 0; k < len; ++k) {
-                       pages[i++] = cpu_to_be64(sg_dma_address(sg) +
-                                                (k << shift));
-                       if (i == PAGE_SIZE / sizeof *pages) {
-                               err = write_pbl(&mhp->rhp->rdev,
-                                     pages,
-                                     mhp->attr.pbl_addr + (n << 3), i,
-                                     mhp->wr_waitp);
-                               if (err)
-                                       goto pbl_done;
-                               n += i;
-                               i = 0;
-                       }
+       for_each_sg_dma_page(mhp->umem->sg_head.sgl, &sg_iter, mhp->umem->nmap, 0) {
+               pages[i++] = cpu_to_be64(sg_page_iter_dma_address(&sg_iter));
+               if (i == PAGE_SIZE / sizeof(*pages)) {
+                       err = write_pbl(&mhp->rhp->rdev, pages,
+                                       mhp->attr.pbl_addr + (n << 3), i,
+                                       mhp->wr_waitp);
+                       if (err)
+                               goto pbl_done;
+                       n += i;
+                       i = 0;
                }
        }