int
 qla2x00_start_sp(srb_t *sp)
 {
-       int rval;
+       int rval = QLA_SUCCESS;
        scsi_qla_host_t *vha = sp->vha;
        struct qla_hw_data *ha = vha->hw;
        struct qla_qpair *qp = sp->qpair;
        void *pkt;
        unsigned long flags;
 
-       rval = QLA_FUNCTION_FAILED;
        spin_lock_irqsave(qp->qp_lock_ptr, flags);
        pkt = __qla2x00_alloc_iocbs(sp->qpair, sp);
        if (!pkt) {
+               rval = EAGAIN;
                ql_log(ql_log_warn, vha, 0x700c,
                    "qla2x00_alloc_iocbs failed.\n");
                goto done;
        }
 
-       rval = QLA_SUCCESS;
        switch (sp->type) {
        case SRB_LOGIN_CMD:
                IS_FWI2_CAPABLE(ha) ?
 
        struct qla_work_evt *e, *tmp;
        unsigned long flags;
        LIST_HEAD(work);
+       int rc;
 
        spin_lock_irqsave(&vha->work_lock, flags);
        list_splice_init(&vha->work_list, &work);
        spin_unlock_irqrestore(&vha->work_lock, flags);
 
        list_for_each_entry_safe(e, tmp, &work, list) {
-               list_del_init(&e->list);
-
+               rc = QLA_SUCCESS;
                switch (e->type) {
                case QLA_EVT_AEN:
                        fc_host_post_event(vha->host, fc_get_event_number(),
                            e->u.logio.data);
                        break;
                case QLA_EVT_ASYNC_LOGOUT:
-                       qla2x00_async_logout(vha, e->u.logio.fcport);
+                       rc = qla2x00_async_logout(vha, e->u.logio.fcport);
                        break;
                case QLA_EVT_ASYNC_LOGOUT_DONE:
                        qla2x00_async_logout_done(vha, e->u.logio.fcport,
                        qla24xx_do_nack_work(vha, e);
                        break;
                case QLA_EVT_ASYNC_PRLO:
-                       qla2x00_async_prlo(vha, e->u.logio.fcport);
+                       rc = qla2x00_async_prlo(vha, e->u.logio.fcport);
                        break;
                case QLA_EVT_ASYNC_PRLO_DONE:
                        qla2x00_async_prlo_done(vha, e->u.logio.fcport,
                            e->u.fcport.fcport, false);
                        break;
                }
+
+               if (rc == EAGAIN) {
+                       /* put 'work' at head of 'vha->work_list' */
+                       spin_lock_irqsave(&vha->work_lock, flags);
+                       list_splice(&work, &vha->work_list);
+                       spin_unlock_irqrestore(&vha->work_lock, flags);
+                       break;
+               }
+               list_del_init(&e->list);
                if (e->flags & QLA_EVT_FLAG_FREE)
                        kfree(e);