mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-09-04 20:19:47 +08:00 
			
		
		
		
	serial: 8250: Don't service RX FIFO if interrupts are disabled
Currently, data in RX FIFO is read based on UART_LSR register state even if RDI and RLSI interrupts are disabled in UART_IER register. This is because when IRQ handler is called due to TX FIFO empty event, RX FIFO is serviced based on UART_LSR register status instead of UART_IIR status. This defeats the purpose of disabling UART RX FIFO interrupts during throttling(see, omap_8250_throttle()) as IRQ handler continues to drain UART RX FIFO resulting in overflow of buffer at tty layer. Fix this by making sure that driver drains UART RX FIFO only when UART_IIR_RDI is set along with UART_LSR_BI or UART_LSR_DR bits. Signed-off-by: Vignesh R <vigneshr@ti.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
		
							parent
							
								
									890fb16b4c
								
							
						
					
					
						commit
						2e9fe53910
					
				| @ -1854,7 +1854,8 @@ int serial8250_handle_irq(struct uart_port *port, unsigned int iir) | |||||||
| 
 | 
 | ||||||
| 	status = serial_port_in(port, UART_LSR); | 	status = serial_port_in(port, UART_LSR); | ||||||
| 
 | 
 | ||||||
| 	if (status & (UART_LSR_DR | UART_LSR_BI)) { | 	if (status & (UART_LSR_DR | UART_LSR_BI) && | ||||||
|  | 	    iir & UART_IIR_RDI) { | ||||||
| 		if (!up->dma || handle_rx_dma(up, iir)) | 		if (!up->dma || handle_rx_dma(up, iir)) | ||||||
| 			status = serial8250_rx_chars(up, status); | 			status = serial8250_rx_chars(up, status); | ||||||
| 	} | 	} | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Vignesh R
						Vignesh R