Merge tag 'devicetree-fixes-for-5.13-2' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6-microblaze.git] / drivers / scsi / ufs / ufshcd.c
index 0625da7..72fd41b 100644 (file)
@@ -2842,7 +2842,7 @@ static int ufshcd_wait_for_dev_cmd(struct ufs_hba *hba,
  * ufshcd_exec_dev_cmd - API for sending device management requests
  * @hba: UFS hba
  * @cmd_type: specifies the type (NOP, Query...)
- * @timeout: time in seconds
+ * @timeout: timeout in milliseconds
  *
  * NOTE: Since there is only one available tag for device management commands,
  * it is expected you hold the hba->dev_cmd.lock mutex.
@@ -2872,6 +2872,9 @@ static int ufshcd_exec_dev_cmd(struct ufs_hba *hba,
        }
        tag = req->tag;
        WARN_ON_ONCE(!ufshcd_valid_tag(hba, tag));
+       /* Set the timeout such that the SCSI error handler is not activated. */
+       req->timeout = msecs_to_jiffies(2 * timeout);
+       blk_mq_start_request(req);
 
        init_completion(&wait);
        lrbp = &hba->lrb[tag];
@@ -8593,7 +8596,7 @@ static void ufshcd_vreg_set_lpm(struct ufs_hba *hba)
        } else if (!ufshcd_is_ufs_dev_active(hba)) {
                ufshcd_toggle_vreg(hba->dev, hba->vreg_info.vcc, false);
                vcc_off = true;
-               if (!ufshcd_is_link_active(hba)) {
+               if (ufshcd_is_link_hibern8(hba) || ufshcd_is_link_off(hba)) {
                        ufshcd_config_vreg_lpm(hba, hba->vreg_info.vccq);
                        ufshcd_config_vreg_lpm(hba, hba->vreg_info.vccq2);
                }
@@ -8615,7 +8618,7 @@ static int ufshcd_vreg_set_hpm(struct ufs_hba *hba)
            !hba->dev_info.is_lu_power_on_wp) {
                ret = ufshcd_setup_vreg(hba, true);
        } else if (!ufshcd_is_ufs_dev_active(hba)) {
-               if (!ret && !ufshcd_is_link_active(hba)) {
+               if (!ufshcd_is_link_active(hba)) {
                        ret = ufshcd_config_vreg_hpm(hba, hba->vreg_info.vccq);
                        if (ret)
                                goto vcc_disable;
@@ -8975,10 +8978,13 @@ int ufshcd_system_suspend(struct ufs_hba *hba)
        if (!hba->is_powered)
                return 0;
 
+       cancel_delayed_work_sync(&hba->rpm_dev_flush_recheck_work);
+
        if ((ufs_get_pm_lvl_to_dev_pwr_mode(hba->spm_lvl) ==
             hba->curr_dev_pwr_mode) &&
            (ufs_get_pm_lvl_to_link_pwr_state(hba->spm_lvl) ==
             hba->uic_link_state) &&
+            pm_runtime_suspended(hba->dev) &&
             !hba->dev_info.b_rpm_dev_flush_capable)
                goto out;