]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
scsi: ufs: Add quirk to fix abnormal ocs fatal error
authorKiwoong Kim <kwmad.kim@samsung.com>
Thu, 28 May 2020 01:16:53 +0000 (06:46 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 26 Aug 2020 09:49:14 +0000 (11:49 +0200)
[ Upstream commit d779a6e90e189f4883ce6f900da02995fb000df5 ]

Some controller like Exynos determines if FATAL ERROR (0x7) in OCS field in
UTRD occurs for values other than GOOD (0x0) in STATUS field in response
upiu as well as errors that a host controller can't cover.  This patch is
to prevent from reporting command results in those cases.

Link: https://lore.kernel.org/r/20200528011658.71590-6-alim.akhtar@samsung.com
Reviewed-by: Avri Altman <avri.altman@wdc.com>
Signed-off-by: Kiwoong Kim <kwmad.kim@samsung.com>
Signed-off-by: Alim Akhtar <alim.akhtar@samsung.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/scsi/ufs/ufshcd.c
drivers/scsi/ufs/ufshcd.h

index 0be06e7c5f293fc09584f922275d883f4ac37fa5..69c7c039b5facc764d44269516137666e1666f34 100644 (file)
@@ -4824,6 +4824,12 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
        /* overall command status of utrd */
        ocs = ufshcd_get_tr_ocs(lrbp);
 
+       if (hba->quirks & UFSHCD_QUIRK_BROKEN_OCS_FATAL_ERROR) {
+               if (be32_to_cpu(lrbp->ucd_rsp_ptr->header.dword_1) &
+                                       MASK_RSP_UPIU_RESULT)
+                       ocs = OCS_SUCCESS;
+       }
+
        switch (ocs) {
        case OCS_SUCCESS:
                result = ufshcd_get_req_rsp(lrbp->ucd_rsp_ptr);
index 97d649f546e3aece5e309bf38b0ae5a726c75da1..e38e9e0af6b59e83aa6a2a0faefc98c394beb44f 100644 (file)
@@ -543,6 +543,12 @@ enum ufshcd_quirks {
         * resolution of the values of PRDTO and PRDTL in UTRD as byte.
         */
        UFSHCD_QUIRK_PRDT_BYTE_GRAN                     = 1 << 9,
+
+       /*
+        * This quirk needs to be enabled if the host controller reports
+        * OCS FATAL ERROR with device error through sense data
+        */
+       UFSHCD_QUIRK_BROKEN_OCS_FATAL_ERROR             = 1 << 10,
 };
 
 enum ufshcd_caps {