scsi: qla2xxx: Remove defer flag to indicate immeadiate port loss
authorHimanshu Madhani <hmadhani@marvell.com>
Tue, 17 Dec 2019 22:06:04 +0000 (14:06 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 20 Dec 2019 03:42:44 +0000 (22:42 -0500)
During cable pull test case, if the port is disconnected for time larger
than devloss timeout, driver does not mark path offline.  In such case,
instead of notifying SCSI-ML of loop down, driver goes into endless loop of
device relogin because defer flag is set.

With newer handling of device relogin in driver discovery, defer flag is
now redundant. This patch removes defer flag and cleans up code handling
port lost indication to SCSI-ML.

Link: https://lore.kernel.org/r/20191217220617.28084-2-hmadhani@marvell.com
Signed-off-by: Quinn Tran <qtran@marvell.com>
Signed-off-by: Himanshu Madhani <hmadhani@marvell.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/qla2xxx/qla_gbl.h
drivers/scsi/qla2xxx/qla_init.c
drivers/scsi/qla2xxx/qla_isr.c
drivers/scsi/qla2xxx/qla_mid.c
drivers/scsi/qla2xxx/qla_mr.c
drivers/scsi/qla2xxx/qla_nx.c
drivers/scsi/qla2xxx/qla_os.c
drivers/scsi/qla2xxx/qla_target.c

index 5b163ad85c34f8488f21a4e6303dee93162fa542..51916183cbe93074ed428c75bc50fd48231f027e 100644 (file)
@@ -253,8 +253,8 @@ extern scsi_qla_host_t *qla24xx_create_vhost(struct fc_vport *);
 extern void qla2x00_sp_free_dma(srb_t *sp);
 extern char *qla2x00_get_fw_version_str(struct scsi_qla_host *, char *);
 
-extern void qla2x00_mark_device_lost(scsi_qla_host_t *, fc_port_t *, int, int);
-extern void qla2x00_mark_all_devices_lost(scsi_qla_host_t *, int);
+extern void qla2x00_mark_device_lost(scsi_qla_host_t *, fc_port_t *, int);
+extern void qla2x00_mark_all_devices_lost(scsi_qla_host_t *);
 
 extern struct fw_blob *qla2x00_request_firmware(scsi_qla_host_t *);
 
index aa5204163becadc2e88133779eefaafde4e79103..c689e34a5235f5b7510d8bce046c8d81ab57a0c4 100644 (file)
@@ -425,7 +425,7 @@ qla2x00_async_prlo_done(struct scsi_qla_host *vha, fc_port_t *fcport,
        fcport->flags &= ~FCF_ASYNC_ACTIVE;
        /* Don't re-login in target mode */
        if (!fcport->tgt_session)
-               qla2x00_mark_device_lost(vha, fcport, 1, 0);
+               qla2x00_mark_device_lost(vha, fcport, 1);
        qlt_logo_completion_handler(fcport, data[0]);
 }
 
@@ -2000,7 +2000,7 @@ qla24xx_handle_plogi_done_event(struct scsi_qla_host *vha, struct event_arg *ea)
                if (ea->data[1] & QLA_LOGIO_LOGIN_RETRIED)
                        set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
                else
-                       qla2x00_mark_device_lost(vha, ea->fcport, 1, 0);
+                       qla2x00_mark_device_lost(vha, ea->fcport, 1);
                break;
        case MBS_LOOP_ID_USED:
                /* data[1] = IO PARAM 1 = nport ID  */
@@ -5230,7 +5230,7 @@ skip_login:
                            qla_ini_mode_enabled(vha)) &&
                            atomic_read(&fcport->state) == FCS_ONLINE) {
                                qla2x00_mark_device_lost(vha, fcport,
-                                       ql2xplogiabsentdevice, 0);
+                                       ql2xplogiabsentdevice);
                                if (fcport->loop_id != FC_NO_LOOP_ID &&
                                    (fcport->flags & FCF_FCP2_DEVICE) == 0 &&
                                    fcport->port_type != FCT_INITIATOR &&
@@ -5905,7 +5905,7 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha)
                            qla_ini_mode_enabled(vha)) &&
                            atomic_read(&fcport->state) == FCS_ONLINE) {
                                qla2x00_mark_device_lost(vha, fcport,
-                                       ql2xplogiabsentdevice, 0);
+                                       ql2xplogiabsentdevice);
                                if (fcport->loop_id != FC_NO_LOOP_ID &&
                                    (fcport->flags & FCF_FCP2_DEVICE) == 0 &&
                                    fcport->port_type != FCT_INITIATOR &&
@@ -6071,7 +6071,7 @@ qla2x00_fabric_login(scsi_qla_host_t *vha, fc_port_t *fcport,
                        ha->isp_ops->fabric_logout(vha, fcport->loop_id,
                            fcport->d_id.b.domain, fcport->d_id.b.area,
                            fcport->d_id.b.al_pa);
-                       qla2x00_mark_device_lost(vha, fcport, 1, 0);
+                       qla2x00_mark_device_lost(vha, fcport, 1);
 
                        rval = 1;
                        break;
@@ -6585,9 +6585,9 @@ qla2x00_quiesce_io(scsi_qla_host_t *vha)
        atomic_set(&ha->loop_down_timer, LOOP_DOWN_TIME);
        if (atomic_read(&vha->loop_state) != LOOP_DOWN) {
                atomic_set(&vha->loop_state, LOOP_DOWN);
-               qla2x00_mark_all_devices_lost(vha, 0);
+               qla2x00_mark_all_devices_lost(vha);
                list_for_each_entry(vp, &ha->vp_list, list)
-                       qla2x00_mark_all_devices_lost(vp, 0);
+                       qla2x00_mark_all_devices_lost(vp);
        } else {
                if (!atomic_read(&vha->loop_down_timer))
                        atomic_set(&vha->loop_down_timer,
@@ -6663,14 +6663,14 @@ qla2x00_abort_isp_cleanup(scsi_qla_host_t *vha)
        atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME);
        if (atomic_read(&vha->loop_state) != LOOP_DOWN) {
                atomic_set(&vha->loop_state, LOOP_DOWN);
-               qla2x00_mark_all_devices_lost(vha, 0);
+               qla2x00_mark_all_devices_lost(vha);
 
                spin_lock_irqsave(&ha->vport_slock, flags);
                list_for_each_entry(vp, &ha->vp_list, list) {
                        atomic_inc(&vp->vref_count);
                        spin_unlock_irqrestore(&ha->vport_slock, flags);
 
-                       qla2x00_mark_all_devices_lost(vp, 0);
+                       qla2x00_mark_all_devices_lost(vp);
 
                        spin_lock_irqsave(&ha->vport_slock, flags);
                        atomic_dec(&vp->vref_count);
index 7b8a6bfcf08d97c1cc1421cd67eb53dfbd8ea9c9..f60fb9c19c2630a037a25aac399572341e252b3b 100644 (file)
@@ -788,7 +788,7 @@ skip_rio:
                if (atomic_read(&vha->loop_state) != LOOP_DOWN) {
                        atomic_set(&vha->loop_state, LOOP_DOWN);
                        atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME);
-                       qla2x00_mark_all_devices_lost(vha, 1);
+                       qla2x00_mark_all_devices_lost(vha);
                }
 
                if (vha->vp_idx) {
@@ -861,7 +861,7 @@ skip_rio:
                        }
 
                        vha->device_flags |= DFLG_NO_CABLE;
-                       qla2x00_mark_all_devices_lost(vha, 1);
+                       qla2x00_mark_all_devices_lost(vha);
                }
 
                if (vha->vp_idx) {
@@ -881,7 +881,7 @@ skip_rio:
                if (atomic_read(&vha->loop_state) != LOOP_DOWN) {
                        atomic_set(&vha->loop_state, LOOP_DOWN);
                        atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME);
-                       qla2x00_mark_all_devices_lost(vha, 1);
+                       qla2x00_mark_all_devices_lost(vha);
                }
 
                if (vha->vp_idx) {
@@ -924,7 +924,7 @@ skip_rio:
                                atomic_set(&vha->loop_down_timer,
                                    LOOP_DOWN_TIME);
                        if (!N2N_TOPO(ha))
-                               qla2x00_mark_all_devices_lost(vha, 1);
+                               qla2x00_mark_all_devices_lost(vha);
                }
 
                if (vha->vp_idx) {
@@ -953,7 +953,7 @@ skip_rio:
                        if (!atomic_read(&vha->loop_down_timer))
                                atomic_set(&vha->loop_down_timer,
                                    LOOP_DOWN_TIME);
-                       qla2x00_mark_all_devices_lost(vha, 1);
+                       qla2x00_mark_all_devices_lost(vha);
                }
 
                if (vha->vp_idx) {
@@ -1022,7 +1022,6 @@ skip_rio:
                            "Marking port lost loopid=%04x portid=%06x.\n",
                            fcport->loop_id, fcport->d_id.b24);
                        if (qla_ini_mode_enabled(vha)) {
-                               qla2x00_mark_device_lost(fcport->vha, fcport, 1, 1);
                                fcport->logout_on_delete = 0;
                                qlt_schedule_sess_for_deletion(fcport);
                        }
@@ -1034,14 +1033,14 @@ global_port_update:
                                atomic_set(&vha->loop_down_timer,
                                    LOOP_DOWN_TIME);
                                vha->device_flags |= DFLG_NO_CABLE;
-                               qla2x00_mark_all_devices_lost(vha, 1);
+                               qla2x00_mark_all_devices_lost(vha);
                        }
 
                        if (vha->vp_idx) {
                                atomic_set(&vha->vp_state, VP_FAILED);
                                fc_vport_set_state(vha->fc_vport,
                                    FC_VPORT_FAILED);
-                               qla2x00_mark_all_devices_lost(vha, 1);
+                               qla2x00_mark_all_devices_lost(vha);
                        }
 
                        vha->flags.management_server_logged_in = 0;
@@ -2745,7 +2744,6 @@ check_scsi_status:
                                port_state_str[FCS_ONLINE],
                                comp_status);
 
-                       qla2x00_mark_device_lost(fcport->vha, fcport, 1, 1);
                        qlt_schedule_sess_for_deletion(fcport);
                }
 
