Commit da92b393 authored by Jitendra Kalsaria's avatar Jitendra Kalsaria Committed by David S. Miller

qlge:Fix crash caused by mailbox execution on wedged chip.

When we are in a recover process from a chip fatal error,
	driver should skip over execution of mailbox commands during
	resetting chip.
Signed-off-by: default avatarJitendra Kalsaria <jitendra.kalsaria@qlogic.com>
Signed-off-by: default avatarRon Mercer <ron.mercer@qlogic.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b00897b8
...@@ -1996,6 +1996,7 @@ enum { ...@@ -1996,6 +1996,7 @@ enum {
QL_LB_LINK_UP = 10, QL_LB_LINK_UP = 10,
QL_FRC_COREDUMP = 11, QL_FRC_COREDUMP = 11,
QL_EEH_FATAL = 12, QL_EEH_FATAL = 12,
QL_ASIC_RECOVERY = 14, /* We are in ascic recovery. */
}; };
/* link_status bit definitions */ /* link_status bit definitions */
......
...@@ -2152,6 +2152,10 @@ void ql_queue_asic_error(struct ql_adapter *qdev) ...@@ -2152,6 +2152,10 @@ void ql_queue_asic_error(struct ql_adapter *qdev)
* thread * thread
*/ */
clear_bit(QL_ADAPTER_UP, &qdev->flags); clear_bit(QL_ADAPTER_UP, &qdev->flags);
/* Set asic recovery bit to indicate reset process that we are
* in fatal error recovery process rather than normal close
*/
set_bit(QL_ASIC_RECOVERY, &qdev->flags);
queue_delayed_work(qdev->workqueue, &qdev->asic_reset_work, 0); queue_delayed_work(qdev->workqueue, &qdev->asic_reset_work, 0);
} }
...@@ -3818,11 +3822,17 @@ static int ql_adapter_reset(struct ql_adapter *qdev) ...@@ -3818,11 +3822,17 @@ static int ql_adapter_reset(struct ql_adapter *qdev)
end_jiffies = jiffies + end_jiffies = jiffies +
max((unsigned long)1, usecs_to_jiffies(30)); max((unsigned long)1, usecs_to_jiffies(30));
/* Check if bit is set then skip the mailbox command and
* clear the bit, else we are in normal reset process.
*/
if (!test_bit(QL_ASIC_RECOVERY, &qdev->flags)) {
/* Stop management traffic. */ /* Stop management traffic. */
ql_mb_set_mgmnt_traffic_ctl(qdev, MB_SET_MPI_TFK_STOP); ql_mb_set_mgmnt_traffic_ctl(qdev, MB_SET_MPI_TFK_STOP);
/* Wait for the NIC and MGMNT FIFOs to empty. */ /* Wait for the NIC and MGMNT FIFOs to empty. */
ql_wait_fifo_empty(qdev); ql_wait_fifo_empty(qdev);
} else
clear_bit(QL_ASIC_RECOVERY, &qdev->flags);
ql_write32(qdev, RST_FO, (RST_FO_FR << 16) | RST_FO_FR); ql_write32(qdev, RST_FO, (RST_FO_FR << 16) | RST_FO_FR);
......
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