Merge "ASoC: msm: Return proper error codes"
diff --git a/sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c b/sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c
index 0574b5f..8e56a6f 100644
--- a/sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c
+++ b/sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c
@@ -561,7 +561,7 @@
 			spin_unlock_irq(&prtd->lock);
 
 		spin_lock_irq(&prtd->lock);
-		/* only reset if flush was successful */
+		/* FIXME. only reset if flush was successful */
 		prtd->byte_offset  = 0;
 		prtd->copied_total = 0;
 		prtd->app_pointer  = 0;
@@ -588,6 +588,7 @@
 		if (!atomic_read(&prtd->start)) {
 			pr_err("%s: stream is not in started state\n",
 				__func__);
+			rc = -EPERM;
 			spin_unlock_irq(&prtd->lock);
 			break;
 		}
@@ -600,12 +601,14 @@
 			pr_debug("%s: wait till all the data is sent to dsp\n",
 				__func__);
 			rc = wait_event_interruptible(prtd->drain_wait,
-					prtd->drain_ready);
+						      prtd->cmd_interrupt || prtd->drain_ready);
 		} else
 			spin_unlock_irq(&prtd->lock);
 
-		if (!atomic_read(&prtd->start)) {
+		if (!atomic_read(&prtd->start) || prtd->cmd_interrupt) {
 			pr_err("%s: stream is not started (interrupted by flush?)\n", __func__);
+			rc = -EINTR;
+			prtd->cmd_interrupt = 0;
 			break;
 		}
 
@@ -615,7 +618,7 @@
 		q6asm_cmd_nowait(prtd->audio_client, CMD_EOS);
 
 		if (cmd == SND_COMPR_TRIGGER_PARTIAL_DRAIN) {
-			pr_err("PARTIAL DRAIN, do not send EOS now, why!?");
+			pr_err("PARTIAL DRAIN, do not wait for EOS ack");
 			break;
 		}
 
@@ -638,7 +641,7 @@
 		break;
 	}
 
-	return 0;
+	return rc;
 }
 
 static int msm_compr_pointer(struct snd_compr_stream *cstream,