Commit 4b2981b2 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'tty-6.8-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty

Pull tty / serial fixes from Greg KH:
 "Here are three small tty and serial driver fixes for 6.8-rc5:

   - revert a 8250_pci1xxxx off-by-one change that was incorrect

   - two changes to fix the transmit path of the mxs-auart driver,
     fixing a regression in the 6.2 release

  All of these have been in linux-next for over a week with no reported
  issues"

* tag 'tty-6.8-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty:
  serial: mxs-auart: fix tx
  serial: core: introduce uart_port_tx_flags()
  serial: 8250_pci1xxxx: partially revert off by one patch
parents a3a7d162 7be50f2e
...@@ -302,7 +302,7 @@ static void pci1xxxx_process_read_data(struct uart_port *port, ...@@ -302,7 +302,7 @@ static void pci1xxxx_process_read_data(struct uart_port *port,
* to read, the data is received one byte at a time. * to read, the data is received one byte at a time.
*/ */
while (valid_burst_count--) { while (valid_burst_count--) {
if (*buff_index >= (RX_BUF_SIZE - UART_BURST_SIZE)) if (*buff_index > (RX_BUF_SIZE - UART_BURST_SIZE))
break; break;
burst_buf = (u32 *)&rx_buff[*buff_index]; burst_buf = (u32 *)&rx_buff[*buff_index];
*burst_buf = readl(port->membase + UART_RX_BURST_FIFO); *burst_buf = readl(port->membase + UART_RX_BURST_FIFO);
......
...@@ -605,13 +605,16 @@ static void mxs_auart_tx_chars(struct mxs_auart_port *s) ...@@ -605,13 +605,16 @@ static void mxs_auart_tx_chars(struct mxs_auart_port *s)
return; return;
} }
pending = uart_port_tx(&s->port, ch, pending = uart_port_tx_flags(&s->port, ch, UART_TX_NOSTOP,
!(mxs_read(s, REG_STAT) & AUART_STAT_TXFF), !(mxs_read(s, REG_STAT) & AUART_STAT_TXFF),
mxs_write(ch, s, REG_DATA)); mxs_write(ch, s, REG_DATA));
if (pending) if (pending)
mxs_set(AUART_INTR_TXIEN, s, REG_INTR); mxs_set(AUART_INTR_TXIEN, s, REG_INTR);
else else
mxs_clr(AUART_INTR_TXIEN, s, REG_INTR); mxs_clr(AUART_INTR_TXIEN, s, REG_INTR);
if (uart_tx_stopped(&s->port))
mxs_auart_stop_tx(&s->port);
} }
static void mxs_auart_rx_char(struct mxs_auart_port *s) static void mxs_auart_rx_char(struct mxs_auart_port *s)
......
...@@ -748,8 +748,17 @@ struct uart_driver { ...@@ -748,8 +748,17 @@ struct uart_driver {
void uart_write_wakeup(struct uart_port *port); void uart_write_wakeup(struct uart_port *port);
#define __uart_port_tx(uport, ch, tx_ready, put_char, tx_done, for_test, \ /**
for_post) \ * enum UART_TX_FLAGS -- flags for uart_port_tx_flags()
*
* @UART_TX_NOSTOP: don't call port->ops->stop_tx() on empty buffer
*/
enum UART_TX_FLAGS {
UART_TX_NOSTOP = BIT(0),
};
#define __uart_port_tx(uport, ch, flags, tx_ready, put_char, tx_done, \
for_test, for_post) \
({ \ ({ \
struct uart_port *__port = (uport); \ struct uart_port *__port = (uport); \
struct circ_buf *xmit = &__port->state->xmit; \ struct circ_buf *xmit = &__port->state->xmit; \
...@@ -777,7 +786,7 @@ void uart_write_wakeup(struct uart_port *port); ...@@ -777,7 +786,7 @@ void uart_write_wakeup(struct uart_port *port);
if (pending < WAKEUP_CHARS) { \ if (pending < WAKEUP_CHARS) { \
uart_write_wakeup(__port); \ uart_write_wakeup(__port); \
\ \
if (pending == 0) \ if (!((flags) & UART_TX_NOSTOP) && pending == 0) \
__port->ops->stop_tx(__port); \ __port->ops->stop_tx(__port); \
} \ } \
\ \
...@@ -812,7 +821,7 @@ void uart_write_wakeup(struct uart_port *port); ...@@ -812,7 +821,7 @@ void uart_write_wakeup(struct uart_port *port);
*/ */
#define uart_port_tx_limited(port, ch, count, tx_ready, put_char, tx_done) ({ \ #define uart_port_tx_limited(port, ch, count, tx_ready, put_char, tx_done) ({ \
unsigned int __count = (count); \ unsigned int __count = (count); \
__uart_port_tx(port, ch, tx_ready, put_char, tx_done, __count, \ __uart_port_tx(port, ch, 0, tx_ready, put_char, tx_done, __count, \
__count--); \ __count--); \
}) })
...@@ -826,8 +835,21 @@ void uart_write_wakeup(struct uart_port *port); ...@@ -826,8 +835,21 @@ void uart_write_wakeup(struct uart_port *port);
* See uart_port_tx_limited() for more details. * See uart_port_tx_limited() for more details.
*/ */
#define uart_port_tx(port, ch, tx_ready, put_char) \ #define uart_port_tx(port, ch, tx_ready, put_char) \
__uart_port_tx(port, ch, tx_ready, put_char, ({}), true, ({})) __uart_port_tx(port, ch, 0, tx_ready, put_char, ({}), true, ({}))
/**
* uart_port_tx_flags -- transmit helper for uart_port with flags
* @port: uart port
* @ch: variable to store a character to be written to the HW
* @flags: %UART_TX_NOSTOP or similar
* @tx_ready: can HW accept more data function
* @put_char: function to write a character
*
* See uart_port_tx_limited() for more details.
*/
#define uart_port_tx_flags(port, ch, flags, tx_ready, put_char) \
__uart_port_tx(port, ch, flags, tx_ready, put_char, ({}), true, ({}))
/* /*
* Baud rate helpers. * Baud rate helpers.
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment