]> git.baikalelectronics.ru Git - kernel.git/commitdiff
octeontx2-af: Add additional register check to rvu_poll_reg()
authorSmadar Fuks <smadarf@marvell.com>
Wed, 1 Sep 2021 05:38:59 +0000 (11:08 +0530)
committerDavid S. Miller <davem@davemloft.net>
Wed, 1 Sep 2021 10:41:14 +0000 (11:41 +0100)
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>
drivers/net/ethernet/marvell/octeontx2/af/rvu.c

index ce647e037f4d91f627f134621cb6682e1e9e82b1..72de4eca6f67efd43f59e476b6d0791c017d8c7a 100644 (file)
@@ -92,7 +92,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;
 
@@ -107,6 +108,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;
 }