aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/hda/hda_codec.c
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2009-03-24 02:36:09 -0400
committerTakashi Iwai <tiwai@suse.de>2009-04-21 05:10:44 -0400
commitb613291fb21a2d74eb8323d97fe9aa5d281b306c (patch)
tree142afbf9e2fa31b852c3fbfe1bb4dafd4977fb98 /sound/pci/hda/hda_codec.c
parent92c7c8a7d6e03eb4c0a3c5888e35dbc45f24744c (diff)
ALSA: hda - Retry codec-verbs at errors
The current error-recovery scheme for the codec communication errors doesn't work always well. Especially falling back to the single-command mode causes the fatal problem on many systems. In this patch, the problematic verb is re-issued again after the error (even with polling mode) instead of the single-cmd mode. The single-cmd mode will be used only when specified via the command option explicitly, mainly just for testing. 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.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
index 3d8bf39e6d98..1736ccbebc72 100644
--- a/sound/pci/hda/hda_codec.c
+++ b/sound/pci/hda/hda_codec.c
@@ -174,14 +174,23 @@ unsigned int snd_hda_codec_read(struct hda_codec *codec, hda_nid_t nid,
174 unsigned int verb, unsigned int parm) 174 unsigned int verb, unsigned int parm)
175{ 175{
176 struct hda_bus *bus = codec->bus; 176 struct hda_bus *bus = codec->bus;
177 unsigned int res; 177 unsigned int cmd, res;
178 int repeated = 0;
178 179
179 res = make_codec_cmd(codec, nid, direct, verb, parm); 180 cmd = make_codec_cmd(codec, nid, direct, verb, parm);
180 snd_hda_power_up(codec); 181 snd_hda_power_up(codec);
181 mutex_lock(&bus->cmd_mutex); 182 mutex_lock(&bus->cmd_mutex);
182 if (!bus->ops.command(bus, res)) 183 again:
184 if (!bus->ops.command(bus, cmd)) {
183 res = bus->ops.get_response(bus); 185 res = bus->ops.get_response(bus);
184 else 186 if (res == -1 && bus->rirb_error) {
187 if (repeated++ < 1) {
188 snd_printd(KERN_WARNING "hda_codec: "
189 "Trying verb 0x%08x again\n", cmd);
190 goto again;
191 }
192 }
193 } else
185 res = (unsigned int)-1; 194 res = (unsigned int)-1;
186 mutex_unlock(&bus->cmd_mutex); 195 mutex_unlock(&bus->cmd_mutex);
187 snd_hda_power_down(codec); 196 snd_hda_power_down(codec);