]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
scsi: qla2xxx: Defer chip reset until target mode is enabled
authorQuinn Tran <quinn.tran@cavium.com>
Fri, 31 Aug 2018 18:24:37 +0000 (11:24 -0700)
committerStefan Bader <stefan.bader@canonical.com>
Tue, 26 Nov 2019 12:16:34 +0000 (13:16 +0100)
BugLink: https://bugs.launchpad.net/bugs/1853915
[ 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>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Khalid Elmously <khalid.elmously@canonical.com>
drivers/scsi/qla2xxx/qla_os.c

index 1b38d814f2c86389cd9f96e40eceb3aa280e1eae..6002b46d6e83bbc2d9f1016de860f3fba371d52b 100644 (file)
@@ -5892,12 +5892,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,
@@ -5905,10 +5920,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,