From 9d98d48b380b1a59c86a5b705f2761d1102694de Mon Sep 17 00:00:00 2001 From: Meng Wang Date: Mon, 16 Dec 2019 17:07:41 -0800 Subject: [PATCH] asoc: msm-lsm-client: abort LAB buffering before stop session and close TX Currently we only set read_abort flag to stop LAB buffering before we call q6lsm_stop_lab. There is a possibility that this step is skipped under certain circumstances. This might cause ADSP crash as a result. Therefore, set flag read_abort before calling q6lsm_stop and q6lsm_close to make sure LAB buffering is stopped before closing a SVA session. Change-Id: I7364c31348f908d8920e32f811745549cf305901 Signed-off-by: Xiaoyu Ye Signed-off-by: Meng Wang --- asoc/msm-lsm-client.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/asoc/msm-lsm-client.c b/asoc/msm-lsm-client.c index d44fd49e1b5e..482f83ebd39a 100644 --- a/asoc/msm-lsm-client.c +++ b/asoc/msm-lsm-client.c @@ -1460,6 +1460,12 @@ static int msm_lsm_ioctl_shared(struct snd_pcm_substream *substream, prtd->lsm_client->lab_started = false; } } + + if (!atomic_read(&prtd->read_abort)) { + dev_dbg(rtd->dev, + "%s: set read_abort to stop buffering\n", __func__); + atomic_set(&prtd->read_abort, 1); + } rc = q6lsm_stop(prtd->lsm_client, true); if (!rc) dev_dbg(rtd->dev, @@ -2665,6 +2671,12 @@ static int msm_lsm_close(struct snd_pcm_substream *substream) __func__, ret); } } + + if (!atomic_read(&prtd->read_abort)) { + dev_dbg(rtd->dev, + "%s: set read_abort to stop buffering\n", __func__); + atomic_set(&prtd->read_abort, 1); + } ret = q6lsm_stop(prtd->lsm_client, true); if (ret) dev_err(rtd->dev, @@ -2695,6 +2707,11 @@ static int msm_lsm_close(struct snd_pcm_substream *substream) SNDRV_PCM_STREAM_CAPTURE); if (prtd->lsm_client->opened) { + if (!atomic_read(&prtd->read_abort)) { + dev_dbg(rtd->dev, + "%s: set read_abort to stop buffering\n", __func__); + atomic_set(&prtd->read_abort, 1); + } q6lsm_close(prtd->lsm_client); prtd->lsm_client->opened = false; }