summaryrefslogtreecommitdiff
path: root/drivers/char/hw_random/pseries-rng.c
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2014-11-20 23:46:04 +0300
committerTakashi Iwai <tiwai@suse.de>2014-11-20 23:46:04 +0300
commita69862d8d04e4877965cc938140c9f8e6da0b827 (patch)
tree667cace5c2fad872871e4d24d0c895664f0e0bc6 /drivers/char/hw_random/pseries-rng.c
parent0f32fd1900e6b972f289416dbd75e92772b630cb (diff)
parent01cb156edbbd4e6c4fd8db0d05f18c62c424f9aa (diff)
downloadlinux-a69862d8d04e4877965cc938140c9f8e6da0b827.tar.xz
Merge branch 'for-linus' into test/usb-resume
Diffstat (limited to 'drivers/char/hw_random/pseries-rng.c')
-rw-r--r--drivers/char/hw_random/pseries-rng.c11
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 @@
#include <asm/vio.h>
-static int pseries_rng_data_read(struct hwrng *rng, u32 *data)
+static int pseries_rng_read(struct hwrng *rng, void *data, size_t max, bool wait)
{
+ u64 buffer[PLPAR_HCALL_BUFSIZE];
+ size_t size = max < 8 ? max : 8;
int rc;
- rc = plpar_hcall(H_RANDOM, (unsigned long *)data);
+ rc = plpar_hcall(H_RANDOM, (unsigned long *)buffer);
if (rc != H_SUCCESS) {
pr_err_ratelimited("H_RANDOM call failed %d\n", rc);
return -EIO;
}
+ memcpy(data, buffer, size);
/* The hypervisor interface returns 64 bits */
- return 8;
+ return size;
}
/**
@@ -55,7 +58,7 @@ static unsigned long pseries_rng_get_desired_dma(struct vio_dev *vdev)
static struct hwrng pseries_rng = {
.name = KBUILD_MODNAME,
- .data_read = pseries_rng_data_read,
+ .read = pseries_rng_read,
};
static int __init pseries_rng_probe(struct vio_dev *dev,