[PATCH AUTOSEL 6.19] ASoC: qcom: q6asm: drop DSP responses for closed data streams

Sasha Levin
2026-02-14T01:04:23Z

From: Cédric Bellegarde <cedric.bellegarde@adishatz.org>

[ Upstream commit 8a066a81ee0c1b6cdbd81393536c3b2d19ccef25 ]

'Commit a354f030dbce ("ASoC: qcom: q6asm: handle the responses
after closing")' attempted to ignore DSP responses arriving
after a stream had been closed.

However, those responses were still handled, causing lockups.

Fix this by unconditionally dropping all DSP responses associated with
closed data streams.

Signed-off-by: Cédric Bellegarde <cedric.bellegarde@adishatz.org>
Link: https://patch.msgid.link/20260102215225.609166-1-cedric.bellegarde@adishatz.org
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---

LLM Generated explanations, may be completely bogus:

Now I have the full picture.

### 7. Dependency Analysis

The commit being analyzed fixes a bug introduced by `a354f030dbce1`
(October 2025). The dependency commit was a well-intentioned fix for
"not expecting rsp" errors, but it made a mistake: it used `break`
instead of `goto done`, which means the DSP responses for closed streams
were *acknowledged* (not hitting the error log) but *still fully
processed* (wake_up and callback invoked), causing lockups.

For backporting: Both `a354f030dbce1` AND this fix should go to stable
together. If `a354f030dbce1` is already in a stable tree, this fix is
critical to prevent lockups. If it's not, they should be considered as a
pair.

### Summary

| Criteria | Assessment |
|----------|-----------|
| **Bug type** | System lockup/hang |
| **Severity** | High — system becomes unresponsive |
| **Fix size** | Very small — ~4 lines changed |
| **Risk** | Very low — only affects already-closed streams |
| **Scope** | Contained to one function in one file |
| **Dependencies** | Requires `a354f030dbce1` to be present |
| **Testing** | Signed-off by maintainer (Mark Brown) |
| **User impact** | Qualcomm audio users (phones, tablets, embedded) |

This is a textbook stable backport candidate: a small, surgical fix for
a serious bug (lockup) in a single driver file, with no risk of
regression. The fix simply ensures that DSP responses for closed audio
streams are properly dropped instead of being processed, preventing the
system from hanging.

**YES**

sound/soc/qcom/qdsp6/q6asm.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/sound/soc/qcom/qdsp6/q6asm.c b/sound/soc/qcom/qdsp6/q6asm.c
index e7295b7b24610..3c4a24c9dba22 100644
--- a/sound/soc/qcom/qdsp6/q6asm.c
+++ b/sound/soc/qcom/qdsp6/q6asm.c
@@ -638,7 +638,6 @@ static int32_t q6asm_stream_callback(struct apr_device *adev,
client_event = ASM_CLIENT_EVENT_CMD_OUT_FLUSH_DONE;
break;
case ASM_STREAM_CMD_OPEN_WRITE_V3:
- case ASM_DATA_CMD_WRITE_V2:
case ASM_STREAM_CMD_OPEN_READ_V3:
case ASM_STREAM_CMD_OPEN_READWRITE_V2:
case ASM_STREAM_CMD_SET_ENCDEC_PARAM:
@@ -657,8 +656,9 @@ static int32_t q6asm_stream_callback(struct apr_device *adev,
break;
case ASM_DATA_CMD_EOS:
case ASM_DATA_CMD_READ_V2:
+ case ASM_DATA_CMD_WRITE_V2:
/* response as result of close stream */
- break;
+ goto done;
default:
dev_err(ac->dev, "command[0x%x] not expecting rsp\n",
result->opcode);
--
2.51.0