|
@@ -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");
|
|
|
-
|
|
|
- if (prtd->last_buffer)
|
|
|
- prtd->last_buffer = 0;
|
|
|
-
|
|
|
- prtd->drain_ready = 1;
|
|
|
- wake_up(&prtd->drain_wait);
|
|
|
- atomic_set(&prtd->drain, 0);
|
|
|
+ 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;
|
|
|
+
|
|
|
+ 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);
|