diff --git a/asoc/msm-compress-q6-v2.c b/asoc/msm-compress-q6-v2.c index c0452922c828..cfb560bda941 100644 --- a/asoc/msm-compress-q6-v2.c +++ b/asoc/msm-compress-q6-v2.c @@ -825,15 +825,23 @@ static void compr_event_handler(uint32_t opcode, * RESUME */ if ((prtd->copied_total == prtd->bytes_sent) && - atomic_read(&prtd->drain)) { - pr_debug("RUN ack, wake up & continue pending drain\n"); + atomic_read(&prtd->drain)) { + bytes_available = prtd->bytes_received - prtd->copied_total; + if (bytes_available < cstream->runtime->fragment_size) { + pr_debug("%s: RUN ack, wake up & continue pending drain\n", + __func__); - if (prtd->last_buffer) - prtd->last_buffer = 0; + if (prtd->last_buffer) + prtd->last_buffer = 0; - prtd->drain_ready = 1; - wake_up(&prtd->drain_wait); - atomic_set(&prtd->drain, 0); + prtd->drain_ready = 1; + wake_up(&prtd->drain_wait); + atomic_set(&prtd->drain, 0); + } else if (atomic_read(&prtd->xrun)) { + pr_debug("%s: RUN ack, continue write cycle\n", __func__); + atomic_set(&prtd->xrun, 0); + msm_compr_send_buffer(prtd); + } } spin_unlock_irqrestore(&prtd->lock, flags);