* [PATCH v2 06/10] soundwire: qcom: Prevent pconfig buffer overflow in qcom_swrm_stream_alloc_ports()
2026-11-03 9:53 [PATCH v2 00/10] soundwire: Fix Critical and High issues reported by Sashiko Lee Jones
@ 2026-11-03 9:53 ` Lee Jones
2026-11-03 9:53 ` [PATCH v2 07/10] soundwire: qcom: Disable runtime PM and avoid clock underflow in qcom_swrm_remove() Lee Jones
` (4 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Lee Jones @ 2026-11-03 9:53 UTC (permalink / raw)
To: lee, Srinivas Kandagatla, Vinod Koul, Bard Liao,
Pierre-Louis Bossart, linux-arm-msm, linux-sound, linux-kernel
qcom_swrm_stream_alloc_ports() allocates the pconfig array with
ctrl->nports elements, but only checks that the assigned port number pn
is below maxport. When multiple slave ports map to the same master port
via m_port_map or the stream requests more slave ports than
ctrl->nports, nports increments past ctrl->nports and writes out of
bounds of pconfig.
Verify that nports is less than maxport before writing to
pconfig[nports], and clear any port_mask bits allocated during the loop
before returning -EBUSY.
Closes: https://sashiko.dev/#/bug/linux-543ea0c0-a6e5-4b03-a041-ea0a760802c1
Signed-off-by: Lee Jones <lee@kernel.org>
---
v1 => v2:
- Also check nports >= maxport and clear allocated port_mask bits on error
- Drop Fixes and Stable tags
drivers/soundwire/qcom.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/soundwire/qcom.c b/drivers/soundwire/qcom.c
index 6e0c5fb10efa..29130745c809 100644
--- a/drivers/soundwire/qcom.c
+++ b/drivers/soundwire/qcom.c
@@ -1350,8 +1350,10 @@ static int qcom_swrm_stream_alloc_ports(struct qcom_swrm_ctrl *ctrl,
else
pn = find_first_zero_bit(port_mask, maxport);
- if (pn >= maxport) {
+ if (pn >= maxport || nports >= maxport) {
dev_err(ctrl->dev, "All ports busy\n");
+ while (nports--)
+ clear_bit(pconfig[nports].num, port_mask);
return -EBUSY;
}
set_bit(pn, port_mask);
--
2.56.0.385.gac671c819a-goog
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH v2 07/10] soundwire: qcom: Disable runtime PM and avoid clock underflow in qcom_swrm_remove()
2026-11-03 9:53 [PATCH v2 00/10] soundwire: Fix Critical and High issues reported by Sashiko Lee Jones
2026-11-03 9:53 ` [PATCH v2 06/10] soundwire: qcom: Prevent pconfig buffer overflow in qcom_swrm_stream_alloc_ports() Lee Jones
@ 2026-11-03 9:53 ` Lee Jones
2026-11-03 9:53 ` [PATCH v2 08/10] soundwire: qcom: Check clk_prepare_enable() return value Lee Jones
` (3 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Lee Jones @ 2026-11-03 9:53 UTC (permalink / raw)
To: lee, Srinivas Kandagatla, Vinod Koul, Bard Liao,
Pierre-Louis Bossart, linux-sound, linux-arm-msm, linux-kernel
When the controller is runtime-suspended, swrm_runtime_suspend() has
already disabled ctrl->hclk. If the device is unbound in that state,
qcom_swrm_remove() omits pm_runtime_disable() and unconditionally calls
clk_disable_unprepare(), triggering a clock enable count underflow and
leaving runtime PM enabled.
Resume the device before removing the bus master, disable runtime PM,
and only disable ctrl->hclk if the device is not runtime-suspended.
Closes: https://sashiko.dev/#/bug/linux-e26e04cd-3dec-4a3d-94e6-f45403c4bb57
Signed-off-by: Lee Jones <lee@kernel.org>
---
v1 => v2: Drop Fixes and Stable tags
drivers/soundwire/qcom.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/drivers/soundwire/qcom.c b/drivers/soundwire/qcom.c
index 29130745c809..a50efdfc3a6b 100644
--- a/drivers/soundwire/qcom.c
+++ b/drivers/soundwire/qcom.c
@@ -1788,8 +1788,13 @@ static void qcom_swrm_remove(struct platform_device *pdev)
{
struct qcom_swrm_ctrl *ctrl = dev_get_drvdata(&pdev->dev);
+ pm_runtime_get_sync(&pdev->dev);
sdw_bus_master_delete(&ctrl->bus);
- clk_disable_unprepare(ctrl->hclk);
+ pm_runtime_disable(&pdev->dev);
+ pm_runtime_put_noidle(&pdev->dev);
+ if (!pm_runtime_status_suspended(&pdev->dev))
+ clk_disable_unprepare(ctrl->hclk);
+ pm_runtime_set_suspended(&pdev->dev);
}
static int __maybe_unused swrm_runtime_resume(struct device *dev)
--
2.56.0.385.gac671c819a-goog
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH v2 08/10] soundwire: qcom: Check clk_prepare_enable() return value
2026-11-03 9:53 [PATCH v2 00/10] soundwire: Fix Critical and High issues reported by Sashiko Lee Jones
2026-11-03 9:53 ` [PATCH v2 06/10] soundwire: qcom: Prevent pconfig buffer overflow in qcom_swrm_stream_alloc_ports() Lee Jones
2026-11-03 9:53 ` [PATCH v2 07/10] soundwire: qcom: Disable runtime PM and avoid clock underflow in qcom_swrm_remove() Lee Jones
@ 2026-11-03 9:53 ` Lee Jones
2026-11-03 9:53 ` [PATCH v2 09/10] soundwire: qcom: Serialise ctrl->intr_mask updates Lee Jones
` (2 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Lee Jones @ 2026-11-03 9:53 UTC (permalink / raw)
To: lee, Srinivas Kandagatla, Vinod Koul, Bard Liao,
Pierre-Louis Bossart, linux-arm-msm, linux-sound, linux-kernel
qcom_swrm_probe(), qcom_swrm_irq_handler(), and swrm_runtime_resume()
ignore the return value of clk_prepare_enable(ctrl->hclk) and proceed
to access controller registers even when enabling the interface clock
fails. Also jump to err_clk when requesting the wake IRQ fails in
qcom_swrm_probe() so ctrl->hclk is disabled on error.
Check the return value of clk_prepare_enable() in all three callers and
abort register access on failure.
Closes: https://sashiko.dev/#/bug/linux-f65cddc9-08ff-4531-9acf-76981d74d914
Signed-off-by: Lee Jones <lee@kernel.org>
---
v1 => v2: Drop Fixes and Stable tags
drivers/soundwire/qcom.c | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/drivers/soundwire/qcom.c b/drivers/soundwire/qcom.c
index a50efdfc3a6b..785096b232f2 100644
--- a/drivers/soundwire/qcom.c
+++ b/drivers/soundwire/qcom.c
@@ -778,7 +778,9 @@ static irqreturn_t qcom_swrm_irq_handler(int irq, void *dev_id)
u32 i;
int devnum;
int ret = IRQ_HANDLED;
- clk_prepare_enable(ctrl->hclk);
+
+ if (clk_prepare_enable(ctrl->hclk))
+ return IRQ_NONE;
ctrl->reg_read(ctrl, ctrl->reg_layout[SWRM_REG_INTERRUPT_STATUS],
&intr_sts);
@@ -1677,7 +1679,9 @@ static int qcom_swrm_probe(struct platform_device *pdev)
goto err_init;
}
- clk_prepare_enable(ctrl->hclk);
+ ret = clk_prepare_enable(ctrl->hclk);
+ if (ret)
+ goto err_init;
ctrl->dev = dev;
dev_set_drvdata(&pdev->dev, ctrl);
@@ -1733,7 +1737,7 @@ static int qcom_swrm_probe(struct platform_device *pdev)
"swr_wake_irq", ctrl);
if (ret) {
dev_err(dev, "Failed to request soundwire wake irq\n");
- goto err_init;
+ goto err_clk;
}
}
@@ -1802,13 +1806,15 @@ static int __maybe_unused swrm_runtime_resume(struct device *dev)
struct qcom_swrm_ctrl *ctrl = dev_get_drvdata(dev);
int ret;
+ ret = clk_prepare_enable(ctrl->hclk);
+ if (ret)
+ return ret;
+
if (ctrl->wake_irq > 0) {
if (!irqd_irq_disabled(irq_get_irq_data(ctrl->wake_irq)))
disable_irq_nosync(ctrl->wake_irq);
}
- clk_prepare_enable(ctrl->hclk);
-
if (ctrl->clock_stop_not_supported) {
reinit_completion(&ctrl->enumeration);
ctrl->reg_write(ctrl, SWRM_COMP_SW_RESET, 0x01);
--
2.56.0.385.gac671c819a-goog
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH v2 09/10] soundwire: qcom: Serialise ctrl->intr_mask updates
2026-11-03 9:53 [PATCH v2 00/10] soundwire: Fix Critical and High issues reported by Sashiko Lee Jones
` (2 preceding siblings ...)
2026-11-03 9:53 ` [PATCH v2 08/10] soundwire: qcom: Check clk_prepare_enable() return value Lee Jones
@ 2026-11-03 9:53 ` Lee Jones
2026-11-03 9:53 ` [PATCH v2 10/10] soundwire: qcom: Prevent stale broadcast IRQ from completing subsequent command Lee Jones
2026-11-07 9:41 ` [PATCH v2 00/10] soundwire: Fix Critical and High issues reported by Sashiko HyeongJun An
5 siblings, 0 replies; 8+ messages in thread
From: Lee Jones @ 2026-11-03 9:53 UTC (permalink / raw)
To: lee, Srinivas Kandagatla, Vinod Koul, Bard Liao,
Pierre-Louis Bossart, linux-arm-msm, linux-sound, linux-kernel
qcom_swrm_irq_handler(), swrm_runtime_suspend(), and
swrm_runtime_resume() concurrently read, modify, and write
ctrl->intr_mask and program the interrupt enable registers without
synchronisation. Overlapping read-modify-write updates can clobber
interrupt mask bits and leave the hardware interrupt mask out of sync.
Add ctrl->intr_lock to serialise accesses to ctrl->intr_mask and its
associated interrupt mask register updates.
Closes: https://sashiko.dev/#/bug/linux-ea523727-6467-42aa-850f-8f838e4b84a8
Signed-off-by: Lee Jones <lee@kernel.org>
---
v1 => v2: Drop Fixes and Stable tags
drivers/soundwire/qcom.c | 25 +++++++++++++++++++++++--
1 file changed, 23 insertions(+), 2 deletions(-)
diff --git a/drivers/soundwire/qcom.c b/drivers/soundwire/qcom.c
index 785096b232f2..cc1b07e2406d 100644
--- a/drivers/soundwire/qcom.c
+++ b/drivers/soundwire/qcom.c
@@ -202,6 +202,8 @@ struct qcom_swrm_ctrl {
struct completion enumeration;
/* Port alloc/free lock */
struct mutex port_lock;
+ /* Interrupt mask and broadcast completion lock */
+ struct mutex intr_lock;
struct clk *hclk;
int irq;
u32 ee;
@@ -784,7 +786,9 @@ static irqreturn_t qcom_swrm_irq_handler(int irq, void *dev_id)
ctrl->reg_read(ctrl, ctrl->reg_layout[SWRM_REG_INTERRUPT_STATUS],
&intr_sts);
+ mutex_lock(&ctrl->intr_lock);
intr_sts_masked = intr_sts & ctrl->intr_mask;
+ mutex_unlock(&ctrl->intr_lock);
do {
for (i = 0; i < SWRM_INTERRUPT_MAX; i++) {
@@ -820,10 +824,12 @@ static irqreturn_t qcom_swrm_irq_handler(int irq, void *dev_id)
dev_err_ratelimited(ctrl->dev,
"%s: SWR bus clsh detected\n",
__func__);
+ mutex_lock(&ctrl->intr_lock);
ctrl->intr_mask &= ~SWRM_INTERRUPT_STATUS_MASTER_CLASH_DET;
ctrl->reg_write(ctrl,
ctrl->reg_layout[SWRM_REG_INTERRUPT_CPU_EN],
ctrl->intr_mask);
+ mutex_unlock(&ctrl->intr_lock);
break;
case SWRM_INTERRUPT_STATUS_RD_FIFO_OVERFLOW:
ctrl->reg_read(ctrl,
@@ -863,20 +869,24 @@ static irqreturn_t qcom_swrm_irq_handler(int irq, void *dev_id)
dev_err_ratelimited(ctrl->dev,
"%s: SWR Port collision detected\n",
__func__);
+ mutex_lock(&ctrl->intr_lock);
ctrl->intr_mask &= ~SWRM_INTERRUPT_STATUS_DOUT_PORT_COLLISION;
ctrl->reg_write(ctrl,
ctrl->reg_layout[SWRM_REG_INTERRUPT_CPU_EN],
ctrl->intr_mask);
+ mutex_unlock(&ctrl->intr_lock);
break;
case SWRM_INTERRUPT_STATUS_READ_EN_RD_VALID_MISMATCH:
dev_err_ratelimited(ctrl->dev,
"%s: SWR read enable valid mismatch\n",
__func__);
+ mutex_lock(&ctrl->intr_lock);
ctrl->intr_mask &=
~SWRM_INTERRUPT_STATUS_READ_EN_RD_VALID_MISMATCH;
ctrl->reg_write(ctrl,
ctrl->reg_layout[SWRM_REG_INTERRUPT_CPU_EN],
ctrl->intr_mask);
+ mutex_unlock(&ctrl->intr_lock);
break;
case SWRM_INTERRUPT_STATUS_SPECIAL_CMD_ID_FINISHED:
complete(&ctrl->broadcast);
@@ -910,7 +920,9 @@ static irqreturn_t qcom_swrm_irq_handler(int irq, void *dev_id)
intr_sts);
ctrl->reg_read(ctrl, ctrl->reg_layout[SWRM_REG_INTERRUPT_STATUS],
&intr_sts);
+ mutex_lock(&ctrl->intr_lock);
intr_sts_masked = intr_sts & ctrl->intr_mask;
+ mutex_unlock(&ctrl->intr_lock);
} while (intr_sts_masked);
clk_disable_unprepare(ctrl->hclk);
@@ -952,11 +964,13 @@ static int qcom_swrm_init(struct qcom_swrm_ctrl *ctrl)
/* Enable Auto enumeration */
ctrl->reg_write(ctrl, SWRM_ENUMERATOR_CFG_ADDR, 1);
+ mutex_lock(&ctrl->intr_lock);
ctrl->intr_mask = SWRM_INTERRUPT_STATUS_RMSK;
/* Mask soundwire interrupts */
if (ctrl->version < SWRM_VERSION_2_0_0)
ctrl->reg_write(ctrl, ctrl->reg_layout[SWRM_REG_INTERRUPT_MASK_ADDR],
- SWRM_INTERRUPT_STATUS_RMSK);
+ ctrl->intr_mask);
+ mutex_unlock(&ctrl->intr_lock);
/* Configure No pings */
ctrl->reg_read(ctrl, SWRM_MCP_CFG_ADDR, &val);
@@ -997,8 +1011,10 @@ static int qcom_swrm_init(struct qcom_swrm_ctrl *ctrl)
0xFFFFFFFF);
/* enable CPU IRQs for the selected EE window */
+ mutex_lock(&ctrl->intr_lock);
ctrl->reg_write(ctrl, ctrl->reg_layout[SWRM_REG_INTERRUPT_CPU_EN],
- SWRM_INTERRUPT_STATUS_RMSK);
+ ctrl->intr_mask);
+ mutex_unlock(&ctrl->intr_lock);
/* Set IRQ to PULSE */
ctrl->reg_write(ctrl, SWRM_COMP_CFG_ADDR,
@@ -1686,6 +1702,7 @@ static int qcom_swrm_probe(struct platform_device *pdev)
ctrl->dev = dev;
dev_set_drvdata(&pdev->dev, ctrl);
mutex_init(&ctrl->port_lock);
+ mutex_init(&ctrl->intr_lock);
init_completion(&ctrl->broadcast);
init_completion(&ctrl->enumeration);
@@ -1851,6 +1868,7 @@ static int __maybe_unused swrm_runtime_resume(struct device *dev)
ctrl->reg_write(ctrl, ctrl->reg_layout[SWRM_REG_INTERRUPT_CLEAR],
SWRM_INTERRUPT_STATUS_MASTER_CLASH_DET);
+ mutex_lock(&ctrl->intr_lock);
ctrl->intr_mask |= SWRM_INTERRUPT_STATUS_MASTER_CLASH_DET;
if (ctrl->version < SWRM_VERSION_2_0_0)
ctrl->reg_write(ctrl,
@@ -1858,6 +1876,7 @@ static int __maybe_unused swrm_runtime_resume(struct device *dev)
ctrl->intr_mask);
ctrl->reg_write(ctrl, ctrl->reg_layout[SWRM_REG_INTERRUPT_CPU_EN],
ctrl->intr_mask);
+ mutex_unlock(&ctrl->intr_lock);
usleep_range(100, 105);
if (!swrm_wait_for_frame_gen_enabled(ctrl))
@@ -1879,6 +1898,7 @@ static int __maybe_unused swrm_runtime_suspend(struct device *dev)
swrm_wait_for_wr_fifo_done(ctrl);
if (!ctrl->clock_stop_not_supported) {
/* Mask bus clash interrupt */
+ mutex_lock(&ctrl->intr_lock);
ctrl->intr_mask &= ~SWRM_INTERRUPT_STATUS_MASTER_CLASH_DET;
if (ctrl->version < SWRM_VERSION_2_0_0)
ctrl->reg_write(ctrl,
@@ -1886,6 +1906,7 @@ static int __maybe_unused swrm_runtime_suspend(struct device *dev)
ctrl->intr_mask);
ctrl->reg_write(ctrl, ctrl->reg_layout[SWRM_REG_INTERRUPT_CPU_EN],
ctrl->intr_mask);
+ mutex_unlock(&ctrl->intr_lock);
/* Prepare slaves for clock stop */
ret = sdw_bus_prep_clk_stop(&ctrl->bus);
if (ret < 0 && ret != -ENODATA) {
--
2.56.0.385.gac671c819a-goog
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH v2 10/10] soundwire: qcom: Prevent stale broadcast IRQ from completing subsequent command
2026-11-03 9:53 [PATCH v2 00/10] soundwire: Fix Critical and High issues reported by Sashiko Lee Jones
` (3 preceding siblings ...)
2026-11-03 9:53 ` [PATCH v2 09/10] soundwire: qcom: Serialise ctrl->intr_mask updates Lee Jones
@ 2026-11-03 9:53 ` Lee Jones
2026-11-07 9:41 ` [PATCH v2 00/10] soundwire: Fix Critical and High issues reported by Sashiko HyeongJun An
5 siblings, 0 replies; 8+ messages in thread
From: Lee Jones @ 2026-11-03 9:53 UTC (permalink / raw)
To: lee, Srinivas Kandagatla, Vinod Koul, Bard Liao,
Pierre-Louis Bossart, linux-sound, linux-arm-msm, linux-kernel
When wait_for_completion_timeout() expires for a broadcast command in
qcom_swrm_cmd_fifo_wr_cmd(), any late
SWRM_INTERRUPT_STATUS_SPECIAL_CMD_ID_FINISHED interrupt from the
timed-out command can fire concurrently with a subsequent broadcast
command after reinit_completion(&ctrl->broadcast), prematurely
completing the new command.
Clear any pending special command completion interrupt and reinitialise
ctrl->broadcast before issuing a broadcast command under
ctrl->intr_lock, clear the interrupt on timeout, and verify that the
interrupt status bit is still asserted under ctrl->intr_lock before
signalling ctrl->broadcast.
Closes: https://sashiko.dev/#/bug/linux-fa1aa3a1-f9c7-4e8a-bdfc-49a559353546
Signed-off-by: Lee Jones <lee@kernel.org>
---
v1 => v2: Drop Fixes and Stable tags
drivers/soundwire/qcom.c | 44 +++++++++++++++++++++++++++++++++-------
1 file changed, 37 insertions(+), 7 deletions(-)
diff --git a/drivers/soundwire/qcom.c b/drivers/soundwire/qcom.c
index cc1b07e2406d..8d1346158ecd 100644
--- a/drivers/soundwire/qcom.c
+++ b/drivers/soundwire/qcom.c
@@ -554,11 +554,18 @@ static int qcom_swrm_cmd_fifo_wr_cmd(struct qcom_swrm_ctrl *ctrl, u8 cmd_data,
if (swrm_wait_for_wr_fifo_avail(ctrl))
return SDW_CMD_FAIL_OTHER;
- if (cmd_id == SWR_BROADCAST_CMD_ID)
+ if (cmd_id == SWR_BROADCAST_CMD_ID) {
+ mutex_lock(&ctrl->intr_lock);
+ ctrl->reg_write(ctrl,
+ ctrl->reg_layout[SWRM_REG_INTERRUPT_CLEAR],
+ SWRM_INTERRUPT_STATUS_SPECIAL_CMD_ID_FINISHED);
reinit_completion(&ctrl->broadcast);
-
- /* Its assumed that write is okay as we do not get any status back */
- ctrl->reg_write(ctrl, ctrl->reg_layout[SWRM_REG_CMD_FIFO_WR_CMD], val);
+ ctrl->reg_write(ctrl, ctrl->reg_layout[SWRM_REG_CMD_FIFO_WR_CMD], val);
+ mutex_unlock(&ctrl->intr_lock);
+ } else {
+ /* Its assumed that write is okay as we do not get any status back */
+ ctrl->reg_write(ctrl, ctrl->reg_layout[SWRM_REG_CMD_FIFO_WR_CMD], val);
+ }
if (ctrl->version <= SWRM_VERSION_1_3_0)
usleep_range(150, 155);
@@ -571,10 +578,16 @@ static int qcom_swrm_cmd_fifo_wr_cmd(struct qcom_swrm_ctrl *ctrl, u8 cmd_data,
*/
ret = wait_for_completion_timeout(&ctrl->broadcast,
msecs_to_jiffies(TIMEOUT_MS));
- if (!ret)
+ if (!ret) {
+ mutex_lock(&ctrl->intr_lock);
+ ctrl->reg_write(ctrl,
+ ctrl->reg_layout[SWRM_REG_INTERRUPT_CLEAR],
+ SWRM_INTERRUPT_STATUS_SPECIAL_CMD_ID_FINISHED);
+ mutex_unlock(&ctrl->intr_lock);
ret = SDW_CMD_IGNORED;
- else
+ } else {
ret = SDW_CMD_OK;
+ }
} else {
ret = SDW_CMD_OK;
@@ -773,6 +786,22 @@ static irqreturn_t qcom_swrm_wake_irq_handler(int irq, void *dev_id)
return IRQ_HANDLED;
}
+static void qcom_swrm_complete_broadcast(struct qcom_swrm_ctrl *ctrl)
+{
+ u32 status;
+
+ guard(mutex)(&ctrl->intr_lock);
+
+ ctrl->reg_read(ctrl, ctrl->reg_layout[SWRM_REG_INTERRUPT_STATUS],
+ &status);
+ if (status & SWRM_INTERRUPT_STATUS_SPECIAL_CMD_ID_FINISHED) {
+ ctrl->reg_write(ctrl,
+ ctrl->reg_layout[SWRM_REG_INTERRUPT_CLEAR],
+ SWRM_INTERRUPT_STATUS_SPECIAL_CMD_ID_FINISHED);
+ complete(&ctrl->broadcast);
+ }
+}
+
static irqreturn_t qcom_swrm_irq_handler(int irq, void *dev_id)
{
struct qcom_swrm_ctrl *ctrl = dev_id;
@@ -889,7 +918,8 @@ static irqreturn_t qcom_swrm_irq_handler(int irq, void *dev_id)
mutex_unlock(&ctrl->intr_lock);
break;
case SWRM_INTERRUPT_STATUS_SPECIAL_CMD_ID_FINISHED:
- complete(&ctrl->broadcast);
+ qcom_swrm_complete_broadcast(ctrl);
+ intr_sts &= ~SWRM_INTERRUPT_STATUS_SPECIAL_CMD_ID_FINISHED;
break;
case SWRM_INTERRUPT_STATUS_BUS_RESET_FINISHED_V2:
break;
--
2.56.0.385.gac671c819a-goog
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [PATCH v2 00/10] soundwire: Fix Critical and High issues reported by Sashiko
2026-11-03 9:53 [PATCH v2 00/10] soundwire: Fix Critical and High issues reported by Sashiko Lee Jones
` (4 preceding siblings ...)
2026-11-03 9:53 ` [PATCH v2 10/10] soundwire: qcom: Prevent stale broadcast IRQ from completing subsequent command Lee Jones
@ 2026-11-07 9:41 ` HyeongJun An
2026-11-10 9:04 ` Lee Jones
5 siblings, 1 reply; 8+ messages in thread
From: HyeongJun An @ 2026-11-07 9:41 UTC (permalink / raw)
To: Lee Jones
Cc: HyeongJun An, Vinod Koul, Bard Liao, Pierre-Louis Bossart,
Srinivas Kandagatla, linux-sound, linux-arm-msm, linux-kernel
On a Dell Latitude 9420 (Tiger Lake, SOF IPC3, sof_sdw with rt711-sdca
on link 0, two rt1316 on links 1 and 2 that are aggregated into one
Speaker stream, and rt714 on link 3), I tested this series on top of
soundwire next at commit afd88e7ad781. Only patches 1-4 run on this
machine. The intel_ace2x and qcom patches are not exercised here.
With and without the series:
- all four peripherals attach at boot
- playback and capture work on every endpoint
- 40 start/stop cycles of the multi-link Speaker stream (10 of them
after the links had runtime suspended), all links streaming at the
same time, and Jack Out start/stop while Speaker was playing all
passed
- ALSA pcm-test: 24 pass, 0 fail
- the dev-properties, dp0 and dpN sysfs attributes of all four
peripherals read back identical (the words arrays are empty on these
codecs, so only the trailing newline goes through the changed code)
With the series, s2idle with Speaker playback and Microphone capture
running: all four peripherals were attached again after resume, both
streams continued after aplay/arecord re-prepared them, and playback and
capture on every endpoint still worked. There were no SoundWire or SOF
kernel messages. I did not run the same s2idle test without the series.
These runs only take the normal paths, so the failure cases that
patches 3 and 4 guard against were not hit.
I ran these with Claude Code (Claude Opus 5.5) on the laptop.
I am sending Tested-by on patches 1-4 only, in replies to those
patches.
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [PATCH v2 00/10] soundwire: Fix Critical and High issues reported by Sashiko
2026-11-07 9:41 ` [PATCH v2 00/10] soundwire: Fix Critical and High issues reported by Sashiko HyeongJun An
@ 2026-11-10 9:04 ` Lee Jones
0 siblings, 0 replies; 8+ messages in thread
From: Lee Jones @ 2026-11-10 9:04 UTC (permalink / raw)
To: HyeongJun An
Cc: Vinod Koul, Bard Liao, Pierre-Louis Bossart, Srinivas Kandagatla,
linux-sound, linux-arm-msm, linux-kernel
On Sat, 07 Nov 2026, HyeongJun An wrote:
> On a Dell Latitude 9420 (Tiger Lake, SOF IPC3, sof_sdw with rt711-sdca
> on link 0, two rt1316 on links 1 and 2 that are aggregated into one
> Speaker stream, and rt714 on link 3), I tested this series on top of
> soundwire next at commit afd88e7ad781. Only patches 1-4 run on this
> machine. The intel_ace2x and qcom patches are not exercised here.
>
> With and without the series:
> - all four peripherals attach at boot
> - playback and capture work on every endpoint
> - 40 start/stop cycles of the multi-link Speaker stream (10 of them
> after the links had runtime suspended), all links streaming at the
> same time, and Jack Out start/stop while Speaker was playing all
> passed
> - ALSA pcm-test: 24 pass, 0 fail
> - the dev-properties, dp0 and dpN sysfs attributes of all four
> peripherals read back identical (the words arrays are empty on these
> codecs, so only the trailing newline goes through the changed code)
>
> With the series, s2idle with Speaker playback and Microphone capture
> running: all four peripherals were attached again after resume, both
> streams continued after aplay/arecord re-prepared them, and playback and
> capture on every endpoint still worked. There were no SoundWire or SOF
> kernel messages. I did not run the same s2idle test without the series.
>
> These runs only take the normal paths, so the failure cases that
> patches 3 and 4 guard against were not hit.
>
> I ran these with Claude Code (Claude Opus 5.5) on the laptop.
>
> I am sending Tested-by on patches 1-4 only, in replies to those
> patches.
I really appreciate you taking the time to test these. Thank you.
--
Lee Jones
^ permalink raw reply [flat|nested] 8+ messages in thread