At Tue, 10 Apr 2007 20:00:29 +0200, Dominique Dumont wrote:
Takashi Iwai tiwai@suse.de writes:
These traces were invaluable to figure out what was going on when I hunted for the spdif bug. I believe it will also be valuable if people have to look for other hda bugs.
I think snd_printdd() isn't appropriate for this because you cannot choose it at runtime but only at build time. My preference is to add a debug module option (with ifdef CONFIG_SND_DEBUG) and check the option value there.
Something like this ?
Signed off by: Dominique Dumont domi.dumont@free.fr
I prefer having options in snd-hda-intel side. Also, setting permission 0644 makes it possible to turn on/off the debug option dynamically, which is pretty useful.
A test patch is below. How about it?
Takashi
diff -r b31803586d4f pci/hda/hda_intel.c --- a/pci/hda/hda_intel.c Thu Apr 12 13:08:09 2007 +0200 +++ b/pci/hda/hda_intel.c Thu Apr 12 14:24:47 2007 +0200 @@ -72,6 +72,14 @@ module_param(enable_msi, int, 0); module_param(enable_msi, int, 0); MODULE_PARM_DESC(enable_msi, "Enable Message Signaled Interrupt (MSI)");
+#ifdef CONFIG_SND_DEBUG +static int trace_cmd; +module_param(trace_cmd, bool, 0644); +MODULE_PARM_DESC(trace_cmd, + "Trace communication with hda codecs (for debugging only)."); +#else +#define trace_cmd 0 +#endif
/* just for backward compatibility */ static int enable; @@ -637,6 +645,9 @@ static int azx_send_cmd(struct hda_codec unsigned int para) { struct azx *chip = codec->bus->private_data; + if (trace_cmd) + snd_printd("codec cmd: nid %02x direct %x verb %04x parm %02x\n", + nid, direct, verb, para); if (chip->single_cmd) return azx_single_send_cmd(codec, nid, direct, verb, para); else @@ -647,10 +658,15 @@ static unsigned int azx_get_response(str static unsigned int azx_get_response(struct hda_codec *codec) { struct azx *chip = codec->bus->private_data; + unsigned int res; + if (chip->single_cmd) - return azx_single_get_response(codec); + res = azx_single_get_response(codec); else - return azx_rirb_get_response(codec); + res = azx_rirb_get_response(codec); + if (trace_cmd) + snd_printd("codec res: -> %x\n", res); + return res; }