From: Kevin Hao <kexin....@windriver.com>

The SDK commit a9d5338d0643 ("hwrng: bcm2835 - sleep more
intelligently") and stable commit 3c5c7f926a4b ("hwrng: bcm2835 - Fix
hwrng throughput regression") are trying to fix the same issue with
different implementation. The later approach is better. So revert
the SDK changes.

Signed-off-by: Kevin Hao <kexin....@windriver.com>
---
Hi Bruce,

Please help me merge this into the following two branches:
  v6.1/standard/bcm-2xxx-rpi
  v6.1/standard/preempt-rt/bcm-2xxx-rpi

 drivers/char/hw_random/bcm2835-rng.c | 19 +++++--------------
 1 file changed, 5 insertions(+), 14 deletions(-)

diff --git a/drivers/char/hw_random/bcm2835-rng.c 
b/drivers/char/hw_random/bcm2835-rng.c
index b821fc12c80d..f46731a5dfe1 100644
--- a/drivers/char/hw_random/bcm2835-rng.c
+++ b/drivers/char/hw_random/bcm2835-rng.c
@@ -14,7 +14,6 @@
 #include <linux/printk.h>
 #include <linux/clk.h>
 #include <linux/reset.h>
-#include <linux/delay.h>
 
 #define RNG_CTRL       0x0
 #define RNG_STATUS     0x4
@@ -29,9 +28,6 @@
 
 #define RNG_INT_OFF    0x1
 
-#define RNG_FIFO_WORDS 4
-#define RNG_US_PER_WORD        34 /* Tuned for throughput */
-
 struct bcm2835_rng_priv {
        struct hwrng rng;
        void __iomem *base;
@@ -68,24 +64,19 @@ static inline void rng_writel(struct bcm2835_rng_priv 
*priv, u32 val,
 static int bcm2835_rng_read(struct hwrng *rng, void *buf, size_t max,
                               bool wait)
 {
-       u32 retries = 1000000/(RNG_FIFO_WORDS * RNG_US_PER_WORD);
        struct bcm2835_rng_priv *priv = to_rng_priv(rng);
        u32 max_words = max / sizeof(u32);
        u32 num_words, count;
 
-       num_words = rng_readl(priv, RNG_STATUS) >> 24;
-
-       while (!num_words) {
-               if (!wait || !retries)
+       while ((rng_readl(priv, RNG_STATUS) >> 24) == 0) {
+               if (!wait)
                        return 0;
-               retries--;
-               usleep_range((u32)RNG_US_PER_WORD,
-                            (u32)RNG_US_PER_WORD * RNG_FIFO_WORDS);
-               num_words = rng_readl(priv, RNG_STATUS) >> 24;
                hwrng_yield(rng);
        }
 
-       num_words = min(num_words, max_words);
+       num_words = rng_readl(priv, RNG_STATUS) >> 24;
+       if (num_words > max_words)
+               num_words = max_words;
 
        for (count = 0; count < num_words; count++)
                ((u32 *)buf)[count] = rng_readl(priv, RNG_DATA);
-- 
2.39.2

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#13359): 
https://lists.yoctoproject.org/g/linux-yocto/message/13359
Mute This Topic: https://lists.yoctoproject.org/mt/102969990/21656
Group Owner: linux-yocto+ow...@lists.yoctoproject.org
Unsubscribe: https://lists.yoctoproject.org/g/linux-yocto/unsub 
[arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to