Commit 35570cfe authored by Manish Chopra's avatar Manish Chopra Committed by David S. Miller

qlcnic: Flush mailbox command list when mailbox is not available

o Driver was hitting a panic at the time of adapter reset due to invalid command
  access from the list which had been already freed by the queuing thread.
  Flush all the pending commands from the list before proceeding with adapter reset
Signed-off-by: default avatarManish Chopra <manish.chopra@qlogic.com>
Signed-off-by: default avatarSucheta Chakraborty <sucheta.chakraborty@qlogic.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 91b86e3d
...@@ -3515,6 +3515,8 @@ static inline void qlcnic_83xx_flush_mbx_queue(struct qlcnic_adapter *adapter) ...@@ -3515,6 +3515,8 @@ static inline void qlcnic_83xx_flush_mbx_queue(struct qlcnic_adapter *adapter)
while (!list_empty(head)) { while (!list_empty(head)) {
cmd = list_entry(head->next, struct qlcnic_cmd_args, list); cmd = list_entry(head->next, struct qlcnic_cmd_args, list);
dev_info(&adapter->pdev->dev, "%s: Mailbox command 0x%x\n",
__func__, cmd->cmd_op);
list_del(&cmd->list); list_del(&cmd->list);
mbx->num_cmds--; mbx->num_cmds--;
qlcnic_83xx_notify_cmd_completion(adapter, cmd); qlcnic_83xx_notify_cmd_completion(adapter, cmd);
...@@ -3534,6 +3536,7 @@ static inline int qlcnic_83xx_check_mbx_status(struct qlcnic_adapter *adapter) ...@@ -3534,6 +3536,7 @@ static inline int qlcnic_83xx_check_mbx_status(struct qlcnic_adapter *adapter)
host_mbx_ctrl = QLCRDX(ahw, QLCNIC_HOST_MBX_CTRL); host_mbx_ctrl = QLCRDX(ahw, QLCNIC_HOST_MBX_CTRL);
if (host_mbx_ctrl) { if (host_mbx_ctrl) {
clear_bit(QLC_83XX_MBX_READY, &mbx->status);
ahw->idc.collect_dump = 1; ahw->idc.collect_dump = 1;
return -EIO; return -EIO;
} }
...@@ -3704,8 +3707,10 @@ static void qlcnic_83xx_mailbox_worker(struct work_struct *work) ...@@ -3704,8 +3707,10 @@ static void qlcnic_83xx_mailbox_worker(struct work_struct *work)
ahw = adapter->ahw; ahw = adapter->ahw;
while (true) { while (true) {
if (qlcnic_83xx_check_mbx_status(adapter)) if (qlcnic_83xx_check_mbx_status(adapter)) {
qlcnic_83xx_flush_mbx_queue(adapter);
return; return;
}
atomic_set(rsp_status, QLC_83XX_MBX_RESPONSE_WAIT); atomic_set(rsp_status, QLC_83XX_MBX_RESPONSE_WAIT);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment