From: Greg Kroah-Hartman Date: Sat, 21 Mar 2026 06:02:21 +0000 (+0100) Subject: 6.1-stable patches X-Git-Tag: v6.1.167~75 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=96f88edaed9bbe4198db59f6152ccfab77ce8846;p=thirdparty%2Fkernel%2Fstable-queue.git 6.1-stable patches added patches: serial-8250-add-late-synchronize_irq-to-shutdown-to-handle-dw-uart-busy.patch serial-8250-fix-tx-deadlock-when-using-dma.patch serial-8250_pci-add-support-for-the-ax99100.patch serial-uartlite-fix-pm-runtime-usage-count-underflow-on-probe.patch --- diff --git a/queue-6.1/serial-8250-add-late-synchronize_irq-to-shutdown-to-handle-dw-uart-busy.patch b/queue-6.1/serial-8250-add-late-synchronize_irq-to-shutdown-to-handle-dw-uart-busy.patch new file mode 100644 index 0000000000..f501cc6861 --- /dev/null +++ b/queue-6.1/serial-8250-add-late-synchronize_irq-to-shutdown-to-handle-dw-uart-busy.patch @@ -0,0 +1,64 @@ +From e0a368ae79531ff92105a2692f10d83052055856 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= +Date: Tue, 3 Feb 2026 19:10:48 +0200 +Subject: serial: 8250: Add late synchronize_irq() to shutdown to handle DW UART BUSY +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Ilpo Järvinen + +commit e0a368ae79531ff92105a2692f10d83052055856 upstream. + +When DW UART is !uart_16550_compatible, it can indicate BUSY at any +point (when under constant Rx pressure) unless a complex sequence of +steps is performed. Any LCR write can run a foul with the condition +that prevents writing LCR while the UART is BUSY, which triggers +BUSY_DETECT interrupt that seems unmaskable using IER bits. + +Normal flow is that dw8250_handle_irq() handles BUSY_DETECT condition +by reading USR register. This BUSY feature, however, breaks the +assumptions made in serial8250_do_shutdown(), which runs +synchronize_irq() after clearing IER and assumes no interrupts can +occur after that point but then proceeds to update LCR, which on DW +UART can trigger an interrupt. + +If serial8250_do_shutdown() releases the interrupt handler before the +handler has run and processed the BUSY_DETECT condition by read the USR +register, the IRQ is not deasserted resulting in interrupt storm that +triggers "irq x: nobody cared" warning leading to disabling the IRQ. + +Add late synchronize_irq() into serial8250_do_shutdown() to ensure +BUSY_DETECT from DW UART is handled before port's interrupt handler is +released. Alternative would be to add DW UART specific shutdown +function but it would mostly duplicate the generic code and the extra +synchronize_irq() seems pretty harmless in serial8250_do_shutdown(). + +Fixes: 7d4008ebb1c9 ("tty: add a DesignWare 8250 driver") +Cc: stable +Reported-by: Bandal, Shankar +Tested-by: Bandal, Shankar +Tested-by: Murthy, Shanth +Reviewed-by: Andy Shevchenko +Signed-off-by: Ilpo Järvinen +Link: https://patch.msgid.link/20260203171049.4353-7-ilpo.jarvinen@linux.intel.com +Signed-off-by: Greg Kroah-Hartman +--- + drivers/tty/serial/8250/8250_port.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +--- a/drivers/tty/serial/8250/8250_port.c ++++ b/drivers/tty/serial/8250/8250_port.c +@@ -2526,6 +2526,12 @@ void serial8250_do_shutdown(struct uart_ + * the IRQ chain. + */ + serial_port_in(port, UART_RX); ++ /* ++ * LCR writes on DW UART can trigger late (unmaskable) IRQs. ++ * Handle them before releasing the handler. ++ */ ++ synchronize_irq(port->irq); ++ + serial8250_rpm_put(up); + + up->ops->release_irq(up); diff --git a/queue-6.1/serial-8250-fix-tx-deadlock-when-using-dma.patch b/queue-6.1/serial-8250-fix-tx-deadlock-when-using-dma.patch new file mode 100644 index 0000000000..84fe661ff3 --- /dev/null +++ b/queue-6.1/serial-8250-fix-tx-deadlock-when-using-dma.patch @@ -0,0 +1,54 @@ +From a424a34b8faddf97b5af41689087e7a230f79ba7 Mon Sep 17 00:00:00 2001 +From: Raul E Rangel +Date: Mon, 9 Feb 2026 13:58:18 -0700 +Subject: serial: 8250: Fix TX deadlock when using DMA + +From: Raul E Rangel + +commit a424a34b8faddf97b5af41689087e7a230f79ba7 upstream. + +`dmaengine_terminate_async` does not guarantee that the +`__dma_tx_complete` callback will run. The callback is currently the +only place where `dma->tx_running` gets cleared. If the transaction is +canceled and the callback never runs, then `dma->tx_running` will never +get cleared and we will never schedule new TX DMA transactions again. + +This change makes it so we clear `dma->tx_running` after we terminate +the DMA transaction. This is "safe" because `serial8250_tx_dma_flush` +is holding the UART port lock. The first thing the callback does is also +grab the UART port lock, so access to `dma->tx_running` is serialized. + +Fixes: 9e512eaaf8f4 ("serial: 8250: Fix fifo underflow on flush") +Cc: stable +Signed-off-by: Raul E Rangel +Link: https://patch.msgid.link/20260209135815.1.I16366ecb0f62f3c96fe3dd5763fcf6f3c2b4d8cd@changeid +Signed-off-by: Greg Kroah-Hartman +--- + drivers/tty/serial/8250/8250_dma.c | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +--- a/drivers/tty/serial/8250/8250_dma.c ++++ b/drivers/tty/serial/8250/8250_dma.c +@@ -146,7 +146,22 @@ void serial8250_tx_dma_flush(struct uart + */ + dma->tx_size = 0; + ++ /* ++ * We can't use `dmaengine_terminate_sync` because `uart_flush_buffer` is ++ * holding the uart port spinlock. ++ */ + dmaengine_terminate_async(dma->txchan); ++ ++ /* ++ * The callback might or might not run. If it doesn't run, we need to ensure ++ * that `tx_running` is cleared so that we can schedule new transactions. ++ * If it does run, then the zombie callback will clear `tx_running` again ++ * and perform a no-op since `tx_size` was cleared above. ++ * ++ * In either case, we ASSUME the DMA transaction will terminate before we ++ * issue a new `serial8250_tx_dma`. ++ */ ++ dma->tx_running = 0; + } + + int serial8250_rx_dma(struct uart_8250_port *p) diff --git a/queue-6.1/serial-8250_pci-add-support-for-the-ax99100.patch b/queue-6.1/serial-8250_pci-add-support-for-the-ax99100.patch new file mode 100644 index 0000000000..40d08b1f98 --- /dev/null +++ b/queue-6.1/serial-8250_pci-add-support-for-the-ax99100.patch @@ -0,0 +1,80 @@ +From 9c0072bc33d349c83d223e64be30794e11938a6b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Martin=20Roukala=20=28n=C3=A9=20Peres=29?= + +Date: Mon, 9 Mar 2026 15:53:10 +0200 +Subject: serial: 8250_pci: add support for the AX99100 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Martin Roukala (né Peres) + +commit 9c0072bc33d349c83d223e64be30794e11938a6b upstream. + +This is found in popular brands such as StarTech.com or Delock, and has +been a source of frustration to quite a few people, if I can trust +Amazon comments complaining about Linux support via the official +out-of-the-tree driver. + +Signed-off-by: Martin Roukala (né Peres) +Cc: stable +Link: https://patch.msgid.link/20260309-8250_pci_ax99100-v1-1-3328bdfd8e94@mupuf.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/tty/serial/8250/8250_pci.c | 17 +++++++++++++++++ + 1 file changed, 17 insertions(+) + +--- a/drivers/tty/serial/8250/8250_pci.c ++++ b/drivers/tty/serial/8250/8250_pci.c +@@ -58,6 +58,8 @@ struct serial_private { + }; + + #define PCI_DEVICE_ID_HPE_PCI_SERIAL 0x37e ++#define PCIE_VENDOR_ID_ASIX 0x125B ++#define PCIE_DEVICE_ID_AX99100 0x9100 + + static const struct pci_device_id pci_use_msi[] = { + { PCI_DEVICE_SUB(PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9900, +@@ -70,6 +72,8 @@ static const struct pci_device_id pci_us + 0xA000, 0x1000) }, + { PCI_DEVICE_SUB(PCI_VENDOR_ID_HP_3PAR, PCI_DEVICE_ID_HPE_PCI_SERIAL, + PCI_ANY_ID, PCI_ANY_ID) }, ++ { PCI_DEVICE_SUB(PCIE_VENDOR_ID_ASIX, PCIE_DEVICE_ID_AX99100, ++ 0xA000, 0x1000) }, + { } + }; + +@@ -854,6 +858,7 @@ static int pci_netmos_init(struct pci_de + case PCI_DEVICE_ID_NETMOS_9912: + case PCI_DEVICE_ID_NETMOS_9922: + case PCI_DEVICE_ID_NETMOS_9900: ++ case PCIE_DEVICE_ID_AX99100: + num_serial = pci_netmos_9900_numports(dev); + break; + +@@ -2416,6 +2421,14 @@ static struct pci_serial_quirk pci_seria + .init = pci_netmos_init, + .setup = pci_netmos_9900_setup, + }, ++ { ++ .vendor = PCIE_VENDOR_ID_ASIX, ++ .device = PCI_ANY_ID, ++ .subvendor = PCI_ANY_ID, ++ .subdevice = PCI_ANY_ID, ++ .init = pci_netmos_init, ++ .setup = pci_netmos_9900_setup, ++ }, + /* + * EndRun Technologies + */ +@@ -5960,6 +5973,10 @@ static const struct pci_device_id serial + 0xA000, 0x3002, + 0, 0, pbn_NETMOS9900_2s_115200 }, + ++ { PCIE_VENDOR_ID_ASIX, PCIE_DEVICE_ID_AX99100, ++ 0xA000, 0x1000, ++ 0, 0, pbn_b0_1_115200 }, ++ + /* + * Best Connectivity and Rosewill PCI Multi I/O cards + */ diff --git a/queue-6.1/serial-uartlite-fix-pm-runtime-usage-count-underflow-on-probe.patch b/queue-6.1/serial-uartlite-fix-pm-runtime-usage-count-underflow-on-probe.patch new file mode 100644 index 0000000000..8d8f8580e1 --- /dev/null +++ b/queue-6.1/serial-uartlite-fix-pm-runtime-usage-count-underflow-on-probe.patch @@ -0,0 +1,53 @@ +From d54801cd509515f674a5aac1d3ea1401d2a05863 Mon Sep 17 00:00:00 2001 +From: Maciej Andrzejewski ICEYE +Date: Thu, 5 Mar 2026 13:37:51 +0100 +Subject: serial: uartlite: fix PM runtime usage count underflow on probe + +From: Maciej Andrzejewski ICEYE + +commit d54801cd509515f674a5aac1d3ea1401d2a05863 upstream. + +ulite_probe() calls pm_runtime_put_autosuspend() at the end of probe +without holding a corresponding PM runtime reference for non-console +ports. + +During ulite_assign(), uart_add_one_port() triggers uart_configure_port() +which calls ulite_pm() via uart_change_pm(). For non-console ports, the +UART core performs a balanced get/put cycle: + + uart_change_pm(ON) -> ulite_pm() -> pm_runtime_get_sync() +1 + uart_change_pm(OFF) -> ulite_pm() -> pm_runtime_put_autosuspend() -1 + +This leaves no spare reference for the pm_runtime_put_autosuspend() at +the end of probe. The PM runtime core prevents the count from actually +going below zero, and instead triggers a +"Runtime PM usage count underflow!" warning. + +For console ports the bug is masked: the UART core skips the +uart_change_pm(OFF) call, so the UART core's unbalanced get happens to +pair with probe's trailing put. + +Add pm_runtime_get_noresume() before pm_runtime_enable() to take an +explicit probe-owned reference that the trailing +pm_runtime_put_autosuspend() can release. This ensures a correct usage +count regardless of whether the port is a console. + +Fixes: 5bbe10a6942d ("tty: serial: uartlite: Add runtime pm support") +Cc: stable +Signed-off-by: Maciej Andrzejewski ICEYE +Link: https://patch.msgid.link/20260305123746.4152800-1-maciej.andrzejewski@m-works.net +Signed-off-by: Greg Kroah-Hartman +--- + drivers/tty/serial/uartlite.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/tty/serial/uartlite.c ++++ b/drivers/tty/serial/uartlite.c +@@ -874,6 +874,7 @@ of_err: + pm_runtime_use_autosuspend(&pdev->dev); + pm_runtime_set_autosuspend_delay(&pdev->dev, UART_AUTOSUSPEND_TIMEOUT); + pm_runtime_set_active(&pdev->dev); ++ pm_runtime_get_noresume(&pdev->dev); + pm_runtime_enable(&pdev->dev); + + ret = ulite_assign(&pdev->dev, id, res->start, irq, pdata); diff --git a/queue-6.1/series b/queue-6.1/series index b6b68a58c6..da884ab5e1 100644 --- a/queue-6.1/series +++ b/queue-6.1/series @@ -296,3 +296,7 @@ mtd-rawnand-pl353-make-sure-optimal-timings-are-applied.patch mtd-rawnand-cadence-fix-error-check-for-dma_alloc_coherent-in-cadence_nand_init.patch mtd-avoid-boot-crash-in-redboot-partition-table-parser.patch iommu-vt-d-fix-intel-iommu-iotlb-sync-hardlockup-and-retry.patch +serial-8250_pci-add-support-for-the-ax99100.patch +serial-8250-fix-tx-deadlock-when-using-dma.patch +serial-8250-add-late-synchronize_irq-to-shutdown-to-handle-dw-uart-busy.patch +serial-uartlite-fix-pm-runtime-usage-count-underflow-on-probe.patch