scsi: ufs: Add quirk to handle broken UIC command
authorjongmin jeong <jjmin.jeong@samsung.com>
Mon, 18 Oct 2021 12:42:02 +0000 (21:42 +0900)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 28 Oct 2021 03:10:10 +0000 (23:10 -0400)
Samsung ExynosAuto v9 SoC has two types of host controller interface to
support the virtualization of UFS Device.  One is the physical host (PH)
that is the same as conventional UFSHCI, and the other is the virtual host
(VH) that supports data transfer function only.

In this configuration the virtual host does not support UIC commands. Add a
quirk to return 0 when the UIC command send function is called.

Link: https://lore.kernel.org/r/20211018124216.153072-2-chanho61.park@samsung.com
Cc: Alim Akhtar <alim.akhtar@samsung.com>
Cc: James E.J. Bottomley <jejb@linux.ibm.com>
Cc: Martin K. Petersen <martin.petersen@oracle.com>
Cc: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: Alim Akhtar <alim.akhtar@samsung.com>
Signed-off-by: jongmin jeong <jjmin.jeong@samsung.com>
Signed-off-by: Chanho Park <chanho61.park@samsung.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/ufs/ufshcd.c
drivers/scsi/ufs/ufshcd.h

index 04cb67995750a270337caf4e5b1c3775101891e5..dc7ce9eef0c783e429dc5f26586e0da80998d3ce 100644 (file)
@@ -2330,6 +2330,9 @@ int ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd)
        int ret;
        unsigned long flags;
 
+       if (hba->quirks & UFSHCD_QUIRK_BROKEN_UIC_CMD)
+               return 0;
+
        ufshcd_hold(hba, false);
        mutex_lock(&hba->uic_cmd_mutex);
        ufshcd_add_delay_before_dme_cmd(hba);
index 3f5dc6732fe158c6f310bde1c9baa539602c996b..e67181a013e360c303c5d35f6af396e26da30569 100644 (file)
@@ -589,6 +589,12 @@ enum ufshcd_quirks {
         * This quirk allows only sg entries aligned with page size.
         */
        UFSHCD_QUIRK_ALIGN_SG_WITH_PAGE_SIZE            = 1 << 14,
+
+       /*
+        * This quirk needs to be enabled if the host controller does not
+        * support UIC command
+        */
+       UFSHCD_QUIRK_BROKEN_UIC_CMD                     = 1 << 15,
 };
 
 enum ufshcd_caps {