[v2,2/5] bus: mhi: core: Make sure to powerdown if mhi_sync_power_up fails
diff mbox series

Message ID 1586278230-29565-3-git-send-email-jhugo@codeaurora.org
State New
Headers show
Series
  • Misc MHI fixes
Related show

Commit Message

Jeffrey Hugo April 7, 2020, 4:50 p.m. UTC
Powerdown is necessary if mhi_sync_power_up fails due to a timeout, to
clean up the resources.  Otherwise a BUG could be triggered when
attempting to clean up MSIs because the IRQ is still active from a
request_irq().

Signed-off-by: Jeffrey Hugo <jhugo@codeaurora.org>
---
 drivers/bus/mhi/core/pm.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

Comments

Hemant Kumar April 8, 2020, 1:34 a.m. UTC | #1
On 2020-04-07 09:50, Jeffrey Hugo wrote:
> Powerdown is necessary if mhi_sync_power_up fails due to a timeout, to
> clean up the resources.  Otherwise a BUG could be triggered when
> attempting to clean up MSIs because the IRQ is still active from a
> request_irq().
> 
> Signed-off-by: Jeffrey Hugo <jhugo@codeaurora.org>
> ---
>  drivers/bus/mhi/core/pm.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/bus/mhi/core/pm.c b/drivers/bus/mhi/core/pm.c
> index 3285c9e..fbffc6b 100644
> --- a/drivers/bus/mhi/core/pm.c
> +++ b/drivers/bus/mhi/core/pm.c
> @@ -922,7 +922,11 @@ int mhi_sync_power_up(struct mhi_controller 
> *mhi_cntrl)
>  			   MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state),
>  			   msecs_to_jiffies(mhi_cntrl->timeout_ms));
> 
> -	return (MHI_IN_MISSION_MODE(mhi_cntrl->ee)) ? 0 : -EIO;
> +	ret = (MHI_IN_MISSION_MODE(mhi_cntrl->ee)) ? 0 : -EIO;

Does it make sense to return -ETIMEDOUT instead of -EIO if device fails 
to move to mission mode?
Controller can use this info as mhi_async_power_up() would not return 
-ETIMEDOUT.

> +	if (ret)
> +		mhi_power_down(mhi_cntrl, false);
> +
> +	return ret;
>  }
>  EXPORT_SYMBOL(mhi_sync_power_up);
Jeffrey Hugo April 8, 2020, 4:19 p.m. UTC | #2
On 4/7/2020 7:34 PM, hemantk@codeaurora.org wrote:
> On 2020-04-07 09:50, Jeffrey Hugo wrote:
>> Powerdown is necessary if mhi_sync_power_up fails due to a timeout, to
>> clean up the resources.  Otherwise a BUG could be triggered when
>> attempting to clean up MSIs because the IRQ is still active from a
>> request_irq().
>>
>> Signed-off-by: Jeffrey Hugo <jhugo@codeaurora.org>
>> ---
>>  drivers/bus/mhi/core/pm.c | 6 +++++-
>>  1 file changed, 5 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/bus/mhi/core/pm.c b/drivers/bus/mhi/core/pm.c
>> index 3285c9e..fbffc6b 100644
>> --- a/drivers/bus/mhi/core/pm.c
>> +++ b/drivers/bus/mhi/core/pm.c
>> @@ -922,7 +922,11 @@ int mhi_sync_power_up(struct mhi_controller 
>> *mhi_cntrl)
>>                 MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state),
>>                 msecs_to_jiffies(mhi_cntrl->timeout_ms));
>>
>> -    return (MHI_IN_MISSION_MODE(mhi_cntrl->ee)) ? 0 : -EIO;
>> +    ret = (MHI_IN_MISSION_MODE(mhi_cntrl->ee)) ? 0 : -EIO;
> 
> Does it make sense to return -ETIMEDOUT instead of -EIO if device fails 
> to move to mission mode?
> Controller can use this info as mhi_async_power_up() would not return 
> -ETIMEDOUT.

It seems sensible to change this to ETIMEDOUT.  I'll queue that up for V3.

> 
>> +    if (ret)
>> +        mhi_power_down(mhi_cntrl, false);
>> +
>> +    return ret;
>>  }
>>  EXPORT_SYMBOL(mhi_sync_power_up);

Patch
diff mbox series

diff --git a/drivers/bus/mhi/core/pm.c b/drivers/bus/mhi/core/pm.c
index 3285c9e..fbffc6b 100644
--- a/drivers/bus/mhi/core/pm.c
+++ b/drivers/bus/mhi/core/pm.c
@@ -922,7 +922,11 @@  int mhi_sync_power_up(struct mhi_controller *mhi_cntrl)
 			   MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state),
 			   msecs_to_jiffies(mhi_cntrl->timeout_ms));
 
-	return (MHI_IN_MISSION_MODE(mhi_cntrl->ee)) ? 0 : -EIO;
+	ret = (MHI_IN_MISSION_MODE(mhi_cntrl->ee)) ? 0 : -EIO;
+	if (ret)
+		mhi_power_down(mhi_cntrl, false);
+
+	return ret;
 }
 EXPORT_SYMBOL(mhi_sync_power_up);