diff --git a/pkg/debian/kernel/0001-serial-core-Fix-checks-for-tx-runtime-PM-state.patch b/pkg/debian/kernel/0001-serial-core-Fix-checks-for-tx-runtime-PM-state.patch new file mode 100644 index 000000000..d525a9324 --- /dev/null +++ b/pkg/debian/kernel/0001-serial-core-Fix-checks-for-tx-runtime-PM-state.patch @@ -0,0 +1,59 @@ +From 8459746f889d72794c164d18423344686267a451 Mon Sep 17 00:00:00 2001 +From: Tony Lindgren +Date: Thu, 5 Oct 2023 10:56:42 +0300 +Subject: [PATCH] serial: core: Fix checks for tx runtime PM state + +commit 81a61051e0ce5fd7e09225c0d5985da08c7954a7 upstream. + +Maximilian reported that surface_serial_hub serdev tx does not work during +system suspend. During system suspend, runtime PM gets disabled in +__device_suspend_late(), and tx is unable to wake-up the serial core port +device that we use to check if tx is safe to start. Johan summarized the +regression noting that serdev tx no longer always works as earlier when the +serdev device is runtime PM active. + +The serdev device and the serial core controller devices are siblings of +the serial port hardware device. The runtime PM usage count from serdev +device does not propagate to the serial core device siblings, it only +propagates to the parent. + +In addition to the tx issue for suspend, testing for the serial core port +device can cause an unnecessary delay in enabling tx while waiting for the +serial core port device to wake-up. The serial core port device wake-up is +only needed to flush pending tx when the serial port hardware device was +in runtime PM suspended state. + +To fix the regression, we need to check the runtime PM state of the parent +serial port hardware device for tx instead of the serial core port device. + +As the serial port device drivers may or may not implement runtime PM, we +need to also add a check for pm_runtime_enabled(). + +Reported-by: Maximilian Luz +Cc: stable +Fixes: 84a9582fd203 ("serial: core: Start managing serial controllers to enable runtime PM") +Signed-off-by: Tony Lindgren +Tested-by: Maximilian Luz +Reviewed-by: Andy Shevchenko +Link: https://lore.kernel.org/r/20231005075644.25936-1-tony@atomide.com +Signed-off-by: Greg Kroah-Hartman +--- + drivers/tty/serial/serial_core.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c +index bf63a045fdc8..83c419ac78bc 100644 +--- a/drivers/tty/serial/serial_core.c ++++ b/drivers/tty/serial/serial_core.c +@@ -157,7 +157,7 @@ static void __uart_start(struct tty_struct *tty) + * enabled, serial_port_runtime_resume() calls start_tx() again + * after enabling the device. + */ +- if (pm_runtime_active(&port_dev->dev)) ++ if (!pm_runtime_enabled(port->dev) || pm_runtime_active(port->dev)) + port->ops->start_tx(port); + pm_runtime_mark_last_busy(&port_dev->dev); + pm_runtime_put_autosuspend(&port_dev->dev); +-- +2.42.0 +