Skip to content

Commit 040036b

Browse files
Quinn Tranmartinkpetersen
Quinn Tran
authored andcommitted
scsi: qla2xxx: Delay loop id allocation at login
Delay loop id allocation to login time Signed-off-by: Quinn Tran <[email protected]> Signed-off-by: Himanshu Madhani <[email protected]> Signed-off-by: Martin K. Petersen <[email protected]>
1 parent 604e2e5 commit 040036b

File tree

1 file changed

+35
-29
lines changed

1 file changed

+35
-29
lines changed

drivers/scsi/qla2xxx/qla_init.c

+35-29
Original file line numberDiff line numberDiff line change
@@ -580,36 +580,29 @@ static void qla24xx_handle_gnl_done_event(scsi_qla_host_t *vha,
580580

581581
if (!found) {
582582
/* fw has no record of this port */
583-
if (fcport->loop_id == FC_NO_LOOP_ID) {
584-
qla2x00_find_new_loop_id(vha, fcport);
585-
fcport->fw_login_state = DSC_LS_PORT_UNAVAIL;
586-
} else {
587-
for (i = 0; i < n; i++) {
588-
e = &vha->gnl.l[i];
589-
id.b.domain = e->port_id[0];
590-
id.b.area = e->port_id[1];
591-
id.b.al_pa = e->port_id[2];
592-
id.b.rsvd_1 = 0;
593-
loop_id = le16_to_cpu(e->nport_handle);
594-
595-
if (fcport->d_id.b24 == id.b24) {
596-
conflict_fcport =
597-
qla2x00_find_fcport_by_wwpn(vha,
598-
e->port_name, 0);
599-
600-
ql_dbg(ql_dbg_disc, vha, 0x20e6,
601-
"%s %d %8phC post del sess\n",
602-
__func__, __LINE__,
603-
conflict_fcport->port_name);
604-
qlt_schedule_sess_for_deletion
605-
(conflict_fcport, 1);
606-
}
607-
608-
if (fcport->loop_id == loop_id) {
609-
/* FW already picked this loop id for another fcport */
610-
qla2x00_find_new_loop_id(vha, fcport);
611-
}
583+
for (i = 0; i < n; i++) {
584+
e = &vha->gnl.l[i];
585+
id.b.domain = e->port_id[0];
586+
id.b.area = e->port_id[1];
587+
id.b.al_pa = e->port_id[2];
588+
id.b.rsvd_1 = 0;
589+
loop_id = le16_to_cpu(e->nport_handle);
590+
591+
if (fcport->d_id.b24 == id.b24) {
592+
conflict_fcport =
593+
qla2x00_find_fcport_by_wwpn(vha,
594+
e->port_name, 0);
595+
ql_dbg(ql_dbg_disc, vha, 0x20e6,
596+
"%s %d %8phC post del sess\n",
597+
__func__, __LINE__,
598+
conflict_fcport->port_name);
599+
qlt_schedule_sess_for_deletion
600+
(conflict_fcport, 1);
612601
}
602+
603+
/* FW already picked this loop id for another fcport */
604+
if (fcport->loop_id == loop_id)
605+
fcport->loop_id = FC_NO_LOOP_ID;
613606
}
614607
qla24xx_fcport_handle_login(vha, fcport);
615608
}
@@ -1104,6 +1097,7 @@ void qla24xx_handle_gpdb_event(scsi_qla_host_t *vha, struct event_arg *ea)
11041097
static void qla_chk_n2n_b4_login(struct scsi_qla_host *vha, fc_port_t *fcport)
11051098
{
11061099
u8 login = 0;
1100+
int rc;
11071101

11081102
if (qla_tgt_mode_enabled(vha))
11091103
return;
@@ -1129,6 +1123,18 @@ static void qla_chk_n2n_b4_login(struct scsi_qla_host *vha, fc_port_t *fcport)
11291123
}
11301124

11311125
if (login) {
1126+
if (fcport->loop_id == FC_NO_LOOP_ID) {
1127+
fcport->fw_login_state = DSC_LS_PORT_UNAVAIL;
1128+
rc = qla2x00_find_new_loop_id(vha, fcport);
1129+
if (rc) {
1130+
ql_dbg(ql_dbg_disc, vha, 0x20e6,
1131+
"%s %d %8phC post del sess - out of loopid\n",
1132+
__func__, __LINE__, fcport->port_name);
1133+
fcport->scan_state = 0;
1134+
qlt_schedule_sess_for_deletion(fcport, true);
1135+
return;
1136+
}
1137+
}
11321138
ql_dbg(ql_dbg_disc, vha, 0x20bf,
11331139
"%s %d %8phC post login\n",
11341140
__func__, __LINE__, fcport->port_name);

0 commit comments

Comments
 (0)