mhi: core: Ring out pending doorbells
Ring out pending doorbells in the event of a cancelled M3 transition attempt. Change-Id: I83ffe0407618ea26768707fc6341d20947ef3ba2 Signed-off-by: Andrei Danaila <adanaila@codeaurora.org>
This commit is contained in:
parent
91fd082145
commit
c84885de9a
1 changed files with 13 additions and 2 deletions
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (c) 2014, The Linux Foundation. All rights reserved.
|
/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License version 2 and
|
* it under the terms of the GNU General Public License version 2 and
|
||||||
|
@ -950,6 +950,7 @@ int mhi_initiate_m3(struct mhi_device_ctxt *mhi_dev_ctxt)
|
||||||
|
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int r;
|
int r;
|
||||||
|
int abort_m3 = 0;
|
||||||
|
|
||||||
mhi_log(MHI_MSG_INFO,
|
mhi_log(MHI_MSG_INFO,
|
||||||
"Entered MHI state %d, Pending M0 %d Pending M3 %d\n",
|
"Entered MHI state %d, Pending M0 %d Pending M3 %d\n",
|
||||||
|
@ -1007,11 +1008,14 @@ int mhi_initiate_m3(struct mhi_device_ctxt *mhi_dev_ctxt)
|
||||||
atomic_read(&mhi_dev_ctxt->counters.outbound_acks));
|
atomic_read(&mhi_dev_ctxt->counters.outbound_acks));
|
||||||
__pm_stay_awake(&mhi_dev_ctxt->w_lock);
|
__pm_stay_awake(&mhi_dev_ctxt->w_lock);
|
||||||
__pm_relax(&mhi_dev_ctxt->w_lock);
|
__pm_relax(&mhi_dev_ctxt->w_lock);
|
||||||
|
abort_m3 = 1;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (atomic_read(&mhi_dev_ctxt->flags.data_pending))
|
if (atomic_read(&mhi_dev_ctxt->flags.data_pending)) {
|
||||||
|
abort_m3 = 1;
|
||||||
goto exit;
|
goto exit;
|
||||||
|
}
|
||||||
r = hrtimer_cancel(&mhi_dev_ctxt->m1_timer);
|
r = hrtimer_cancel(&mhi_dev_ctxt->m1_timer);
|
||||||
if (r)
|
if (r)
|
||||||
mhi_log(MHI_MSG_INFO, "Cancelled M1 timer, timer was active\n");
|
mhi_log(MHI_MSG_INFO, "Cancelled M1 timer, timer was active\n");
|
||||||
|
@ -1061,6 +1065,13 @@ int mhi_initiate_m3(struct mhi_device_ctxt *mhi_dev_ctxt)
|
||||||
if (r)
|
if (r)
|
||||||
mhi_log(MHI_MSG_INFO, "Failed to set bus freq ret %d\n", r);
|
mhi_log(MHI_MSG_INFO, "Failed to set bus freq ret %d\n", r);
|
||||||
exit:
|
exit:
|
||||||
|
if (abort_m3) {
|
||||||
|
write_lock_irqsave(&mhi_dev_ctxt->xfer_lock, flags);
|
||||||
|
atomic_inc(&mhi_dev_ctxt->flags.data_pending);
|
||||||
|
write_unlock_irqrestore(&mhi_dev_ctxt->xfer_lock, flags);
|
||||||
|
ring_all_chan_dbs(mhi_dev_ctxt);
|
||||||
|
atomic_dec(&mhi_dev_ctxt->flags.data_pending);
|
||||||
|
}
|
||||||
atomic_set(&mhi_dev_ctxt->flags.m3_work_enabled, 0);
|
atomic_set(&mhi_dev_ctxt->flags.m3_work_enabled, 0);
|
||||||
mhi_dev_ctxt->flags.pending_M3 = 0;
|
mhi_dev_ctxt->flags.pending_M3 = 0;
|
||||||
mutex_unlock(&mhi_dev_ctxt->pm_lock);
|
mutex_unlock(&mhi_dev_ctxt->pm_lock);
|
||||||
|
|
Loading…
Add table
Reference in a new issue