Commit c0f6eebe authored by Jorge Ramirez-Ortiz's avatar Jorge Ramirez-Ortiz Committed by Herbert Xu

hwrng: optee - fix wait use case

The current code waits for data to be available before attempting a
second read. However the second read would not be executed as the
while loop will exit.

This fix does not wait if all data has been read (skips the call to
msleep(0)) and reads a second time if partial data was retrieved on
the first read.

Worth noticing that since msleep(0) schedules a one jiffy timeout is
better to skip such a call.
Signed-off-by: default avatarJorge Ramirez-Ortiz <jorge@foundries.io>
Reviewed-by: default avatarSumit Garg <sumit.garg@linaro.org>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 34093993
...@@ -122,14 +122,14 @@ static int optee_rng_read(struct hwrng *rng, void *buf, size_t max, bool wait) ...@@ -122,14 +122,14 @@ static int optee_rng_read(struct hwrng *rng, void *buf, size_t max, bool wait)
if (max > MAX_ENTROPY_REQ_SZ) if (max > MAX_ENTROPY_REQ_SZ)
max = MAX_ENTROPY_REQ_SZ; max = MAX_ENTROPY_REQ_SZ;
while (read == 0) { while (read < max) {
rng_size = get_optee_rng_data(pvt_data, data, (max - read)); rng_size = get_optee_rng_data(pvt_data, data, (max - read));
data += rng_size; data += rng_size;
read += rng_size; read += rng_size;
if (wait && pvt_data->data_rate) { if (wait && pvt_data->data_rate) {
if (timeout-- == 0) if ((timeout-- == 0) || (read == max))
return read; return read;
msleep((1000 * (max - read)) / pvt_data->data_rate); msleep((1000 * (max - read)) / pvt_data->data_rate);
} else { } else {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment