]> git.karo-electronics.de Git - linux-beck.git/commitdiff
ALSA: sscape: fix incorrect timeout after microcode upload
authorKrzysztof Helt <krzysztof.h1@wp.pl>
Mon, 12 Jan 2009 20:25:04 +0000 (21:25 +0100)
committerTakashi Iwai <tiwai@suse.de>
Tue, 13 Jan 2009 06:52:24 +0000 (07:52 +0100)
A comment states that one should wait up to 5 secs
while a waiting loop waits only 5 system ticks.

Signed-off-by: Krzysztof Helt <krzysztof.h1@wp.pl>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/isa/sscape.c

index bc449166d18d6544408cd14cd40c2d9660a5bc5b..6a7f842b9627b399642e5a542f8e1d7ffe2b5656 100644 (file)
@@ -393,20 +393,20 @@ static int sscape_wait_dma_unsafe(unsigned io_base, enum GA_REG reg, unsigned ti
  */
 static int obp_startup_ack(struct soundscape *s, unsigned timeout)
 {
-       while (timeout != 0) {
+       unsigned long end_time = jiffies + msecs_to_jiffies(timeout);
+
+       do {
                unsigned long flags;
                unsigned char x;
 
-               schedule_timeout_uninterruptible(1);
-
                spin_lock_irqsave(&s->lock, flags);
                x = inb(HOST_DATA_IO(s->io_base));
                spin_unlock_irqrestore(&s->lock, flags);
                if ((x & 0xfe) == 0xfe)
                        return 1;
 
-               --timeout;
-       } /* while */
+               msleep(10);
+       } while (time_before(jiffies, end_time));
 
        return 0;
 }
@@ -420,20 +420,20 @@ static int obp_startup_ack(struct soundscape *s, unsigned timeout)
  */
 static int host_startup_ack(struct soundscape *s, unsigned timeout)
 {
-       while (timeout != 0) {
+       unsigned long end_time = jiffies + msecs_to_jiffies(timeout);
+
+       do {
                unsigned long flags;
                unsigned char x;
 
-               schedule_timeout_uninterruptible(1);
-
                spin_lock_irqsave(&s->lock, flags);
                x = inb(HOST_DATA_IO(s->io_base));
                spin_unlock_irqrestore(&s->lock, flags);
                if (x == 0xfe)
                        return 1;
 
-               --timeout;
-       } /* while */
+               msleep(10);
+       } while (time_before(jiffies, end_time));
 
        return 0;
 }
@@ -529,10 +529,10 @@ static int upload_dma_data(struct soundscape *s,
         * give it 5 seconds (max) ...
         */
        ret = 0;
-       if (!obp_startup_ack(s, 5)) {
+       if (!obp_startup_ack(s, 5000)) {
                snd_printk(KERN_ERR "sscape: No response from on-board processor after upload\n");
                ret = -EAGAIN;
-       } else if (!host_startup_ack(s, 5)) {
+       } else if (!host_startup_ack(s, 5000)) {
                snd_printk(KERN_ERR "sscape: SoundScape failed to initialise\n");
                ret = -EAGAIN;
        }