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

Commit 83cb0fb8 authored by Arun Easi's avatar Arun Easi Committed by Greg Kroah-Hartman
Browse files

scsi: qla2xxx: Fix discovery issues in FC-AL topology

commit 47ccb113cead905bdc236571bf8ac6fed90321b3 upstream.

A direct attach tape device, when gets swapped with another, was not
discovered. Fix this by looking at loop map and reinitialize link if there
are devices present.

Link: https://lore.kernel.org/linux-scsi/baef87c3-5dad-3b47-44c1-6914bfc90108@cybernetics.com/
Link: https://lore.kernel.org/r/20220713052045.10683-8-njavali@marvell.com


Cc: stable@vger.kernel.org
Reported-by: default avatarTony Battersby <tonyb@cybernetics.com>
Tested-by: default avatarTony Battersby <tonyb@cybernetics.com>
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 bc98764d
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -397,7 +397,8 @@ extern int
qla2x00_get_resource_cnts(scsi_qla_host_t *);

extern int
qla2x00_get_fcal_position_map(scsi_qla_host_t *ha, char *pos_map);
qla2x00_get_fcal_position_map(scsi_qla_host_t *ha, char *pos_map,
		u8 *num_entries);

extern int
qla2x00_get_link_status(scsi_qla_host_t *, uint16_t, struct link_statistics *,
+29 −0
Original line number Diff line number Diff line
@@ -5068,6 +5068,22 @@ qla2x00_configure_loop(scsi_qla_host_t *vha)
	return (rval);
}

static void
qla_reinitialize_link(scsi_qla_host_t *vha)
{
	int rval;

	atomic_set(&vha->loop_state, LOOP_DOWN);
	atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME);
	rval = qla2x00_full_login_lip(vha);
	if (rval == QLA_SUCCESS) {
		ql_dbg(ql_dbg_disc, vha, 0xd050, "Link reinitialized\n");
	} else {
		ql_dbg(ql_dbg_disc, vha, 0xd051,
			"Link reinitialization failed (%d)\n", rval);
	}
}

/*
 * qla2x00_configure_local_loop
 *	Updates Fibre Channel Device Database with local loop devices.
@@ -5132,6 +5148,19 @@ qla2x00_configure_local_loop(scsi_qla_host_t *vha)
		spin_unlock_irqrestore(&vha->work_lock, flags);

		if (vha->scan.scan_retry < MAX_SCAN_RETRIES) {
			u8 loop_map_entries = 0;
			int rc;

			rc = qla2x00_get_fcal_position_map(vha, NULL,
						&loop_map_entries);
			if (rc == QLA_SUCCESS && loop_map_entries > 1) {
				/*
				 * There are devices that are still not logged
				 * in. Reinitialize to give them a chance.
				 */
				qla_reinitialize_link(vha);
				return QLA_FUNCTION_FAILED;
			}
			set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
			set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
		}
+4 −1
Original line number Diff line number Diff line
@@ -2928,7 +2928,8 @@ qla2x00_get_resource_cnts(scsi_qla_host_t *vha)
 *	Kernel context.
 */
int
qla2x00_get_fcal_position_map(scsi_qla_host_t *vha, char *pos_map)
qla2x00_get_fcal_position_map(scsi_qla_host_t *vha, char *pos_map,
		u8 *num_entries)
{
	int rval;
	mbx_cmd_t mc;
@@ -2968,6 +2969,8 @@ qla2x00_get_fcal_position_map(scsi_qla_host_t *vha, char *pos_map)

		if (pos_map)
			memcpy(pos_map, pmap, FCAL_MAP_SIZE);
		if (num_entries)
			*num_entries = pmap[0];
	}
	dma_pool_free(ha->s_dma_pool, pmap, pmap_dma);