aboutsummaryrefslogtreecommitdiff
path: root/core/ipmi.c
diff options
context:
space:
mode:
Diffstat (limited to 'core/ipmi.c')
-rw-r--r--core/ipmi.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/core/ipmi.c b/core/ipmi.c
index 2bf3f4d..9cf5aa6 100644
--- a/core/ipmi.c
+++ b/core/ipmi.c
@@ -182,8 +182,18 @@ void ipmi_queue_msg_sync(struct ipmi_msg *msg)
ipmi_queue_msg_head(msg);
unlock(&sync_lock);
- while (sync_msg == msg)
+ /*
+ * BT response handling relies on a timer. We can't just run all
+ * timers because we may have been called with a lock that a timer
+ * wants, and they're generally not written to cope with that.
+ * So, just run whatever the IPMI backend needs to make forward
+ * progress.
+ */
+ while (sync_msg == msg) {
+ if (msg->backend->poll)
+ msg->backend->poll();
time_wait_ms(10);
+ }
}
static void ipmi_read_event_complete(struct ipmi_msg *msg)