]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
bus: mhi: core: Improve mhi_sync_power_up handling for SYS_ERR state
authorVivek Pernamitta <quic_vpernami@quicinc.com>
Fri, 12 Sep 2025 12:48:09 +0000 (18:18 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Nov 2025 20:34:27 +0000 (15:34 -0500)
[ Upstream commit aa1a0e93ed21a06acb7ca9d4a4a9fce75ea53d0c ]

Allow mhi_sync_power_up to handle SYS_ERR during power-up, reboot,
or recovery. This is to avoid premature exit when MHI_PM_IN_ERROR_STATE is
observed during above mentioned system states.

To achieve this, treat SYS_ERR as a valid state and let its handler process
the error and queue the next transition to Mission Mode instead of aborting
early.

Signed-off-by: Vivek Pernamitta <quic_vpernami@quicinc.com>
[mani: reworded description]
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@oss.qualcomm.com>
Link: https://patch.msgid.link/20250912-uevent_vdev_next-20250911-v4-5-fa2f6ccd301b@quicinc.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/bus/mhi/host/internal.h
drivers/bus/mhi/host/pm.c

index 762df4bb7f64625d24f262cabe17cb52753472f2..e8b68c0fec7b0db66708db232d9f6702ae2deb7e 100644 (file)
@@ -163,6 +163,8 @@ enum mhi_pm_state {
                                                        MHI_PM_IN_ERROR_STATE(pm_state))
 #define MHI_PM_IN_SUSPEND_STATE(pm_state)              (pm_state & \
                                                        (MHI_PM_M3_ENTER | MHI_PM_M3))
+#define MHI_PM_FATAL_ERROR(pm_state)                   ((pm_state == MHI_PM_FW_DL_ERR) || \
+                                                       (pm_state >= MHI_PM_SYS_ERR_FAIL))
 
 #define NR_OF_CMD_RINGS                                        1
 #define CMD_EL_PER_RING                                        128
index 0ccbcb717955a3a539b7417361aa544a41630ef7..8f32dd0a2f218879dd63a86465833a951c0d5376 100644 (file)
@@ -1279,7 +1279,7 @@ int mhi_sync_power_up(struct mhi_controller *mhi_cntrl)
                mhi_cntrl->ready_timeout_ms : mhi_cntrl->timeout_ms;
        wait_event_timeout(mhi_cntrl->state_event,
                           MHI_IN_MISSION_MODE(mhi_cntrl->ee) ||
-                          MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state),
+                          MHI_PM_FATAL_ERROR(mhi_cntrl->pm_state),
                           msecs_to_jiffies(timeout_ms));
 
        ret = (MHI_IN_MISSION_MODE(mhi_cntrl->ee)) ? 0 : -ETIMEDOUT;