serial: core: introduce uart_port_tx_flags()
Subsystems (2)
Jiri Slaby (SUSE)
maintainerPATCH v2 1/2 serial: core: introduce uart_port_tx_flags()
And an enum with a flag: UART_TX_NOSTOP. To NOT call __port->ops->stop_tx() when the circular buffer is empty. mxs-uart needs this (see the next patch).
---
Notes:
[v2] fix/invert the condition
include/linux/serial_core.h | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-)
include/linux/serial_core.h +27 -5
@@ -748,8 +748,17 @@ struct uart_driver {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 circ_buf *xmit = &__port->state->xmit; \
@@ -777,7 +786,7 @@ void uart_write_wakeup(struct uart_port *port);if (pending <WAKEUP_CHARS ) { \uart_write_wakeup (__port); \ \ -if (pending ==0 ) \ +if (!((flags) &UART_TX_NOSTOP ) && pending ==0 ) \ __port->ops->stop_tx (__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) ({ \ 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--); \ })
@@ -826,8 +835,21 @@ void uart_write_wakeup(struct uart_port *port);* See uart_port_tx_limited() for more details. */ #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. */
Signature · 1 line
2.43.0
Jiri Slaby (SUSE)
maintainerPATCH v2 2/2 serial: mxs-auart: fix tx
Emil reports:
After updating Linux on an i.MX28 board, serial communication over AUART broke. When I TX from the board and measure on the TX pin, it seems like the HW fifo is not emptied before the transmission is stopped.
MXS performs weird things with stop_tx(). The driver makes it conditional on uart_tx_stopped().
So the driver needs special handling. Pass the brand new UART_TX_NOSTOP to uart_port_tx_flags() and handle the stop on its own.
--- drivers/tty/serial/mxs-auart.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/tty/serial/mxs-auart.c +4 -1
@@ -605,13 +605,16 @@ static void mxs_auart_tx_chars(struct mxs_auart_port *s)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_write (ch, s,REG_DATA ));if (pending)mxs_set (AUART_INTR_TXIEN , s,REG_INTR );else 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)
Signature · 1 line
2.43.0
Jiri Slaby
maintainerRe: [PATCH v2 2/2] serial: mxs-auart: fix tx
Quoted 9 lines · Jiri Slaby (SUSE)
Emil reports:
After updating Linux on an i.MX28 board, serial communication over AUART broke. When I TX from the board and measure on the TX pin, it seems like the HW fifo is not emptied before the transmission is stopped.MXS performs weird things with
stop_tx(). The driver makes it conditional onuart_tx_stopped().
Quoted 7 lines
So the driver needs special handling. Pass the brand new
UART_TX_NOSTOPtouart_port_tx_flags()and handle the stop on its own.Signed-off-by Jiri Slaby (SUSE) <[email protected]>Reported-by Emil Kronborg <[email protected]>Fixes 2d141e683e9a ("tty: serial: use uart_port_tx() helper")
Am I unable to send a proper patch anymore?
I forgot to add mxs+arm maintainers:
Cc: Shawn Guo <[email protected]>
Cc: Sascha Hauer <[email protected]>
Cc: Pengutronix Kernel Team <[email protected]>
Cc: Fabio Estevam <[email protected]>
Cc: NXP Linux Team <[email protected]>
Cc: [email protected]
I can resend with those fixed, if you prefer...
Quoted 26 lines
--- drivers/tty/serial/mxs-auart.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)drivers/tty/serial/mxs-auart.c +4
-1@@ -605,13 +605,16 @@ static void mxs_auart_tx_chars(struct mxs_auart_port *s)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_write (ch, s,REG_DATA ));if (pending)mxs_set (AUART_INTR_TXIEN , s,REG_INTR );else 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)
Signature · 2 lines
js suse labs
Greg KH
maintainerRe: [PATCH v2 2/2] serial: mxs-auart: fix tx
Quoted 28 lines · Jiri Slaby
Quoted 9 lines · Jiri Slaby (SUSE)
Emil reports:
After updating Linux on an i.MX28 board, serial communication over AUART broke. When I TX from the board and measure on the TX pin, it seems like the HW fifo is not emptied before the transmission is stopped.MXS performs weird things with
stop_tx(). The driver makes it conditional onuart_tx_stopped().Quoted 7 lines
So the driver needs special handling. Pass the brand new
UART_TX_NOSTOPtouart_port_tx_flags()and handle the stop on its own.Signed-off-by Jiri Slaby (SUSE) <[email protected]>Reported-by Emil Kronborg <[email protected]>Fixes 2d141e683e9a ("tty: serial: use uart_port_tx() helper")Am I unable to send a proper patch anymore?
I forgot to add mxs+arm maintainers:
Cc: Shawn Guo <[email protected]>
Cc: Sascha Hauer <[email protected]>
Cc: Pengutronix Kernel Team <[email protected]>
Cc: Fabio Estevam <[email protected]>
Cc: NXP Linux Team <[email protected]>
Cc: [email protected]
Quoted 1 line
I can resend with those fixed, if you prefer...
Nah, this is fine, I'll take this as-is, thanks!
greg k-h
Stefan Wahren
Tested-byRe: [PATCH v2 2/2] serial: mxs-auart: fix tx
In reply to Jiri SlabyAm 01.02.24 um 13:05 schrieb Jiri Slaby:
Quoted 10 lines · Jiri Slaby (SUSE)
Quoted 9 lines
Emil reports:
After updating Linux on an i.MX28 board, serial communication over AUART broke. When I TX from the board and measure on the TX pin, it seems like the HW fifo is not emptied before the transmission is stopped.MXS performs weird things with
stop_tx(). The driver makes it conditional onuart_tx_stopped().
Quoted 9 lines
Quoted 8 lines
So the driver needs special handling. Pass the brand new
UART_TX_NOSTOPtouart_port_tx_flags()and handle the stop on its own.Signed-off-by Jiri Slaby (SUSE) <[email protected]>Reported-by Emil Kronborg <[email protected]>Fixes 2d141e683e9a ("tty: serial: use uart_port_tx() helper")Closes:
https://lore.kernel.org/all/miwgbnvy3hjpnricubg76ytpn7xoceehwahupy25bubbduu23s@om2lptpa26xw/
Thanks
Re: [PATCH v2 2/2] serial: mxs-auart: fix tx
In reply to Jiri Slaby (SUSE)Quoted 43 lines · Jiri Slaby (SUSE)
Emil reports:
After updating Linux on an i.MX28 board, serial communication over AUART broke. When I TX from the board and measure on the TX pin, it seems like the HW fifo is not emptied before the transmission is stopped.MXS performs weird things with
stop_tx(). The driver makes it conditional onuart_tx_stopped().So the driver needs special handling. Pass the brand new
UART_TX_NOSTOPtouart_port_tx_flags()and handle the stop on its own.Signed-off-by Jiri Slaby (SUSE) <[email protected]>Reported-by Emil Kronborg <[email protected]>Fixes 2d141e683e9a ("tty: serial: use uart_port_tx() helper")--- drivers/tty/serial/mxs-auart.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)drivers/tty/serial/mxs-auart.c +4
-2@@ -605,13 +605,16 @@ static void mxs_auart_tx_chars(struct mxs_auart_port *s)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_write (ch, s,REG_DATA ));if (pending)mxs_set (AUART_INTR_TXIEN , s,REG_INTR );else 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) --
Quoted 2 lines
2.43.0
Tested on i.MX28.
Signature · 1 line
Emil Kronborg
Quoted 80 lines · Jiri Slaby (SUSE)
And an enum with a flag:
UART_TX_NOSTOP. To NOT call__port->ops->stop_tx()when the circular buffer is empty. mxs-uart needs this (see the next patch).Signed-off-by Jiri Slaby (SUSE) <[email protected]>Cc Emil Kronborg <[email protected]>---
Notes:
[v2] fix/invert the conditioninclude/linux/serial_core.h | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-)include/linux/serial_core.h +27
-6@@ -748,8 +748,17 @@ struct uart_driver {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 circ_buf *xmit = &__port->state->xmit; \@@ -777,7 +786,7 @@ void uart_write_wakeup(struct uart_port *port);if (pending <WAKEUP_CHARS ) { \uart_write_wakeup (__port); \ \ -if (pending ==0 ) \ +if (!((flags) &UART_TX_NOSTOP ) && pending ==0 ) \ __port->ops->stop_tx (__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) ({ \ 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--); \ })@@ -826,8 +835,21 @@ void uart_write_wakeup(struct uart_port *port);* See uart_port_tx_limited() for more details. */ #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. */ --
Quoted 2 lines
2.43.0
Tested on i.MX28 board.
Signature · 1 line
Emil Kronborg