|
|
@@ -1249,20 +1249,19 @@ __acquires(&uap->port.lock)
|
|
|
|
|
|
/*
|
|
|
* Transmit a character
|
|
|
- * There must be at least one free entry in the TX FIFO to accept the char.
|
|
|
*
|
|
|
- * Returns true if the FIFO might have space in it afterwards;
|
|
|
- * returns false if the FIFO definitely became full.
|
|
|
+ * Returns true if the character was successfully queued to the FIFO.
|
|
|
+ * Returns false otherwise.
|
|
|
*/
|
|
|
static bool pl011_tx_char(struct uart_amba_port *uap, unsigned char c)
|
|
|
{
|
|
|
+ if (readw(uap->port.membase + UART01x_FR) & UART01x_FR_TXFF)
|
|
|
+ return false; /* unable to transmit character */
|
|
|
+
|
|
|
writew(c, uap->port.membase + UART01x_DR);
|
|
|
uap->port.icount.tx++;
|
|
|
|
|
|
- if (likely(uap->tx_irq_seen > 1))
|
|
|
- return true;
|
|
|
-
|
|
|
- return !(readw(uap->port.membase + UART01x_FR) & UART01x_FR_TXFF);
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
static bool pl011_tx_chars(struct uart_amba_port *uap)
|
|
|
@@ -1296,7 +1295,8 @@ static bool pl011_tx_chars(struct uart_amba_port *uap)
|
|
|
return false;
|
|
|
|
|
|
if (uap->port.x_char) {
|
|
|
- pl011_tx_char(uap, uap->port.x_char);
|
|
|
+ if (!pl011_tx_char(uap, uap->port.x_char))
|
|
|
+ goto done;
|
|
|
uap->port.x_char = 0;
|
|
|
--count;
|
|
|
}
|