rval = qla2x00_start_sp(sp);
        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;
        }
 
 
        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;
 } /* GNNFT */
 
 
        rval = qla2x00_start_sp(sp);
        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;
        }
 
 
        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;
 }