u16 dma_tx_err_type = le16_to_cpu(err_record->dma_tx_err_type);
        u16 sipc_rx_err_type = le16_to_cpu(err_record->sipc_rx_err_type);
        u32 dma_rx_err_type = le32_to_cpu(err_record->dma_rx_err_type);
+       struct hisi_sas_complete_v2_hdr *complete_queue =
+                       hisi_hba->complete_hdr[slot->cmplt_queue];
+       struct hisi_sas_complete_v2_hdr *complete_hdr =
+                       &complete_queue[slot->cmplt_queue_slot];
+       u32 dw0 = le32_to_cpu(complete_hdr->dw0);
        int error = -1;
 
        if (err_phase == 1) {
                        break;
                }
                }
-               hisi_sas_sata_done(task, slot);
+               if (dw0 & CMPLT_HDR_RSPNS_XFRD_MSK)
+                       hisi_sas_sata_done(task, slot);
        }
                break;
        default:
        case SAS_PROTOCOL_SATA | SAS_PROTOCOL_STP:
        {
                ts->stat = SAS_SAM_STAT_GOOD;
-               hisi_sas_sata_done(task, slot);
+               if (dw0 & CMPLT_HDR_RSPNS_XFRD_MSK)
+                       hisi_sas_sata_done(task, slot);
                break;
        }
        default:
 
                        ts->stat = SAS_OPEN_REJECT;
                        ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
                }
-               hisi_sas_sata_done(task, slot);
+               if (dw0 & CMPLT_HDR_RSPNS_XFRD_MSK)
+                       hisi_sas_sata_done(task, slot);
                break;
        case SAS_PROTOCOL_SMP:
                ts->stat = SAS_SAM_STAT_CHECK_CONDITION;
        case SAS_PROTOCOL_STP:
        case SAS_PROTOCOL_SATA | SAS_PROTOCOL_STP:
                ts->stat = SAS_SAM_STAT_GOOD;
-               hisi_sas_sata_done(task, slot);
+               if (dw0 & CMPLT_HDR_RSPNS_XFRD_MSK)
+                       hisi_sas_sata_done(task, slot);
                break;
        default:
                ts->stat = SAS_SAM_STAT_CHECK_CONDITION;