diff options
Diffstat (limited to 'drivers/char/hw_random/pseries-rng.c')
-rw-r--r-- | drivers/char/hw_random/pseries-rng.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/drivers/char/hw_random/pseries-rng.c b/drivers/char/hw_random/pseries-rng.c index 6226aa08c36a..bcf86f91800a 100644 --- a/drivers/char/hw_random/pseries-rng.c +++ b/drivers/char/hw_random/pseries-rng.c | |||
@@ -25,18 +25,21 @@ | |||
25 | #include <asm/vio.h> | 25 | #include <asm/vio.h> |
26 | 26 | ||
27 | 27 | ||
28 | static int pseries_rng_data_read(struct hwrng *rng, u32 *data) | 28 | static int pseries_rng_read(struct hwrng *rng, void *data, size_t max, bool wait) |
29 | { | 29 | { |
30 | u64 buffer[PLPAR_HCALL_BUFSIZE]; | ||
31 | size_t size = max < 8 ? max : 8; | ||
30 | int rc; | 32 | int rc; |
31 | 33 | ||
32 | rc = plpar_hcall(H_RANDOM, (unsigned long *)data); | 34 | rc = plpar_hcall(H_RANDOM, (unsigned long *)buffer); |
33 | if (rc != H_SUCCESS) { | 35 | if (rc != H_SUCCESS) { |
34 | pr_err_ratelimited("H_RANDOM call failed %d\n", rc); | 36 | pr_err_ratelimited("H_RANDOM call failed %d\n", rc); |
35 | return -EIO; | 37 | return -EIO; |
36 | } | 38 | } |
39 | memcpy(data, buffer, size); | ||
37 | 40 | ||
38 | /* The hypervisor interface returns 64 bits */ | 41 | /* The hypervisor interface returns 64 bits */ |
39 | return 8; | 42 | return size; |
40 | } | 43 | } |
41 | 44 | ||
42 | /** | 45 | /** |
@@ -55,7 +58,7 @@ static unsigned long pseries_rng_get_desired_dma(struct vio_dev *vdev) | |||
55 | 58 | ||
56 | static struct hwrng pseries_rng = { | 59 | static struct hwrng pseries_rng = { |
57 | .name = KBUILD_MODNAME, | 60 | .name = KBUILD_MODNAME, |
58 | .data_read = pseries_rng_data_read, | 61 | .read = pseries_rng_read, |
59 | }; | 62 | }; |
60 | 63 | ||
61 | static int __init pseries_rng_probe(struct vio_dev *dev, | 64 | static int __init pseries_rng_probe(struct vio_dev *dev, |