]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - ti-linux-kernel/ti-linux-kernel.git/commitdiff
serial: 8250: 8250_omap: Don't queue new DMA request for RX timeout
authorVignesh Raghavendra <vigneshr@ti.com>
Tue, 14 Jan 2020 14:53:03 +0000 (14:53 +0000)
committerSekhar Nori <nsekhar@ti.com>
Wed, 15 Jan 2020 10:52:47 +0000 (16:22 +0530)
When RX Timeout interrupt is raised without any data in RX FIFO (i.e
when UART_LSR_DR bit is not set) don't queue a new RX DMA request as
request will be immediately subjected to teardown as part of RX timeout
handling. This removes dependency on DMA driver to call completion
callback for descriptor terminated before completion.

Signed-off-by: Vignesh Raghavendra <vigneshr@ti.com>
Signed-off-by: Sekhar Nori <nsekhar@ti.com>
drivers/tty/serial/8250/8250_omap.c

index 088232f6aa75a869de6884617080eaf265bf8891..979e4c861a6b7ecfee0a2bf4c5fe9cd546f0d41b 100644 (file)
@@ -1102,22 +1102,18 @@ static unsigned char am654_8250_handle_rx_dma(struct uart_8250_port *up,
                omap_8250_rx_dma(up);
                serial_out(up, UART_OMAP_EFR2, UART_OMAP_EFR2_TIMEOUT_BEHAVE);
        } else if ((iir & 0x3f) == UART_IIR_RX_TIMEOUT) {
-               if (!up->dma->rx_running) {
-                       omap_8250_rx_dma(up);
-               } else {
-                       /*
-                        * Disable RX timeout, read IIR to clear
-                        * current timeout condition, clear EFR2 to
-                        * periodic timeouts, re-enable interrupts.
-                        */
-                       up->ier &= ~(UART_IER_RLSI | UART_IER_RDI);
-                       serial_out(up, UART_IER, up->ier);
-                       omap_8250_rx_dma_flush(up);
-                       serial_in(up, UART_IIR);
-                       serial_out(up, UART_OMAP_EFR2, 0x0);
-                       up->ier |= UART_IER_RLSI | UART_IER_RDI;
-                       serial_out(up, UART_IER, up->ier);
-               }
+               /*
+                * Disable RX timeout, read IIR to clear
+                * current timeout condition, clear EFR2 to
+                * periodic timeouts, re-enable interrupts.
+                */
+               up->ier &= ~(UART_IER_RLSI | UART_IER_RDI);
+               serial_out(up, UART_IER, up->ier);
+               omap_8250_rx_dma_flush(up);
+               serial_in(up, UART_IIR);
+               serial_out(up, UART_OMAP_EFR2, 0x0);
+               up->ier |= UART_IER_RLSI | UART_IER_RDI;
+               serial_out(up, UART_IER, up->ier);
        }
 
        return status;