]> rtime.felk.cvut.cz Git - hercules2020/nv-tegra/linux-4.4.git/commitdiff
scsi: ufs: Enable UFS WLUNS using quirk.
authorNaveen Kumar Arepalli <naveenk@nvidia.com>
Thu, 19 Jan 2017 08:44:36 +0000 (14:14 +0530)
committermobile promotions <svcmobile_promotions@nvidia.com>
Tue, 24 Jan 2017 07:14:42 +0000 (23:14 -0800)
-Define UFSHCD_QUIRK_ENABLE_WLUNS to enable UFS WLUNS
-SCSI RTPM is not handled properly for WLUNS. Null pointer Crash
is observed in system resume case. Guard UFS WLUNS using a quirk.

Bug 200244924

Change-Id: I7c8e13e56f7414ad88f69c185cbdb1cb00deceab
Signed-off-by: Naveen Kumar Arepalli <naveenk@nvidia.com>
Reviewed-on: http://git-master/r/1288063
Reviewed-by: Venkata Jagadish <vjagadish@nvidia.com>
Reviewed-by: svccoveritychecker <svccoveritychecker@nvidia.com>
GVS: Gerrit_Virtual_Submit
Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com>
drivers/scsi/ufs/ufshcd.c
drivers/scsi/ufs/ufshcd.h

index 9160cc2c1c151f94dccda7aa9694893fb271a6ba..7e120f6fbeade27c1a0298bc5d3a5e1d2eca2cdd 100644 (file)
@@ -4334,6 +4334,9 @@ static int ufshcd_scsi_add_wlus(struct ufs_hba *hba)
        struct scsi_device *sdev_rpmb;
        struct scsi_device *sdev_boot;
 
+       if (!(hba->quirks & UFSHCD_QUIRK_ENABLE_WLUNS))
+               return 0;
+
        hba->sdev_ufs_device = __scsi_add_device(hba->host, 0, 0,
                ufshcd_upiu_wlun_to_scsi_wlun(UFS_UPIU_UFS_DEVICE_WLUN), NULL);
        if (IS_ERR(hba->sdev_ufs_device)) {
@@ -5102,6 +5105,7 @@ static int ufshcd_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op)
        enum ufs_dev_pwr_mode req_dev_pwr_mode;
        enum uic_link_state req_link_state;
 
+
        hba->pm_op_in_progress = 1;
        if (!ufshcd_is_shutdown_pm(pm_op)) {
                pm_lvl = ufshcd_is_runtime_pm(pm_op) ?
@@ -5156,9 +5160,12 @@ static int ufshcd_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op)
               !ufshcd_is_runtime_pm(pm_op))) {
                /* ensure that bkops is disabled */
                ufshcd_disable_auto_bkops(hba);
-               ret = ufshcd_set_dev_pwr_mode(hba, req_dev_pwr_mode);
-               if (ret)
-                       goto enable_gating;
+
+               if (hba->quirks & UFSHCD_QUIRK_ENABLE_WLUNS) {
+                       ret = ufshcd_set_dev_pwr_mode(hba, req_dev_pwr_mode);
+                       if (ret)
+                               goto enable_gating;
+               }
        }
 
        ret = ufshcd_link_state_transition(hba, req_link_state, 1);
@@ -5215,8 +5222,10 @@ set_link_active:
        else if (ufshcd_is_link_off(hba))
                ufshcd_host_reset_and_restore(hba);
 set_dev_active:
-       if (!ufshcd_set_dev_pwr_mode(hba, UFS_ACTIVE_PWR_MODE))
+       if (hba->quirks & UFSHCD_QUIRK_ENABLE_WLUNS) {
+               if (!ufshcd_set_dev_pwr_mode(hba, UFS_ACTIVE_PWR_MODE))
                ufshcd_disable_auto_bkops(hba);
+       }
 enable_gating:
        hba->clk_gating.is_suspended = false;
        ufshcd_release(hba);
@@ -5284,9 +5293,11 @@ static int ufshcd_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op)
        }
 
        if (!ufshcd_is_ufs_dev_active(hba)) {
-               ret = ufshcd_set_dev_pwr_mode(hba, UFS_ACTIVE_PWR_MODE);
-               if (ret)
-                       goto set_old_link_state;
+               if (hba->quirks & UFSHCD_QUIRK_ENABLE_WLUNS) {
+                       ret = ufshcd_set_dev_pwr_mode(hba, UFS_ACTIVE_PWR_MODE);
+                       if (ret)
+                               goto set_old_link_state;
+               }
        }
 
        /*
@@ -5373,13 +5384,14 @@ EXPORT_SYMBOL(ufshcd_system_suspend);
 
 int ufshcd_system_resume(struct ufs_hba *hba)
 {
-       if (!hba || !hba->is_powered || pm_runtime_suspended(hba->dev))
+       if (!hba || !hba->is_powered)
                /*
                 * Let the runtime resume take care of resuming
                 * if runtime suspended.
                 */
                return 0;
 
+
        return ufshcd_resume(hba, UFS_SYSTEM_PM);
 }
 EXPORT_SYMBOL(ufshcd_system_resume);
index 2f996cee02b828d14df57b63a9e0f1de99e25885..f0d3824c3f68f715d6149347cce7fabfddd47f76 100644 (file)
@@ -474,6 +474,11 @@ struct ufs_hba {
         */
        #define UFSHCD_QUIRK_ENABLE_BKOPS                       UFS_BIT(6)
 
+       /*
+         * Enable this quirk to support UFS WLUNS
+        */
+       #define UFSHCD_QUIRK_ENABLE_WLUNS                       UFS_BIT(7)
+
        unsigned int quirks;    /* Deviations from standard UFSHCI spec. */
 
        wait_queue_head_t tm_wq;