[ARM] i.MX serial: fix tx buffer overflows
Fix occasional tx buffer overflows in the i.MX serial driver which came from the fact that space in the buffer was checked after sending the first byte. Also, fifosize is 32 bytes, not 8. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de Acked-by: Pavel Pisa <pisa@cmp.felk.cvut.cz> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
ae0a846e41
commit
8c0b254b7e
1 changed files with 5 additions and 6 deletions
|
@ -154,7 +154,7 @@ static inline void imx_transmit_buffer(struct imx_port *sport)
|
||||||
{
|
{
|
||||||
struct circ_buf *xmit = &sport->port.info->xmit;
|
struct circ_buf *xmit = &sport->port.info->xmit;
|
||||||
|
|
||||||
do {
|
while (!(UTS((u32)sport->port.membase) & UTS_TXFULL)) {
|
||||||
/* send xmit->buf[xmit->tail]
|
/* send xmit->buf[xmit->tail]
|
||||||
* out the port here */
|
* out the port here */
|
||||||
URTX0((u32)sport->port.membase) = xmit->buf[xmit->tail];
|
URTX0((u32)sport->port.membase) = xmit->buf[xmit->tail];
|
||||||
|
@ -163,7 +163,7 @@ static inline void imx_transmit_buffer(struct imx_port *sport)
|
||||||
sport->port.icount.tx++;
|
sport->port.icount.tx++;
|
||||||
if (uart_circ_empty(xmit))
|
if (uart_circ_empty(xmit))
|
||||||
break;
|
break;
|
||||||
} while (!(UTS((u32)sport->port.membase) & UTS_TXFULL));
|
}
|
||||||
|
|
||||||
if (uart_circ_empty(xmit))
|
if (uart_circ_empty(xmit))
|
||||||
imx_stop_tx(&sport->port);
|
imx_stop_tx(&sport->port);
|
||||||
|
@ -178,8 +178,7 @@ static void imx_start_tx(struct uart_port *port)
|
||||||
|
|
||||||
UCR1((u32)sport->port.membase) |= UCR1_TXMPTYEN;
|
UCR1((u32)sport->port.membase) |= UCR1_TXMPTYEN;
|
||||||
|
|
||||||
if(UTS((u32)sport->port.membase) & UTS_TXEMPTY)
|
imx_transmit_buffer(sport);
|
||||||
imx_transmit_buffer(sport);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static irqreturn_t imx_rtsint(int irq, void *dev_id)
|
static irqreturn_t imx_rtsint(int irq, void *dev_id)
|
||||||
|
@ -678,7 +677,7 @@ static struct imx_port imx_ports[] = {
|
||||||
.mapbase = IMX_UART1_BASE, /* FIXME */
|
.mapbase = IMX_UART1_BASE, /* FIXME */
|
||||||
.irq = UART1_MINT_RX,
|
.irq = UART1_MINT_RX,
|
||||||
.uartclk = 16000000,
|
.uartclk = 16000000,
|
||||||
.fifosize = 8,
|
.fifosize = 32,
|
||||||
.flags = UPF_BOOT_AUTOCONF,
|
.flags = UPF_BOOT_AUTOCONF,
|
||||||
.ops = &imx_pops,
|
.ops = &imx_pops,
|
||||||
.line = 0,
|
.line = 0,
|
||||||
|
@ -694,7 +693,7 @@ static struct imx_port imx_ports[] = {
|
||||||
.mapbase = IMX_UART2_BASE, /* FIXME */
|
.mapbase = IMX_UART2_BASE, /* FIXME */
|
||||||
.irq = UART2_MINT_RX,
|
.irq = UART2_MINT_RX,
|
||||||
.uartclk = 16000000,
|
.uartclk = 16000000,
|
||||||
.fifosize = 8,
|
.fifosize = 32,
|
||||||
.flags = UPF_BOOT_AUTOCONF,
|
.flags = UPF_BOOT_AUTOCONF,
|
||||||
.ops = &imx_pops,
|
.ops = &imx_pops,
|
||||||
.line = 1,
|
.line = 1,
|
||||||
|
|
Loading…
Reference in a new issue