diff options
Diffstat (limited to 'drivers/infiniband/hw/cxgb4/mem.c')
-rw-r--r-- | drivers/infiniband/hw/cxgb4/mem.c | 63 |
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); |
907 | err1: | 916 | err1: |
917 | dma_free_coherent(&mhp->rhp->rdev.lldi.pdev->dev, | ||
918 | mhp->max_mpl_len, mhp->mpl, mhp->mpl_addr); | ||
919 | err_mpl: | ||
908 | kfree(mhp); | 920 | kfree(mhp); |
909 | err: | 921 | err: |
910 | return ERR_PTR(ret); | 922 | return ERR_PTR(ret); |
911 | } | 923 | } |
912 | 924 | ||
913 | struct ib_fast_reg_page_list *c4iw_alloc_fastreg_pbl(struct ib_device *device, | 925 | static 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 | ||
944 | void c4iw_free_fastreg_pbl(struct ib_fast_reg_page_list *ibpl) | 937 | int 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 | ||
958 | int c4iw_dereg_mr(struct ib_mr *ib_mr) | 948 | int 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) |