drivers (fsi): sbefifo: Add timeout for waiting for data
PATCH 1/1 drivers (fsi): sbefifo: Add timeout for waiting for data
From: "Edward A. James" <[email protected]>
During a transfer, in the event that the SBE isn't running, the driver will wait for data to appear in the FIFO forever. This doesn't work at BMC boot time if any transfers are attempted (by OCC driver probing, for example), as it will just hang the boot. So add a simple timeout mechanism when the driver reschdules waiting for data to show up in the FIFO.
Tested on witherspoon by rebooting the BMC successfully with chassis power on.
Signed-off-by Edward A. James <[email protected]>
--- drivers/fsi/fsi-sbefifo.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
drivers/fsi/fsi-sbefifo.c +16 -0
@@ -54,6 +54,7 @@#define SBEFIFO_EOT_ACK 0x14#define SBEFIFO_RESCHEDULE msecs_to_jiffies(500) +#define SBEFIFO_MAX_RESCHDULE msecs_to_jiffies(5000)struct sbefifo {struct timer_list poll_timer;
@@ -77,6 +78,7 @@ struct sbefifo_buf { };struct sbefifo_xfr { +unsigned long wait_data_timeout;struct sbefifo_buf *rbuf;struct sbefifo_buf *wbuf;struct list_head client;
@@ -450,6 +452,20 @@ static void sbefifo_poll_timer(unsigned long data) devn =sbefifo_dev_nwreadable (sts);if (devn ==0 ) { +/* +* Limit the maximum waiting period for data in the +* FIFO. If the SBE isn't running, we will wait +* forever. +*/ +if (!xfr->wait_data_timeout) { + xfr->wait_data_timeout = + jiffies +SBEFIFO_MAX_RESCHDULE ; + }else if (time_after (jiffies, + xfr->wait_data_timeout)) { + ret = -ETIME ; + goto out; + } +/* No data yet. Reschedule. */ sbefifo->poll_timer.expires = jiffies +SBEFIFO_RESCHEDULE ;
Signature · 1 line
1.8.3.1