[ALSA] hda-intel - A slight cleanup of timeout check in azx_get_response()
authorTakashi Iwai <tiwai@suse.de>
Thu, 21 Sep 2006 11:34:13 +0000 (13:34 +0200)
committerJaroslav Kysela <perex@suse.cz>
Sat, 23 Sep 2006 08:48:06 +0000 (10:48 +0200)
A slight cleanup of timeout check in azx_get_response() to check
jiffies for HZ-independent timeout.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@suse.cz>
sound/pci/hda/hda_intel.c

index 4d2df771112e06f34dbe3c8844f2308627b31fba..e9d4cb4d07e11e07dedef1c9086a7d28f3a3cbb7 100644 (file)
@@ -520,38 +520,36 @@ static void azx_update_rirb(struct azx *chip)
 static unsigned int azx_rirb_get_response(struct hda_codec *codec)
 {
        struct azx *chip = codec->bus->private_data;
-       int timeout = 50;
+       unsigned long timeout;
 
-       for (;;) {
+ again:
+       timeout = jiffies + msecs_to_jiffies(1000);
+       do {
                if (chip->polling_mode) {
                        spin_lock_irq(&chip->reg_lock);
                        azx_update_rirb(chip);
                        spin_unlock_irq(&chip->reg_lock);
                }
                if (! chip->rirb.cmds)
-                       break;
-               if (! --timeout) {
-                       if (! chip->polling_mode) {
-                               snd_printk(KERN_WARNING "hda_intel: "
-                                          "azx_get_response timeout, "
-                                          "switching to polling mode...\n");
-                               chip->polling_mode = 1;
-                               timeout = 50;
-                               continue;
-                       }
-                       snd_printk(KERN_ERR
-                                  "hda_intel: azx_get_response timeout, "
-                                  "switching to single_cmd mode...\n");
-                       chip->rirb.rp = azx_readb(chip, RIRBWP);
-                       chip->rirb.cmds = 0;
-                       /* switch to single_cmd mode */
-                       chip->single_cmd = 1;
-                       azx_free_cmd_io(chip);
-                       return -1;
-               }
-               msleep(1);
+                       return chip->rirb.res; /* the last value */
+               schedule_timeout_interruptible(1);
+       } while (time_after_eq(timeout, jiffies));
+
+       if (!chip->polling_mode) {
+               snd_printk(KERN_WARNING "hda_intel: azx_get_response timeout, "
+                          "switching to polling mode...\n");
+               chip->polling_mode = 1;
+               goto again;
        }
-       return chip->rirb.res; /* the last value */
+
+       snd_printk(KERN_ERR "hda_intel: azx_get_response timeout, "
+                  "switching to single_cmd mode...\n");
+       chip->rirb.rp = azx_readb(chip, RIRBWP);
+       chip->rirb.cmds = 0;
+       /* switch to single_cmd mode */
+       chip->single_cmd = 1;
+       azx_free_cmd_io(chip);
+       return -1;
 }
 
 /*