]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.15-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 21 Mar 2026 06:02:11 +0000 (07:02 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 21 Mar 2026 06:02:11 +0000 (07:02 +0100)
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

queue-5.15/serial-8250-add-late-synchronize_irq-to-shutdown-to-handle-dw-uart-busy.patch [new file with mode: 0644]
queue-5.15/serial-8250-fix-tx-deadlock-when-using-dma.patch [new file with mode: 0644]
queue-5.15/serial-8250_pci-add-support-for-the-ax99100.patch [new file with mode: 0644]
queue-5.15/serial-uartlite-fix-pm-runtime-usage-count-underflow-on-probe.patch [new file with mode: 0644]
queue-5.15/series

diff --git a/queue-5.15/serial-8250-add-late-synchronize_irq-to-shutdown-to-handle-dw-uart-busy.patch b/queue-5.15/serial-8250-add-late-synchronize_irq-to-shutdown-to-handle-dw-uart-busy.patch
new file mode 100644 (file)
index 0000000..b2d3711
--- /dev/null
@@ -0,0 +1,64 @@
+From e0a368ae79531ff92105a2692f10d83052055856 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= <ilpo.jarvinen@linux.intel.com>
+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 <ilpo.jarvinen@linux.intel.com>
+
+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 <stable@kernel.org>
+Reported-by: Bandal, Shankar <shankar.bandal@intel.com>
+Tested-by: Bandal, Shankar <shankar.bandal@intel.com>
+Tested-by: Murthy, Shanth <shanth.murthy@intel.com>
+Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
+Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+Link: https://patch.msgid.link/20260203171049.4353-7-ilpo.jarvinen@linux.intel.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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
+@@ -2488,6 +2488,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-5.15/serial-8250-fix-tx-deadlock-when-using-dma.patch b/queue-5.15/serial-8250-fix-tx-deadlock-when-using-dma.patch
new file mode 100644 (file)
index 0000000..14a263c
--- /dev/null
@@ -0,0 +1,54 @@
+From a424a34b8faddf97b5af41689087e7a230f79ba7 Mon Sep 17 00:00:00 2001
+From: Raul E Rangel <rrangel@chromium.org>
+Date: Mon, 9 Feb 2026 13:58:18 -0700
+Subject: serial: 8250: Fix TX deadlock when using DMA
+
+From: Raul E Rangel <rrangel@chromium.org>
+
+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 <stable@kernel.org>
+Signed-off-by: Raul E Rangel <rrangel@google.com>
+Link: https://patch.msgid.link/20260209135815.1.I16366ecb0f62f3c96fe3dd5763fcf6f3c2b4d8cd@changeid
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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
+@@ -150,7 +150,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-5.15/serial-8250_pci-add-support-for-the-ax99100.patch b/queue-5.15/serial-8250_pci-add-support-for-the-ax99100.patch
new file mode 100644 (file)
index 0000000..c54dd53
--- /dev/null
@@ -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?=
+ <martin.roukala@mupuf.org>
+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) <martin.roukala@mupuf.org>
+
+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) <martin.roukala@mupuf.org>
+Cc: stable <stable@kernel.org>
+Link: https://patch.msgid.link/20260309-8250_pci_ax99100-v1-1-3328bdfd8e94@mupuf.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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;
+@@ -2688,6 +2693,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
+       */
+@@ -6369,6 +6382,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-5.15/serial-uartlite-fix-pm-runtime-usage-count-underflow-on-probe.patch b/queue-5.15/serial-uartlite-fix-pm-runtime-usage-count-underflow-on-probe.patch
new file mode 100644 (file)
index 0000000..8d419d7
--- /dev/null
@@ -0,0 +1,53 @@
+From d54801cd509515f674a5aac1d3ea1401d2a05863 Mon Sep 17 00:00:00 2001
+From: Maciej Andrzejewski ICEYE <maciej.andrzejewski@m-works.net>
+Date: Thu, 5 Mar 2026 13:37:51 +0100
+Subject: serial: uartlite: fix PM runtime usage count underflow on probe
+
+From: Maciej Andrzejewski ICEYE <maciej.andrzejewski@m-works.net>
+
+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 <stable@kernel.org>
+Signed-off-by: Maciej Andrzejewski ICEYE <maciej.andrzejewski@m-works.net>
+Link: https://patch.msgid.link/20260305123746.4152800-1-maciej.andrzejewski@m-works.net
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/tty/serial/uartlite.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/tty/serial/uartlite.c
++++ b/drivers/tty/serial/uartlite.c
+@@ -806,6 +806,7 @@ static int ulite_probe(struct platform_d
+       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);
index a737793f0c11df056fd003dfdfc276499aa50143..349348a5e5a8796e0e72bf0d810ae6ca74c7a73a 100644 (file)
@@ -206,3 +206,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