--- 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;