diff options
author | Shawn Nematbakhsh <shawnn@chromium.org> | 2016-10-20 14:59:53 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2016-10-26 01:45:25 -0700 |
commit | 907c09ee381ed53c7b081379ba71ed69fb062293 (patch) | |
tree | 5ebbd0b5dd3a83dc8bdcaf3e8e2404bc6ba34cef /core/nds32 | |
parent | fffea303b4a0892a51d6dad5e903d7869deff13c (diff) | |
download | chrome-ec-907c09ee381ed53c7b081379ba71ed69fb062293.tar.gz |
task: Don't propagate TASK_EVENT_TIMER between between waits
In __wait_evt(), if a timer expiration occurs after we read event
status, before the timer is canceled, then TASK_EVENT_TIMER will be
propagated to the next task wait, likely leading to premature timeout.
Prevent this by clearing TASK_EVENT_TIMER after canceling our timer.
BUG=chrome-os-partner:58658
BRANCH=gru
TEST=Manual on gru, run 'pd # hard' for 12 hours with charger attached,
verify no TCPC I2C read errors occur.
Change-Id: Iac2f05a768b4ef29f82e7c3eb899f4c7dd5c3744
Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/400968
Commit-Ready: Shawn N <shawnn@chromium.org>
Tested-by: Shawn N <shawnn@chromium.org>
Reviewed-by: Randall Spangler <rspangler@chromium.org>
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
Diffstat (limited to 'core/nds32')
-rw-r--r-- | core/nds32/task.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/core/nds32/task.c b/core/nds32/task.c index dc83cba088..36f7849f2b 100644 --- a/core/nds32/task.c +++ b/core/nds32/task.c @@ -434,8 +434,11 @@ static uint32_t __wait_evt(int timeout_us, task_id_t resched) __schedule(1, resched, 0); resched = TASK_ID_IDLE; } - if (timeout_us > 0) + if (timeout_us > 0) { timer_cancel(me); + /* Ensure timer event is clear, we no longer care about it */ + atomic_clear(&tsk->events, TASK_EVENT_TIMER); + } return evt; } |