[alsa-devel] [PATCH] Fix oopses in snd-hda-intel from alsa v1.0.18rc3

Takashi Iwai tiwai at suse.de
Sat Sep 13 16:57:09 CEST 2008


At Fri, 12 Sep 2008 03:04:39 -0300,
Herton Ronaldo Krzesinski wrote:
> 
> On Friday 12 September 2008 02:43:02 Herton Ronaldo Krzesinski wrote:
> > Fixes the following oopses and other likewise possible ones:
> > 
> 
> Ouch, just pasted the oopses for reference and forgot a real changelog, it can
> be like this:
> 
> ---
> 
> ALSA: hda: fix oopses in snd-hda-intel after digital slave support additions
> 
> Many places fail to check if codec has slave_dig_outs entries (the most common
> case is not having any entry), leading to various possible oopses in hda_codec
> code.

My bad.  I should have been more careful, but I couldn't test enough
as I was in a conference.

Anyway, applied now on sound-2.6 git tree.  Thanks!


Takashi

> 
> > 
> > Signed-off-by: Herton Ronaldo Krzesinski <herton at mandriva.com.br>
> > 
> > diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
> > index 696d77e..531364d 100644
> > --- a/sound/pci/hda/hda_codec.c
> > +++ b/sound/pci/hda/hda_codec.c
> > @@ -1462,14 +1462,15 @@ static int snd_hda_spdif_default_put(struct snd_kcontrol *kcontrol,
> >  					  AC_VERB_SET_DIGI_CONVERT_2,
> >  					  val >> 8);
> >  
> > -		for (d = codec->slave_dig_outs; *d; d++) {
> > -			snd_hda_codec_write_cache(codec, *d, 0,
> > +		if (codec->slave_dig_outs)
> > +			for (d = codec->slave_dig_outs; *d; d++) {
> > +				snd_hda_codec_write_cache(codec, *d, 0,
> >  					  AC_VERB_SET_DIGI_CONVERT_1,
> >  					  val & 0xff);
> > -			snd_hda_codec_write_cache(codec, *d, 0,
> > +				snd_hda_codec_write_cache(codec, *d, 0,
> >  					  AC_VERB_SET_DIGI_CONVERT_2,
> >  					  val >> 8);
> > -		}
> > +			}
> >  	}
> >  
> >  	mutex_unlock(&codec->spdif_mutex);
> > @@ -1507,8 +1508,9 @@ static int snd_hda_spdif_out_switch_put(struct snd_kcontrol *kcontrol,
> >  					  AC_VERB_SET_DIGI_CONVERT_1,
> >  					  val & 0xff);
> >  
> > -		for (d = codec->slave_dig_outs; *d; d++)
> > -			snd_hda_codec_write_cache(codec, *d, 0,
> > +		if (codec->slave_dig_outs)
> > +			for (d = codec->slave_dig_outs; *d; d++)
> > +				snd_hda_codec_write_cache(codec, *d, 0,
> >  					  AC_VERB_SET_DIGI_CONVERT_1,
> >  					  val & 0xff);
> >  		/* unmute amp switch (if any) */
> > @@ -1664,8 +1666,9 @@ static int snd_hda_spdif_in_switch_put(struct snd_kcontrol *kcontrol,
> >  		snd_hda_codec_write_cache(codec, nid, 0,
> >  					  AC_VERB_SET_DIGI_CONVERT_1, val);
> >  
> > -		for (d = codec->slave_dig_outs; *d; d++)
> > -			snd_hda_codec_write_cache(codec, *d, 0,
> > +		if (codec->slave_dig_outs)
> > +			for (d = codec->slave_dig_outs; *d; d++)
> > +				snd_hda_codec_write_cache(codec, *d, 0,
> >  					  AC_VERB_SET_DIGI_CONVERT_1, val);
> >  	}
> >  	mutex_unlock(&codec->spdif_mutex);
> > @@ -2617,9 +2620,10 @@ static void setup_dig_out_stream(struct hda_codec *codec, hda_nid_t nid,
> >  		snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1,
> >  			    codec->spdif_ctls & ~AC_DIG1_ENABLE & 0xff);
> >  
> > -		for (d = codec->slave_dig_outs; *d; d++)
> > -			snd_hda_codec_write(codec, *d, 0,
> > -					AC_VERB_SET_DIGI_CONVERT_1,
> > +		if (codec->slave_dig_outs)
> > +			for (d = codec->slave_dig_outs; *d; d++)
> > +				snd_hda_codec_write(codec, *d, 0,
> > +				    AC_VERB_SET_DIGI_CONVERT_1,
> >  				    codec->spdif_ctls & ~AC_DIG1_ENABLE & 0xff);
> >  	}
> >  	snd_hda_codec_setup_stream(codec, nid, stream_tag, 0, format);
> > @@ -2628,9 +2632,10 @@ static void setup_dig_out_stream(struct hda_codec *codec, hda_nid_t nid,
> >  		snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1,
> >  				    codec->spdif_ctls & 0xff);
> >  
> > -		for (d = codec->slave_dig_outs; *d; d++)
> > -			snd_hda_codec_write(codec, *d, 0,
> > -					AC_VERB_SET_DIGI_CONVERT_1,
> > +		if (codec->slave_dig_outs)
> > +			for (d = codec->slave_dig_outs; *d; d++)
> > +				snd_hda_codec_write(codec, *d, 0,
> > +				    AC_VERB_SET_DIGI_CONVERT_1,
> >  				    codec->spdif_ctls & 0xff);
> >  	}
> >  
> > 
> > 
> 
> 
> 
> -- 
> []'s
> Herton
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel at alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
> 


More information about the Alsa-devel mailing list