index eabc5127174ed90c0cac48c1864826dbb35f3e15..8ae639d089d13068468a4436f03d156b00ef95df 100644 (file)
@@ -147,7 +147,7 @@ qla2x00_mark_vp_devices_dead(scsi_qla_host_t *vha)
                    "Marking port dead, loop_id=0x%04x : %x.\n",
                    fcport->loop_id, fcport->vha->vp_idx);
 
-               qla2x00_mark_device_lost(vha, fcport, 0, 0);
+               qla2x00_mark_device_lost(vha, fcport, 0);
                qla2x00_set_fcport_state(fcport, FCS_UNCONFIGURED);
        }
 }
@@ -167,7 +167,7 @@ qla24xx_disable_vp(scsi_qla_host_t *vha)
        list_for_each_entry(fcport, &vha->vp_fcports, list)
                fcport->logout_on_delete = 0;
 
-       qla2x00_mark_all_devices_lost(vha, 0);
+       qla2x00_mark_all_devices_lost(vha);
 
        /* Remove port id from vp target map */
        spin_lock_irqsave(&vha->hw->hardware_lock, flags);
@@ -327,7 +327,7 @@ qla2x00_vp_abort_isp(scsi_qla_host_t *vha)
         */
        if (atomic_read(&vha->loop_state) != LOOP_DOWN) {
                atomic_set(&vha->loop_state, LOOP_DOWN);
-               qla2x00_mark_all_devices_lost(vha, 0);
+               qla2x00_mark_all_devices_lost(vha);
        } else {
                if (!atomic_read(&vha->loop_down_timer))
                        atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME);
