2023-12-06 07:37:39

by Jiri Slaby

[permalink] [raw]
Subject: [PATCH 04/27] tty: make tty_operations::send_xchar accept u8 char

tty_operations::send_xchar is one of the last users of 'char' type for
characters in the tty layer. Convert it to u8 now.

Signed-off-by: Jiri Slaby (SUSE) <[email protected]>
Cc: Karsten Keil <[email protected]>
Cc: Ulf Hansson <[email protected]>
Cc: Marcel Holtmann <[email protected]>
Cc: Johan Hedberg <[email protected]>
Cc: Luiz Augusto von Dentz <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
---
drivers/isdn/capi/capi.c | 4 ++--
drivers/mmc/core/sdio_uart.c | 2 +-
drivers/tty/amiserial.c | 2 +-
drivers/tty/serial/serial_core.c | 2 +-
drivers/tty/tty_io.c | 2 +-
include/linux/tty.h | 2 +-
include/linux/tty_driver.h | 4 ++--
net/bluetooth/rfcomm/tty.c | 2 +-
8 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/drivers/isdn/capi/capi.c b/drivers/isdn/capi/capi.c
index 2f3789515445..6e80d7bd3c4d 100644
--- a/drivers/isdn/capi/capi.c
+++ b/drivers/isdn/capi/capi.c
@@ -1231,9 +1231,9 @@ static void capinc_tty_hangup(struct tty_struct *tty)
tty_port_hangup(&mp->port);
}

-static void capinc_tty_send_xchar(struct tty_struct *tty, char ch)
+static void capinc_tty_send_xchar(struct tty_struct *tty, u8 ch)
{
- pr_debug("capinc_tty_send_xchar(%d)\n", ch);
+ pr_debug("capinc_tty_send_xchar(%u)\n", ch);
}

static const struct tty_operations capinc_ops = {
diff --git a/drivers/mmc/core/sdio_uart.c b/drivers/mmc/core/sdio_uart.c
index a05322f15771..370fadf1d6d1 100644
--- a/drivers/mmc/core/sdio_uart.c
+++ b/drivers/mmc/core/sdio_uart.c
@@ -792,7 +792,7 @@ static unsigned int sdio_uart_chars_in_buffer(struct tty_struct *tty)
return kfifo_len(&port->xmit_fifo);
}

