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

Commit 6944dccb authored by Quinn Tran's avatar Quinn Tran Committed by Martin K. Petersen
Browse files

scsi: qla2xxx: Add retry limit for fabric scan logic



Switch scan is assumed to succeed most of the time.
If the scan failed, then scan is limit 5 retries.

Signed-off-by: default avatarQuinn Tran <quinn.tran@cavium.com>
Signed-off-by: default avatarHimanshu Madhani <himanshu.madhani@cavium.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 040036bb
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -2986,6 +2986,8 @@ struct fab_scan_rp {
struct fab_scan {
	struct fab_scan_rp *l;
	u32 size;
	u16 scan_retry;
#define MAX_SCAN_RETRIES 5
	enum scan_flags_t scan_flags;
	struct delayed_work scan_work;
};
+20 −12
Original line number Diff line number Diff line
@@ -3875,13 +3875,17 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t *sp)

	rc = sp->rc;
	if (rc) {
		ql_dbg(ql_dbg_disc, vha, 0xffff,
		    "GPNFT failed. FC4type %x. Rescanning.\n",
		    fc4type);
		vha->scan.scan_retry++;
		if (vha->scan.scan_retry < MAX_SCAN_RETRIES) {
			set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
			set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
		} else {
			ql_dbg(ql_dbg_disc, vha, 0xffff,
			    "Fabric scan failed on all retries.\n");
		}
		goto out;
	}
	vha->scan.scan_retry = 0;

	list_for_each_entry(fcport, &vha->vp_fcports, list)
		fcport->scan_state = QLA_FCPORT_SCAN;
@@ -3964,7 +3968,6 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t *sp)

out:
	qla24xx_sp_unmap(vha, sp);

	spin_lock_irqsave(&vha->work_lock, flags);
	vha->scan.scan_flags &= ~SF_SCANNING;
	spin_unlock_irqrestore(&vha->work_lock, flags);
@@ -3992,16 +3995,21 @@ static void qla2x00_async_gpnft_gnnft_sp_done(void *s, int res)
	if (res) {
		unsigned long flags;

		ql_dbg(ql_dbg_disc, sp->vha, 0xffff,
		    "Async done-%s timed out.\n",
		    sp->name);
		sp->free(sp);
		spin_lock_irqsave(&vha->work_lock, flags);
		vha->scan.scan_flags &= ~SF_SCANNING;
		vha->scan.scan_retry++;
		spin_unlock_irqrestore(&vha->work_lock, flags);

		if (vha->scan.scan_retry < MAX_SCAN_RETRIES) {
			set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
			set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
			qla2xxx_wake_dpc(vha);
		} else {
			ql_dbg(ql_dbg_disc, sp->vha, 0xffff,
			    "Async done-%s rescan failed on all retries\n",
			    sp->name);
		}
		return;
	}

+1 −0
Original line number Diff line number Diff line
@@ -1059,6 +1059,7 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb)
		 * Mark all devices as missing so we will login again.
		 */
		atomic_set(&vha->loop_state, LOOP_UP);
		vha->scan.scan_retry = 0;

		set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
		set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);