diff options
| -rw-r--r-- | drivers/infiniband/hw/cxgb4/qp.c | 5 | ||||
| -rw-r--r-- | drivers/infiniband/hw/i40iw/i40iw_ctrl.c | 25 | ||||
| -rw-r--r-- | drivers/infiniband/hw/i40iw/i40iw_puda.c | 2 | ||||
| -rw-r--r-- | drivers/infiniband/hw/i40iw/i40iw_type.h | 4 | ||||
| -rw-r--r-- | drivers/infiniband/hw/i40iw/i40iw_ucontext.h | 4 | ||||
| -rw-r--r-- | drivers/infiniband/hw/i40iw/i40iw_uk.c | 17 | ||||
| -rw-r--r-- | drivers/infiniband/hw/i40iw/i40iw_user.h | 4 | ||||
| -rw-r--r-- | drivers/infiniband/hw/i40iw/i40iw_verbs.c | 21 | ||||
| -rw-r--r-- | drivers/infiniband/hw/i40iw/i40iw_verbs.h | 1 | ||||
| -rw-r--r-- | drivers/infiniband/hw/qedr/verbs.c | 35 | ||||
| -rw-r--r-- | drivers/infiniband/sw/rxe/rxe_comp.c | 2 | ||||
| -rw-r--r-- | drivers/infiniband/sw/rxe/rxe_net.c | 3 | ||||
| -rw-r--r-- | drivers/infiniband/sw/rxe/rxe_qp.c | 1 | ||||
| -rw-r--r-- | drivers/infiniband/sw/rxe/rxe_resp.c | 3 | ||||
| -rw-r--r-- | include/rdma/ib_addr.h | 6 |
15 files changed, 90 insertions, 43 deletions
diff --git a/drivers/infiniband/hw/cxgb4/qp.c b/drivers/infiniband/hw/cxgb4/qp.c index b7ac97b27c88..cda5542e13a2 100644 --- a/drivers/infiniband/hw/cxgb4/qp.c +++ b/drivers/infiniband/hw/cxgb4/qp.c | |||
| @@ -321,7 +321,8 @@ static int create_qp(struct c4iw_rdev *rdev, struct t4_wq *wq, | |||
| 321 | FW_RI_RES_WR_DCAEN_V(0) | | 321 | FW_RI_RES_WR_DCAEN_V(0) | |
| 322 | FW_RI_RES_WR_DCACPU_V(0) | | 322 | FW_RI_RES_WR_DCACPU_V(0) | |
| 323 | FW_RI_RES_WR_FBMIN_V(2) | | 323 | FW_RI_RES_WR_FBMIN_V(2) | |
| 324 | FW_RI_RES_WR_FBMAX_V(2) | | 324 | (t4_sq_onchip(&wq->sq) ? FW_RI_RES_WR_FBMAX_V(2) : |
| 325 | FW_RI_RES_WR_FBMAX_V(3)) | | ||
| 325 | FW_RI_RES_WR_CIDXFTHRESHO_V(0) | | 326 | FW_RI_RES_WR_CIDXFTHRESHO_V(0) | |
| 326 | FW_RI_RES_WR_CIDXFTHRESH_V(0) | | 327 | FW_RI_RES_WR_CIDXFTHRESH_V(0) | |
| 327 | FW_RI_RES_WR_EQSIZE_V(eqsize)); | 328 | FW_RI_RES_WR_EQSIZE_V(eqsize)); |
| @@ -345,7 +346,7 @@ static int create_qp(struct c4iw_rdev *rdev, struct t4_wq *wq, | |||
| 345 | FW_RI_RES_WR_DCAEN_V(0) | | 346 | FW_RI_RES_WR_DCAEN_V(0) | |
| 346 | FW_RI_RES_WR_DCACPU_V(0) | | 347 | FW_RI_RES_WR_DCACPU_V(0) | |
| 347 | FW_RI_RES_WR_FBMIN_V(2) | | 348 | FW_RI_RES_WR_FBMIN_V(2) | |
| 348 | FW_RI_RES_WR_FBMAX_V(2) | | 349 | FW_RI_RES_WR_FBMAX_V(3) | |
| 349 | FW_RI_RES_WR_CIDXFTHRESHO_V(0) | | 350 | FW_RI_RES_WR_CIDXFTHRESHO_V(0) | |
| 350 | FW_RI_RES_WR_CIDXFTHRESH_V(0) | | 351 | FW_RI_RES_WR_CIDXFTHRESH_V(0) | |
| 351 | FW_RI_RES_WR_EQSIZE_V(eqsize)); | 352 | FW_RI_RES_WR_EQSIZE_V(eqsize)); |
diff --git a/drivers/infiniband/hw/i40iw/i40iw_ctrl.c b/drivers/infiniband/hw/i40iw/i40iw_ctrl.c index 392f78384a60..98923a8cf86d 100644 --- a/drivers/infiniband/hw/i40iw/i40iw_ctrl.c +++ b/drivers/infiniband/hw/i40iw/i40iw_ctrl.c | |||
| @@ -358,13 +358,16 @@ void i40iw_qp_add_qos(struct i40iw_sc_qp *qp) | |||
| 358 | * @dev: sc device struct | 358 | * @dev: sc device struct |
| 359 | * @pd: sc pd ptr | 359 | * @pd: sc pd ptr |
| 360 | * @pd_id: pd_id for allocated pd | 360 | * @pd_id: pd_id for allocated pd |
| 361 | * @abi_ver: ABI version from user context, -1 if not valid | ||
| 361 | */ | 362 | */ |
| 362 | static void i40iw_sc_pd_init(struct i40iw_sc_dev *dev, | 363 | static void i40iw_sc_pd_init(struct i40iw_sc_dev *dev, |
| 363 | struct i40iw_sc_pd *pd, | 364 | struct i40iw_sc_pd *pd, |
| 364 | u16 pd_id) | 365 | u16 pd_id, |
| 366 | int abi_ver) | ||
| 365 | { | 367 | { |
| 366 | pd->size = sizeof(*pd); | 368 | pd->size = sizeof(*pd); |
| 367 | pd->pd_id = pd_id; | 369 | pd->pd_id = pd_id; |
| 370 | pd->abi_ver = abi_ver; | ||
| 368 | pd->dev = dev; | 371 | pd->dev = dev; |
| 369 | } | 372 | } |
| 370 | 373 | ||
| @@ -2252,6 +2255,7 @@ static enum i40iw_status_code i40iw_sc_qp_init(struct i40iw_sc_qp *qp, | |||
| 2252 | offset); | 2255 | offset); |
| 2253 | 2256 | ||
| 2254 | info->qp_uk_init_info.wqe_alloc_reg = wqe_alloc_reg; | 2257 | info->qp_uk_init_info.wqe_alloc_reg = wqe_alloc_reg; |
| 2258 | info->qp_uk_init_info.abi_ver = qp->pd->abi_ver; | ||
| 2255 | ret_code = i40iw_qp_uk_init(&qp->qp_uk, &info->qp_uk_init_info); | 2259 | ret_code = i40iw_qp_uk_init(&qp->qp_uk, &info->qp_uk_init_info); |
| 2256 | if (ret_code) | 2260 | if (ret_code) |
| 2257 | return ret_code; | 2261 | return ret_code; |
| @@ -2270,10 +2274,21 @@ static enum i40iw_status_code i40iw_sc_qp_init(struct i40iw_sc_qp *qp, | |||
| 2270 | false); | 2274 | false); |
| 2271 | i40iw_debug(qp->dev, I40IW_DEBUG_WQE, "%s: hw_sq_size[%04d] sq_ring.size[%04d]\n", | 2275 | i40iw_debug(qp->dev, I40IW_DEBUG_WQE, "%s: hw_sq_size[%04d] sq_ring.size[%04d]\n", |
| 2272 | __func__, qp->hw_sq_size, qp->qp_uk.sq_ring.size); | 2276 | __func__, qp->hw_sq_size, qp->qp_uk.sq_ring.size); |
| 2273 | ret_code = i40iw_fragcnt_to_wqesize_rq(qp->qp_uk.max_rq_frag_cnt, | 2277 | |
| 2274 | &wqe_size); | 2278 | switch (qp->pd->abi_ver) { |
| 2275 | if (ret_code) | 2279 | case 4: |
| 2276 | return ret_code; | 2280 | ret_code = i40iw_fragcnt_to_wqesize_rq(qp->qp_uk.max_rq_frag_cnt, |
| 2281 | &wqe_size); | ||
| 2282 | if (ret_code) | ||
| 2283 | return ret_code; | ||
| 2284 | break; | ||
| 2285 | case 5: /* fallthrough until next ABI version */ | ||
| 2286 | default: | ||
| 2287 | if (qp->qp_uk.max_rq_frag_cnt > I40IW_MAX_WQ_FRAGMENT_COUNT) | ||
| 2288 | return I40IW_ERR_INVALID_FRAG_COUNT; | ||
| 2289 | wqe_size = I40IW_MAX_WQE_SIZE_RQ; | ||
| 2290 | break; | ||
| 2291 | } | ||
| 2277 | qp->hw_rq_size = i40iw_get_encoded_wqe_size(qp->qp_uk.rq_size * | 2292 | qp->hw_rq_size = i40iw_get_encoded_wqe_size(qp->qp_uk.rq_size * |
| 2278 | (wqe_size / I40IW_QP_WQE_MIN_SIZE), false); | 2293 | (wqe_size / I40IW_QP_WQE_MIN_SIZE), false); |
| 2279 | i40iw_debug(qp->dev, I40IW_DEBUG_WQE, | 2294 | i40iw_debug(qp->dev, I40IW_DEBUG_WQE, |
diff --git a/drivers/infiniband/hw/i40iw/i40iw_puda.c b/drivers/infiniband/hw/i40iw/i40iw_puda.c index 449ba8c81ce7..db41ab40da9c 100644 --- a/drivers/infiniband/hw/i40iw/i40iw_puda.c +++ b/drivers/infiniband/hw/i40iw/i40iw_puda.c | |||
| @@ -930,7 +930,7 @@ enum i40iw_status_code i40iw_puda_create_rsrc(struct i40iw_sc_vsi *vsi, | |||
| 930 | INIT_LIST_HEAD(&rsrc->txpend); | 930 | INIT_LIST_HEAD(&rsrc->txpend); |
| 931 | 931 | ||
| 932 | rsrc->tx_wqe_avail_cnt = info->sq_size - 1; | 932 | rsrc->tx_wqe_avail_cnt = info->sq_size - 1; |
| 933 | dev->iw_pd_ops->pd_init(dev, &rsrc->sc_pd, info->pd_id); | 933 | dev->iw_pd_ops->pd_init(dev, &rsrc->sc_pd, info->pd_id, -1); |
| 934 | rsrc->qp_id = info->qp_id; | 934 | rsrc->qp_id = info->qp_id; |
| 935 | rsrc->cq_id = info->cq_id; | 935 | rsrc->cq_id = info->cq_id; |
| 936 | rsrc->sq_size = info->sq_size; | 936 | rsrc->sq_size = info->sq_size; |
diff --git a/drivers/infiniband/hw/i40iw/i40iw_type.h b/drivers/infiniband/hw/i40iw/i40iw_type.h index f3f8e9cc3c05..7b76259752b0 100644 --- a/drivers/infiniband/hw/i40iw/i40iw_type.h +++ b/drivers/infiniband/hw/i40iw/i40iw_type.h | |||
| @@ -280,6 +280,7 @@ struct i40iw_sc_pd { | |||
| 280 | u32 size; | 280 | u32 size; |
| 281 | struct i40iw_sc_dev *dev; | 281 | struct i40iw_sc_dev *dev; |
| 282 | u16 pd_id; | 282 | u16 pd_id; |
| 283 | int abi_ver; | ||
| 283 | }; | 284 | }; |
| 284 | 285 | ||
| 285 | struct i40iw_cqp_quanta { | 286 | struct i40iw_cqp_quanta { |
| @@ -852,6 +853,7 @@ struct i40iw_qp_init_info { | |||
| 852 | u64 host_ctx_pa; | 853 | u64 host_ctx_pa; |
| 853 | u64 q2_pa; | 854 | u64 q2_pa; |
| 854 | u64 shadow_area_pa; | 855 | u64 shadow_area_pa; |
| 856 | int abi_ver; | ||
| 855 | u8 sq_tph_val; | 857 | u8 sq_tph_val; |
| 856 | u8 rq_tph_val; | 858 | u8 rq_tph_val; |
| 857 | u8 type; | 859 | u8 type; |
| @@ -1051,7 +1053,7 @@ struct i40iw_aeq_ops { | |||
| 1051 | }; | 1053 | }; |
| 1052 | 1054 | ||
| 1053 | struct i40iw_pd_ops { | 1055 | struct i40iw_pd_ops { |
| 1054 | void (*pd_init)(struct i40iw_sc_dev *, struct i40iw_sc_pd *, u16); | 1056 | void (*pd_init)(struct i40iw_sc_dev *, struct i40iw_sc_pd *, u16, int); |
| 1055 | }; | 1057 | }; |
| 1056 | 1058 | ||
| 1057 | struct i40iw_priv_qp_ops { | 1059 | struct i40iw_priv_qp_ops { |
diff --git a/drivers/infiniband/hw/i40iw/i40iw_ucontext.h b/drivers/infiniband/hw/i40iw/i40iw_ucontext.h index 12acd688def4..57d3f1d11ff1 100644 --- a/drivers/infiniband/hw/i40iw/i40iw_ucontext.h +++ b/drivers/infiniband/hw/i40iw/i40iw_ucontext.h | |||
| @@ -39,8 +39,8 @@ | |||
| 39 | 39 | ||
| 40 | #include <linux/types.h> | 40 | #include <linux/types.h> |
| 41 | 41 | ||
| 42 | #define I40IW_ABI_USERSPACE_VER 4 | 42 | #define I40IW_ABI_VER 5 |
| 43 | #define I40IW_ABI_KERNEL_VER 4 | 43 | |
| 44 | struct i40iw_alloc_ucontext_req { | 44 | struct i40iw_alloc_ucontext_req { |
| 45 | __u32 reserved32; | 45 | __u32 reserved32; |
| 46 | __u8 userspace_ver; | 46 | __u8 userspace_ver; |
diff --git a/drivers/infiniband/hw/i40iw/i40iw_uk.c b/drivers/infiniband/hw/i40iw/i40iw_uk.c index 4376cd628774..2800f796271c 100644 --- a/drivers/infiniband/hw/i40iw/i40iw_uk.c +++ b/drivers/infiniband/hw/i40iw/i40iw_uk.c | |||
| @@ -966,10 +966,6 @@ enum i40iw_status_code i40iw_qp_uk_init(struct i40iw_qp_uk *qp, | |||
| 966 | if (ret_code) | 966 | if (ret_code) |
| 967 | return ret_code; | 967 | return ret_code; |
| 968 | 968 | ||
| 969 | ret_code = i40iw_get_wqe_shift(info->rq_size, info->max_rq_frag_cnt, 0, &rqshift); | ||
| 970 | if (ret_code) | ||
| 971 | return ret_code; | ||
| 972 | |||
| 973 | qp->sq_base = info->sq; | 969 | qp->sq_base = info->sq; |
| 974 | qp->rq_base = info->rq; | 970 | qp->rq_base = info->rq; |
| 975 | qp->shadow_area = info->shadow_area; | 971 | qp->shadow_area = info->shadow_area; |
| @@ -998,8 +994,19 @@ enum i40iw_status_code i40iw_qp_uk_init(struct i40iw_qp_uk *qp, | |||
| 998 | if (!qp->use_srq) { | 994 | if (!qp->use_srq) { |
| 999 | qp->rq_size = info->rq_size; | 995 | qp->rq_size = info->rq_size; |
| 1000 | qp->max_rq_frag_cnt = info->max_rq_frag_cnt; | 996 | qp->max_rq_frag_cnt = info->max_rq_frag_cnt; |
| 1001 | qp->rq_wqe_size = rqshift; | ||
| 1002 | I40IW_RING_INIT(qp->rq_ring, qp->rq_size); | 997 | I40IW_RING_INIT(qp->rq_ring, qp->rq_size); |
| 998 | switch (info->abi_ver) { | ||
| 999 | case 4: | ||
| 1000 | ret_code = i40iw_get_wqe_shift(info->rq_size, info->max_rq_frag_cnt, 0, &rqshift); | ||
| 1001 | if (ret_code) | ||
| 1002 | return ret_code; | ||
| 1003 | break; | ||
| 1004 | case 5: /* fallthrough until next ABI version */ | ||
| 1005 | default: | ||
| 1006 | rqshift = I40IW_MAX_RQ_WQE_SHIFT; | ||
| 1007 | break; | ||
| 1008 | } | ||
| 1009 | qp->rq_wqe_size = rqshift; | ||
| 1003 | qp->rq_wqe_size_multiplier = 4 << rqshift; | 1010 | qp->rq_wqe_size_multiplier = 4 << rqshift; |
| 1004 | } | 1011 | } |
| 1005 | qp->ops = iw_qp_uk_ops; | 1012 | qp->ops = iw_qp_uk_ops; |
diff --git a/drivers/infiniband/hw/i40iw/i40iw_user.h b/drivers/infiniband/hw/i40iw/i40iw_user.h index 80d9f464f65e..84be6f13b9c5 100644 --- a/drivers/infiniband/hw/i40iw/i40iw_user.h +++ b/drivers/infiniband/hw/i40iw/i40iw_user.h | |||
| @@ -76,6 +76,7 @@ enum i40iw_device_capabilities_const { | |||
| 76 | I40IW_MAX_ORD_SIZE = 127, | 76 | I40IW_MAX_ORD_SIZE = 127, |
| 77 | I40IW_MAX_WQ_ENTRIES = 2048, | 77 | I40IW_MAX_WQ_ENTRIES = 2048, |
| 78 | I40IW_Q2_BUFFER_SIZE = (248 + 100), | 78 | I40IW_Q2_BUFFER_SIZE = (248 + 100), |
| 79 | I40IW_MAX_WQE_SIZE_RQ = 128, | ||
| 79 | I40IW_QP_CTX_SIZE = 248, | 80 | I40IW_QP_CTX_SIZE = 248, |
| 80 | I40IW_MAX_PDS = 32768 | 81 | I40IW_MAX_PDS = 32768 |
| 81 | }; | 82 | }; |
| @@ -97,6 +98,7 @@ enum i40iw_device_capabilities_const { | |||
| 97 | #define i40iw_address_list u64 * | 98 | #define i40iw_address_list u64 * |
| 98 | 99 | ||
| 99 | #define I40IW_MAX_MR_SIZE 0x10000000000L | 100 | #define I40IW_MAX_MR_SIZE 0x10000000000L |
| 101 | #define I40IW_MAX_RQ_WQE_SHIFT 2 | ||
| 100 | 102 | ||
| 101 | struct i40iw_qp_uk; | 103 | struct i40iw_qp_uk; |
| 102 | struct i40iw_cq_uk; | 104 | struct i40iw_cq_uk; |
| @@ -405,7 +407,7 @@ struct i40iw_qp_uk_init_info { | |||
| 405 | u32 max_sq_frag_cnt; | 407 | u32 max_sq_frag_cnt; |
| 406 | u32 max_rq_frag_cnt; | 408 | u32 max_rq_frag_cnt; |
| 407 | u32 max_inline_data; | 409 | u32 max_inline_data; |
| 408 | 410 | int abi_ver; | |
| 409 | }; | 411 | }; |
| 410 | 412 | ||
| 411 | struct i40iw_cq_uk_init_info { | 413 | struct i40iw_cq_uk_init_info { |
diff --git a/drivers/infiniband/hw/i40iw/i40iw_verbs.c b/drivers/infiniband/hw/i40iw/i40iw_verbs.c index 7368a50bbdaa..29e97df9e1a7 100644 --- a/drivers/infiniband/hw/i40iw/i40iw_verbs.c +++ b/drivers/infiniband/hw/i40iw/i40iw_verbs.c | |||
| @@ -145,9 +145,8 @@ static struct ib_ucontext *i40iw_alloc_ucontext(struct ib_device *ibdev, | |||
| 145 | if (ib_copy_from_udata(&req, udata, sizeof(req))) | 145 | if (ib_copy_from_udata(&req, udata, sizeof(req))) |
| 146 | return ERR_PTR(-EINVAL); | 146 | return ERR_PTR(-EINVAL); |
| 147 | 147 | ||
| 148 | if (req.userspace_ver != I40IW_ABI_USERSPACE_VER) { | 148 | if (req.userspace_ver < 4 || req.userspace_ver > I40IW_ABI_VER) { |
| 149 | i40iw_pr_err("Invalid userspace driver version detected. Detected version %d, should be %d\n", | 149 | i40iw_pr_err("Unsupported provider library version %u.\n", req.userspace_ver); |
| 150 | req.userspace_ver, I40IW_ABI_USERSPACE_VER); | ||
| 151 | return ERR_PTR(-EINVAL); | 150 | return ERR_PTR(-EINVAL); |
| 152 | } | 151 | } |
| 153 | 152 | ||
| @@ -155,13 +154,14 @@ static struct ib_ucontext *i40iw_alloc_ucontext(struct ib_device *ibdev, | |||
| 155 | uresp.max_qps = iwdev->max_qp; | 154 | uresp.max_qps = iwdev->max_qp; |
| 156 | uresp.max_pds = iwdev->max_pd; | 155 | uresp.max_pds = iwdev->max_pd; |
| 157 | uresp.wq_size = iwdev->max_qp_wr * 2; | 156 | uresp.wq_size = iwdev->max_qp_wr * 2; |
| 158 | uresp.kernel_ver = I40IW_ABI_KERNEL_VER; | 157 | uresp.kernel_ver = req.userspace_ver; |
| 159 | 158 | ||
| 160 | ucontext = kzalloc(sizeof(*ucontext), GFP_KERNEL); | 159 | ucontext = kzalloc(sizeof(*ucontext), GFP_KERNEL); |
| 161 | if (!ucontext) | 160 | if (!ucontext) |
| 162 | return ERR_PTR(-ENOMEM); | 161 | return ERR_PTR(-ENOMEM); |
| 163 | 162 | ||
| 164 | ucontext->iwdev = iwdev; | 163 | ucontext->iwdev = iwdev; |
| 164 | ucontext->abi_ver = req.userspace_ver; | ||
| 165 | 165 | ||
| 166 | if (ib_copy_to_udata(udata, &uresp, sizeof(uresp))) { | 166 | if (ib_copy_to_udata(udata, &uresp, sizeof(uresp))) { |
| 167 | kfree(ucontext); | 167 | kfree(ucontext); |
| @@ -333,6 +333,7 @@ static struct ib_pd *i40iw_alloc_pd(struct ib_device *ibdev, | |||
| 333 | struct i40iw_sc_dev *dev = &iwdev->sc_dev; | 333 | struct i40iw_sc_dev *dev = &iwdev->sc_dev; |
| 334 | struct i40iw_alloc_pd_resp uresp; | 334 | struct i40iw_alloc_pd_resp uresp; |
| 335 | struct i40iw_sc_pd *sc_pd; | 335 | struct i40iw_sc_pd *sc_pd; |
| 336 | struct i40iw_ucontext *ucontext; | ||
| 336 | u32 pd_id = 0; | 337 | u32 pd_id = 0; |
| 337 | int err; | 338 | int err; |
| 338 | 339 | ||
| @@ -353,15 +354,18 @@ static struct ib_pd *i40iw_alloc_pd(struct ib_device *ibdev, | |||
| 353 | } | 354 | } |
| 354 | 355 | ||
| 355 | sc_pd = &iwpd->sc_pd; | 356 | sc_pd = &iwpd->sc_pd; |
| 356 | dev->iw_pd_ops->pd_init(dev, sc_pd, pd_id); | ||
| 357 | 357 | ||
| 358 | if (context) { | 358 | if (context) { |
| 359 | ucontext = to_ucontext(context); | ||
| 360 | dev->iw_pd_ops->pd_init(dev, sc_pd, pd_id, ucontext->abi_ver); | ||
| 359 | memset(&uresp, 0, sizeof(uresp)); | 361 | memset(&uresp, 0, sizeof(uresp)); |
| 360 | uresp.pd_id = pd_id; | 362 | uresp.pd_id = pd_id; |
| 361 | if (ib_copy_to_udata(udata, &uresp, sizeof(uresp))) { | 363 | if (ib_copy_to_udata(udata, &uresp, sizeof(uresp))) { |
| 362 | err = -EFAULT; | 364 | err = -EFAULT; |
| 363 | goto error; | 365 | goto error; |
| 364 | } | 366 | } |
| 367 | } else { | ||
| 368 | dev->iw_pd_ops->pd_init(dev, sc_pd, pd_id, -1); | ||
| 365 | } | 369 | } |
| 366 | 370 | ||
| 367 | i40iw_add_pdusecount(iwpd); | 371 | i40iw_add_pdusecount(iwpd); |
| @@ -518,7 +522,7 @@ static int i40iw_setup_kmode_qp(struct i40iw_device *iwdev, | |||
| 518 | struct i40iw_dma_mem *mem = &iwqp->kqp.dma_mem; | 522 | struct i40iw_dma_mem *mem = &iwqp->kqp.dma_mem; |
| 519 | u32 sqdepth, rqdepth; | 523 | u32 sqdepth, rqdepth; |
| 520 | u32 sq_size, rq_size; | 524 | u32 sq_size, rq_size; |
| 521 | u8 sqshift, rqshift; | 525 | u8 sqshift; |
| 522 | u32 size; | 526 | u32 size; |
| 523 | enum i40iw_status_code status; | 527 | enum i40iw_status_code status; |
| 524 | struct i40iw_qp_uk_init_info *ukinfo = &info->qp_uk_init_info; | 528 | struct i40iw_qp_uk_init_info *ukinfo = &info->qp_uk_init_info; |
| @@ -527,14 +531,11 @@ static int i40iw_setup_kmode_qp(struct i40iw_device *iwdev, | |||
| 527 | rq_size = i40iw_qp_roundup(ukinfo->rq_size + 1); | 531 | rq_size = i40iw_qp_roundup(ukinfo->rq_size + 1); |
| 528 | 532 | ||
| 529 | status = i40iw_get_wqe_shift(sq_size, ukinfo->max_sq_frag_cnt, ukinfo->max_inline_data, &sqshift); | 533 | status = i40iw_get_wqe_shift(sq_size, ukinfo->max_sq_frag_cnt, ukinfo->max_inline_data, &sqshift); |
| 530 | if (!status) | ||
| 531 | status = i40iw_get_wqe_shift(rq_size, ukinfo->max_rq_frag_cnt, 0, &rqshift); | ||
| 532 | |||
| 533 | if (status) | 534 | if (status) |
| 534 | return -ENOMEM; | 535 | return -ENOMEM; |
| 535 | 536 | ||
| 536 | sqdepth = sq_size << sqshift; | 537 | sqdepth = sq_size << sqshift; |
| 537 | rqdepth = rq_size << rqshift; | 538 | rqdepth = rq_size << I40IW_MAX_RQ_WQE_SHIFT; |
| 538 | 539 | ||
| 539 | size = sqdepth * sizeof(struct i40iw_sq_uk_wr_trk_info) + (rqdepth << 3); | 540 | size = sqdepth * sizeof(struct i40iw_sq_uk_wr_trk_info) + (rqdepth << 3); |
| 540 | iwqp->kqp.wrid_mem = kzalloc(size, GFP_KERNEL); | 541 | iwqp->kqp.wrid_mem = kzalloc(size, GFP_KERNEL); |
diff --git a/drivers/infiniband/hw/i40iw/i40iw_verbs.h b/drivers/infiniband/hw/i40iw/i40iw_verbs.h index 6549c939500f..07c3fec77de6 100644 --- a/drivers/infiniband/hw/i40iw/i40iw_verbs.h +++ b/drivers/infiniband/hw/i40iw/i40iw_verbs.h | |||
| @@ -42,6 +42,7 @@ struct i40iw_ucontext { | |||
| 42 | spinlock_t cq_reg_mem_list_lock; /* memory list for cq's */ | 42 | spinlock_t cq_reg_mem_list_lock; /* memory list for cq's */ |
| 43 | struct list_head qp_reg_mem_list; | 43 | struct list_head qp_reg_mem_list; |
| 44 | spinlock_t qp_reg_mem_list_lock; /* memory list for qp's */ | 44 | spinlock_t qp_reg_mem_list_lock; /* memory list for qp's */ |
| 45 | int abi_ver; | ||
| 45 | }; | 46 | }; |
| 46 | 47 | ||
| 47 | struct i40iw_pd { | 48 | struct i40iw_pd { |
diff --git a/drivers/infiniband/hw/qedr/verbs.c b/drivers/infiniband/hw/qedr/verbs.c index 302fb05e6e6f..57c8de208077 100644 --- a/drivers/infiniband/hw/qedr/verbs.c +++ b/drivers/infiniband/hw/qedr/verbs.c | |||
| @@ -890,6 +890,8 @@ struct ib_cq *qedr_create_cq(struct ib_device *ibdev, | |||
| 890 | 890 | ||
| 891 | pbl_ptr = cq->q.pbl_tbl->pa; | 891 | pbl_ptr = cq->q.pbl_tbl->pa; |
| 892 | page_cnt = cq->q.pbl_info.num_pbes; | 892 | page_cnt = cq->q.pbl_info.num_pbes; |
| 893 | |||
| 894 | cq->ibcq.cqe = chain_entries; | ||
| 893 | } else { | 895 | } else { |
| 894 | cq->cq_type = QEDR_CQ_TYPE_KERNEL; | 896 | cq->cq_type = QEDR_CQ_TYPE_KERNEL; |
| 895 | 897 | ||
| @@ -905,6 +907,7 @@ struct ib_cq *qedr_create_cq(struct ib_device *ibdev, | |||
| 905 | 907 | ||
| 906 | page_cnt = qed_chain_get_page_cnt(&cq->pbl); | 908 | page_cnt = qed_chain_get_page_cnt(&cq->pbl); |
| 907 | pbl_ptr = qed_chain_get_pbl_phys(&cq->pbl); | 909 | pbl_ptr = qed_chain_get_pbl_phys(&cq->pbl); |
| 910 | cq->ibcq.cqe = cq->pbl.capacity; | ||
| 908 | } | 911 | } |
| 909 | 912 | ||
| 910 | qedr_init_cq_params(cq, ctx, dev, vector, chain_entries, page_cnt, | 913 | qedr_init_cq_params(cq, ctx, dev, vector, chain_entries, page_cnt, |
| @@ -982,8 +985,13 @@ int qedr_destroy_cq(struct ib_cq *ibcq) | |||
| 982 | 985 | ||
| 983 | /* GSIs CQs are handled by driver, so they don't exist in the FW */ | 986 | /* GSIs CQs are handled by driver, so they don't exist in the FW */ |
| 984 | if (cq->cq_type != QEDR_CQ_TYPE_GSI) { | 987 | if (cq->cq_type != QEDR_CQ_TYPE_GSI) { |
| 988 | int rc; | ||
| 989 | |||
| 985 | iparams.icid = cq->icid; | 990 | iparams.icid = cq->icid; |
| 986 | dev->ops->rdma_destroy_cq(dev->rdma_ctx, &iparams, &oparams); | 991 | rc = dev->ops->rdma_destroy_cq(dev->rdma_ctx, &iparams, |
| 992 | &oparams); | ||
| 993 | if (rc) | ||
| 994 | return rc; | ||
| 987 | dev->ops->common->chain_free(dev->cdev, &cq->pbl); | 995 | dev->ops->common->chain_free(dev->cdev, &cq->pbl); |
| 988 | } | 996 | } |
| 989 | 997 | ||
| @@ -1966,7 +1974,7 @@ int qedr_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, | |||
| 1966 | 1974 | ||
| 1967 | if (attr_mask & IB_QP_STATE) { | 1975 | if (attr_mask & IB_QP_STATE) { |
| 1968 | if ((qp->qp_type != IB_QPT_GSI) && (!udata)) | 1976 | if ((qp->qp_type != IB_QPT_GSI) && (!udata)) |
| 1969 | qedr_update_qp_state(dev, qp, qp_params.new_state); | 1977 | rc = qedr_update_qp_state(dev, qp, qp_params.new_state); |
| 1970 | qp->state = qp_params.new_state; | 1978 | qp->state = qp_params.new_state; |
| 1971 | } | 1979 | } |
| 1972 | 1980 | ||
| @@ -2070,8 +2078,10 @@ int qedr_destroy_qp(struct ib_qp *ibqp) | |||
| 2070 | DP_DEBUG(dev, QEDR_MSG_QP, "destroy qp: destroying %p, qp type=%d\n", | 2078 | DP_DEBUG(dev, QEDR_MSG_QP, "destroy qp: destroying %p, qp type=%d\n", |
| 2071 | qp, qp->qp_type); | 2079 | qp, qp->qp_type); |
| 2072 | 2080 | ||
| 2073 | if (qp->state != (QED_ROCE_QP_STATE_RESET | QED_ROCE_QP_STATE_ERR | | 2081 | if ((qp->state != QED_ROCE_QP_STATE_RESET) && |
| 2074 | QED_ROCE_QP_STATE_INIT)) { | 2082 | (qp->state != QED_ROCE_QP_STATE_ERR) && |
| 2083 | (qp->state != QED_ROCE_QP_STATE_INIT)) { | ||
| 2084 | |||
| 2075 | attr.qp_state = IB_QPS_ERR; | 2085 | attr.qp_state = IB_QPS_ERR; |
| 2076 | attr_mask |= IB_QP_STATE; | 2086 | attr_mask |= IB_QP_STATE; |
| 2077 | 2087 | ||
| @@ -2626,7 +2636,9 @@ static u32 qedr_prepare_sq_rdma_data(struct qedr_dev *dev, | |||
| 2626 | rwqe2->r_key = cpu_to_le32(rdma_wr(wr)->rkey); | 2636 | rwqe2->r_key = cpu_to_le32(rdma_wr(wr)->rkey); |
| 2627 | DMA_REGPAIR_LE(rwqe2->remote_va, rdma_wr(wr)->remote_addr); | 2637 | DMA_REGPAIR_LE(rwqe2->remote_va, rdma_wr(wr)->remote_addr); |
| 2628 | 2638 | ||
| 2629 | if (wr->send_flags & IB_SEND_INLINE) { | 2639 | if (wr->send_flags & IB_SEND_INLINE && |
| 2640 | (wr->opcode == IB_WR_RDMA_WRITE_WITH_IMM || | ||
| 2641 | wr->opcode == IB_WR_RDMA_WRITE)) { | ||
| 2630 | u8 flags = 0; | 2642 | u8 flags = 0; |
| 2631 | 2643 | ||
| 2632 | SET_FIELD2(flags, RDMA_SQ_RDMA_WQE_1ST_INLINE_FLG, 1); | 2644 | SET_FIELD2(flags, RDMA_SQ_RDMA_WQE_1ST_INLINE_FLG, 1); |
| @@ -2977,8 +2989,9 @@ int qedr_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr, | |||
| 2977 | 2989 | ||
| 2978 | spin_lock_irqsave(&qp->q_lock, flags); | 2990 | spin_lock_irqsave(&qp->q_lock, flags); |
| 2979 | 2991 | ||
| 2980 | if ((qp->state == QED_ROCE_QP_STATE_RESET) || | 2992 | if ((qp->state != QED_ROCE_QP_STATE_RTS) && |
| 2981 | (qp->state == QED_ROCE_QP_STATE_ERR)) { | 2993 | (qp->state != QED_ROCE_QP_STATE_ERR) && |
| 2994 | (qp->state != QED_ROCE_QP_STATE_SQD)) { | ||
| 2982 | spin_unlock_irqrestore(&qp->q_lock, flags); | 2995 | spin_unlock_irqrestore(&qp->q_lock, flags); |
| 2983 | *bad_wr = wr; | 2996 | *bad_wr = wr; |
| 2984 | DP_DEBUG(dev, QEDR_MSG_CQ, | 2997 | DP_DEBUG(dev, QEDR_MSG_CQ, |
| @@ -3031,8 +3044,7 @@ int qedr_post_recv(struct ib_qp *ibqp, struct ib_recv_wr *wr, | |||
| 3031 | 3044 | ||
| 3032 | spin_lock_irqsave(&qp->q_lock, flags); | 3045 | spin_lock_irqsave(&qp->q_lock, flags); |
| 3033 | 3046 | ||
| 3034 | if ((qp->state == QED_ROCE_QP_STATE_RESET) || | 3047 | if (qp->state == QED_ROCE_QP_STATE_RESET) { |
| 3035 | (qp->state == QED_ROCE_QP_STATE_ERR)) { | ||
| 3036 | spin_unlock_irqrestore(&qp->q_lock, flags); | 3048 | spin_unlock_irqrestore(&qp->q_lock, flags); |
| 3037 | *bad_wr = wr; | 3049 | *bad_wr = wr; |
| 3038 | return -EINVAL; | 3050 | return -EINVAL; |
| @@ -3174,6 +3186,7 @@ static int process_req(struct qedr_dev *dev, struct qedr_qp *qp, | |||
| 3174 | 3186 | ||
| 3175 | /* fill WC */ | 3187 | /* fill WC */ |
| 3176 | wc->status = status; | 3188 | wc->status = status; |
| 3189 | wc->vendor_err = 0; | ||
| 3177 | wc->wc_flags = 0; | 3190 | wc->wc_flags = 0; |
| 3178 | wc->src_qp = qp->id; | 3191 | wc->src_qp = qp->id; |
| 3179 | wc->qp = &qp->ibqp; | 3192 | wc->qp = &qp->ibqp; |
| @@ -3225,7 +3238,7 @@ static int qedr_poll_cq_req(struct qedr_dev *dev, | |||
| 3225 | "Error: POLL CQ with RDMA_CQE_REQ_STS_WORK_REQUEST_FLUSHED_ERR. CQ icid=0x%x, QP icid=0x%x\n", | 3238 | "Error: POLL CQ with RDMA_CQE_REQ_STS_WORK_REQUEST_FLUSHED_ERR. CQ icid=0x%x, QP icid=0x%x\n", |
| 3226 | cq->icid, qp->icid); | 3239 | cq->icid, qp->icid); |
| 3227 | cnt = process_req(dev, qp, cq, num_entries, wc, req->sq_cons, | 3240 | cnt = process_req(dev, qp, cq, num_entries, wc, req->sq_cons, |
| 3228 | IB_WC_WR_FLUSH_ERR, 0); | 3241 | IB_WC_WR_FLUSH_ERR, 1); |
| 3229 | break; | 3242 | break; |
| 3230 | default: | 3243 | default: |
| 3231 | /* process all WQE before the cosumer */ | 3244 | /* process all WQE before the cosumer */ |
| @@ -3363,6 +3376,7 @@ static void __process_resp_one(struct qedr_dev *dev, struct qedr_qp *qp, | |||
| 3363 | 3376 | ||
| 3364 | /* fill WC */ | 3377 | /* fill WC */ |
| 3365 | wc->status = wc_status; | 3378 | wc->status = wc_status; |
| 3379 | wc->vendor_err = 0; | ||
| 3366 | wc->src_qp = qp->id; | 3380 | wc->src_qp = qp->id; |
| 3367 | wc->qp = &qp->ibqp; | 3381 | wc->qp = &qp->ibqp; |
| 3368 | wc->wr_id = wr_id; | 3382 | wc->wr_id = wr_id; |
| @@ -3391,6 +3405,7 @@ static int process_resp_flush(struct qedr_qp *qp, struct qedr_cq *cq, | |||
| 3391 | while (num_entries && qp->rq.wqe_cons != hw_cons) { | 3405 | while (num_entries && qp->rq.wqe_cons != hw_cons) { |
| 3392 | /* fill WC */ | 3406 | /* fill WC */ |
| 3393 | wc->status = IB_WC_WR_FLUSH_ERR; | 3407 | wc->status = IB_WC_WR_FLUSH_ERR; |
| 3408 | wc->vendor_err = 0; | ||
| 3394 | wc->wc_flags = 0; | 3409 | wc->wc_flags = 0; |
| 3395 | wc->src_qp = qp->id; | 3410 | wc->src_qp = qp->id; |
| 3396 | wc->byte_len = 0; | 3411 | wc->byte_len = 0; |
diff --git a/drivers/infiniband/sw/rxe/rxe_comp.c b/drivers/infiniband/sw/rxe/rxe_comp.c index cd27cbde7652..d369f24425f9 100644 --- a/drivers/infiniband/sw/rxe/rxe_comp.c +++ b/drivers/infiniband/sw/rxe/rxe_comp.c | |||
| @@ -224,7 +224,7 @@ static inline enum comp_state check_psn(struct rxe_qp *qp, | |||
| 224 | else | 224 | else |
| 225 | return COMPST_DONE; | 225 | return COMPST_DONE; |
| 226 | } else if ((diff > 0) && (wqe->mask & WR_ATOMIC_OR_READ_MASK)) { | 226 | } else if ((diff > 0) && (wqe->mask & WR_ATOMIC_OR_READ_MASK)) { |
| 227 | return COMPST_ERROR_RETRY; | 227 | return COMPST_DONE; |
| 228 | } else { | 228 | } else { |
| 229 | return COMPST_CHECK_ACK; | 229 | return COMPST_CHECK_ACK; |
| 230 | } | 230 | } |
diff --git a/drivers/infiniband/sw/rxe/rxe_net.c b/drivers/infiniband/sw/rxe/rxe_net.c index 16967cdb45df..342e78163613 100644 --- a/drivers/infiniband/sw/rxe/rxe_net.c +++ b/drivers/infiniband/sw/rxe/rxe_net.c | |||
| @@ -455,8 +455,7 @@ static int send(struct rxe_dev *rxe, struct rxe_pkt_info *pkt, | |||
| 455 | return -EAGAIN; | 455 | return -EAGAIN; |
| 456 | } | 456 | } |
| 457 | 457 | ||
| 458 | if (pkt->qp) | 458 | atomic_inc(&pkt->qp->skb_out); |
| 459 | atomic_inc(&pkt->qp->skb_out); | ||
| 460 | kfree_skb(skb); | 459 | kfree_skb(skb); |
| 461 | 460 | ||
| 462 | return 0; | 461 | return 0; |
diff --git a/drivers/infiniband/sw/rxe/rxe_qp.c b/drivers/infiniband/sw/rxe/rxe_qp.c index c3e60e4bde6e..486d576e55bc 100644 --- a/drivers/infiniband/sw/rxe/rxe_qp.c +++ b/drivers/infiniband/sw/rxe/rxe_qp.c | |||
| @@ -855,4 +855,5 @@ void rxe_qp_cleanup(void *arg) | |||
| 855 | free_rd_atomic_resources(qp); | 855 | free_rd_atomic_resources(qp); |
| 856 | 856 | ||
| 857 | kernel_sock_shutdown(qp->sk, SHUT_RDWR); | 857 | kernel_sock_shutdown(qp->sk, SHUT_RDWR); |
| 858 | sock_release(qp->sk); | ||
| 858 | } | 859 | } |
diff --git a/drivers/infiniband/sw/rxe/rxe_resp.c b/drivers/infiniband/sw/rxe/rxe_resp.c index 7a36ec9dbc0c..3435efff8799 100644 --- a/drivers/infiniband/sw/rxe/rxe_resp.c +++ b/drivers/infiniband/sw/rxe/rxe_resp.c | |||
| @@ -1070,12 +1070,13 @@ static enum resp_states duplicate_request(struct rxe_qp *qp, | |||
| 1070 | struct rxe_pkt_info *pkt) | 1070 | struct rxe_pkt_info *pkt) |
| 1071 | { | 1071 | { |
| 1072 | enum resp_states rc; | 1072 | enum resp_states rc; |
| 1073 | u32 prev_psn = (qp->resp.psn - 1) & BTH_PSN_MASK; | ||
| 1073 | 1074 | ||
| 1074 | if (pkt->mask & RXE_SEND_MASK || | 1075 | if (pkt->mask & RXE_SEND_MASK || |
| 1075 | pkt->mask & RXE_WRITE_MASK) { | 1076 | pkt->mask & RXE_WRITE_MASK) { |
| 1076 | /* SEND. Ack again and cleanup. C9-105. */ | 1077 | /* SEND. Ack again and cleanup. C9-105. */ |
| 1077 | if (bth_ack(pkt)) | 1078 | if (bth_ack(pkt)) |
| 1078 | send_ack(qp, pkt, AETH_ACK_UNLIMITED, qp->resp.psn - 1); | 1079 | send_ack(qp, pkt, AETH_ACK_UNLIMITED, prev_psn); |
| 1079 | rc = RESPST_CLEANUP; | 1080 | rc = RESPST_CLEANUP; |
| 1080 | goto out; | 1081 | goto out; |
| 1081 | } else if (pkt->mask & RXE_READ_MASK) { | 1082 | } else if (pkt->mask & RXE_READ_MASK) { |
diff --git a/include/rdma/ib_addr.h b/include/rdma/ib_addr.h index 931a47ba4571..1beab5532035 100644 --- a/include/rdma/ib_addr.h +++ b/include/rdma/ib_addr.h | |||
| @@ -205,10 +205,12 @@ static inline void iboe_addr_get_sgid(struct rdma_dev_addr *dev_addr, | |||
| 205 | 205 | ||
| 206 | dev = dev_get_by_index(&init_net, dev_addr->bound_dev_if); | 206 | dev = dev_get_by_index(&init_net, dev_addr->bound_dev_if); |
| 207 | if (dev) { | 207 | if (dev) { |
| 208 | ip4 = (struct in_device *)dev->ip_ptr; | 208 | ip4 = in_dev_get(dev); |
| 209 | if (ip4 && ip4->ifa_list && ip4->ifa_list->ifa_address) | 209 | if (ip4 && ip4->ifa_list && ip4->ifa_list->ifa_address) { |
| 210 | ipv6_addr_set_v4mapped(ip4->ifa_list->ifa_address, | 210 | ipv6_addr_set_v4mapped(ip4->ifa_list->ifa_address, |
| 211 | (struct in6_addr *)gid); | 211 | (struct in6_addr *)gid); |
| 212 | in_dev_put(ip4); | ||
| 213 | } | ||
| 212 | dev_put(dev); | 214 | dev_put(dev); |
| 213 | } | 215 | } |
| 214 | } | 216 | } |
