aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
diff options
context:
space:
mode:
authorMitesh Ahuja <mitesh.ahuja@emulex.Com>2014-06-10 10:02:21 -0400
committerRoland Dreier <roland@purestorage.com>2014-08-01 18:07:36 -0400
commit6dab02648c4c8bb58b35efccf29291d7970aeb68 (patch)
tree0b37e9117f5a2ca796c2d28d1449cc7b6035160f /drivers/infiniband/hw/ocrdma/ocrdma_hw.c
parentf252b5dc36e26368c7161f32ef304c30cd2d1f6c (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.c8
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)