ALSA: hda - Allow one chance for zero NID in connection list
authorTakashi Iwai <tiwai@suse.de>
Thu, 20 Dec 2012 09:45:55 +0000 (10:45 +0100)
committerTakashi Iwai <tiwai@suse.de>
Sat, 12 Jan 2013 07:31:06 +0000 (08:31 +0100)
The commit [2e9bf24: ALSA: hda_codec: Check for invalid zero
connections] trims the whole connection list when an invalid value is
reported by the hardware.  But some codecs (at least AD1986A) may give
a zero NID in the middle of the connection list, so dropping the whole
list isn't good for such cases.

In this patch, as a workaround, allow a single zero NID in the read
connection list.  If it hits zero twice, it's handled as an error, so
that we can avoid "too many connections" errors.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/hda_codec.c

index e7749de..ef0a0ee 100644 (file)
@@ -424,6 +424,7 @@ int snd_hda_get_raw_connections(struct hda_codec *codec, hda_nid_t nid,
        unsigned int shift, num_elems, mask;
        unsigned int wcaps;
        hda_nid_t prev_nid;
+       int null_count = 0;
 
        if (snd_BUG_ON(!conn_list || max_conns <= 0))
                return -EINVAL;
@@ -474,7 +475,7 @@ int snd_hda_get_raw_connections(struct hda_codec *codec, hda_nid_t nid,
                }
                range_val = !!(parm & (1 << (shift-1))); /* ranges */
                val = parm & mask;
-               if (val == 0) {
+               if (val == 0 && null_count++) {  /* no second chance */
                        snd_printk(KERN_WARNING "hda_codec: "
                                   "invalid CONNECT_LIST verb %x[%i]:%x\n",
                                    nid, i, parm);