mirror of
https://github.com/torvalds/linux.git
synced 2024-11-26 22:21:42 +00:00
Misc, phantom, fix poll
Return ERR even if there are pending data, but hw is not running. Do not decrement count in poll, do it in ioctl, where data are actually read. Signed-off-by: Jiri Slaby <jirislaby@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
7e4e8e689f
commit
7d4f9f094b
@ -169,6 +169,7 @@ static long phantom_ioctl(struct file *file, unsigned int cmd,
|
||||
for (i = 0; i < m; i++)
|
||||
if (rs.mask & BIT(i))
|
||||
rs.values[i] = ioread32(dev->iaddr + i);
|
||||
atomic_set(&dev->counter, 0);
|
||||
spin_unlock_irqrestore(&dev->regs_lock, flags);
|
||||
|
||||
if (copy_to_user(argp, &rs, sizeof(rs)))
|
||||
@ -254,11 +255,12 @@ static unsigned int phantom_poll(struct file *file, poll_table *wait)
|
||||
|
||||
pr_debug("phantom_poll: %d\n", atomic_read(&dev->counter));
|
||||
poll_wait(file, &dev->wait, wait);
|
||||
if (atomic_read(&dev->counter)) {
|
||||
|
||||
if (!(dev->status & PHB_RUNNING))
|
||||
mask = POLLERR;
|
||||
else if (atomic_read(&dev->counter))
|
||||
mask = POLLIN | POLLRDNORM;
|
||||
atomic_dec(&dev->counter);
|
||||
} else if ((dev->status & PHB_RUNNING) == 0)
|
||||
mask = POLLIN | POLLRDNORM | POLLERR;
|
||||
|
||||
pr_debug("phantom_poll end: %x/%d\n", mask, atomic_read(&dev->counter));
|
||||
|
||||
return mask;
|
||||
|
Loading…
Reference in New Issue
Block a user