diff options
author | Takashi Iwai <tiwai@suse.de> | 2009-07-10 06:52:27 -0400 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2009-07-10 06:56:41 -0400 |
commit | 3c6aae4489e7c05f3685e9eaa538249be7c79ebe (patch) | |
tree | 95d1db12b1668da922684d45acd156fe308ca35f /sound/pci/hda/hda_codec.c | |
parent | 31909b83ea5b4035ce129bb0df622ec2d2fb3e96 (diff) |
ALSA: hda - Check codec errors in snd_hda_get_connections()
The codec read errors in snd_hda_get_connections() are ignored so far,
and it causes a problem like the bug in the commit
9d30937accf2c01e8b0bd59787409a7348cbbcb7
ALSA: hda_intel: more strict alc880_parse_auto_config dig_nid checking
Better to check errors in the function and returns a proper error code
rather than passing bogus NID values.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci/hda/hda_codec.c')
-rw-r--r-- | sound/pci/hda/hda_codec.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 94d848e98716..ec352c6ae49a 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
@@ -316,6 +316,8 @@ int snd_hda_get_connections(struct hda_codec *codec, hda_nid_t nid, | |||
316 | /* single connection */ | 316 | /* single connection */ |
317 | parm = snd_hda_codec_read(codec, nid, 0, | 317 | parm = snd_hda_codec_read(codec, nid, 0, |
318 | AC_VERB_GET_CONNECT_LIST, 0); | 318 | AC_VERB_GET_CONNECT_LIST, 0); |
319 | if (parm == -1 && codec->bus->rirb_error) | ||
320 | return -EIO; | ||
319 | conn_list[0] = parm & mask; | 321 | conn_list[0] = parm & mask; |
320 | return 1; | 322 | return 1; |
321 | } | 323 | } |
@@ -327,9 +329,12 @@ int snd_hda_get_connections(struct hda_codec *codec, hda_nid_t nid, | |||
327 | int range_val; | 329 | int range_val; |
328 | hda_nid_t val, n; | 330 | hda_nid_t val, n; |
329 | 331 | ||
330 | if (i % num_elems == 0) | 332 | if (i % num_elems == 0) { |
331 | parm = snd_hda_codec_read(codec, nid, 0, | 333 | parm = snd_hda_codec_read(codec, nid, 0, |
332 | AC_VERB_GET_CONNECT_LIST, i); | 334 | AC_VERB_GET_CONNECT_LIST, i); |
335 | if (parm == -1 && codec->bus->rirb_error) | ||
336 | return -EIO; | ||
337 | } | ||
333 | range_val = !!(parm & (1 << (shift-1))); /* ranges */ | 338 | range_val = !!(parm & (1 << (shift-1))); /* ranges */ |
334 | val = parm & mask; | 339 | val = parm & mask; |
335 | parm >>= shift; | 340 | parm >>= shift; |