summaryrefslogtreecommitdiff
path: root/packages/linux/linux-2.6.18/fix-usart3-rx-BUG.patch
blob: 1035f9f01074dbf1abfe48fe9f79389061e86678 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
---
 drivers/serial/atmel_usart.c |   10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

Index: linux-2.6.18-avr32/drivers/serial/atmel_usart.c
===================================================================
--- linux-2.6.18-avr32.orig/drivers/serial/atmel_usart.c	2006-11-24 15:59:38.000000000 +0100
+++ linux-2.6.18-avr32/drivers/serial/atmel_usart.c	2006-11-24 15:59:46.000000000 +0100
@@ -194,8 +194,14 @@ static inline int rx_dma_update_tail(str
 		usart3_writel(up, RNCR, RX_BUFFER_SIZE);
 
 		again = 1;
-	} else
-		BUG_ON(usart3_readl(up, CSR) & USART3_BIT(ENDRX));
+	} else if(usart3_readl(up, CSR) & USART3_BIT(ENDRX)) {
+		/*
+		 * The USART hit the end of the buffer after head was
+		 * updated.  Let's do another pass so that we can
+		 * avoid taking another interrupt immediately.
+		 */
+		again = 1;
+	}
 
 	up->rx_tail = tail;