[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20231101084504.79087-1-hy50.seo@samsung.com>
Date: Wed, 1 Nov 2023 17:45:04 +0900
From: SEO HOYOUNG <hy50.seo@...sung.com>
To: linux-scsi@...r.kernel.org, linux-kernel@...r.kernel.org,
alim.akhtar@...sung.com, avri.altman@....com, jejb@...ux.ibm.com,
martin.petersen@...cle.com, beanhuo@...ron.com, bvanassche@....org,
kwangwon.min@...sung.com, kwmad.kim@...sung.com,
sh425.lee@...sung.com, sc.suh@...sung.com,
quic_nguyenb@...cinc.com, cpgs@...sung.com
Cc: SEO HOYOUNG <hy50.seo@...sung.com>
Subject: [PATCH v1] scsi: ufs: core: Process abort completed command in MCQ
mode
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@...sung.com>
---
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
Powered by blists - more mailing lists