Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 08d04784 authored by Arun Easi's avatar Arun Easi Committed by Greg Kroah-Hartman
Browse files

scsi: qla2xxx: Fix device reconnect in loop topology

commit 8ad4be3d15cf144b5834bdb00d5bbe4050938dc7 upstream.

A device logout in loop topology initiates a device connection teardown
which loses the FW device handle. In loop topo, the device handle is not
regrabbed leading to device login failures and eventually to loss of the
device. Fix this by taking the main login path that does it.

Link: https://lore.kernel.org/r/20220110050218.3958-11-njavali@marvell.com


Cc: stable@vger.kernel.org
Reviewed-by: default avatarHimanshu Madhani <himanshu.madhani@oracle.com>
Signed-off-by: default avatarArun Easi <aeasi@marvell.com>
Signed-off-by: default avatarNilesh Javali <njavali@marvell.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 167debae
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -955,6 +955,9 @@ static void qla24xx_handle_gnl_done_event(scsi_qla_host_t *vha,
				set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
			}
			break;
		case ISP_CFG_NL:
			qla24xx_fcport_handle_login(vha, fcport);
			break;
		default:
			break;
		}
@@ -1477,6 +1480,11 @@ static void qla_chk_n2n_b4_login(struct scsi_qla_host *vha, fc_port_t *fcport)
	u8 login = 0;
	int rc;

	ql_dbg(ql_dbg_disc, vha, 0x307b,
	    "%s %8phC DS %d LS %d lid %d retries=%d\n",
	    __func__, fcport->port_name, fcport->disc_state,
	    fcport->fw_login_state, fcport->loop_id, fcport->login_retry);

	if (qla_tgt_mode_enabled(vha))
		return;

@@ -5217,6 +5225,13 @@ qla2x00_configure_local_loop(scsi_qla_host_t *vha)
			memcpy(fcport->node_name, new_fcport->node_name,
			    WWN_SIZE);
			fcport->scan_state = QLA_FCPORT_FOUND;
			if (fcport->login_retry == 0) {
				fcport->login_retry = vha->hw->login_retry_count;
				ql_dbg(ql_dbg_disc, vha, 0x2135,
				    "Port login retry %8phN, lid 0x%04x retry cnt=%d.\n",
				    fcport->port_name, fcport->loop_id,
				    fcport->login_retry);
			}
			found++;
			break;
		}
+5 −0
Original line number Diff line number Diff line
@@ -5348,6 +5348,11 @@ void qla2x00_relogin(struct scsi_qla_host *vha)
					memset(&ea, 0, sizeof(ea));
					ea.fcport = fcport;
					qla24xx_handle_relogin_event(vha, &ea);
				} else if (vha->hw->current_topology ==
					 ISP_CFG_NL &&
					IS_QLA2XXX_MIDTYPE(vha->hw)) {
					(void)qla24xx_fcport_handle_login(vha,
									fcport);
				} else if (vha->hw->current_topology ==
				    ISP_CFG_NL) {
					fcport->login_retry--;