[alsa-devel] [RFC PATCH] ALSA: hda - Do not accept responses from non-existing codecs

Takashi Iwai tiwai at suse.de
Wed Jan 29 16:47:16 CET 2014


At Wed, 29 Jan 2014 13:12:31 +0100,
David Henningsson wrote:
> 
> While looking into some spurious responses, I found that the addr value was
> treated a bit inconsistent: values 8..0xf will be treated as codec 0 and
> values 0..7 will be treated as no error regardless of whether there is a codec
> there, or not.
> 
> With this patch, all non-existing codecs will be treated equally.
> In addition, printing rp and wp could help figuring out if the wp value is
> reported wrongly from the controller or if something else is wrong.
> 
> Signed-off-by: David Henningsson <david.henningsson at canonical.com>
> ---
>  sound/pci/hda/hda_intel.c |   23 +++++++++--------------
>  1 file changed, 9 insertions(+), 14 deletions(-)
> 
> Note: this patch is untested (hence the RFC indication)

The patch looks OK to me, but this doesn't have to be merged for 3.14, 
so I queued to sound-unstable tree (topic/hda branch) for now.
It'll be merged back to sound git tree once when the merge window is
closed.


thanks,

Takashi


> 
> diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
> index fa2879a..e87eac5 100644
> --- a/sound/pci/hda/hda_intel.c
> +++ b/sound/pci/hda/hda_intel.c
> @@ -834,18 +834,6 @@ static unsigned int azx_command_addr(u32 cmd)
>  	return addr;
>  }
>  
> -static unsigned int azx_response_addr(u32 res)
> -{
> -	unsigned int addr = res & 0xf;
> -
> -	if (addr >= AZX_MAX_CODECS) {
> -		snd_BUG();
> -		addr = 0;
> -	}
> -
> -	return addr;
> -}
> -
>  /* send a command */
>  static int azx_corb_send_cmd(struct hda_bus *bus, u32 val)
>  {
> @@ -907,8 +895,15 @@ static void azx_update_rirb(struct azx *chip)
>  		rp = chip->rirb.rp << 1; /* an RIRB entry is 8-bytes */
>  		res_ex = le32_to_cpu(chip->rirb.buf[rp + 1]);
>  		res = le32_to_cpu(chip->rirb.buf[rp]);
> -		addr = azx_response_addr(res_ex);
> -		if (res_ex & ICH6_RIRB_EX_UNSOL_EV)
> +		addr = res_ex & 0xf;
> +		if ((addr >= AZX_MAX_CODECS) || !(chip->codec_mask & (1 << addr))) {
> +			snd_printk(KERN_ERR SFX "%s: spurious response %#x:%#x, rp = %d, wp = %d",
> +				   pci_name(chip->pci),
> +				   res, res_ex,
> +				   chip->rirb.rp, wp);
> +			snd_BUG();
> +		}
> +		else if (res_ex & ICH6_RIRB_EX_UNSOL_EV)
>  			snd_hda_queue_unsol_event(chip->bus, res, res_ex);
>  		else if (chip->rirb.cmds[addr]) {
>  			chip->rirb.res[addr] = res;
> -- 
> 1.7.9.5
> 


More information about the Alsa-devel mailing list