From 0dd21f133bee4c6656457655bf012217173467a3 Mon Sep 17 00:00:00 2001 From: Jaegeuk Kim Date: Tue, 18 Feb 2025 11:08:43 -0800 Subject: [PATCH] ANDROID: scsi: ufs: add UFSHCD_ANDROID_QUIRK_SET_IID_TO_ONE This patch forward-ports the three patches together for 6.12. 6336a9a84b20 ("ANDROID: ufs: core: move Android quirks into separate field") f10cf63d3ff9 ("ANDROID: scsi: ufs: add UFSHCD_ANDROID_QUIRK_SET_IID_TO_ONE") 0de12a814a2d ("ANDROID: scsi: ufs: Fix a race condition related to device command processing") Bug: 303649600 Bug: 397077931 Change-Id: I43b410e947cffdf0b4acd2c38ba6b1432b2f1342 Signed-off-by: Eric Biggers Signed-off-by: Konstantin Vyshetsky Signed-off-by: Bart Van Assche Signed-off-by: Jaegeuk Kim --- drivers/ufs/core/ufs-mcq.c | 2 +- drivers/ufs/core/ufshcd.c | 6 ++++++ include/ufs/ufshcd.h | 7 +++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c index dba935c712d6..44d015de2f6d 100644 --- a/drivers/ufs/core/ufs-mcq.c +++ b/drivers/ufs/core/ufs-mcq.c @@ -565,7 +565,7 @@ int ufshcd_mcq_sq_cleanup(struct ufs_hba *hba, int task_tag) goto unlock; /* SQCTI = EXT_IID, IID, LUN, Task Tag */ - nexus = lrbp->lun << 8 | task_tag; + nexus = lrbp->ucd_req_ptr->header.iid << 16 | lrbp->lun << 8 | task_tag; opr_sqd_base = mcq_opr_base(hba, OPR_SQD, id); writel(nexus, opr_sqd_base + REG_SQCTI); diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c index 940e1a211c52..9154f9521a1d 100644 --- a/drivers/ufs/core/ufshcd.c +++ b/drivers/ufs/core/ufshcd.c @@ -2909,6 +2909,9 @@ static int ufshcd_compose_devman_upiu(struct ufs_hba *hba, else ret = -EINVAL; + if (!ret && hba->android_quirks & UFSHCD_ANDROID_QUIRK_SET_IID_TO_ONE) + lrbp->ucd_req_ptr->header.iid = 1; + return ret; } @@ -2928,6 +2931,9 @@ static void ufshcd_comp_scsi_upiu(struct ufs_hba *hba, struct ufshcd_lrb *lrbp) if (ioprio_class == IOPRIO_CLASS_RT) upiu_flags |= UPIU_CMD_FLAGS_CP; ufshcd_prepare_utp_scsi_cmd_upiu(lrbp, upiu_flags); + + if (hba->android_quirks & UFSHCD_ANDROID_QUIRK_SET_IID_TO_ONE) + lrbp->ucd_req_ptr->header.iid = 1; } /** diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h index db2692a67012..dccc71f37b27 100644 --- a/include/ufs/ufshcd.h +++ b/include/ufs/ufshcd.h @@ -703,6 +703,11 @@ enum ufshcd_quirks { UFSHCD_QUIRK_BROKEN_LSDBS_CAP = 1 << 25, }; +enum ufshcd_android_quirks { + /* Set IID to one. */ + UFSHCD_ANDROID_QUIRK_SET_IID_TO_ONE = 1 << 0, +}; + enum ufshcd_caps { /* Allow dynamic clk gating */ UFSHCD_CAP_CLK_GATING = 1 << 0, @@ -1037,6 +1042,8 @@ struct ufs_hba { unsigned int quirks; /* Deviations from standard UFSHCI spec. */ + unsigned int android_quirks; /* for UFSHCD_ANDROID_QUIRK_* flags */ + /* Device deviations from standard UFS device spec. */ unsigned int dev_quirks;