static void qla_noop_sp_done(srb_t *sp, int res)
 {
+       sp->fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE);
        /* ref: INIT */
        kref_put(&sp->cmd_kref, qla2x00_sp_release);
 }
        if (!sa_ctl) {
                ql_dbg(ql_dbg_edif, vha, 0x70e6,
                    "sa_ctl allocation failed\n");
-               return -ENOMEM;
+               rval =  -ENOMEM;
+               goto done;
        }
 
        fcport = sa_ctl->fcport;
        if (!sp) {
                ql_dbg(ql_dbg_edif, vha, 0x70e6,
                 "SRB allocation failed\n");
-               return -ENOMEM;
+               rval = -ENOMEM;
+               goto done;
        }
 
        fcport->flags |= FCF_ASYNC_SENT;
 
        rval = qla2x00_start_sp(sp);
 
-       if (rval != QLA_SUCCESS)
+       if (rval != QLA_SUCCESS) {
                rval = QLA_FUNCTION_FAILED;
+               goto done_free_sp;
+       }
 
+       return rval;
+done_free_sp:
+       kref_put(&sp->cmd_kref, qla2x00_sp_release);
+       fcport->flags &= ~FCF_ASYNC_SENT;
+done:
+       fcport->flags &= ~FCF_ASYNC_ACTIVE;
        return rval;
 }