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

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

scsi: qla2xxx: Retry fabric Scan on IOCB queue full



when fabric scan thread encounters IOCB Q Full, schedule a delayed work to
retry fabric scan.

Signed-off-by: default avatarQuinn Tran <qutran@marvell.com>
Signed-off-by: default avatarHimanshu Madhani <hmadhani@marvell.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 3a4b6cc7
Loading
Loading
Loading
Loading
+22 −6
Original line number Original line Diff line number Diff line
@@ -4053,9 +4053,6 @@ static int qla24xx_async_gnnft(scsi_qla_host_t *vha, struct srb *sp,


	rval = qla2x00_start_sp(sp);
	rval = qla2x00_start_sp(sp);
	if (rval != QLA_SUCCESS) {
	if (rval != QLA_SUCCESS) {
		spin_lock_irqsave(&vha->work_lock, flags);
		vha->scan.scan_flags &= ~SF_SCANNING;
		spin_unlock_irqrestore(&vha->work_lock, flags);
		goto done_free_sp;
		goto done_free_sp;
	}
	}


@@ -4079,6 +4076,17 @@ static int qla24xx_async_gnnft(scsi_qla_host_t *vha, struct srb *sp,


	sp->free(sp);
	sp->free(sp);


	spin_lock_irqsave(&vha->work_lock, flags);
	vha->scan.scan_flags &= ~SF_SCANNING;
	if (vha->scan.scan_flags == 0) {
		ql_dbg(ql_dbg_disc, vha, 0xffff,
		    "%s: schedule\n", __func__);
		vha->scan.scan_flags |= SF_QUEUED;
		schedule_delayed_work(&vha->scan.scan_work, 5);
	}
	spin_unlock_irqrestore(&vha->work_lock, flags);


	return rval;
	return rval;
} /* GNNFT */
} /* GNNFT */


@@ -4208,9 +4216,6 @@ int qla24xx_async_gpnft(scsi_qla_host_t *vha, u8 fc4_type, srb_t *sp)


	rval = qla2x00_start_sp(sp);
	rval = qla2x00_start_sp(sp);
	if (rval != QLA_SUCCESS) {
	if (rval != QLA_SUCCESS) {
		spin_lock_irqsave(&vha->work_lock, flags);
		vha->scan.scan_flags &= ~SF_SCANNING;
		spin_unlock_irqrestore(&vha->work_lock, flags);
		goto done_free_sp;
		goto done_free_sp;
	}
	}


@@ -4234,6 +4239,17 @@ int qla24xx_async_gpnft(scsi_qla_host_t *vha, u8 fc4_type, srb_t *sp)


	sp->free(sp);
	sp->free(sp);


	spin_lock_irqsave(&vha->work_lock, flags);
	vha->scan.scan_flags &= ~SF_SCANNING;
	if (vha->scan.scan_flags == 0) {
		ql_dbg(ql_dbg_disc, vha, 0xffff,
		    "%s: schedule\n", __func__);
		vha->scan.scan_flags |= SF_QUEUED;
		schedule_delayed_work(&vha->scan.scan_work, 5);
	}
	spin_unlock_irqrestore(&vha->work_lock, flags);


	return rval;
	return rval;
}
}