diff options
author | Naresh Gottumukkala <bgottumukkala@emulex.com> | 2013-08-26 05:57:42 -0400 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2013-09-03 00:17:55 -0400 |
commit | f11220ee69f72cf08479f28fd494264ac6a9349b (patch) | |
tree | b52bdbc7b6024b76787fab612975093db688f40d | |
parent | c88bd03ffccdb069fd9541bea347bdab8f4e7e6a (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.c | 21 | ||||
-rw-r--r-- | drivers/infiniband/hw/ocrdma/ocrdma_sli.h | 5 | ||||
-rw-r--r-- | drivers/infiniband/hw/ocrdma/ocrdma_verbs.c | 12 | ||||
-rw-r--r-- | drivers/infiniband/hw/ocrdma/ocrdma_verbs.h | 1 |
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 | ||
1657 | static 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 | |||
1657 | int ocrdma_qp_state_change(struct ocrdma_qp *qp, enum ib_qp_state new_ib_state, | 1665 | int 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 | ||
96 | enum { | 96 | enum { |
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 | ||
1402 | static void ocrdma_del_flush_qp(struct ocrdma_qp *qp) | 1400 | void 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 *); |
74 | int ocrdma_destroy_qp(struct ib_qp *); | 74 | int ocrdma_destroy_qp(struct ib_qp *); |
75 | void ocrdma_del_flush_qp(struct ocrdma_qp *qp); | ||
75 | 76 | ||
76 | struct ib_srq *ocrdma_create_srq(struct ib_pd *, struct ib_srq_init_attr *, | 77 | struct ib_srq *ocrdma_create_srq(struct ib_pd *, struct ib_srq_init_attr *, |
77 | struct ib_udata *); | 78 | struct ib_udata *); |