struct rsnd_dai_stream *io)
 {
        struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
+       struct rsnd_src *src = rsnd_mod_to_src(mod);
+       struct device *dev = rsnd_priv_to_dev(priv);
 
        spin_lock(&priv->lock);
 
                goto rsnd_src_interrupt_gen2_out;
 
        if (rsnd_src_error_record_gen2(mod)) {
-               struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
-               struct rsnd_src *src = rsnd_mod_to_src(mod);
-               struct device *dev = rsnd_priv_to_dev(priv);
 
                dev_dbg(dev, "%s[%d] restart\n",
                        rsnd_mod_name(mod), rsnd_mod_id(mod));
 
                _rsnd_src_stop_gen2(mod);
-               if (src->err < 1024)
-                       _rsnd_src_start_gen2(mod, io);
-               else
-                       dev_warn(dev, "no more SRC restart\n");
+               _rsnd_src_start_gen2(mod, io);
+       }
+
+       if (src->err > 1024) {
+               rsnd_src_irq_disable_gen2(mod);
+
+               dev_warn(dev, "no more %s[%d] restart\n",
+                        rsnd_mod_name(mod), rsnd_mod_id(mod));
        }
 
 rsnd_src_interrupt_gen2_out:
 
 {
        struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
        struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
+       struct device *dev = rsnd_priv_to_dev(priv);
        int is_dma = rsnd_ssi_is_dma_mode(mod);
        u32 status;
        bool elapsed = false;
 
        /* DMA only */
        if (is_dma && (status & (UIRQ | OIRQ))) {
-               struct device *dev = rsnd_priv_to_dev(priv);
-
                /*
                 * restart SSI
                 */
                        rsnd_mod_name(mod), rsnd_mod_id(mod));
 
                rsnd_ssi_stop(mod, io, priv);
-               if (ssi->err < 1024)
-                       rsnd_ssi_start(mod, io, priv);
-               else
-                       dev_warn(dev, "no more SSI restart\n");
+               rsnd_ssi_start(mod, io, priv);
        }
 
        rsnd_ssi_record_error(ssi, status);
 
+       if (ssi->err > 1024) {
+               rsnd_ssi_irq_disable(mod);
+
+               dev_warn(dev, "no more %s[%d] restart\n",
+                        rsnd_mod_name(mod), rsnd_mod_id(mod));
+       }
+
 rsnd_ssi_interrupt_out:
        spin_unlock(&priv->lock);