diff options
Diffstat (limited to 'drivers/infiniband/hw/ocrdma')
-rw-r--r-- | drivers/infiniband/hw/ocrdma/ocrdma.h | 2 | ||||
-rw-r--r-- | drivers/infiniband/hw/ocrdma/ocrdma_hw.c | 3 | ||||
-rw-r--r-- | drivers/infiniband/hw/ocrdma/ocrdma_sli.h | 2 | ||||
-rw-r--r-- | drivers/infiniband/hw/ocrdma/ocrdma_verbs.c | 29 |
4 files changed, 29 insertions, 7 deletions
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma.h b/drivers/infiniband/hw/ocrdma/ocrdma.h index 8d54dc74ca77..e798837f1fe0 100644 --- a/drivers/infiniband/hw/ocrdma/ocrdma.h +++ b/drivers/infiniband/hw/ocrdma/ocrdma.h | |||
@@ -60,6 +60,7 @@ struct ocrdma_dev_attr { | |||
60 | int max_send_sge; | 60 | int max_send_sge; |
61 | int max_recv_sge; | 61 | int max_recv_sge; |
62 | int max_srq_sge; | 62 | int max_srq_sge; |
63 | int max_rdma_sge; | ||
63 | int max_mr; | 64 | int max_mr; |
64 | u64 max_mr_size; | 65 | u64 max_mr_size; |
65 | u32 max_num_mr_pbl; | 66 | u32 max_num_mr_pbl; |
@@ -287,6 +288,7 @@ struct ocrdma_qp { | |||
287 | u32 qkey; | 288 | u32 qkey; |
288 | bool dpp_enabled; | 289 | bool dpp_enabled; |
289 | u8 *ird_q_va; | 290 | u8 *ird_q_va; |
291 | u16 db_cache; | ||
290 | }; | 292 | }; |
291 | 293 | ||
292 | struct ocrdma_hw_mr { | 294 | struct ocrdma_hw_mr { |
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c index c4bb29c9d48a..97bb1ce8d243 100644 --- a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c +++ b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c | |||
@@ -992,6 +992,9 @@ static void ocrdma_get_attr(struct ocrdma_dev *dev, | |||
992 | attr->max_srq_sge = (rsp->max_srq_rqe_sge & | 992 | attr->max_srq_sge = (rsp->max_srq_rqe_sge & |
993 | OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_MASK) >> | 993 | OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_MASK) >> |
994 | OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_OFFSET; | 994 | OCRDMA_MBX_QUERY_CFG_MAX_SRQ_SGE_OFFSET; |
995 | attr->max_rdma_sge = (rsp->max_write_send_sge & | ||
996 | OCRDMA_MBX_QUERY_CFG_MAX_WRITE_SGE_MASK) >> | ||
997 | OCRDMA_MBX_QUERY_CFG_MAX_WRITE_SGE_SHIFT; | ||
995 | attr->max_ord_per_qp = (rsp->max_ird_ord_per_qp & | 998 | attr->max_ord_per_qp = (rsp->max_ird_ord_per_qp & |
996 | OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_MASK) >> | 999 | OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_MASK) >> |
997 | OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_SHIFT; | 1000 | OCRDMA_MBX_QUERY_CFG_MAX_ORD_PER_QP_SHIFT; |
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_sli.h b/drivers/infiniband/hw/ocrdma/ocrdma_sli.h index 96a962982417..0184009060db 100644 --- a/drivers/infiniband/hw/ocrdma/ocrdma_sli.h +++ b/drivers/infiniband/hw/ocrdma/ocrdma_sli.h | |||
@@ -1306,7 +1306,7 @@ struct ocrdma_reg_nsmr_cont { | |||
1306 | u32 last; | 1306 | u32 last; |
1307 | 1307 | ||
1308 | struct ocrdma_pa pbl[MAX_OCRDMA_NSMR_PBL]; | 1308 | struct ocrdma_pa pbl[MAX_OCRDMA_NSMR_PBL]; |
1309 | } __packed; | 1309 | }; |
1310 | 1310 | ||
1311 | struct ocrdma_pbe { | 1311 | struct ocrdma_pbe { |
1312 | u32 pa_hi; | 1312 | u32 pa_hi; |
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c index 2cfbd343ba0e..5f68dff0d6ca 100644 --- a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c +++ b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c | |||
@@ -84,7 +84,7 @@ int ocrdma_query_device(struct ib_device *ibdev, struct ib_device_attr *attr) | |||
84 | IB_DEVICE_SYS_IMAGE_GUID | | 84 | IB_DEVICE_SYS_IMAGE_GUID | |
85 | IB_DEVICE_LOCAL_DMA_LKEY; | 85 | IB_DEVICE_LOCAL_DMA_LKEY; |
86 | attr->max_sge = min(dev->attr.max_send_sge, dev->attr.max_srq_sge); | 86 | attr->max_sge = min(dev->attr.max_send_sge, dev->attr.max_srq_sge); |
87 | attr->max_sge_rd = 0; | 87 | attr->max_sge_rd = dev->attr.max_rdma_sge; |
88 | attr->max_cq = dev->attr.max_cq; | 88 | attr->max_cq = dev->attr.max_cq; |
89 | attr->max_cqe = dev->attr.max_cqe; | 89 | attr->max_cqe = dev->attr.max_cqe; |
90 | attr->max_mr = dev->attr.max_mr; | 90 | attr->max_mr = dev->attr.max_mr; |
@@ -327,7 +327,7 @@ int ocrdma_mmap(struct ib_ucontext *context, struct vm_area_struct *vma) | |||
327 | return status; | 327 | return status; |
328 | } | 328 | } |
329 | 329 | ||
330 | static int ocrdma_copy_pd_uresp(struct ocrdma_pd *pd, | 330 | static int ocrdma_copy_pd_uresp(struct ocrdma_dev *dev, struct ocrdma_pd *pd, |
331 | struct ib_ucontext *ib_ctx, | 331 | struct ib_ucontext *ib_ctx, |
332 | struct ib_udata *udata) | 332 | struct ib_udata *udata) |
333 | { | 333 | { |
@@ -337,7 +337,6 @@ static int ocrdma_copy_pd_uresp(struct ocrdma_pd *pd, | |||
337 | u32 db_page_size; | 337 | u32 db_page_size; |
338 | struct ocrdma_alloc_pd_uresp rsp; | 338 | struct ocrdma_alloc_pd_uresp rsp; |
339 | struct ocrdma_ucontext *uctx = get_ocrdma_ucontext(ib_ctx); | 339 | struct ocrdma_ucontext *uctx = get_ocrdma_ucontext(ib_ctx); |
340 | struct ocrdma_dev *dev = get_ocrdma_dev(pd->ibpd.device); | ||
341 | 340 | ||
342 | memset(&rsp, 0, sizeof(rsp)); | 341 | memset(&rsp, 0, sizeof(rsp)); |
343 | rsp.id = pd->id; | 342 | rsp.id = pd->id; |
@@ -400,14 +399,15 @@ struct ib_pd *ocrdma_alloc_pd(struct ib_device *ibdev, | |||
400 | } | 399 | } |
401 | 400 | ||
402 | if (udata && context) { | 401 | if (udata && context) { |
403 | status = ocrdma_copy_pd_uresp(pd, context, udata); | 402 | status = ocrdma_copy_pd_uresp(dev, pd, context, udata); |
404 | if (status) | 403 | if (status) |
405 | goto err; | 404 | goto err; |
406 | } | 405 | } |
407 | return &pd->ibpd; | 406 | return &pd->ibpd; |
408 | 407 | ||
409 | err: | 408 | err: |
410 | ocrdma_dealloc_pd(&pd->ibpd); | 409 | status = ocrdma_mbx_dealloc_pd(dev, pd); |
410 | kfree(pd); | ||
411 | return ERR_PTR(status); | 411 | return ERR_PTR(status); |
412 | } | 412 | } |
413 | 413 | ||
@@ -1090,6 +1090,17 @@ gen_err: | |||
1090 | return ERR_PTR(status); | 1090 | return ERR_PTR(status); |
1091 | } | 1091 | } |
1092 | 1092 | ||
1093 | |||
1094 | static void ocrdma_flush_rq_db(struct ocrdma_qp *qp) | ||
1095 | { | ||
1096 | if (qp->db_cache) { | ||
1097 | u32 val = qp->rq.dbid | (qp->db_cache << | ||
1098 | ocrdma_get_num_posted_shift(qp)); | ||
1099 | iowrite32(val, qp->rq_db); | ||
1100 | qp->db_cache = 0; | ||
1101 | } | ||
1102 | } | ||
1103 | |||
1093 | int _ocrdma_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, | 1104 | int _ocrdma_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, |
1094 | int attr_mask) | 1105 | int attr_mask) |
1095 | { | 1106 | { |
@@ -1108,6 +1119,9 @@ int _ocrdma_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, | |||
1108 | if (status < 0) | 1119 | if (status < 0) |
1109 | return status; | 1120 | return status; |
1110 | status = ocrdma_mbx_modify_qp(dev, qp, attr, attr_mask, old_qps); | 1121 | status = ocrdma_mbx_modify_qp(dev, qp, attr, attr_mask, old_qps); |
1122 | if (!status && attr_mask & IB_QP_STATE && attr->qp_state == IB_QPS_RTR) | ||
1123 | ocrdma_flush_rq_db(qp); | ||
1124 | |||
1111 | return status; | 1125 | return status; |
1112 | } | 1126 | } |
1113 | 1127 | ||
@@ -1822,7 +1836,10 @@ static void ocrdma_ring_rq_db(struct ocrdma_qp *qp) | |||
1822 | { | 1836 | { |
1823 | u32 val = qp->rq.dbid | (1 << ocrdma_get_num_posted_shift(qp)); | 1837 | u32 val = qp->rq.dbid | (1 << ocrdma_get_num_posted_shift(qp)); |
1824 | 1838 | ||
1825 | iowrite32(val, qp->rq_db); | 1839 | if (qp->state != OCRDMA_QPS_INIT) |
1840 | iowrite32(val, qp->rq_db); | ||
1841 | else | ||
1842 | qp->db_cache++; | ||
1826 | } | 1843 | } |
1827 | 1844 | ||
1828 | static void ocrdma_build_rqe(struct ocrdma_hdr_wqe *rqe, struct ib_recv_wr *wr, | 1845 | static void ocrdma_build_rqe(struct ocrdma_hdr_wqe *rqe, struct ib_recv_wr *wr, |