aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/hw/cxgb4/mem.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/infiniband/hw/cxgb4/mem.c')
-rw-r--r--drivers/infiniband/hw/cxgb4/mem.c63
1 files changed, 28 insertions, 35 deletions
diff --git a/drivers/infiniband/hw/cxgb4/mem.c b/drivers/infiniband/hw/cxgb4/mem.c
index 026b91ebd5e2..e1629ab58db7 100644
--- a/drivers/infiniband/hw/cxgb4/mem.c
+++ b/drivers/infiniband/hw/cxgb4/mem.c
@@ -144,7 +144,7 @@ static int _c4iw_write_mem_inline(struct c4iw_rdev *rdev, u32 addr, u32 len,
144 if (i == (num_wqe-1)) { 144 if (i == (num_wqe-1)) {
145 req->wr.wr_hi = cpu_to_be32(FW_WR_OP_V(FW_ULPTX_WR) | 145 req->wr.wr_hi = cpu_to_be32(FW_WR_OP_V(FW_ULPTX_WR) |
146 FW_WR_COMPL_F); 146 FW_WR_COMPL_F);
147 req->wr.wr_lo = (__force __be64)&wr_wait; 147 req->wr.wr_lo = (__force __be64)(unsigned long)&wr_wait;
148 } else 148 } else
149 req->wr.wr_hi = cpu_to_be32(FW_WR_OP_V(FW_ULPTX_WR)); 149 req->wr.wr_hi = cpu_to_be32(FW_WR_OP_V(FW_ULPTX_WR));
150 req->wr.wr_mid = cpu_to_be32( 150 req->wr.wr_mid = cpu_to_be32(
@@ -863,6 +863,7 @@ struct ib_mr *c4iw_alloc_mr(struct ib_pd *pd,
863 u32 mmid; 863 u32 mmid;
864 u32 stag = 0; 864 u32 stag = 0;
865 int ret = 0; 865 int ret = 0;
866 int length = roundup(max_num_sg * sizeof(u64), 32);
866 867
867 if (mr_type != IB_MR_TYPE_MEM_REG || 868 if (mr_type != IB_MR_TYPE_MEM_REG ||
868 max_num_sg > t4_max_fr_depth(use_dsgl)) 869 max_num_sg > t4_max_fr_depth(use_dsgl))
@@ -876,6 +877,14 @@ struct ib_mr *c4iw_alloc_mr(struct ib_pd *pd,
876 goto err; 877 goto err;
877 } 878 }
878 879
880 mhp->mpl = dma_alloc_coherent(&rhp->rdev.lldi.pdev->dev,
881 length, &mhp->mpl_addr, GFP_KERNEL);
882 if (!mhp->mpl) {
883 ret = -ENOMEM;
884 goto err_mpl;
885 }
886 mhp->max_mpl_len = length;
887
879 mhp->rhp = rhp; 888 mhp->rhp = rhp;
880 ret = alloc_pbl(mhp, max_num_sg); 889 ret = alloc_pbl(mhp, max_num_sg);
881 if (ret) 890 if (ret)
@@ -905,54 +914,35 @@ err2:
905 c4iw_pblpool_free(&mhp->rhp->rdev, mhp->attr.pbl_addr, 914 c4iw_pblpool_free(&mhp->rhp->rdev, mhp->attr.pbl_addr,
906 mhp->attr.pbl_size << 3); 915 mhp->attr.pbl_size << 3);
907err1: 916err1:
917 dma_free_coherent(&mhp->rhp->rdev.lldi.pdev->dev,
918 mhp->max_mpl_len, mhp->mpl, mhp->mpl_addr);
919err_mpl:
908 kfree(mhp); 920 kfree(mhp);
909err: 921err:
910 return ERR_PTR(ret); 922 return ERR_PTR(ret);
911} 923}
912 924
913struct ib_fast_reg_page_list *c4iw_alloc_fastreg_pbl(struct ib_device *device, 925static int c4iw_set_page(struct ib_mr *ibmr, u64 addr)
914 int page_list_len)
915{ 926{
916 struct c4iw_fr_page_list *c4pl; 927 struct c4iw_mr *mhp = to_c4iw_mr(ibmr);
917 struct c4iw_dev *dev = to_c4iw_dev(device);
918 dma_addr_t dma_addr;
919 int pll_len = roundup(page_list_len * sizeof(u64), 32);
920
921 c4pl = kmalloc(sizeof(*c4pl), GFP_KERNEL);
922 if (!c4pl)
923 return ERR_PTR(-ENOMEM);
924 928
925 c4pl->ibpl.page_list = dma_alloc_coherent(&dev->rdev.lldi.pdev->dev, 929 if (unlikely(mhp->mpl_len == mhp->max_mpl_len))
926 pll_len, &dma_addr, 930 return -ENOMEM;
927 GFP_KERNEL);
928 if (!c4pl->ibpl.page_list) {
929 kfree(c4pl);
930 return ERR_PTR(-ENOMEM);
931 }
932 dma_unmap_addr_set(c4pl, mapping, dma_addr);
933 c4pl->dma_addr = dma_addr;
934 c4pl->dev = dev;
935 c4pl->pll_len = pll_len;
936 931
937 PDBG("%s c4pl %p pll_len %u page_list %p dma_addr %pad\n", 932 mhp->mpl[mhp->mpl_len++] = addr;
938 __func__, c4pl, c4pl->pll_len, c4pl->ibpl.page_list,
939 &c4pl->dma_addr);
940 933
941 return &c4pl->ibpl; 934 return 0;
942} 935}
943 936
944void c4iw_free_fastreg_pbl(struct ib_fast_reg_page_list *ibpl) 937int c4iw_map_mr_sg(struct ib_mr *ibmr,
938 struct scatterlist *sg,
939 int sg_nents)
945{ 940{
946 struct c4iw_fr_page_list *c4pl = to_c4iw_fr_page_list(ibpl); 941 struct c4iw_mr *mhp = to_c4iw_mr(ibmr);
947 942
948 PDBG("%s c4pl %p pll_len %u page_list %p dma_addr %pad\n", 943 mhp->mpl_len = 0;
949 __func__, c4pl, c4pl->pll_len, c4pl->ibpl.page_list,
950 &c4pl->dma_addr);
951 944
952 dma_free_coherent(&c4pl->dev->rdev.lldi.pdev->dev, 945 return ib_sg_to_pages(ibmr, sg, sg_nents, c4iw_set_page);
953 c4pl->pll_len,
954 c4pl->ibpl.page_list, dma_unmap_addr(c4pl, mapping));
955 kfree(c4pl);
956} 946}
957 947
958int c4iw_dereg_mr(struct ib_mr *ib_mr) 948int c4iw_dereg_mr(struct ib_mr *ib_mr)
@@ -970,6 +960,9 @@ int c4iw_dereg_mr(struct ib_mr *ib_mr)
970 rhp = mhp->rhp; 960 rhp = mhp->rhp;
971 mmid = mhp->attr.stag >> 8; 961 mmid = mhp->attr.stag >> 8;
972 remove_handle(rhp, &rhp->mmidr, mmid); 962 remove_handle(rhp, &rhp->mmidr, mmid);
963 if (mhp->mpl)
964 dma_free_coherent(&mhp->rhp->rdev.lldi.pdev->dev,
965 mhp->max_mpl_len, mhp->mpl, mhp->mpl_addr);
973 dereg_mem(&rhp->rdev, mhp->attr.stag, mhp->attr.pbl_size, 966 dereg_mem(&rhp->rdev, mhp->attr.stag, mhp->attr.pbl_size,
974 mhp->attr.pbl_addr); 967 mhp->attr.pbl_addr);
975 if (mhp->attr.pbl_size) 968 if (mhp->attr.pbl_size)