mhi: core: add a timeout when waiting for MHI state BHI event.
It's possible for POR to fail and endpoint not enter correct reset state. Add a timeout when waiting for MHI state BHI transition event during firmware download. CRs-Fixed: 2062442 Change-Id: I6af16ec1a514d50b9e984e3fb16696d23e605ba0 Signed-off-by: Sujeev Dias <sdias@codeaurora.org>
This commit is contained in:
parent
085ef3652a
commit
a105b345b1
3 changed files with 12 additions and 12 deletions
|
@ -537,11 +537,12 @@ void bhi_firmware_download(struct work_struct *work)
|
|||
|
||||
mhi_log(mhi_dev_ctxt, MHI_MSG_INFO, "Enter\n");
|
||||
|
||||
wait_event_interruptible(*mhi_dev_ctxt->mhi_ev_wq.bhi_event,
|
||||
ret = wait_event_interruptible_timeout(
|
||||
*mhi_dev_ctxt->mhi_ev_wq.bhi_event,
|
||||
mhi_dev_ctxt->mhi_state == MHI_STATE_BHI ||
|
||||
mhi_dev_ctxt->mhi_pm_state == MHI_PM_LD_ERR_FATAL_DETECT);
|
||||
if (mhi_dev_ctxt->mhi_pm_state == MHI_PM_LD_ERR_FATAL_DETECT ||
|
||||
mhi_dev_ctxt->mhi_state != MHI_STATE_BHI) {
|
||||
mhi_dev_ctxt->mhi_pm_state == MHI_PM_LD_ERR_FATAL_DETECT,
|
||||
msecs_to_jiffies(MHI_MAX_STATE_TRANSITION_TIMEOUT));
|
||||
if (!ret || mhi_dev_ctxt->mhi_pm_state == MHI_PM_LD_ERR_FATAL_DETECT) {
|
||||
mhi_log(mhi_dev_ctxt, MHI_MSG_ERROR,
|
||||
"MHI is not in valid state for firmware download\n");
|
||||
return;
|
||||
|
|
|
@ -27,8 +27,7 @@
|
|||
#define CMD_EL_PER_RING 128
|
||||
#define ELEMENT_GAP 1
|
||||
#define MHI_EPID 4
|
||||
#define MHI_MAX_RESUME_TIMEOUT 5000
|
||||
#define MHI_MAX_SUSPEND_TIMEOUT 5000
|
||||
#define MHI_MAX_STATE_TRANSITION_TIMEOUT 5000
|
||||
#define MHI_MAX_CMD_TIMEOUT 500
|
||||
#define MHI_RPM_AUTOSUSPEND_TMR_VAL_MS 1000
|
||||
#define MAX_BUF_SIZE 32
|
||||
|
|
|
@ -116,7 +116,7 @@ static int mhi_pm_initiate_m3(struct mhi_device_ctxt *mhi_dev_ctxt,
|
|||
mhi_dev_ctxt->mhi_state == MHI_STATE_M0 ||
|
||||
mhi_dev_ctxt->mhi_state == MHI_STATE_M1 ||
|
||||
mhi_dev_ctxt->mhi_pm_state == MHI_PM_LD_ERR_FATAL_DETECT,
|
||||
msecs_to_jiffies(MHI_MAX_RESUME_TIMEOUT));
|
||||
msecs_to_jiffies(MHI_MAX_STATE_TRANSITION_TIMEOUT));
|
||||
if (!r || mhi_dev_ctxt->mhi_pm_state == MHI_PM_LD_ERR_FATAL_DETECT) {
|
||||
mhi_log(mhi_dev_ctxt, MHI_MSG_ERROR,
|
||||
"Failed to get M0||M1 event or LD pm_state:0x%x state:%s\n",
|
||||
|
@ -142,7 +142,7 @@ static int mhi_pm_initiate_m3(struct mhi_device_ctxt *mhi_dev_ctxt,
|
|||
r = wait_event_timeout(*mhi_dev_ctxt->mhi_ev_wq.m3_event,
|
||||
mhi_dev_ctxt->mhi_state == MHI_STATE_M3 ||
|
||||
mhi_dev_ctxt->mhi_pm_state == MHI_PM_LD_ERR_FATAL_DETECT,
|
||||
msecs_to_jiffies(MHI_MAX_SUSPEND_TIMEOUT));
|
||||
msecs_to_jiffies(MHI_MAX_STATE_TRANSITION_TIMEOUT));
|
||||
if (!r || mhi_dev_ctxt->mhi_pm_state == MHI_PM_LD_ERR_FATAL_DETECT) {
|
||||
mhi_log(mhi_dev_ctxt, MHI_MSG_ERROR,
|
||||
"Failed to get M3 event, timeout, current state:%s\n",
|
||||
|
@ -180,7 +180,7 @@ static int mhi_pm_initiate_m0(struct mhi_device_ctxt *mhi_dev_ctxt)
|
|||
mhi_dev_ctxt->mhi_state == MHI_STATE_M0 ||
|
||||
mhi_dev_ctxt->mhi_state == MHI_STATE_M1 ||
|
||||
mhi_dev_ctxt->mhi_pm_state == MHI_PM_LD_ERR_FATAL_DETECT,
|
||||
msecs_to_jiffies(MHI_MAX_RESUME_TIMEOUT));
|
||||
msecs_to_jiffies(MHI_MAX_STATE_TRANSITION_TIMEOUT));
|
||||
if (!r || mhi_dev_ctxt->mhi_pm_state == MHI_PM_LD_ERR_FATAL_DETECT) {
|
||||
mhi_log(mhi_dev_ctxt, MHI_MSG_ERROR,
|
||||
"Failed to get M0 event, timeout or LD\n");
|
||||
|
@ -322,9 +322,6 @@ static int mhi_pm_slave_mode_power_on(struct mhi_device_ctxt *mhi_dev_ctxt)
|
|||
else
|
||||
ret_val = 0;
|
||||
|
||||
/* wait for firmware download to complete */
|
||||
flush_work(&mhi_dev_ctxt->bhi_ctxt.fw_load_work);
|
||||
|
||||
if (ret_val) {
|
||||
read_lock_irq(&mhi_dev_ctxt->pm_xfer_lock);
|
||||
mhi_dev_ctxt->deassert_wake(mhi_dev_ctxt);
|
||||
|
@ -333,6 +330,9 @@ static int mhi_pm_slave_mode_power_on(struct mhi_device_ctxt *mhi_dev_ctxt)
|
|||
|
||||
unlock_pm_lock:
|
||||
|
||||
/* wait for firmware download to complete */
|
||||
flush_work(&mhi_dev_ctxt->bhi_ctxt.fw_load_work);
|
||||
|
||||
mhi_log(mhi_dev_ctxt, MHI_MSG_INFO, "Exit with ret:%d\n", ret_val);
|
||||
mutex_unlock(&mhi_dev_ctxt->pm_lock);
|
||||
return ret_val;
|
||||
|
|
Loading…
Add table
Reference in a new issue