| From d118ff085eb79d663c58d6666d5f7be09db94fbf Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 31 Aug 2018 11:24:37 -0700 |
| Subject: scsi: qla2xxx: Defer chip reset until target mode is enabled |
| |
| From: Quinn Tran <quinn.tran@cavium.com> |
| |
| [ Upstream commit 93eca6135183f7a71e36acd47655a085ed11bcdc ] |
| |
| For target mode, any chip reset triggered before target mode is enabled will |
| be held off until user is ready to enable. This prevents the chip from |
| starting or running before it is intended. |
| |
| Signed-off-by: Quinn Tran <quinn.tran@cavium.com> |
| Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com> |
| Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/scsi/qla2xxx/qla_os.c | 28 +++++++++++++++++++++------- |
| 1 file changed, 21 insertions(+), 7 deletions(-) |
| |
| diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c |
| index 18ee614fe07f5..d978ea1344625 100644 |
| --- a/drivers/scsi/qla2xxx/qla_os.c |
| +++ b/drivers/scsi/qla2xxx/qla_os.c |
| @@ -6059,12 +6059,27 @@ qla2x00_do_dpc(void *data) |
| if (test_and_clear_bit |
| (ISP_ABORT_NEEDED, &base_vha->dpc_flags) && |
| !test_bit(UNLOADING, &base_vha->dpc_flags)) { |
| + bool do_reset = true; |
| + |
| + switch (ql2x_ini_mode) { |
| + case QLA2XXX_INI_MODE_ENABLED: |
| + break; |
| + case QLA2XXX_INI_MODE_DISABLED: |
| + if (!qla_tgt_mode_enabled(base_vha)) |
| + do_reset = false; |
| + break; |
| + case QLA2XXX_INI_MODE_DUAL: |
| + if (!qla_dual_mode_enabled(base_vha)) |
| + do_reset = false; |
| + break; |
| + default: |
| + break; |
| + } |
| |
| - ql_dbg(ql_dbg_dpc, base_vha, 0x4007, |
| - "ISP abort scheduled.\n"); |
| - if (!(test_and_set_bit(ABORT_ISP_ACTIVE, |
| + if (do_reset && !(test_and_set_bit(ABORT_ISP_ACTIVE, |
| &base_vha->dpc_flags))) { |
| - |
| + ql_dbg(ql_dbg_dpc, base_vha, 0x4007, |
| + "ISP abort scheduled.\n"); |
| if (ha->isp_ops->abort_isp(base_vha)) { |
| /* failed. retry later */ |
| set_bit(ISP_ABORT_NEEDED, |
| @@ -6072,10 +6087,9 @@ qla2x00_do_dpc(void *data) |
| } |
| clear_bit(ABORT_ISP_ACTIVE, |
| &base_vha->dpc_flags); |
| + ql_dbg(ql_dbg_dpc, base_vha, 0x4008, |
| + "ISP abort end.\n"); |
| } |
| - |
| - ql_dbg(ql_dbg_dpc, base_vha, 0x4008, |
| - "ISP abort end.\n"); |
| } |
| |
| if (test_and_clear_bit(FCPORT_UPDATE_NEEDED, |
| -- |
| 2.20.1 |
| |