index 605b59c76c9010d8c82bbbfa464a02db077f7673..cb830d79cfbe08eb103fc949c003400e81a42915 100644 (file)
@@ -1210,7 +1210,7 @@ qlafx00_find_all_targets(scsi_qla_host_t *vha,
                                    " Existing TGT-ID %x did not get "
                                    " offline event from firmware.\n",
                                    fcport->old_tgt_id);
-                               qla2x00_mark_device_lost(vha, fcport, 0, 0);
+                               qla2x00_mark_device_lost(vha, fcport, 0);
                                set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
                                kfree(new_fcport);
                                return rval;
@@ -1274,7 +1274,7 @@ qlafx00_configure_all_targets(scsi_qla_host_t *vha)
 
                if (atomic_read(&fcport->state) == FCS_DEVICE_LOST) {
                        if (fcport->port_type != FCT_INITIATOR)
-                               qla2x00_mark_device_lost(vha, fcport, 0, 0);
+                               qla2x00_mark_device_lost(vha, fcport, 0);
                }
        }
 
@@ -1706,7 +1706,7 @@ qlafx00_tgt_detach(struct scsi_qla_host *vha, int tgt_id)
        if (!fcport)
                return;
 
-       qla2x00_mark_device_lost(vha, fcport, 0, 0);
+       qla2x00_mark_device_lost(vha, fcport, 0);
 
        return;
 }
