Hi, There is such 'side effect' with 'intel8x0m' AC97 modem driver. During AC97 initialization 'intel8x0m' allocates mixers for both codecs - audio and modem. With two codec cards if 'intel8x0m' is modprobed after sound driver ('intel8x0') when card was 'unmuted' already it mutes whole card again, but sound driver does not (and cannot) know about it - mixer settings are ok, but sound just disappears.
This patch prevents such behaviour. Now mixer is allocated only for modem codec (according to AC97 spec modem codec will be always secondary on multi-codec AC97 bus). Regards, Sasha.
--- pci/intel8x0m.c~ 2004-01-21 20:33:32.000000000 +0200 +++ pci/intel8x0m.c 2004-03-01 16:13:11.000000000 +0200 @@ -255,7 +255,7 @@ int in_ac97_init: 1; ac97_bus_t *ac97_bus; - ac97_t *ac97[3]; + ac97_t *ac97; spinlock_t reg_lock; spinlock_t ac97_lock; @@ -880,7 +880,7 @@ static void snd_intel8x0_mixer_free_ac97(ac97_t *ac97) { intel8x0_t *chip = snd_magic_cast(intel8x0_t, ac97->private_data, return); - chip->ac97[ac97->num] = NULL; + chip->ac97 = NULL; } @@ -889,7 +889,6 @@ ac97_bus_t bus, *pbus; ac97_t ac97, *x97; int err; - unsigned int i, codecs; unsigned int glob_sta = 0; chip->in_ac97_init = 1; @@ -908,27 +907,25 @@ glob_sta = igetdword(chip, ICHREG(GLOB_STA)); bus.write = snd_intel8x0_codec_write; bus.read = snd_intel8x0_codec_read; - codecs = glob_sta & ICH_SCR ? 2 : 1; bus.vra = 1; if ((err = snd_ac97_bus(chip->card, &bus, &pbus)) < 0) goto __err; chip->ac97_bus = pbus; ac97.pci = chip->pci; - for (i = 0; i < codecs; i++) { - ac97.num = i; - if ((err = snd_ac97_mixer(pbus, &ac97, &x97)) < 0) { - snd_printk(KERN_ERR "Unable to initialize codec #%d\n", i); - if (i == 0) - goto __err; - continue; - } - chip->ac97[i] = x97; - if(ac97_is_modem(x97) && !chip->ichd[ICHD_MDMIN].ac97 ) { - chip->ichd[ICHD_MDMIN].ac97 = x97; - chip->ichd[ICHD_MDMOUT].ac97 = x97; - } + ac97.num = glob_sta & ICH_SCR ? 1 : 0; + if ((err = snd_ac97_mixer(pbus, &ac97, &x97)) < 0) { + snd_printk(KERN_ERR "Unable to initialize codec #%d\n", ac97.num); + if (ac97.num == 0) + goto __err; + return err; } + chip->ac97 = x97; + if(ac97_is_modem(x97) && !chip->ichd[ICHD_MDMIN].ac97 ) { + chip->ichd[ICHD_MDMIN].ac97 = x97; + chip->ichd[ICHD_MDMOUT].ac97 = x97; + } + chip->in_ac97_init = 0; return 0; @@ -1006,11 +1003,9 @@ } else { /* resume phase */ - int i; status = 0; - for (i = 0; i < 3; i++) - if (chip->ac97[i]) - status |= get_ich_codec_bit(chip, i); + if (chip->ac97) + status |= get_ich_codec_bit(chip, chip->ac97->num); /* wait until all the probed codecs are ready */ end_time = jiffies + HZ; do { @@ -1102,7 +1097,6 @@ static void intel8x0_resume(intel8x0_t *chip) { snd_card_t *card = chip->card; - int i; if (! chip->in_suspend || card->power_state == SNDRV_CTL_POWER_D0) @@ -1111,9 +1105,8 @@ pci_enable_device(chip->pci); pci_set_master(chip->pci); snd_intel8x0_chip_init(chip, 0); - for (i = 0; i < 3; i++) - if (chip->ac97[i]) - snd_ac97_resume(chip->ac97[i]); + if (chip->ac97) + snd_ac97_resume(chip->ac97); chip->in_suspend = 0; snd_power_change_state(card, SNDRV_CTL_POWER_D0);