Removed upstreamed patches: mvebu/patches-5.4 409-phy-marvell-comphy-Convert-internal-SMCC-firmware-re.patch All modifications made by update_kernel.sh Build system: x86_64 Build-tested: ipq806x/R7800, ath79/generic, bcm27xx/bcm2711, x86_64 Run-tested: ipq806x/R7800, x86_64, lantiq/Easybox 904 xDSL No dmesg regressions, everything functional Signed-off-by: John Audia <graysky@archlinux.us> Tested-by: Curtis Deptuck <curtdept@me.com> [x86_64 build/run] [added lantiq test report] Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
		
			
				
	
	
		
			62 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From a3749ee48539fa832b1832cdcae26d34e5d20f00 Mon Sep 17 00:00:00 2001
 | 
						|
From: Phil Elwell <phil@raspberrypi.org>
 | 
						|
Date: Fri, 24 Jan 2020 11:38:28 +0000
 | 
						|
Subject: [PATCH] tty: amba-pl011: Add un/throttle support
 | 
						|
 | 
						|
The PL011 driver lacks throttle and unthrottle methods. As a result,
 | 
						|
sending more data to the Pi than it can immediately sink while CRTSCTS
 | 
						|
is enabled causes a NULL pointer to be followed.
 | 
						|
 | 
						|
Add a throttle handler that disables the RX interrupts, and an
 | 
						|
unthrottle handler that reenables them.
 | 
						|
 | 
						|
Signed-off-by: Phil Elwell <phil@raspberrypi.org>
 | 
						|
---
 | 
						|
 drivers/tty/serial/amba-pl011.c | 28 ++++++++++++++++++++++++++++
 | 
						|
 1 file changed, 28 insertions(+)
 | 
						|
 | 
						|
--- a/drivers/tty/serial/amba-pl011.c
 | 
						|
+++ b/drivers/tty/serial/amba-pl011.c
 | 
						|
@@ -1326,6 +1326,32 @@ static void pl011_start_tx(struct uart_p
 | 
						|
 		pl011_start_tx_pio(uap);
 | 
						|
 }
 | 
						|
 
 | 
						|
+static void pl011_throttle(struct uart_port *port)
 | 
						|
+{
 | 
						|
+	struct uart_amba_port *uap =
 | 
						|
+	    container_of(port, struct uart_amba_port, port);
 | 
						|
+	unsigned long flags;
 | 
						|
+
 | 
						|
+	spin_lock_irqsave(&uap->port.lock, flags);
 | 
						|
+	uap->im &= ~(UART011_RTIM | UART011_RXIM);
 | 
						|
+	pl011_write(uap->im, uap, REG_IMSC);
 | 
						|
+	spin_unlock_irqrestore(&uap->port.lock, flags);
 | 
						|
+}
 | 
						|
+
 | 
						|
+static void pl011_unthrottle(struct uart_port *port)
 | 
						|
+{
 | 
						|
+	struct uart_amba_port *uap =
 | 
						|
+	    container_of(port, struct uart_amba_port, port);
 | 
						|
+	unsigned long flags;
 | 
						|
+
 | 
						|
+	spin_lock_irqsave(&uap->port.lock, flags);
 | 
						|
+	uap->im |= UART011_RTIM;
 | 
						|
+	if (!pl011_dma_rx_running(uap))
 | 
						|
+	    uap->im |= UART011_RXIM;
 | 
						|
+	pl011_write(uap->im, uap, REG_IMSC);
 | 
						|
+	spin_unlock_irqrestore(&uap->port.lock, flags);
 | 
						|
+}
 | 
						|
+
 | 
						|
 static void pl011_stop_rx(struct uart_port *port)
 | 
						|
 {
 | 
						|
 	struct uart_amba_port *uap =
 | 
						|
@@ -2167,6 +2193,8 @@ static const struct uart_ops amba_pl011_
 | 
						|
 	.stop_tx	= pl011_stop_tx,
 | 
						|
 	.start_tx	= pl011_start_tx,
 | 
						|
 	.stop_rx	= pl011_stop_rx,
 | 
						|
+	.throttle	= pl011_throttle,
 | 
						|
+	.unthrottle	= pl011_unthrottle,
 | 
						|
 	.enable_ms	= pl011_enable_ms,
 | 
						|
 	.break_ctl	= pl011_break_ctl,
 | 
						|
 	.startup	= pl011_startup,
 |