Prechádzať zdrojové kódy

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 <[email protected]>
Signed-off-by: Meng Wang <[email protected]>
Meng Wang 5 rokov pred
rodič
commit
9d98d48b38
1 zmenil súbory, kde vykonal 17 pridanie a 0 odobranie
  1. 17 0
      asoc/msm-lsm-client.c

+ 17 - 0
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;
 	}