| From 84a8496569f31c1c4b6037f6724c2c388d492688 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 24 Jul 2020 16:45:18 +0930 |
| Subject: fsi/sbefifo: Fix reset timeout |
| |
| From: Joachim Fenkes <FENKES@de.ibm.com> |
| |
| [ Upstream commit 9ab1428dfe2c66b51e0b41337cd0164da0ab6080 ] |
| |
| On BMCs with lower timer resolution than 1ms, msleep(1) will take |
| way longer than 1ms, so looping 10k times won't wait for 10s but |
| significantly longer. |
| |
| Fix this by using jiffies like the rest of the code. |
| |
| Fixes: 9f4a8a2d7f9d ("fsi/sbefifo: Add driver for the SBE FIFO") |
| Signed-off-by: Joachim Fenkes <fenkes@de.ibm.com> |
| Link: https://lore.kernel.org/r/20200724071518.430515-3-joel@jms.id.au |
| Signed-off-by: Joel Stanley <joel@jms.id.au> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/fsi/fsi-sbefifo.c | 8 +++++--- |
| 1 file changed, 5 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/fsi/fsi-sbefifo.c b/drivers/fsi/fsi-sbefifo.c |
| index de27c435d706..84cb965bfed5 100644 |
| --- a/drivers/fsi/fsi-sbefifo.c |
| +++ b/drivers/fsi/fsi-sbefifo.c |
| @@ -325,7 +325,8 @@ static int sbefifo_up_write(struct sbefifo *sbefifo, __be32 word) |
| static int sbefifo_request_reset(struct sbefifo *sbefifo) |
| { |
| struct device *dev = &sbefifo->fsi_dev->dev; |
| - u32 status, timeout; |
| + unsigned long end_time; |
| + u32 status; |
| int rc; |
| |
| dev_dbg(dev, "Requesting FIFO reset\n"); |
| @@ -341,7 +342,8 @@ static int sbefifo_request_reset(struct sbefifo *sbefifo) |
| } |
| |
| /* Wait for it to complete */ |
| - for (timeout = 0; timeout < SBEFIFO_RESET_TIMEOUT; timeout++) { |
| + end_time = jiffies + msecs_to_jiffies(SBEFIFO_RESET_TIMEOUT); |
| + while (!time_after(jiffies, end_time)) { |
| rc = sbefifo_regr(sbefifo, SBEFIFO_UP | SBEFIFO_STS, &status); |
| if (rc) { |
| dev_err(dev, "Failed to read UP fifo status during reset" |
| @@ -355,7 +357,7 @@ static int sbefifo_request_reset(struct sbefifo *sbefifo) |
| return 0; |
| } |
| |
| - msleep(1); |
| + cond_resched(); |
| } |
| dev_err(dev, "FIFO reset timed out\n"); |
| |
| -- |
| 2.30.2 |
| |