@@ -1740,7 +1740,7 @@ qlafx00_process_aen(struct scsi_qla_host *vha, struct qla_work_evt *evt)
                                set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
                        } else if (evt->u.aenfx.mbx[2] == 2) {
                                vha->device_flags |= DFLG_NO_CABLE;
-                               qla2x00_mark_all_devices_lost(vha, 1);
+                               qla2x00_mark_all_devices_lost(vha);
                        }
                }
                break;
@@ -2513,7 +2513,7 @@ check_scsi_status:
                    atomic_read(&fcport->state));
 
                if (atomic_read(&fcport->state) == FCS_ONLINE)
-                       qla2x00_mark_device_lost(fcport->vha, fcport, 1, 1);
+                       qla2x00_mark_device_lost(fcport->vha, fcport, 1);
                break;
 
        case CS_ABORTED:
index 2b2028f2383e60c9cc6cf0aadad3551e294de43a..30be084ccc1b95298b7a1b4e1b72225f605a7136 100644 (file)
@@ -3030,7 +3030,7 @@ qla8xxx_dev_failed_handler(scsi_qla_host_t *vha)
        /* Set DEV_FAILED flag to disable timer */
        vha->device_flags |= DFLG_DEV_FAILED;
        qla2x00_abort_all_cmds(vha, DID_NO_CONNECT << 16);
-       qla2x00_mark_all_devices_lost(vha, 0);
+       qla2x00_mark_all_devices_lost(vha);
        vha->flags.online = 0;
        vha->flags.init_done = 0;
 }
