aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/hw
diff options
context:
space:
mode:
authorSelvin Xavier <selvin.xavier@emulex.com>2014-02-04 01:27:06 -0500
committerRoland Dreier <roland@purestorage.com>2014-04-03 11:30:05 -0400
commitbbc5ec524eecf8af95b81c3c1d15cbc672568b4e (patch)
tree6405270e42ad8fbde4654cd3fb7957fabc666bd2 /drivers/infiniband/hw
parent1228056bcff2e4029c3d9d5d31cf122eea3a4c6a (diff)
RDMA/ocrdma: Support non-embedded mailbox commands
Added a routine to issue non-embedded mailbox commands for handling large mailbox request/response data. Signed-off-by: Selvin Xavier <selvin.xavier@emulex.com> Signed-off-by: Devesh Sharma <devesh.sharma@emulex.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
Diffstat (limited to 'drivers/infiniband/hw')
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma_hw.c55
1 files changed, 47 insertions, 8 deletions
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
index ebcb26079daf..e6797ff4c99b 100644
--- a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
+++ b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
@@ -953,7 +953,8 @@ static int ocrdma_mbx_cmd(struct ocrdma_dev *dev, struct ocrdma_mqe *mqe)
953{ 953{
954 int status = 0; 954 int status = 0;
955 u16 cqe_status, ext_status; 955 u16 cqe_status, ext_status;
956 struct ocrdma_mqe *rsp; 956 struct ocrdma_mqe *rsp_mqe;
957 struct ocrdma_mbx_rsp *rsp = NULL;
957 958
958 mutex_lock(&dev->mqe_ctx.lock); 959 mutex_lock(&dev->mqe_ctx.lock);
959 ocrdma_post_mqe(dev, mqe); 960 ocrdma_post_mqe(dev, mqe);
@@ -962,23 +963,61 @@ static int ocrdma_mbx_cmd(struct ocrdma_dev *dev, struct ocrdma_mqe *mqe)
962 goto mbx_err; 963 goto mbx_err;
963 cqe_status = dev->mqe_ctx.cqe_status; 964 cqe_status = dev->mqe_ctx.cqe_status;
964 ext_status = dev->mqe_ctx.ext_status; 965 ext_status = dev->mqe_ctx.ext_status;
965 rsp = ocrdma_get_mqe_rsp(dev); 966 rsp_mqe = ocrdma_get_mqe_rsp(dev);
966 ocrdma_copy_le32_to_cpu(mqe, rsp, (sizeof(*mqe))); 967 ocrdma_copy_le32_to_cpu(mqe, rsp_mqe, (sizeof(*mqe)));
968 if ((mqe->hdr.spcl_sge_cnt_emb & OCRDMA_MQE_HDR_EMB_MASK) >>
969 OCRDMA_MQE_HDR_EMB_SHIFT)
970 rsp = &mqe->u.rsp;
971
967 if (cqe_status || ext_status) { 972 if (cqe_status || ext_status) {
968 pr_err("%s() opcode=0x%x, cqe_status=0x%x, ext_status=0x%x\n", 973 pr_err("%s() cqe_status=0x%x, ext_status=0x%x,",
969 __func__, 974 __func__, cqe_status, ext_status);
970 (rsp->u.rsp.subsys_op & OCRDMA_MBX_RSP_OPCODE_MASK) >> 975 if (rsp) {
971 OCRDMA_MBX_RSP_OPCODE_SHIFT, cqe_status, ext_status); 976 /* This is for embedded cmds. */
977 pr_err("opcode=0x%x, subsystem=0x%x\n",
978 (rsp->subsys_op & OCRDMA_MBX_RSP_OPCODE_MASK) >>
979 OCRDMA_MBX_RSP_OPCODE_SHIFT,
980 (rsp->subsys_op & OCRDMA_MBX_RSP_SUBSYS_MASK) >>
981 OCRDMA_MBX_RSP_SUBSYS_SHIFT);
982 }
972 status = ocrdma_get_mbx_cqe_errno(cqe_status); 983 status = ocrdma_get_mbx_cqe_errno(cqe_status);
973 goto mbx_err; 984 goto mbx_err;
974 } 985 }
975 if (mqe->u.rsp.status & OCRDMA_MBX_RSP_STATUS_MASK) 986 /* For non embedded, rsp errors are handled in ocrdma_nonemb_mbx_cmd */
987 if (rsp && (mqe->u.rsp.status & OCRDMA_MBX_RSP_STATUS_MASK))
976 status = ocrdma_get_mbx_errno(mqe->u.rsp.status); 988 status = ocrdma_get_mbx_errno(mqe->u.rsp.status);
977mbx_err: 989mbx_err:
978 mutex_unlock(&dev->mqe_ctx.lock); 990 mutex_unlock(&dev->mqe_ctx.lock);
979 return status; 991 return status;
980} 992}
981 993
994static int ocrdma_nonemb_mbx_cmd(struct ocrdma_dev *dev, struct ocrdma_mqe *mqe,
995 void *payload_va)
996{
997 int status = 0;
998 struct ocrdma_mbx_rsp *rsp = payload_va;
999
1000 if ((mqe->hdr.spcl_sge_cnt_emb & OCRDMA_MQE_HDR_EMB_MASK) >>
1001 OCRDMA_MQE_HDR_EMB_SHIFT)
1002 BUG();
1003
1004 status = ocrdma_mbx_cmd(dev, mqe);
1005 if (!status)
1006 /* For non embedded, only CQE failures are handled in
1007 * ocrdma_mbx_cmd. We need to check for RSP errors.
1008 */
1009 if (rsp->status & OCRDMA_MBX_RSP_STATUS_MASK)
1010 status = ocrdma_get_mbx_errno(rsp->status);
1011
1012 if (status)
1013 pr_err("opcode=0x%x, subsystem=0x%x\n",
1014 (rsp->subsys_op & OCRDMA_MBX_RSP_OPCODE_MASK) >>
1015 OCRDMA_MBX_RSP_OPCODE_SHIFT,
1016 (rsp->subsys_op & OCRDMA_MBX_RSP_SUBSYS_MASK) >>
1017 OCRDMA_MBX_RSP_SUBSYS_SHIFT);
1018 return status;
1019}
1020
982static void ocrdma_get_attr(struct ocrdma_dev *dev, 1021static void ocrdma_get_attr(struct ocrdma_dev *dev,
983 struct ocrdma_dev_attr *attr, 1022 struct ocrdma_dev_attr *attr,
984 struct ocrdma_mbx_query_config *rsp) 1023 struct ocrdma_mbx_query_config *rsp)