In MCQ mode, the case where OCS is updated to aborted is as follows 1. when abort processing is completed 2. When a duplicate command occurs In case of 1 situation, cmd should be re-request. So in the case of cmd whose abort processing is completed in MCQ mode, the ufs driver needs to update to scsi with DID_REQUEUE. Signed-off-by: SEO HOYOUNG <hy50.seo@xxxxxxxxxxx> --- drivers/ufs/core/ufshcd.c | 9 ++++++++- include/ufs/ufshci.h | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c index 68d7da02944f..234b7d7ec037 100644 --- a/drivers/ufs/core/ufshcd.c +++ b/drivers/ufs/core/ufshcd.c @@ -5307,6 +5307,7 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp, enum utp_ocs ocs; u8 upiu_flags; u32 resid; + u8 eec; upiu_flags = lrbp->ucd_rsp_ptr->header.flags; resid = be32_to_cpu(lrbp->ucd_rsp_ptr->sr.residual_transfer_count); @@ -5371,7 +5372,13 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp, } break; case OCS_ABORTED: - result |= DID_ABORT << 16; + if (cqe) + eec = le32_to_cpu(cqe->status) & MASK_EEC; + + if (is_mcq_enabled(hba) && !eec) + result |= DID_REQUEUE << 16; + else + result |= DID_ABORT << 16; break; case OCS_INVALID_COMMAND_STATUS: result |= DID_REQUEUE << 16; diff --git a/include/ufs/ufshci.h b/include/ufs/ufshci.h index d5accacae6bc..9aefc7e6d0fc 100644 --- a/include/ufs/ufshci.h +++ b/include/ufs/ufshci.h @@ -465,6 +465,7 @@ enum utp_ocs { enum { MASK_OCS = 0x0F, + MASK_EEC = 0xF0, }; /* The maximum length of the data byte count field in the PRDT is 256KB */ -- 2.26.0