-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
Jiri Slaby wrote:
On 09/16/2008 04:43 PM, Matthew Ranostay wrote:
Bug fix patch at:
http://mailman.alsa-project.org/pipermail/alsa-devel/2008-September/010767.h...
It works, thanks.
Another problem is when I switch IEC958 in alsamixer, I get:
Ok, the problem was that codec->slave_dig_outs getting a dereference when NULL. This has been already fixed in Takashi's sound-2.6.git tree, with the commit id 06efc354f735d5dbbdf4653fc6a8acd489ac5a18.
Thanks,
Matt Ranostay
- ---
# git log pci/hda/hda_codec.c ... commit 06efc354f735d5dbbdf4653fc6a8acd489ac5a18 Author: Herton Ronaldo Krzesinski herton@mandriva.com.br Date: Sat Sep 13 16:44:29 2008 +0200
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.
Signed-off-by: Herton Ronaldo Krzesinski herton@mandriva.com.br Signed-off-by: Takashi Iwai tiwai@suse.de ... # git diff af41e1693fdaa7a3e25cc8dd1ff3180f83487e5a 06efc354f735d5dbbdf4653fc6a8acd489ac5a18 pci/hda/hda_codec.c
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index c4fc0d4..0707a8e 100644 - --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c @@ -1457,14 +1457,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); @@ -1502,8 +1503,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) */ @@ -1659,8 +1661,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); @@ -2610,9 +2613,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); @@ -2621,9 +2625,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); }
BUG: unable to handle kernel NULL pointer dereference at 0000000000000000 IP: [<ffffffffa0057d8a>] snd_hda_spdif_out_switch_put+0xca/0x170 [snd_hda_intel] PGD 7a3ea067 PUD 7a378067 PMD 0 Oops: 0000 [1] SMP last sysfs file: /sys/devices/virtual/net/tun0/type Dumping ftrace buffer: (ftrace buffer empty) CPU 0 Modules linked in: arc4 ecb cryptomgr aead crypto_blkcipher crypto_algapi ath5k mac80211 hid_microsoft led_class usbhid rtc_cmos snd_hda_intel hid ohci1394 ieee1394 evdev cfg80211 ff_memless [last unloaded: freq_table] Pid: 3831, comm: alsamixer Tainted: G W 2.6.27-rc6-mm1_64 #452 RIP: 0010:[<ffffffffa0057d8a>] [<ffffffffa0057d8a>] snd_hda_spdif_out_switch_put+0xca/0x170 [snd_hda_intel] RSP: 0018:ffff88007a3d5c68 EFLAGS: 00010202 RAX: 0000000000000000 RBX: 0000000000000000 RCX: 000000000000000f RDX: ffff88007b410be0 RSI: 0000000000070d1e RDI: ffff88007bda9bb0 RBP: ffff88007a3d5ca8 R08: 0000000000000001 R09: 0000000000000001 R10: ffffffff8049083f R11: ffff880078cd4240 R12: ffff88007bd2f398 R13: 0000000000000001 R14: 0000000000000001 R15: 000000000000001e FS: 00007fb6b40476f0(0000) GS:ffffffff806f2400(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000000000 CR3: 000000007a3cc000 CR4: 00000000000006e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 Process alsamixer (pid: 3831, threadinfo ffff88007a3d4000, task ffff88007a35b300) Stack: 0000000101e33400 ffff88007bd2f568 001e88007a3d5cc8 ffff88007b51d1f0 ffff880078cd4240 ffff88007bd2d5a0 ffff88007bd2d708 ffff88007b7720c8 ffff88007a3d5cc8 ffffffff80493097 ffff88007b51d1f0 ffff880078cd4240 Call Trace: [<ffffffff80493097>] slave_put_val+0x37/0xc0 [<ffffffff804933bc>] slave_put+0x5c/0x70 [<ffffffff8048fdf9>] snd_ctl_elem_write+0x119/0x160 [<ffffffff804908a5>] snd_ctl_ioctl+0x295/0x940 [<ffffffff80258934>] ? up+0x34/0x50 [<ffffffff80254502>] ? remove_wait_queue+0x52/0x60 [<ffffffff803a198c>] ? read_chan+0x3ac/0x8b0 [<ffffffff8023193e>] ? __wake_up+0x4e/0x70 [<ffffffff80242b32>] ? current_fs_time+0x22/0x30 [<ffffffff802c9d01>] vfs_ioctl+0x31/0xa0 [<ffffffff802c9ff3>] do_vfs_ioctl+0x283/0x2f0 [<ffffffff802ca0aa>] sys_ioctl+0x4a/0x80 [<ffffffff8020c4cb>] system_call_fastpath+0x16/0x1b Code: 00 4c 89 e7 0f b7 c9 44 0f b7 7d d6 44 0f b6 e9 89 4d c4 45 89 e8 b9 0d 07 00 00 44 89 fe e8 8e f6 ff ff 49 8b 9c 24 f8 01 00 00 <0f> b7 03 66 85 c0 74 27 66 0f 1f 44 00 00 31 d2 48 83 c3 02 0f RIP [<ffffffffa0057d8a>] snd_hda_spdif_out_switch_put+0xca/0x170 [snd_hda_intel] RSP <ffff88007a3d5c68> CR2: 0000000000000000 ---[ end trace 4eaa2a86a8e2da22 ]---