index 8b84bc4a6ac81d59f01cf57dc26a4adda22f07f3..936036375f73c4126b34627ab2c0fe3f482741e9 100644 (file)
@@ -1110,7 +1110,7 @@ qla2x00_wait_for_sess_deletion(scsi_qla_host_t *vha)
 {
        u8 i;
 
-       qla2x00_mark_all_devices_lost(vha, 0);
+       qla2x00_mark_all_devices_lost(vha);
 
        for (i = 0; i < 10; i++) {
                if (wait_event_timeout(vha->fcport_waitQ,
@@ -1667,7 +1667,7 @@ qla2x00_loop_reset(scsi_qla_host_t *vha)
        if (ha->flags.enable_lip_full_login && !IS_CNA_CAPABLE(ha)) {
                atomic_set(&vha->loop_state, LOOP_DOWN);
                atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME);
-               qla2x00_mark_all_devices_lost(vha, 0);
+               qla2x00_mark_all_devices_lost(vha);
                ret = qla2x00_full_login_lip(vha);
                if (ret != QLA_SUCCESS) {
                        ql_dbg(ql_dbg_taskm, vha, 0x802d,
@@ -3854,37 +3854,21 @@ void qla2x00_free_fcports(struct scsi_qla_host *vha)
 }
 
 static inline void
-qla2x00_schedule_rport_del(struct scsi_qla_host *vha, fc_port_t *fcport,
-    int defer)
+qla2x00_schedule_rport_del(struct scsi_qla_host *vha, fc_port_t *fcport)
 {
-       struct fc_rport *rport;
-       scsi_qla_host_t *base_vha;
-       unsigned long flags;
+       int now;
 
        if (!fcport->rport)
                return;
 
-       rport = fcport->rport;
-       if (defer) {
-               base_vha = pci_get_drvdata(vha->hw->pdev);
-               spin_lock_irqsave(vha->host->host_lock, flags);
-               fcport->drport = rport;
-               spin_unlock_irqrestore(vha->host->host_lock, flags);
-               qlt_do_generation_tick(vha, &base_vha->total_fcport_update_gen);
-               set_bit(FCPORT_UPDATE_NEEDED, &base_vha->dpc_flags);
-               qla2xxx_wake_dpc(base_vha);
-       } else {
-               int now;
-
-               if (rport) {
-                       ql_dbg(ql_dbg_disc, fcport->vha, 0x2109,
-                           "%s %8phN. rport %p roles %x\n",
-                           __func__, fcport->port_name, rport,
-                           rport->roles);
-                       fc_remote_port_delete(rport);
-               }
-               qlt_do_generation_tick(vha, &now);
+       if (fcport->rport) {
+               ql_dbg(ql_dbg_disc, fcport->vha, 0x2109,
+                   "%s %8phN. rport %p roles %x\n",
+                   __func__, fcport->port_name, fcport->rport,
+                   fcport->rport->roles);
+               fc_remote_port_delete(fcport->rport);
        }
+       qlt_do_generation_tick(vha, &now);
 }
 
 /*
@@ -3897,18 +3881,18 @@ qla2x00_schedule_rport_del(struct scsi_qla_host *vha, fc_port_t *fcport,
  * Context:
  */
 void qla2x00_mark_device_lost(scsi_qla_host_t *vha, fc_port_t *fcport,
-    int do_login, int defer)
+    int do_login)
 {
        if (IS_QLAFX00(vha->hw)) {
                qla2x00_set_fcport_state(fcport, FCS_DEVICE_LOST);
-               qla2x00_schedule_rport_del(vha, fcport, defer);
+               qla2x00_schedule_rport_del(vha, fcport);
                return;
        }
 
        if (atomic_read(&fcport->state) == FCS_ONLINE &&
            vha->vp_idx == fcport->vha->vp_idx) {
                qla2x00_set_fcport_state(fcport, FCS_DEVICE_LOST);
-               qla2x00_schedule_rport_del(vha, fcport, defer);
+               qla2x00_schedule_rport_del(vha, fcport);
        }
        /*
         * We may need to retry the login, so don't change the state of the
@@ -3937,7 +3921,7 @@ void qla2x00_mark_device_lost(scsi_qla_host_t *vha, fc_port_t *fcport,
  * Context:
  */
 void
-qla2x00_mark_all_devices_lost(scsi_qla_host_t *vha, int defer)
+qla2x00_mark_all_devices_lost(scsi_qla_host_t *vha)
 {
        fc_port_t *fcport;
 
@@ -3957,13 +3941,6 @@ qla2x00_mark_all_devices_lost(scsi_qla_host_t *vha, int defer)
                 */
                if (atomic_read(&fcport->state) == FCS_DEVICE_DEAD)
                        continue;
-               if (atomic_read(&fcport->state) == FCS_ONLINE) {
-                       qla2x00_set_fcport_state(fcport, FCS_DEVICE_LOST);
-                       if (defer)
-                               qla2x00_schedule_rport_del(vha, fcport, defer);
-                       else if (vha->vp_idx == fcport->vha->vp_idx)
-                               qla2x00_schedule_rport_del(vha, fcport, defer);
-               }
        }
 }
 
@@ -6899,13 +6876,13 @@ static void qla_pci_error_cleanup(scsi_qla_host_t *vha)
                qpair->online = 0;
        mutex_unlock(&ha->mq_lock);
 
-       qla2x00_mark_all_devices_lost(vha, 0);
+       qla2x00_mark_all_devices_lost(vha);
 
        spin_lock_irqsave(&ha->vport_slock, flags);
        list_for_each_entry(vp, &ha->vp_list, list) {
                atomic_inc(&vp->vref_count);
                spin_unlock_irqrestore(&ha->vport_slock, flags);
-               qla2x00_mark_all_devices_lost(vp, 0);
+               qla2x00_mark_all_devices_lost(vp);
                spin_lock_irqsave(&ha->vport_slock, flags);
                atomic_dec(&vp->vref_count);
        }
index 68c14143e50e4884f4057ad6071b662d9bd38378..a43f7c9463c81d38fc481f66f3e32cfcba7e4056 100644 (file)
@@ -966,7 +966,7 @@ void qlt_free_session_done(struct work_struct *work)
                sess->send_els_logo);
 
        if (!IS_SW_RESV_ADDR(sess->d_id)) {
-               qla2x00_mark_device_lost(vha, sess, 0, 0);
+               qla2x00_mark_device_lost(vha, sess, 0);
 
                if (sess->send_els_logo) {
                        qlt_port_logo_t logo;