bus: mhi: core: Check state before processing power_down
We cannot process a power_down if the power state is DISABLED. There is no valid mhi_ctxt in that case, so attepting to process the power_down will likely result in a null pointer dereference. If the power state is DISABLED, there is nothing to do anyways, so just bail early. Signed-off-by: Jeffrey Hugo <jhugo@codeaurora.org> Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> Link: https://lore.kernel.org/r/1615409365-8165-1-git-send-email-jhugo@codeaurora.org Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
This commit is contained in:
parent
68731852f6
commit
9e40641f62
@ -1134,6 +1134,7 @@ error_setup_irq:
|
|||||||
mhi_deinit_dev_ctxt(mhi_cntrl);
|
mhi_deinit_dev_ctxt(mhi_cntrl);
|
||||||
|
|
||||||
error_dev_ctxt:
|
error_dev_ctxt:
|
||||||
|
mhi_cntrl->pm_state = MHI_PM_DISABLE;
|
||||||
mutex_unlock(&mhi_cntrl->pm_mutex);
|
mutex_unlock(&mhi_cntrl->pm_mutex);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@ -1145,12 +1146,19 @@ void mhi_power_down(struct mhi_controller *mhi_cntrl, bool graceful)
|
|||||||
enum mhi_pm_state cur_state, transition_state;
|
enum mhi_pm_state cur_state, transition_state;
|
||||||
struct device *dev = &mhi_cntrl->mhi_dev->dev;
|
struct device *dev = &mhi_cntrl->mhi_dev->dev;
|
||||||
|
|
||||||
|
mutex_lock(&mhi_cntrl->pm_mutex);
|
||||||
|
write_lock_irq(&mhi_cntrl->pm_lock);
|
||||||
|
cur_state = mhi_cntrl->pm_state;
|
||||||
|
if (cur_state == MHI_PM_DISABLE) {
|
||||||
|
write_unlock_irq(&mhi_cntrl->pm_lock);
|
||||||
|
mutex_unlock(&mhi_cntrl->pm_mutex);
|
||||||
|
return; /* Already powered down */
|
||||||
|
}
|
||||||
|
|
||||||
/* If it's not a graceful shutdown, force MHI to linkdown state */
|
/* If it's not a graceful shutdown, force MHI to linkdown state */
|
||||||
transition_state = (graceful) ? MHI_PM_SHUTDOWN_PROCESS :
|
transition_state = (graceful) ? MHI_PM_SHUTDOWN_PROCESS :
|
||||||
MHI_PM_LD_ERR_FATAL_DETECT;
|
MHI_PM_LD_ERR_FATAL_DETECT;
|
||||||
|
|
||||||
mutex_lock(&mhi_cntrl->pm_mutex);
|
|
||||||
write_lock_irq(&mhi_cntrl->pm_lock);
|
|
||||||
cur_state = mhi_tryset_pm_state(mhi_cntrl, transition_state);
|
cur_state = mhi_tryset_pm_state(mhi_cntrl, transition_state);
|
||||||
if (cur_state != transition_state) {
|
if (cur_state != transition_state) {
|
||||||
dev_err(dev, "Failed to move to state: %s from: %s\n",
|
dev_err(dev, "Failed to move to state: %s from: %s\n",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user