The SMCCC_RET_TRNG_NO_ENTROPY switch arm is never used because the NO_ENTROPY return value is negative and negative values are handled above the switch by immediately returning. Fix by handling errors using a default arm in the switch. Fixes: 0888d04b47a1 ("hwrng: Add Arm SMCCC TRNG based driver") Signed-off-by: James Cowgill <james.cowgill@xxxxxxxxxx> --- drivers/char/hw_random/arm_smccc_trng.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/char/hw_random/arm_smccc_trng.c b/drivers/char/hw_random/arm_smccc_trng.c index b24ac39a903b..e34c3ea692b6 100644 --- a/drivers/char/hw_random/arm_smccc_trng.c +++ b/drivers/char/hw_random/arm_smccc_trng.c @@ -66,33 +66,33 @@ static int smccc_trng_read(struct hwrng *rng, void *data, size_t max, bool wait) unsigned int copied = 0; int tries = 0; while (copied < max) { size_t bits = min_t(size_t, (max - copied) * BITS_PER_BYTE, MAX_BITS_PER_CALL); arm_smccc_1_1_invoke(ARM_SMCCC_TRNG_RND, bits, &res); - if ((int)res.a0 < 0) - return (int)res.a0; switch ((int)res.a0) { case SMCCC_RET_SUCCESS: copied += copy_from_registers(buf + copied, &res, bits / BITS_PER_BYTE); tries = 0; break; case SMCCC_RET_TRNG_NO_ENTROPY: if (!wait) return copied; tries++; if (tries >= SMCCC_TRNG_MAX_TRIES) return copied; cond_resched(); break; + default: + return -EIO; } } return copied; } static int smccc_trng_probe(struct platform_device *pdev) { -- 2.36.1