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

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
...@@ -2986,6 +2986,8 @@ struct fab_scan_rp { ...@@ -2986,6 +2986,8 @@ struct fab_scan_rp {
struct fab_scan { struct fab_scan {
struct fab_scan_rp *l; struct fab_scan_rp *l;
u32 size; u32 size;
u16 scan_retry;
#define MAX_SCAN_RETRIES 5
enum scan_flags_t scan_flags; enum scan_flags_t scan_flags;
struct delayed_work scan_work; struct delayed_work scan_work;
}; };
......
...@@ -3875,13 +3875,17 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t *sp) ...@@ -3875,13 +3875,17 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t *sp)
rc = sp->rc; rc = sp->rc;
if (rc) { if (rc) {
ql_dbg(ql_dbg_disc, vha, 0xffff, vha->scan.scan_retry++;
"GPNFT failed. FC4type %x. Rescanning.\n", if (vha->scan.scan_retry < MAX_SCAN_RETRIES) {
fc4type); set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags); set_bit(LOOP_RESYNC_NEEDED, &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; goto out;
} }
vha->scan.scan_retry = 0;
list_for_each_entry(fcport, &vha->vp_fcports, list) list_for_each_entry(fcport, &vha->vp_fcports, list)
fcport->scan_state = QLA_FCPORT_SCAN; fcport->scan_state = QLA_FCPORT_SCAN;
...@@ -3964,7 +3968,6 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t *sp) ...@@ -3964,7 +3968,6 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t *sp)
out: out:
qla24xx_sp_unmap(vha, sp); qla24xx_sp_unmap(vha, sp);
spin_lock_irqsave(&vha->work_lock, flags); spin_lock_irqsave(&vha->work_lock, flags);
vha->scan.scan_flags &= ~SF_SCANNING; vha->scan.scan_flags &= ~SF_SCANNING;
spin_unlock_irqrestore(&vha->work_lock, flags); spin_unlock_irqrestore(&vha->work_lock, flags);
...@@ -3992,16 +3995,21 @@ static void qla2x00_async_gpnft_gnnft_sp_done(void *s, int res) ...@@ -3992,16 +3995,21 @@ static void qla2x00_async_gpnft_gnnft_sp_done(void *s, int res)
if (res) { if (res) {
unsigned long flags; unsigned long flags;
ql_dbg(ql_dbg_disc, sp->vha, 0xffff,
"Async done-%s timed out.\n",
sp->name);
sp->free(sp); sp->free(sp);
spin_lock_irqsave(&vha->work_lock, flags); spin_lock_irqsave(&vha->work_lock, flags);
vha->scan.scan_flags &= ~SF_SCANNING; vha->scan.scan_flags &= ~SF_SCANNING;
vha->scan.scan_retry++;
spin_unlock_irqrestore(&vha->work_lock, flags); spin_unlock_irqrestore(&vha->work_lock, flags);
set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags); if (vha->scan.scan_retry < MAX_SCAN_RETRIES) {
qla2xxx_wake_dpc(vha); 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; return;
} }
......
...@@ -1059,6 +1059,7 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb) ...@@ -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. * Mark all devices as missing so we will login again.
*/ */
atomic_set(&vha->loop_state, LOOP_UP); atomic_set(&vha->loop_state, LOOP_UP);
vha->scan.scan_retry = 0;
set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags); set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags); set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment