Commit b492d6a4 authored by Quinn Tran's avatar Quinn Tran Committed by Martin K. Petersen

scsi: qla2xxx: edif: Fix app start delay

Current driver does unnecessary pause for each session to get to certain
state before allowing the app start call to return. In larger environment,
this introduces a long delay.  Originally the delay was meant to
synchronize app and driver. However, the with current implementation the
two sides use various events to synchronize their state.

The same is applied to the authentication failure call.

Link: https://lore.kernel.org/r/20211026115412.27691-6-njavali@marvell.com
Fixes: 4de067e5 ("scsi: qla2xxx: edif: Add N2N support for EDIF")
Reviewed-by: default avatarHimanshu Madhani <himanshu.madhani@oracle.com>
Signed-off-by: default avatarQuinn Tran <qutran@marvell.com>
Signed-off-by: default avatarNilesh Javali <njavali@marvell.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 8e6d5df3
......@@ -290,63 +290,6 @@ qla_edif_app_check(scsi_qla_host_t *vha, struct app_id appid)
return false;
}
static void qla_edif_reset_auth_wait(struct fc_port *fcport, int state,
int waitonly)
{
int cnt, max_cnt = 200;
bool traced = false;
fcport->keep_nport_handle = 1;
if (!waitonly) {
qla2x00_set_fcport_disc_state(fcport, state);
qlt_schedule_sess_for_deletion(fcport);
} else {
qla2x00_set_fcport_disc_state(fcport, state);
}
ql_dbg(ql_dbg_edif, fcport->vha, 0xf086,
"%s: waiting for session, max_cnt=%u\n",
__func__, max_cnt);
cnt = 0;
if (waitonly) {
/* Marker wait min 10 msecs. */
msleep(50);
cnt += 50;
}
while (1) {
if (!traced) {
ql_dbg(ql_dbg_edif, fcport->vha, 0xf086,
"%s: session sleep.\n",
__func__);
traced = true;
}
msleep(20);
cnt++;
if (waitonly && (fcport->disc_state == state ||
fcport->disc_state == DSC_LOGIN_COMPLETE))
break;
if (fcport->disc_state == DSC_LOGIN_AUTH_PEND)
break;
if (cnt > max_cnt)
break;
}
if (!waitonly) {
ql_dbg(ql_dbg_edif, fcport->vha, 0xf086,
"%s: waited for session - %8phC, loopid=%x portid=%06x fcport=%p state=%u, cnt=%u\n",
__func__, fcport->port_name, fcport->loop_id,
fcport->d_id.b24, fcport, fcport->disc_state, cnt);
} else {
ql_dbg(ql_dbg_edif, fcport->vha, 0xf086,
"%s: waited ONLY for session - %8phC, loopid=%x portid=%06x fcport=%p state=%u, cnt=%u\n",
__func__, fcport->port_name, fcport->loop_id,
fcport->d_id.b24, fcport, fcport->disc_state, cnt);
}
}
static void
qla_edif_free_sa_ctl(fc_port_t *fcport, struct edif_sa_ctl *sa_ctl,
int index)
......@@ -583,8 +526,8 @@ qla_edif_app_start(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
ql_dbg(ql_dbg_edif, vha, 0x911e,
"%s wwpn %8phC calling qla_edif_reset_auth_wait\n",
__func__, fcport->port_name);
fcport->edif.app_sess_online = 1;
qla_edif_reset_auth_wait(fcport, DSC_LOGIN_PEND, 0);
fcport->edif.app_sess_online = 0;
qlt_schedule_sess_for_deletion(fcport);
qla_edif_sa_ctl_init(vha, fcport);
}
}
......@@ -800,7 +743,6 @@ qla_edif_app_authok(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
ql_dbg(ql_dbg_edif, vha, 0x911e,
"%s AUTH complete - RESUME with prli for wwpn %8phC\n",
__func__, fcport->port_name);
qla_edif_reset_auth_wait(fcport, DSC_LOGIN_PEND, 1);
qla24xx_post_prli_work(vha, fcport);
}
......@@ -873,7 +815,7 @@ qla_edif_app_authfail(scsi_qla_host_t *vha, struct bsg_job *bsg_job)
if (qla_ini_mode_enabled(fcport->vha)) {
fcport->send_els_logo = 1;
qla_edif_reset_auth_wait(fcport, DSC_LOGIN_PEND, 0);
qlt_schedule_sess_for_deletion(fcport);
}
}
......
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