From cd45260e94abb81668b785027ecf5489ccd137f2 Mon Sep 17 00:00:00 2001
From: John Crispin <blogic@openwrt.org>
Date: Tue, 11 Sep 2007 16:53:53 +0000
Subject: fix a possible dead lock in the fonera-mp3 driver, that can happen,
 when the buffer runs dry

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@8753 3c298f89-4303-0410-b956-a3cf2f4a3e73
---
 package/fonera-mp3-drv/src/mp3_drv.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

(limited to 'package')

diff --git a/package/fonera-mp3-drv/src/mp3_drv.c b/package/fonera-mp3-drv/src/mp3_drv.c
index 9609444181..a2d8c79ae6 100644
--- a/package/fonera-mp3-drv/src/mp3_drv.c
+++ b/package/fonera-mp3-drv/src/mp3_drv.c
@@ -101,11 +101,12 @@ static DECLARE_COMPLETION(mp3_exit);
 static int mp3_playback_thread(void *data){
 	int j;
 	unsigned long timeout;
+	unsigned char empty = 0;
 	printk("started kthread\n");
 	daemonize("kmp3");
 	while(mp3_buffering_status != MP3_PLAY_FINISHED){
 		if((mp3_buffering_status == MP3_PLAYING) || (mp3_buffering_status == MP3_BUFFER_FINISHED)){
-			while(VS1011_NEEDS_DATA){
+			while((VS1011_NEEDS_DATA) && (!empty)){
 				if(mp3_buffer_offset_read == MP3_BUFFER_SIZE){
 					mp3_buffer_offset_read = 0;
 				}
@@ -115,6 +116,7 @@ static int mp3_playback_thread(void *data){
 						printk("mp3_drv.ko : finished playing\n");
 						mp3_buffering_status = MP3_PLAY_FINISHED;
 					} else {
+						empty = 1;
 						printk("mp3_drv.ko : buffer empty ?\n");
 						if(mp3_buffering_status != MP3_PLAY_FINISHED){
 						}
@@ -128,8 +130,9 @@ static int mp3_playback_thread(void *data){
 				}
 			}
 		}
+		empty = 0;
 		timeout = 1;	
-        	timeout = wait_event_interruptible_timeout(wq, (timeout==0), timeout);	
+       	timeout = wait_event_interruptible_timeout(wq, (timeout==0), timeout);	
 	}
 	complete_and_exit(&mp3_exit, 0); 
 }
-- 
cgit v1.2.3