diff options
author | Selvin Xavier <selvin.xavier@emulex.com> | 2014-02-04 01:27:06 -0500 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2014-04-03 11:30:05 -0400 |
commit | bbc5ec524eecf8af95b81c3c1d15cbc672568b4e (patch) | |
tree | 6405270e42ad8fbde4654cd3fb7957fabc666bd2 /drivers/infiniband/hw | |
parent | 1228056bcff2e4029c3d9d5d31cf122eea3a4c6a (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.c | 55 |
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); |
977 | mbx_err: | 989 | mbx_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 | ||
994 | static 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 | |||
982 | static void ocrdma_get_attr(struct ocrdma_dev *dev, | 1021 | static 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) |