Skip to content

Commit eb4a534

Browse files
Matt Porterherbertx
Matt Porter
authored andcommitted
hwrng: bcm2835 - fix oops when rng h/w is accessed during registration
Commit "d9e7972 hwrng: add randomness to system from rng sources" exposed a bug in the bcm2835-rng driver resulting in boot failure on Raspberry Pi due to the following oops: [ 28.261523] BUG: soft lockup - CPU#0 stuck for 23s! [swapper:1] [ 28.271058] [ 28.275958] CPU: 0 PID: 1 Comm: swapper Not tainted 3.14.0+ #11 [ 28.285374] task: db480000 ti: db484000 task.ti: db484000 [ 28.294279] PC is at bcm2835_rng_read+0x28/0x48 [ 28.302276] LR is at hwrng_register+0x1a8/0x238 . . . The RNG h/w is not completely initialized and enabled before hwrng_register() is called and so the bcm2835_rng_read() fails. Fix this by making the warmup/enable writes before registering the RNG source with the hwrng core. Signed-off-by: Matt Porter <[email protected]> Signed-off-by: Herbert Xu <[email protected]>
1 parent 59ecc26 commit eb4a534

File tree

1 file changed

+5
-5
lines changed

1 file changed

+5
-5
lines changed

drivers/char/hw_random/bcm2835-rng.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,18 +61,18 @@ static int bcm2835_rng_probe(struct platform_device *pdev)
6161
}
6262
bcm2835_rng_ops.priv = (unsigned long)rng_base;
6363

64+
/* set warm-up count & enable */
65+
__raw_writel(RNG_WARMUP_COUNT, rng_base + RNG_STATUS);
66+
__raw_writel(RNG_RBGEN, rng_base + RNG_CTRL);
67+
6468
/* register driver */
6569
err = hwrng_register(&bcm2835_rng_ops);
6670
if (err) {
6771
dev_err(dev, "hwrng registration failed\n");
6872
iounmap(rng_base);
69-
} else {
73+
} else
7074
dev_info(dev, "hwrng registered\n");
7175

72-
/* set warm-up count & enable */
73-
__raw_writel(RNG_WARMUP_COUNT, rng_base + RNG_STATUS);
74-
__raw_writel(RNG_RBGEN, rng_base + RNG_CTRL);
75-
}
7676
return err;
7777
}
7878

0 commit comments

Comments
 (0)