-static void sdio_uart_send_xchar(struct tty_struct *tty, char ch)
+static void sdio_uart_send_xchar(struct tty_struct *tty, u8 ch)
{
struct sdio_uart_port *port = tty->driver_data;

diff --git a/drivers/tty/amiserial.c b/drivers/tty/amiserial.c
index a80f059f77bf..a30dc054ffbf 100644
--- a/drivers/tty/amiserial.c
+++ b/drivers/tty/amiserial.c
@@ -811,7 +811,7 @@ static void rs_flush_buffer(struct tty_struct *tty)
* This function is used to send a high-priority XON/XOFF character to
* the device
*/
-static void rs_send_xchar(struct tty_struct *tty, char ch)
+static void rs_send_xchar(struct tty_struct *tty, u8 ch)
{
struct serial_state *info = tty->driver_data;
unsigned long flags;
diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
index 0393853b9947..80085b151b34 100644
--- a/drivers/tty/serial/serial_core.c
+++ b/drivers/tty/serial/serial_core.c
@@ -687,7 +687,7 @@ EXPORT_SYMBOL_GPL(uart_xchar_out);
* This function is used to send a high-priority XON/XOFF character to
* the device
*/
-static void uart_send_xchar(struct tty_struct *tty, char ch)
+static void uart_send_xchar(struct tty_struct *tty, u8 ch)
{
struct uart_state *state = tty->driver_data;
struct uart_port *port;
diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c
index 005d91c63707..6a502110da61 100644
--- a/drivers/tty/tty_io.c
+++ b/drivers/tty/tty_io.c
@@ -1149,7 +1149,7 @@ ssize_t redirected_tty_write(struct kiocb *iocb, struct iov_iter *iter)
*
* Locking: none for xchar method, write ordering for write method.
*/
-int tty_send_xchar(struct tty_struct *tty, char ch)
+int tty_send_xchar(struct tty_struct *tty, u8 ch)
{
bool was_stopped = tty->flow.stopped;

diff --git a/include/linux/tty.h b/include/linux/tty.h
index e96c85f4f91e..d3bedcc08738 100644
--- a/include/linux/tty.h
+++ b/include/linux/tty.h
@@ -410,7 +410,7 @@ void tty_wait_until_sent(struct tty_struct *tty, long timeout);
void stop_tty(struct tty_struct *tty);
void start_tty(struct tty_struct *tty);
void tty_write_message(struct tty_struct *tty, char *msg);
-int tty_send_xchar(struct tty_struct *tty, char ch);
+int tty_send_xchar(struct tty_struct *tty, u8 ch);
int tty_put_char(struct tty_struct *tty, unsigned char c);
unsigned int tty_chars_in_buffer(struct tty_struct *tty);
unsigned int tty_write_room(struct tty_struct *tty);
diff --git a/include/linux/tty_driver.h b/include/linux/tty_driver.h
index f428c1b784a2..7372124fbf90 100644
--- a/include/linux/tty_driver.h
+++ b/include/linux/tty_driver.h
@@ -242,7 +242,7 @@ struct serial_struct;
* Optional: If not provided, the device is assumed to have no FIFO.
* Usually correct to invoke via tty_wait_until_sent(). May sleep.
*
- * @send_xchar: ``void ()(struct tty_struct *tty, char ch)``
+ * @send_xchar: ``void ()(struct tty_struct *tty, u8 ch)``
*
* This routine is used to send a high-priority XON/XOFF character (@ch)
* to the @tty device.
@@ -374,7 +374,7 @@ struct tty_operations {
void (*flush_buffer)(struct tty_struct *tty);
void (*set_ldisc)(struct tty_struct *tty);
void (*wait_until_sent)(struct tty_struct *tty, int timeout);
- void (*send_xchar)(struct tty_struct *tty, char ch);
+ void (*send_xchar)(struct tty_struct *tty, u8 ch);
int (*tiocmget)(struct tty_struct *tty);
int (*tiocmset)(struct tty_struct *tty,
unsigned int set, unsigned int clear);
diff --git a/net/bluetooth/rfcomm/tty.c b/net/bluetooth/rfcomm/tty.c
index 94ec913dfb76..69c75c041fe1 100644
--- a/net/bluetooth/rfcomm/tty.c
+++ b/net/bluetooth/rfcomm/tty.c
@@ -1041,7 +1041,7 @@ static void rfcomm_tty_flush_buffer(struct tty_struct *tty)
tty_wakeup(tty);
}

-static void rfcomm_tty_send_xchar(struct tty_struct *tty, char ch)
+static void rfcomm_tty_send_xchar(struct tty_struct *tty, u8 ch)
{
BT_DBG("tty %p ch %c", tty, ch);
}
--
2.43.0



2023-12-06 08:28:04

by Geert Uytterhoeven

[permalink] [raw]
Subject: Re: [PATCH 04/27] tty: make tty_operations::send_xchar accept u8 char

CC linux-m68k

On Wed, Dec 6, 2023 at 8:37 AM Jiri Slaby (SUSE) <[email protected]> wrote:
> tty_operations::send_xchar is one of the last users of 'char' type for
> characters in the tty layer. Convert it to u8 now.
>
> Signed-off-by: Jiri Slaby (SUSE) <[email protected]>

> drivers/tty/amiserial.c | 2 +-

Reviewed-by: Geert Uytterhoeven <[email protected]>

> --- a/drivers/tty/amiserial.c
> +++ b/drivers/tty/amiserial.c
> @@ -811,7 +811,7 @@ static void rs_flush_buffer(struct tty_struct *tty)
> * This function is used to send a high-priority XON/XOFF character to
> * the device
> */
> -static void rs_send_xchar(struct tty_struct *tty, char ch)
> +static void rs_send_xchar(struct tty_struct *tty, u8 ch)
> {
> struct serial_state *info = tty->driver_data;
> unsigned long flags;

Looks like this might fix an actual (harmless?) bug, if anyone evers
configures a VSTOP or VSTART character with bit 7 set?

info->x_char = ch; // x_char is int, hence sign-extended

transmit_chars() does:

amiga_custom.serdat = info->x_char | 0x100;

which will inadvertently have all high bits sets, including the bit
9, which is only used if PARENB is enabled. But as it looks like
PARENB handling is broken in amiseral anyway, this doesn't matter
much...

include/linux/tty.h:#define STOP_CHAR(tty) ((tty)->termios.c_cc[VSTOP])
include/linux/tty.h:#define START_CHAR(tty) ((tty)->termios.c_cc[VSTART])

Gr{oetje,eeting}s,

Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds

2023-12-07 14:10:07

by Ulf Hansson

[permalink] [raw]
Subject: Re: [PATCH 04/27] tty: make tty_operations::send_xchar accept u8 char

On Wed, 6 Dec 2023 at 08:37, Jiri Slaby (SUSE) <[email protected]> wrote:
>
> tty_operations::send_xchar is one of the last users of 'char' type for
> characters in the tty layer. Convert it to u8 now.
>
> Signed-off-by: Jiri Slaby (SUSE) <[email protected]>
> Cc: Karsten Keil <[email protected]>
> Cc: Ulf Hansson <[email protected]>
> Cc: Marcel Holtmann <[email protected]>
> Cc: Johan Hedberg <[email protected]>
> Cc: Luiz Augusto von Dentz <[email protected]>
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]

Acked-by: Ulf Hansson <[email protected]> # For MMC

Kind regards
Uffe

> ---
> drivers/isdn/capi/capi.c | 4 ++--
> drivers/mmc/core/sdio_uart.c | 2 +-
> drivers/tty/amiserial.c | 2 +-
> drivers/tty/serial/serial_core.c | 2 +-
> drivers/tty/tty_io.c | 2 +-
> include/linux/tty.h | 2 +-
> include/linux/tty_driver.h | 4 ++--
> net/bluetooth/rfcomm/tty.c | 2 +-
> 8 files changed, 10 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/isdn/capi/capi.c b/drivers/isdn/capi/capi.c
> index 2f3789515445..6e80d7bd3c4d 100644
> --- a/drivers/isdn/capi/capi.c
> +++ b/drivers/isdn/capi/capi.c
> @@ -1231,9 +1231,9 @@ static void capinc_tty_hangup(struct tty_struct *tty)
> tty_port_hangup(&mp->port);
> }
>
> -static void capinc_tty_send_xchar(struct tty_struct *tty, char ch)
> +static void capinc_tty_send_xchar(struct tty_struct *tty, u8 ch)
> {
> - pr_debug("capinc_tty_send_xchar(%d)\n", ch);
> + pr_debug("capinc_tty_send_xchar(%u)\n", ch);
> }
>
> static const struct tty_operations capinc_ops = {
> diff --git a/drivers/mmc/core/sdio_uart.c b/drivers/mmc/core/sdio_uart.c
> index a05322f15771..370fadf1d6d1 100644
> --- a/drivers/mmc/core/sdio_uart.c
> +++ b/drivers/mmc/core/sdio_uart.c
> @@ -792,7 +792,7 @@ static unsigned int sdio_uart_chars_in_buffer(struct tty_struct *tty)
> return kfifo_len(&port->xmit_fifo);
> }
>
> -static void sdio_uart_send_xchar(struct tty_struct *tty, char ch)
> +static void sdio_uart_send_xchar(struct tty_struct *tty, u8 ch)
> {
> struct sdio_uart_port *port = tty->driver_data;
>
> diff --git a/drivers/tty/amiserial.c b/drivers/tty/amiserial.c
> index a80f059f77bf..a30dc054ffbf 100644
> --- a/drivers/tty/amiserial.c
> +++ b/drivers/tty/amiserial.c
> @@ -811,7 +811,7 @@ static void rs_flush_buffer(struct tty_struct *tty)
> * This function is used to send a high-priority XON/XOFF character to
> * the device
> */
> -static void rs_send_xchar(struct tty_struct *tty, char ch)
> +static void rs_send_xchar(struct tty_struct *tty, u8 ch)
> {
> struct serial_state *info = tty->driver_data;
> unsigned long flags;
> diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
> index 0393853b9947..80085b151b34 100644
> --- a/drivers/tty/serial/serial_core.c
> +++ b/drivers/tty/serial/serial_core.c
> @@ -687,7 +687,7 @@ EXPORT_SYMBOL_GPL(uart_xchar_out);
> * This function is used to send a high-priority XON/XOFF character to
> * the device
> */
> -static void uart_send_xchar(struct tty_struct *tty, char ch)
> +static void uart_send_xchar(struct tty_struct *tty, u8 ch)
> {
> struct uart_state *state = tty->driver_data;
> struct uart_port *port;
> diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c
> index 005d91c63707..6a502110da61 100644
> --- a/drivers/tty/tty_io.c
> +++ b/drivers/tty/tty_io.c
> @@ -1149,7 +1149,7 @@ ssize_t redirected_tty_write(struct kiocb *iocb, struct iov_iter *iter)
> *
> * Locking: none for xchar method, write ordering for write method.
> */
> -int tty_send_xchar(struct tty_struct *tty, char ch)
> +int tty_send_xchar(struct tty_struct *tty, u8 ch)
> {
> bool was_stopped = tty->flow.stopped;
>
> diff --git a/include/linux/tty.h b/include/linux/tty.h
> index e96c85f4f91e..d3bedcc08738 100644
> --- a/include/linux/tty.h
> +++ b/include/linux/tty.h
> @@ -410,7 +410,7 @@ void tty_wait_until_sent(struct tty_struct *tty, long timeout);
> void stop_tty(struct tty_struct *tty);
> void start_tty(struct tty_struct *tty);
> void tty_write_message(struct tty_struct *tty, char *msg);
> -int tty_send_xchar(struct tty_struct *tty, char ch);
> +int tty_send_xchar(struct tty_struct *tty, u8 ch);
> int tty_put_char(struct tty_struct *tty, unsigned char c);
> unsigned int tty_chars_in_buffer(struct tty_struct *tty);
> unsigned int tty_write_room(struct tty_struct *tty);
> diff --git a/include/linux/tty_driver.h b/include/linux/tty_driver.h
> index f428c1b784a2..7372124fbf90 100644
> --- a/include/linux/tty_driver.h
> +++ b/include/linux/tty_driver.h
> @@ -242,7 +242,7 @@ struct serial_struct;
> * Optional: If not provided, the device is assumed to have no FIFO.
> * Usually correct to invoke via tty_wait_until_sent(). May sleep.
> *
> - * @send_xchar: ``void ()(struct tty_struct *tty, char ch)``
> + * @send_xchar: ``void ()(struct tty_struct *tty, u8 ch)``
> *
> * This routine is used to send a high-priority XON/XOFF character (@ch)
> * to the @tty device.
> @@ -374,7 +374,7 @@ struct tty_operations {
> void (*flush_buffer)(struct tty_struct *tty);
> void (*set_ldisc)(struct tty_struct *tty);
> void (*wait_until_sent)(struct tty_struct *tty, int timeout);
> - void (*send_xchar)(struct tty_struct *tty, char ch);
> + void (*send_xchar)(struct tty_struct *tty, u8 ch);
> int (*tiocmget)(struct tty_struct *tty);
> int (*tiocmset)(struct tty_struct *tty,
> unsigned int set, unsigned int clear);
> diff --git a/net/bluetooth/rfcomm/tty.c b/net/bluetooth/rfcomm/tty.c
> index 94ec913dfb76..69c75c041fe1 100644
> --- a/net/bluetooth/rfcomm/tty.c
> +++ b/net/bluetooth/rfcomm/tty.c
> @@ -1041,7 +1041,7 @@ static void rfcomm_tty_flush_buffer(struct tty_struct *tty)
> tty_wakeup(tty);
> }
>
> -static void rfcomm_tty_send_xchar(struct tty_struct *tty, char ch)
> +static void rfcomm_tty_send_xchar(struct tty_struct *tty, u8 ch)
> {
> BT_DBG("tty %p ch %c", tty, ch);
> }
> --
> 2.43.0
>