aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNaresh Gottumukkala <bgottumukkala@emulex.com>2013-08-26 05:57:42 -0400
committerRoland Dreier <roland@purestorage.com>2013-09-03 00:17:55 -0400
commitf11220ee69f72cf08479f28fd494264ac6a9349b (patch)
treeb52bdbc7b6024b76787fab612975093db688f40d
parentc88bd03ffccdb069fd9541bea347bdab8f4e7e6a (diff)
RDMA/ocrdma: For ERX2 irrespective of Qid, num_posted offset is 24
1) All RQ doorbells are handled by ERX2 and doorbell->num_posted offset is constant to bit offset 24 for ERX2 irrspective of Q id. 2) Fixed RESET to INIT state change (from ERR->RST->INIT->RTR case). Signed-off-by: Naresh Gottumukkala <bgottumukkala@emulex.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma_hw.c21
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma_sli.h5
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma_verbs.c12
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma_verbs.h1
4 files changed, 25 insertions, 14 deletions
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
index 1b14ef811b36..2c2991b7dae0 100644
--- a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
+++ b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
@@ -256,11 +256,11 @@ static int ocrdma_get_mbx_cqe_errno(u16 cqe_status)
256 break; 256 break;
257 case OCRDMA_MBX_CQE_STATUS_INSUFFICIENT_RESOURCES: 257 case OCRDMA_MBX_CQE_STATUS_INSUFFICIENT_RESOURCES:
258 case OCRDMA_MBX_CQE_STATUS_QUEUE_FLUSHING: 258 case OCRDMA_MBX_CQE_STATUS_QUEUE_FLUSHING:
259 err_num = -EAGAIN; 259 err_num = -EINVAL;
260 break; 260 break;
261 case OCRDMA_MBX_CQE_STATUS_DMA_FAILED: 261 case OCRDMA_MBX_CQE_STATUS_DMA_FAILED:
262 default: 262 default:
263 err_num = -EIO; 263 err_num = -EINVAL;
264 break; 264 break;
265 } 265 }
266 return err_num; 266 return err_num;
@@ -1654,6 +1654,14 @@ void ocrdma_flush_qp(struct ocrdma_qp *qp)
1654 spin_unlock_irqrestore(&qp->dev->flush_q_lock, flags); 1654 spin_unlock_irqrestore(&qp->dev->flush_q_lock, flags);
1655} 1655}
1656 1656
1657static void ocrdma_init_hwq_ptr(struct ocrdma_qp *qp)
1658{
1659 qp->sq.head = 0;
1660 qp->sq.tail = 0;
1661 qp->rq.head = 0;
1662 qp->rq.tail = 0;
1663}
1664
1657int ocrdma_qp_state_change(struct ocrdma_qp *qp, enum ib_qp_state new_ib_state, 1665int ocrdma_qp_state_change(struct ocrdma_qp *qp, enum ib_qp_state new_ib_state,
1658 enum ib_qp_state *old_ib_state) 1666 enum ib_qp_state *old_ib_state)
1659{ 1667{
@@ -1673,8 +1681,12 @@ int ocrdma_qp_state_change(struct ocrdma_qp *qp, enum ib_qp_state new_ib_state,
1673 } 1681 }
1674 1682
1675 1683
1676 if (new_state == OCRDMA_QPS_ERR) 1684 if (new_state == OCRDMA_QPS_INIT) {
1685 ocrdma_init_hwq_ptr(qp);
1686 ocrdma_del_flush_qp(qp);
1687 } else if (new_state == OCRDMA_QPS_ERR) {
1677 ocrdma_flush_qp(qp); 1688 ocrdma_flush_qp(qp);
1689 }
1678 1690
1679 qp->state = new_state; 1691 qp->state = new_state;
1680 1692
@@ -2317,7 +2329,8 @@ int ocrdma_mbx_modify_srq(struct ocrdma_srq *srq, struct ib_srq_attr *srq_attr)
2317{ 2329{
2318 int status = -ENOMEM; 2330 int status = -ENOMEM;
2319 struct ocrdma_modify_srq *cmd; 2331 struct ocrdma_modify_srq *cmd;
2320 struct ocrdma_dev *dev = get_ocrdma_dev(srq->ibsrq.device); 2332 struct ocrdma_pd *pd = srq->pd;
2333 struct ocrdma_dev *dev = get_ocrdma_dev(pd->ibpd.device);
2321 2334
2322 cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_CREATE_SRQ, sizeof(*cmd)); 2335 cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_CREATE_SRQ, sizeof(*cmd));
2323 if (!cmd) 2336 if (!cmd)
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_sli.h b/drivers/infiniband/hw/ocrdma/ocrdma_sli.h
index 6cf5a96f38c6..bfd0acb5659d 100644
--- a/drivers/infiniband/hw/ocrdma/ocrdma_sli.h
+++ b/drivers/infiniband/hw/ocrdma/ocrdma_sli.h
@@ -95,12 +95,11 @@ enum {
95 95
96enum { 96enum {
97 OCRDMA_DB_RQ_OFFSET = 0xE0, 97 OCRDMA_DB_RQ_OFFSET = 0xE0,
98 OCRDMA_DB_GEN2_RQ1_OFFSET = 0x100, 98 OCRDMA_DB_GEN2_RQ_OFFSET = 0x100,
99 OCRDMA_DB_GEN2_RQ2_OFFSET = 0xC0,
100 OCRDMA_DB_SQ_OFFSET = 0x60, 99 OCRDMA_DB_SQ_OFFSET = 0x60,
101 OCRDMA_DB_GEN2_SQ_OFFSET = 0x1C0, 100 OCRDMA_DB_GEN2_SQ_OFFSET = 0x1C0,
102 OCRDMA_DB_SRQ_OFFSET = OCRDMA_DB_RQ_OFFSET, 101 OCRDMA_DB_SRQ_OFFSET = OCRDMA_DB_RQ_OFFSET,
103 OCRDMA_DB_GEN2_SRQ_OFFSET = OCRDMA_DB_GEN2_RQ1_OFFSET, 102 OCRDMA_DB_GEN2_SRQ_OFFSET = OCRDMA_DB_GEN2_RQ_OFFSET,
104 OCRDMA_DB_CQ_OFFSET = 0x120, 103 OCRDMA_DB_CQ_OFFSET = 0x120,
105 OCRDMA_DB_EQ_OFFSET = OCRDMA_DB_CQ_OFFSET, 104 OCRDMA_DB_EQ_OFFSET = OCRDMA_DB_CQ_OFFSET,
106 OCRDMA_DB_MQ_OFFSET = 0x140 105 OCRDMA_DB_MQ_OFFSET = 0x140
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
index 7698572b79fb..9e1d8c6bde52 100644
--- a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
+++ b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
@@ -930,9 +930,8 @@ static int ocrdma_copy_qp_uresp(struct ocrdma_qp *qp,
930 uresp.db_page_size = dev->nic_info.db_page_size; 930 uresp.db_page_size = dev->nic_info.db_page_size;
931 if (dev->nic_info.dev_family == OCRDMA_GEN2_FAMILY) { 931 if (dev->nic_info.dev_family == OCRDMA_GEN2_FAMILY) {
932 uresp.db_sq_offset = OCRDMA_DB_GEN2_SQ_OFFSET; 932 uresp.db_sq_offset = OCRDMA_DB_GEN2_SQ_OFFSET;
933 uresp.db_rq_offset = ((qp->id & 0xFFFF) < 128) ? 933 uresp.db_rq_offset = OCRDMA_DB_GEN2_RQ_OFFSET;
934 OCRDMA_DB_GEN2_RQ1_OFFSET : OCRDMA_DB_GEN2_RQ2_OFFSET; 934 uresp.db_shift = 24;
935 uresp.db_shift = (qp->id < 128) ? 24 : 16;
936 } else { 935 } else {
937 uresp.db_sq_offset = OCRDMA_DB_SQ_OFFSET; 936 uresp.db_sq_offset = OCRDMA_DB_SQ_OFFSET;
938 uresp.db_rq_offset = OCRDMA_DB_RQ_OFFSET; 937 uresp.db_rq_offset = OCRDMA_DB_RQ_OFFSET;
@@ -975,8 +974,7 @@ static void ocrdma_set_qp_db(struct ocrdma_dev *dev, struct ocrdma_qp *qp,
975 OCRDMA_DB_GEN2_SQ_OFFSET; 974 OCRDMA_DB_GEN2_SQ_OFFSET;
976 qp->rq_db = dev->nic_info.db + 975 qp->rq_db = dev->nic_info.db +
977 (pd->id * dev->nic_info.db_page_size) + 976 (pd->id * dev->nic_info.db_page_size) +
978 ((qp->id < 128) ? 977 OCRDMA_DB_GEN2_RQ_OFFSET;
979 OCRDMA_DB_GEN2_RQ1_OFFSET : OCRDMA_DB_GEN2_RQ2_OFFSET);
980 } else { 978 } else {
981 qp->sq_db = dev->nic_info.db + 979 qp->sq_db = dev->nic_info.db +
982 (pd->id * dev->nic_info.db_page_size) + 980 (pd->id * dev->nic_info.db_page_size) +
@@ -1399,7 +1397,7 @@ skip_cqe:
1399 spin_unlock_irqrestore(&cq->cq_lock, cq_flags); 1397 spin_unlock_irqrestore(&cq->cq_lock, cq_flags);
1400} 1398}
1401 1399
1402static void ocrdma_del_flush_qp(struct ocrdma_qp *qp) 1400void ocrdma_del_flush_qp(struct ocrdma_qp *qp)
1403{ 1401{
1404 int found = false; 1402 int found = false;
1405 unsigned long flags; 1403 unsigned long flags;
@@ -1496,7 +1494,7 @@ static int ocrdma_copy_srq_uresp(struct ocrdma_dev *dev, struct ocrdma_srq *srq,
1496 uresp.db_page_size = dev->nic_info.db_page_size; 1494 uresp.db_page_size = dev->nic_info.db_page_size;
1497 uresp.num_rqe_allocated = srq->rq.max_cnt; 1495 uresp.num_rqe_allocated = srq->rq.max_cnt;
1498 if (dev->nic_info.dev_family == OCRDMA_GEN2_FAMILY) { 1496 if (dev->nic_info.dev_family == OCRDMA_GEN2_FAMILY) {
1499 uresp.db_rq_offset = OCRDMA_DB_GEN2_RQ1_OFFSET; 1497 uresp.db_rq_offset = OCRDMA_DB_GEN2_RQ_OFFSET;
1500 uresp.db_shift = 24; 1498 uresp.db_shift = 24;
1501 } else { 1499 } else {
1502 uresp.db_rq_offset = OCRDMA_DB_RQ_OFFSET; 1500 uresp.db_rq_offset = OCRDMA_DB_RQ_OFFSET;
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.h b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.h
index 7f3056731af1..b8f7853fd36c 100644
--- a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.h
+++ b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.h
@@ -72,6 +72,7 @@ int ocrdma_query_qp(struct ib_qp *,
72 struct ib_qp_attr *qp_attr, 72 struct ib_qp_attr *qp_attr,
73 int qp_attr_mask, struct ib_qp_init_attr *); 73 int qp_attr_mask, struct ib_qp_init_attr *);
74int ocrdma_destroy_qp(struct ib_qp *); 74int ocrdma_destroy_qp(struct ib_qp *);
75void ocrdma_del_flush_qp(struct ocrdma_qp *qp);
75 76
76struct ib_srq *ocrdma_create_srq(struct ib_pd *, struct ib_srq_init_attr *, 77struct ib_srq *ocrdma_create_srq(struct ib_pd *, struct ib_srq_init_attr *,
77 struct ib_udata *); 78 struct ib_udata *);