[alsa-devel] [PATCH v2 2/2] ALSA: hda: fix to wait for RIRB & CORB DMA to set

Takashi Iwai tiwai at suse.de
Sun May 8 11:45:50 CEST 2016


On Thu, 05 May 2016 07:54:43 +0200,
Vinod Koul wrote:
> 
> From: Jeeja KP <jeeja.kp at intel.com>
> 
> If the DMAs are not being quiesced properly, it may lead to
> stability issues, so the recommendation is to wait till DMAs are
> stopped.
> 
> After setting the stop bit of RIRB/CORB DMA, we should wait for
> stop bit to be set.
> 
> Signed-off-by: Jeeja KP <jeeja.kp at intel.com>
> Signed-off-by: Vinod Koul <vinod.koul at intel.com>
> ---
> changes in v2:
>  - use common wait routine as suggested by Takashi
> 
>  sound/hda/hdac_controller.c | 17 +++++++++++++++++
>  1 file changed, 17 insertions(+)
> 
> diff --git a/sound/hda/hdac_controller.c b/sound/hda/hdac_controller.c
> index 8c486235c905..9fee464e5d49 100644
> --- a/sound/hda/hdac_controller.c
> +++ b/sound/hda/hdac_controller.c
> @@ -80,6 +80,22 @@ void snd_hdac_bus_init_cmd_io(struct hdac_bus *bus)
>  }
>  EXPORT_SYMBOL_GPL(snd_hdac_bus_init_cmd_io);
>  
> +/* wait for cmd dmas till they are stopped */
> +static void hdac_wait_for_cmd_dmas(struct hdac_bus *bus)
> +{
> +	unsigned long timeout;
> +
> +	timeout = jiffies + msecs_to_jiffies(100);
> +	while ((snd_hdac_chip_readb(bus, RIRBCTL) & AZX_RBCTL_DMA_EN)
> +		&& time_before(jiffies, timeout))
> +		udelay(10);
> +
> +	timeout = jiffies + msecs_to_jiffies(100);
> +	while ((snd_hdac_chip_readb(bus, CORBCTL) & AZX_CORBCTL_RUN)
> +		&& time_before(jiffies, timeout))
> +		udelay(10);

This will end up with doubled timeout.  But it doesn't matter so much
in practice.  So I applied the patch as is.


thanks,

Takashi


> +}
> +
>  /**
>   * snd_hdac_bus_stop_cmd_io - clean up CORB/RIRB buffers
>   * @bus: HD-audio core bus
> @@ -90,6 +106,7 @@ void snd_hdac_bus_stop_cmd_io(struct hdac_bus *bus)
>  	/* disable ringbuffer DMAs */
>  	snd_hdac_chip_writeb(bus, RIRBCTL, 0);
>  	snd_hdac_chip_writeb(bus, CORBCTL, 0);
> +	hdac_wait_for_cmd_dmas(bus);
>  	/* disable unsolicited responses */
>  	snd_hdac_chip_updatel(bus, GCTL, AZX_GCTL_UNSOL, 0);
>  	spin_unlock_irq(&bus->reg_lock);
> -- 
> 1.9.1
> 


More information about the Alsa-devel mailing list