From c3fc675285bc9542262e23c7330581eaf5a24de1 Mon Sep 17 00:00:00 2001 From: Cyril Bur Date: Tue, 5 Dec 2017 12:01:06 +1100 Subject: libflash/mbox-flash: Allow mbox-flash to tell the driver msg timeouts Currently when mbox-flash decides that a message times out the driver has no way of knowing to drop the message and will continue waiting for a response indefinitely preventing more messages from ever being sent. This is a problem if the BMC crashes or has some other issue where it won't ever respond to our outstanding message. This patch provides a method for mbox-flash to tell the driver how long it should wait before it no longer needs to care about the response. Signed-off-by: Cyril Bur Signed-off-by: Stewart Smith --- hw/lpc-mbox.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'hw') diff --git a/hw/lpc-mbox.c b/hw/lpc-mbox.c index 7421493..f303f4d 100644 --- a/hw/lpc-mbox.c +++ b/hw/lpc-mbox.c @@ -64,6 +64,7 @@ struct mbox { struct lock lock; /* Protect in_flight */ struct bmc_mbox_msg *in_flight; uint8_t sequence; + unsigned long timeout; }; static struct mbox mbox; @@ -115,7 +116,7 @@ static void bmc_mbox_send_message(struct bmc_mbox_msg *msg) bmc_mbox_outb(MBOX_CTRL_INT_SEND, MBOX_HOST_CTRL); } -int bmc_mbox_enqueue(struct bmc_mbox_msg *msg) +int bmc_mbox_enqueue(struct bmc_mbox_msg *msg, unsigned int timeout_sec) { if (!mbox.base) { prlog(PR_CRIT, "Using MBOX without init!\n"); @@ -125,10 +126,15 @@ int bmc_mbox_enqueue(struct bmc_mbox_msg *msg) lock(&mbox.lock); if (mbox.in_flight) { prlog(PR_DEBUG, "MBOX message already in flight\n"); - unlock(&mbox.lock); - return OPAL_BUSY; + if (mftb() > mbox.timeout) { + prlog(PR_ERR, "In flight message dropped on the floor\n"); + } else { + unlock(&mbox.lock); + return OPAL_BUSY; + } } + mbox.timeout = mftb() + secs_to_tb(timeout_sec); mbox.in_flight = msg; unlock(&mbox.lock); msg->seq = ++mbox.sequence; -- cgit v1.1