From: Joshua Lang <joshual...@google.com>

The buffer_status field is interrupt updated. After every read request,
the buffer_status read field should be reset so that on the next loop
iteration we don't read a stale value and read data before the
device is ready.

Signed-off-by: “Joshua Lang” <joshual...@google.com>
---
 drivers/staging/goldfish/goldfish_audio.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/drivers/staging/goldfish/goldfish_audio.c 
b/drivers/staging/goldfish/goldfish_audio.c
index f5b1e5169069..3210202e0a32 100644
--- a/drivers/staging/goldfish/goldfish_audio.c
+++ b/drivers/staging/goldfish/goldfish_audio.c
@@ -118,6 +118,7 @@ static ssize_t goldfish_audio_read(struct file *fp, char 
__user *buf,
                                   size_t count, loff_t *pos)
 {
        struct goldfish_audio *data = fp->private_data;
+       unsigned long irq_flags;
        int length;
        int result = 0;
 
@@ -131,6 +132,10 @@ static ssize_t goldfish_audio_read(struct file *fp, char 
__user *buf,
                wait_event_interruptible(data->wait, data->buffer_status &
                                         AUDIO_INT_READ_BUFFER_FULL);
 
+               spin_lock_irqsave(&data->lock, irq_flags);
+               data->buffer_status &= ~AUDIO_INT_READ_BUFFER_FULL;
+               spin_unlock_irqrestore(&data->lock, irq_flags);
+
                length = AUDIO_READ(data, AUDIO_READ_BUFFER_AVAILABLE);
 
                /* copy data to user space */
-- 
2.17.0.921.gf22659ad46-goog

_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to