hwrng: atmel-rng - fix race condition leading to repeated bits
[platform/kernel/linux-rpi.git] / drivers / char / hw_random / atmel-rng.c
index f518b99..6289f0e 100644 (file)
@@ -36,6 +36,13 @@ static int atmel_trng_read(struct hwrng *rng, void *buf, size_t max,
        /* data ready? */
        if (readl(trng->base + TRNG_ODATA) & 1) {
                *data = readl(trng->base + TRNG_ODATA);
+               /*
+                 ensure data ready is only set again AFTER the next data
+                 word is ready in case it got set between checking ISR
+                 and reading ODATA, so we don't risk re-reading the
+                 same word
+               */
+               readl(trng->base + TRNG_ISR);
                return 4;
        } else
                return 0;