aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/hw/ocrdma
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/infiniband/hw/ocrdma')
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma.h2
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma_hw.c3
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma_sli.h2
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma_verbs.c29
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
292struct ocrdma_hw_mr { 294struct 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
1311struct ocrdma_pbe { 1311struct 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
330static int ocrdma_copy_pd_uresp(struct ocrdma_pd *pd, 330static 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
409err: 408err:
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
1094static 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
1093int _ocrdma_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, 1104int _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
1828static void ocrdma_build_rqe(struct ocrdma_hdr_wqe *rqe, struct ib_recv_wr *wr, 1845static void ocrdma_build_rqe(struct ocrdma_hdr_wqe *rqe, struct ib_recv_wr *wr,