]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
scsi: ufs: host: mediatek: Fix PWM mode switch issue
authorPeter Wang <peter.wang@mediatek.com>
Mon, 11 Aug 2025 13:11:21 +0000 (21:11 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Nov 2025 20:37:01 +0000 (15:37 -0500)
[ Upstream commit 7212d624f8638f8ea8ad1ecbb80622c7987bc7a1 ]

Address a failure in switching to PWM mode by ensuring proper
configuration of power modes and adaptation settings. The changes
include checks for SLOW_MODE and adjustments to the desired working mode
and adaptation configuration based on the device's power mode and
hardware version.

Signed-off-by: Peter Wang <peter.wang@mediatek.com>
Link: https://lore.kernel.org/r/20250811131423.3444014-6-peter.wang@mediatek.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/ufs/host/ufs-mediatek.c

index 8dd124835151af78e2df9fb678db1616d25f6a7b..4171fa672450d72ded00cd712ed95aa38cf872bb 100644 (file)
@@ -1303,6 +1303,10 @@ static bool ufs_mtk_pmc_via_fastauto(struct ufs_hba *hba,
            dev_req_params->gear_rx < UFS_HS_G4)
                return false;
 
+       if (dev_req_params->pwr_tx == SLOW_MODE ||
+           dev_req_params->pwr_rx == SLOW_MODE)
+               return false;
+
        return true;
 }
 
@@ -1318,6 +1322,10 @@ static int ufs_mtk_pre_pwr_change(struct ufs_hba *hba,
        host_params.hs_rx_gear = UFS_HS_G5;
        host_params.hs_tx_gear = UFS_HS_G5;
 
+       if (dev_max_params->pwr_rx == SLOW_MODE ||
+           dev_max_params->pwr_tx == SLOW_MODE)
+               host_params.desired_working_mode = UFS_PWM_MODE;
+
        ret = ufshcd_negotiate_pwr_params(&host_params, dev_max_params, dev_req_params);
        if (ret) {
                pr_info("%s: failed to determine capabilities\n",
@@ -1350,10 +1358,21 @@ static int ufs_mtk_pre_pwr_change(struct ufs_hba *hba,
                }
        }
 
-       if (host->hw_ver.major >= 3) {
+       if (dev_req_params->pwr_rx == FAST_MODE ||
+           dev_req_params->pwr_rx == FASTAUTO_MODE) {
+               if (host->hw_ver.major >= 3) {
+                       ret = ufshcd_dme_configure_adapt(hba,
+                                                  dev_req_params->gear_tx,
+                                                  PA_INITIAL_ADAPT);
+               } else {
+                       ret = ufshcd_dme_configure_adapt(hba,
+                                  dev_req_params->gear_tx,
+                                  PA_NO_ADAPT);
+               }
+       } else {
                ret = ufshcd_dme_configure_adapt(hba,
-                                          dev_req_params->gear_tx,
-                                          PA_INITIAL_ADAPT);
+                          dev_req_params->gear_tx,
+                          PA_NO_ADAPT);
        }
 
        return ret;