diff options
author | Mitesh Ahuja <mitesh.ahuja@emulex.Com> | 2014-06-10 10:02:21 -0400 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2014-08-01 18:07:36 -0400 |
commit | 6dab02648c4c8bb58b35efccf29291d7970aeb68 (patch) | |
tree | 0b37e9117f5a2ca796c2d28d1449cc7b6035160f /drivers/infiniband/hw/ocrdma/ocrdma_hw.c | |
parent | f252b5dc36e26368c7161f32ef304c30cd2d1f6c (diff) |
RDMA/ocrdma: Do proper cleanup even if FW is in error state
If any mailbox command reports timeout, save the state in the driver,
to prevent issuing any more commands to the HW. Do proper cleanup
even if FW is in error state.
Signed-off-by: Mitesh Ahuja <mitesh.ahuja@emulex.Com>
Signed-off-by: Selvin Xavier <selvin.xavier@emulex.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
Diffstat (limited to 'drivers/infiniband/hw/ocrdma/ocrdma_hw.c')
-rw-r--r-- | drivers/infiniband/hw/ocrdma/ocrdma_hw.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c index 55308b667649..5b6e9d9c779e 100644 --- a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c +++ b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c | |||
@@ -966,8 +966,12 @@ static int ocrdma_wait_mqe_cmpl(struct ocrdma_dev *dev) | |||
966 | msecs_to_jiffies(30000)); | 966 | msecs_to_jiffies(30000)); |
967 | if (status) | 967 | if (status) |
968 | return 0; | 968 | return 0; |
969 | else | 969 | else { |
970 | dev->mqe_ctx.fw_error_state = true; | ||
971 | pr_err("%s(%d) mailbox timeout: fw not responding\n", | ||
972 | __func__, dev->id); | ||
970 | return -1; | 973 | return -1; |
974 | } | ||
971 | } | 975 | } |
972 | 976 | ||
973 | /* issue a mailbox command on the MQ */ | 977 | /* issue a mailbox command on the MQ */ |
@@ -979,6 +983,8 @@ static int ocrdma_mbx_cmd(struct ocrdma_dev *dev, struct ocrdma_mqe *mqe) | |||
979 | struct ocrdma_mbx_rsp *rsp = NULL; | 983 | struct ocrdma_mbx_rsp *rsp = NULL; |
980 | 984 | ||
981 | mutex_lock(&dev->mqe_ctx.lock); | 985 | mutex_lock(&dev->mqe_ctx.lock); |
986 | if (dev->mqe_ctx.fw_error_state) | ||
987 | goto mbx_err; | ||
982 | ocrdma_post_mqe(dev, mqe); | 988 | ocrdma_post_mqe(dev, mqe); |
983 | status = ocrdma_wait_mqe_cmpl(dev); | 989 | status = ocrdma_wait_mqe_cmpl(dev); |
984 | if (status) | 990 | if (status) |