Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 96461
b: refs/heads/master
c: 3d88958
h: refs/heads/master
i:
  96459: cd53246
v: v3
  • Loading branch information
Jeff Dike authored and Linus Torvalds committed May 13, 2008
1 parent 7cc86d9 commit 402acc6
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 39 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 5d33e4d7fd9a52d2673e5c730eab81856e100a74
refs/heads/master: 3d88958e01e71bb14a367db75f12f7a59c068f02
79 changes: 41 additions & 38 deletions trunk/arch/um/drivers/random.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
/* Copyright (C) 2005 Jeff Dike <jdike@addtoit.com> */
/* Copyright (C) 2005 - 2008 Jeff Dike <jdike@{linux.intel,addtoit}.com> */

/* Much of this ripped from drivers/char/hw_random.c, see there for other
* copyright.
*
Expand Down Expand Up @@ -35,7 +36,7 @@ static int rng_dev_open (struct inode *inode, struct file *filp)
/* enforce read-only access to this chrdev */
if ((filp->f_mode & FMODE_READ) == 0)
return -EINVAL;
if (filp->f_mode & FMODE_WRITE)
if ((filp->f_mode & FMODE_WRITE) != 0)
return -EINVAL;

return 0;
Expand All @@ -44,31 +45,31 @@ static int rng_dev_open (struct inode *inode, struct file *filp)
static atomic_t host_sleep_count = ATOMIC_INIT(0);

static ssize_t rng_dev_read (struct file *filp, char __user *buf, size_t size,
loff_t * offp)
loff_t *offp)
{
u32 data;
int n, ret = 0, have_data;

while(size){
n = os_read_file(random_fd, &data, sizeof(data));
if(n > 0){
have_data = n;
while (have_data && size) {
if (put_user((u8)data, buf++)) {
ret = ret ? : -EFAULT;
break;
}
size--;
ret++;
have_data--;
data>>=8;
}
}
else if(n == -EAGAIN){
u32 data;
int n, ret = 0, have_data;

while (size) {
n = os_read_file(random_fd, &data, sizeof(data));
if (n > 0) {
have_data = n;
while (have_data && size) {
if (put_user((u8) data, buf++)) {
ret = ret ? : -EFAULT;
break;
}
size--;
ret++;
have_data--;
data >>= 8;
}
}
else if (n == -EAGAIN) {
DECLARE_WAITQUEUE(wait, current);

if (filp->f_flags & O_NONBLOCK)
return ret ? : -EAGAIN;
if (filp->f_flags & O_NONBLOCK)
return ret ? : -EAGAIN;

atomic_inc(&host_sleep_count);
reactivate_fd(random_fd, RANDOM_IRQ);
Expand All @@ -85,8 +86,10 @@ static ssize_t rng_dev_read (struct file *filp, char __user *buf, size_t size,
ignore_sigio_fd(random_fd);
deactivate_fd(random_fd, RANDOM_IRQ);
}
}
else return n;
}
else
return n;

if (signal_pending (current))
return ret ? : -ERESTARTSYS;
}
Expand Down Expand Up @@ -120,33 +123,33 @@ static int __init rng_init (void)
{
int err;

err = os_open_file("/dev/random", of_read(OPENFLAGS()), 0);
if(err < 0)
goto out;
err = os_open_file("/dev/random", of_read(OPENFLAGS()), 0);
if (err < 0)
goto out;

random_fd = err;
random_fd = err;

err = um_request_irq(RANDOM_IRQ, random_fd, IRQ_READ, random_interrupt,
IRQF_DISABLED | IRQF_SAMPLE_RANDOM, "random",
NULL);
if(err)
if (err)
goto err_out_cleanup_hw;

sigio_broken(random_fd, 1);

err = misc_register (&rng_miscdev);
if (err) {
printk (KERN_ERR RNG_MODULE_NAME ": misc device register failed\n");
printk (KERN_ERR RNG_MODULE_NAME ": misc device register "
"failed\n");
goto err_out_cleanup_hw;
}
out:
return err;

out:
return err;

err_out_cleanup_hw:
err_out_cleanup_hw:
os_close_file(random_fd);
random_fd = -1;
goto out;
random_fd = -1;
goto out;
}

/*
Expand Down

0 comments on commit 402acc6

Please sign in to comment.