summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSmadar Fuks <smadarf@marvell.com>2021-09-01 11:08:59 +0530
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2021-09-22 12:28:01 +0200
commitc422c555053e5adc192b0f08d16d26cb59e4f249 (patch)
tree7197c518eac25da7eb1087fbf308c0c7c5c6006d
parent1cac475eeb9f5c46c1b5ddb4ca79f531ad15e1c8 (diff)
downloadlinux-stable-c422c555053e5adc192b0f08d16d26cb59e4f249.tar.gz
linux-stable-c422c555053e5adc192b0f08d16d26cb59e4f249.tar.bz2
linux-stable-c422c555053e5adc192b0f08d16d26cb59e4f249.zip
octeontx2-af: Add additional register check to rvu_poll_reg()
[ Upstream commit 21274aa1781941884599a97ab59be7f8f36af98c ] Check one more time before exiting the API with an error. Fix API to poll at least twice, in case there are other high priority tasks and this API doesn't get CPU cycles for multiple jiffies update. In addition, increase timeout from usecs_to_jiffies(10000) to usecs_to_jiffies(20000), to prevent the case that for CONFIG_100HZ timeout will be a single jiffies. A single jiffies results actual timeout that can be any time between 1usec and 10msec. To solve this, a value of usecs_to_jiffies(20000) ensures that timeout is 2 jiffies. Signed-off-by: Smadar Fuks <smadarf@marvell.com> Signed-off-by: Sunil Goutham <sgoutham@marvell.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Sasha Levin <sashal@kernel.org>
-rw-r--r--drivers/net/ethernet/marvell/octeontx2/af/rvu.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu.c
index 644d28b0692b..c26652436c53 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/rvu.c
+++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu.c
@@ -84,7 +84,8 @@ static void rvu_setup_hw_capabilities(struct rvu *rvu)
*/
int rvu_poll_reg(struct rvu *rvu, u64 block, u64 offset, u64 mask, bool zero)
{
- unsigned long timeout = jiffies + usecs_to_jiffies(10000);
+ unsigned long timeout = jiffies + usecs_to_jiffies(20000);
+ bool twice = false;
void __iomem *reg;
u64 reg_val;
@@ -99,6 +100,15 @@ again:
usleep_range(1, 5);
goto again;
}
+ /* In scenarios where CPU is scheduled out before checking
+ * 'time_before' (above) and gets scheduled in such that
+ * jiffies are beyond timeout value, then check again if HW is
+ * done with the operation in the meantime.
+ */
+ if (!twice) {
+ twice = true;
+ goto again;
+ }
return -EBUSY;
}