提交 6dab0264 编写于 作者: M Mitesh Ahuja 提交者: Roland Dreier

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: NMitesh Ahuja <mitesh.ahuja@emulex.Com>
Signed-off-by: NSelvin Xavier <selvin.xavier@emulex.com>
Signed-off-by: NRoland Dreier <roland@purestorage.com>
上级 f252b5dc
...@@ -137,6 +137,7 @@ struct mqe_ctx { ...@@ -137,6 +137,7 @@ struct mqe_ctx {
u16 cqe_status; u16 cqe_status;
u16 ext_status; u16 ext_status;
bool cmd_done; bool cmd_done;
bool fw_error_state;
}; };
struct ocrdma_hw_mr { struct ocrdma_hw_mr {
......
...@@ -966,8 +966,12 @@ static int ocrdma_wait_mqe_cmpl(struct ocrdma_dev *dev) ...@@ -966,8 +966,12 @@ static int ocrdma_wait_mqe_cmpl(struct ocrdma_dev *dev)
msecs_to_jiffies(30000)); msecs_to_jiffies(30000));
if (status) if (status)
return 0; return 0;
else else {
dev->mqe_ctx.fw_error_state = true;
pr_err("%s(%d) mailbox timeout: fw not responding\n",
__func__, dev->id);
return -1; return -1;
}
} }
/* issue a mailbox command on the MQ */ /* 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,6 +983,8 @@ static int ocrdma_mbx_cmd(struct ocrdma_dev *dev, struct ocrdma_mqe *mqe)
struct ocrdma_mbx_rsp *rsp = NULL; struct ocrdma_mbx_rsp *rsp = NULL;
mutex_lock(&dev->mqe_ctx.lock); mutex_lock(&dev->mqe_ctx.lock);
if (dev->mqe_ctx.fw_error_state)
goto mbx_err;
ocrdma_post_mqe(dev, mqe); ocrdma_post_mqe(dev, mqe);
status = ocrdma_wait_mqe_cmpl(dev); status = ocrdma_wait_mqe_cmpl(dev);
if (status) if (status)
......
...@@ -329,7 +329,10 @@ static int ocrdma_dealloc_ucontext_pd(struct ocrdma_ucontext *uctx) ...@@ -329,7 +329,10 @@ static int ocrdma_dealloc_ucontext_pd(struct ocrdma_ucontext *uctx)
struct ocrdma_pd *pd = uctx->cntxt_pd; struct ocrdma_pd *pd = uctx->cntxt_pd;
struct ocrdma_dev *dev = get_ocrdma_dev(pd->ibpd.device); struct ocrdma_dev *dev = get_ocrdma_dev(pd->ibpd.device);
BUG_ON(uctx->pd_in_use); if (uctx->pd_in_use) {
pr_err("%s(%d) Freeing in use pdid=0x%x.\n",
__func__, dev->id, pd->id);
}
uctx->cntxt_pd = NULL; uctx->cntxt_pd = NULL;
status = _ocrdma_dealloc_pd(dev, pd); status = _ocrdma_dealloc_pd(dev, pd);
return status; return status;
...@@ -844,6 +847,13 @@ int ocrdma_dereg_mr(struct ib_mr *ib_mr) ...@@ -844,6 +847,13 @@ int ocrdma_dereg_mr(struct ib_mr *ib_mr)
if (mr->umem) if (mr->umem)
ib_umem_release(mr->umem); ib_umem_release(mr->umem);
kfree(mr); kfree(mr);
/* Don't stop cleanup, in case FW is unresponsive */
if (dev->mqe_ctx.fw_error_state) {
status = 0;
pr_err("%s(%d) fw not responding.\n",
__func__, dev->id);
}
return status; return status;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册