aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/hda
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2012-12-12 05:10:49 -0500
committerTakashi Iwai <tiwai@suse.de>2012-12-12 05:32:33 -0500
commitcc5ede3efdf1c3777efdf92124e7572c1024a7f0 (patch)
tree103bd4daea72d60e42fdbcb6bf3edb9412edae55 /sound/pci/hda
parentfa348da53b6ffd3dcebae288d4072a4571755d35 (diff)
ALSA: hda - Check validity of CORB/RIRB WP reads
When the HD-audio controller is disabled (e.g. via vga switcheroo) but the driver is still accessing it, it spews floods of "spurious response" kernel messages. It's because CORB/RIRB WP reads 0xff, and the driver tries to fill up until this number. This patch changes the CORB/RIRB WP reads to word instead of byte, and add the check of the read value. If it's 0xffff, the controller is supposed to be disabled, so the further action will be skipped. Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci/hda')
-rw-r--r--sound/pci/hda/hda_intel.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
index d00dea0eb7f9..eb88c528e120 100644
--- a/sound/pci/hda/hda_intel.c
+++ b/sound/pci/hda/hda_intel.c
@@ -799,7 +799,12 @@ static int azx_corb_send_cmd(struct hda_bus *bus, u32 val)
799 spin_lock_irq(&chip->reg_lock); 799 spin_lock_irq(&chip->reg_lock);
800 800
801 /* add command to corb */ 801 /* add command to corb */
802 wp = azx_readb(chip, CORBWP); 802 wp = azx_readw(chip, CORBWP);
803 if (wp == 0xffff) {
804 /* something wrong, controller likely turned to D3 */
805 spin_unlock_irq(&chip->reg_lock);
806 return -1;
807 }
803 wp++; 808 wp++;
804 wp %= ICH6_MAX_CORB_ENTRIES; 809 wp %= ICH6_MAX_CORB_ENTRIES;
805 810
@@ -821,7 +826,12 @@ static void azx_update_rirb(struct azx *chip)
821 unsigned int addr; 826 unsigned int addr;
822 u32 res, res_ex; 827 u32 res, res_ex;
823 828
824 wp = azx_readb(chip, RIRBWP); 829 wp = azx_readw(chip, RIRBWP);
830 if (wp == 0xffff) {
831 /* something wrong, controller likely turned to D3 */
832 return;
833 }
834
825 if (wp == chip->rirb.wp) 835 if (wp == chip->rirb.wp)
826 return; 836 return;
827 chip->rirb.wp = wp; 837 chip->rirb.wp = wp;