/* Obtain free SQ entry */
        bnx2fc_add_2_sq(tgt, xid);
 
+       /* Set flag that cleanup request is pending with the firmware */
+       set_bit(BNX2FC_FLAG_ISSUE_CLEANUP_REQ, &io_req->req_flags);
+
        /* Ring doorbell */
        bnx2fc_ring_doorbell(tgt);
 
        BNX2FC_IO_DBG(io_req, "Entered process_cleanup_compl "
                              "refcnt = %d, cmd_type = %d\n",
                   kref_read(&io_req->refcount), io_req->cmd_type);
+       /*
+        * Test whether there is a cleanup request pending. If not just
+        * exit.
+        */
+       if (!test_and_clear_bit(BNX2FC_FLAG_ISSUE_CLEANUP_REQ,
+                               &io_req->req_flags))
+               return;
+       /*
+        * If we receive a cleanup completion for this request then the
+        * firmware will not give us an abort completion for this request
+        * so clear any ABTS pending flags.
+        */
+       if (test_bit(BNX2FC_FLAG_ISSUE_ABTS, &io_req->req_flags) &&
+           !test_bit(BNX2FC_FLAG_ABTS_DONE, &io_req->req_flags)) {
+               set_bit(BNX2FC_FLAG_ABTS_DONE, &io_req->req_flags);
+               if (io_req->wait_for_abts_comp)
+                       complete(&io_req->abts_done);
+       }
+
        bnx2fc_scsi_done(io_req, DID_ERROR);
        kref_put(&io_req->refcount, bnx2fc_cmd_release);
        if (io_req->wait_for_cleanup_comp)
                return;
        }
 
+       /*
+        * If we receive an ABTS completion here then we will not receive
+        * a cleanup completion so clear any cleanup pending flags.
+        */
+       if (test_bit(BNX2FC_FLAG_ISSUE_CLEANUP_REQ, &io_req->req_flags)) {
+               clear_bit(BNX2FC_FLAG_ISSUE_CLEANUP_REQ, &io_req->req_flags);
+               if (io_req->wait_for_cleanup_comp)
+                       complete(&io_req->cleanup_done);
+       }
+
        /* Do not issue RRQ as this IO is already cleanedup */
        if (test_and_set_bit(BNX2FC_FLAG_IO_CLEANUP,
                                &io_req->req_flags))