]> git.baikalelectronics.ru Git - kernel.git/commitdiff
serial: 8250: make saved LSR larger
authorIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Fri, 24 Jun 2022 20:42:05 +0000 (23:42 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 27 Jun 2022 12:44:20 +0000 (14:44 +0200)
DW flags address received as BIT(8) in LSR. In order to not lose that
on read, enlarge lsr_saved_flags to u16.

Adjust lsr/status variables and related call chains to use u16.
Technically, some of these type conversion would not be needed but it
doesn't hurt to be consistent.

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Link: https://lore.kernel.org/r/20220624204210.11112-2-ilpo.jarvinen@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/8250/8250.h
drivers/tty/serial/8250/8250_exar.c
drivers/tty/serial/8250/8250_fsl.c
drivers/tty/serial/8250/8250_ingenic.c
drivers/tty/serial/8250/8250_omap.c
drivers/tty/serial/8250/8250_port.c
include/linux/serial_8250.h

index b120da57c61f9176375455e02e59c33803e0d4e4..0ff5688ba90c958a5267fa7f2dcf470998eaa836 100644 (file)
@@ -133,9 +133,9 @@ static inline void serial_out(struct uart_8250_port *up, int offset, int value)
  *
  *     Returns LSR value or'ed with the preserved flags (if any).
  */
-static inline unsigned int serial_lsr_in(struct uart_8250_port *up)
+static inline u16 serial_lsr_in(struct uart_8250_port *up)
 {
-       unsigned int lsr = up->lsr_saved_flags;
+       u16 lsr = up->lsr_saved_flags;
 
        lsr |= serial_in(up, UART_LSR);
        up->lsr_saved_flags = lsr & LSR_SAVE_FLAGS;
index 528779b400495c0afdf4629c94893f7c7ee4abff..3d999eec4087b76a370e02173444482cff5c1dd0 100644 (file)
@@ -195,11 +195,11 @@ static int xr17v35x_startup(struct uart_port *port)
 
 static void exar_shutdown(struct uart_port *port)
 {
-       unsigned char lsr;
        bool tx_complete = false;
        struct uart_8250_port *up = up_to_u8250p(port);
        struct circ_buf *xmit = &port->state->xmit;
        int i = 0;
+       u16 lsr;
 
        do {
                lsr = serial_in(up, UART_LSR);
index 9c01c531349dfd41a501aec82b61299e05361116..fd4005fcd0d6213844aebc38b3c3d86330ce09a1 100644 (file)
@@ -25,8 +25,8 @@
 
 int fsl8250_handle_irq(struct uart_port *port)
 {
-       unsigned char lsr, orig_lsr;
        unsigned long flags;
+       u16 lsr, orig_lsr;
        unsigned int iir;
        struct uart_8250_port *up = up_to_u8250p(port);
 
index cff91aa03f2906d85056813abe657e4962d125df..2b2f5d8d24b918eebf89062ffde1eb683fd9ff65 100644 (file)
@@ -54,7 +54,7 @@ static void early_out(struct uart_port *port, int offset, uint8_t value)
 
 static void ingenic_early_console_putc(struct uart_port *port, unsigned char c)
 {
-       uint8_t lsr;
+       u16 lsr;
 
        do {
                lsr = early_in(port, UART_LSR);
index ac8bfa04239153209ca76aab80886c7431971af5..0dcecbbc3967aa691756e9c3fbf6e919f79e9d75 100644 (file)
@@ -1115,8 +1115,7 @@ static bool handle_rx_dma(struct uart_8250_port *up, unsigned int iir)
        return omap_8250_rx_dma(up);
 }
 
-static unsigned char omap_8250_handle_rx_dma(struct uart_8250_port *up,
-                                            u8 iir, unsigned char status)
+static u16 omap_8250_handle_rx_dma(struct uart_8250_port *up, u8 iir, u16 status)
 {
        if ((status & (UART_LSR_DR | UART_LSR_BI)) &&
            (iir & UART_IIR_RDI)) {
@@ -1130,7 +1129,7 @@ static unsigned char omap_8250_handle_rx_dma(struct uart_8250_port *up,
 }
 
 static void am654_8250_handle_rx_dma(struct uart_8250_port *up, u8 iir,
-                                    unsigned char status)
+                                    u16 status)
 {
        /*
         * Queue a new transfer if FIFO has data.
@@ -1164,7 +1163,7 @@ static int omap_8250_dma_handle_irq(struct uart_port *port)
 {
        struct uart_8250_port *up = up_to_u8250p(port);
        struct omap8250_priv *priv = up->port.private_data;
-       unsigned char status;
+       u16 status;
        u8 iir;
 
        serial8250_rpm_get(up);
index 55b252954a923701862df821c9646c2e6d804549..c8ae0e8376d489ff94e3759801a6624556fd73ae 100644 (file)
@@ -1502,7 +1502,7 @@ static inline void __stop_tx(struct uart_8250_port *p)
        struct uart_8250_em485 *em485 = p->em485;
 
        if (em485) {
-               unsigned char lsr = serial_lsr_in(p);
+               u16 lsr = serial_lsr_in(p);
                u64 stop_delay = 0;
 
                p->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
@@ -1563,7 +1563,7 @@ static inline void __start_tx(struct uart_port *port)
 
        if (serial8250_set_THRI(up)) {
                if (up->bugs & UART_BUG_TXEN) {
-                       unsigned char lsr = serial_lsr_in(up);
+                       u16 lsr = serial_lsr_in(up);
 
                        if (lsr & UART_LSR_THRE)
                                serial8250_tx_chars(up);
@@ -1716,7 +1716,7 @@ static void serial8250_enable_ms(struct uart_port *port)
        serial8250_rpm_put(up);
 }
 
-void serial8250_read_char(struct uart_8250_port *up, unsigned char lsr)
+void serial8250_read_char(struct uart_8250_port *up, u16 lsr)
 {
        struct uart_port *port = &up->port;
        unsigned char ch;
@@ -1785,7 +1785,7 @@ EXPORT_SYMBOL_GPL(serial8250_read_char);
  * (such as THRE) because the LSR value might come from an already consumed
  * character.
  */
-unsigned char serial8250_rx_chars(struct uart_8250_port *up, unsigned char lsr)
+u16 serial8250_rx_chars(struct uart_8250_port *up, u16 lsr)
 {
        struct uart_port *port = &up->port;
        int max_count = 256;
@@ -1905,10 +1905,10 @@ static bool handle_rx_dma(struct uart_8250_port *up, unsigned int iir)
  */
 int serial8250_handle_irq(struct uart_port *port, unsigned int iir)
 {
-       unsigned char status;
        struct uart_8250_port *up = up_to_u8250p(port);
        bool skip_rx = false;
        unsigned long flags;
+       u16 status;
 
        if (iir & UART_IIR_NO_INT)
                return 0;
@@ -1991,7 +1991,7 @@ static unsigned int serial8250_tx_empty(struct uart_port *port)
 {
        struct uart_8250_port *up = up_to_u8250p(port);
        unsigned long flags;
-       unsigned int lsr;
+       u16 lsr;
 
        serial8250_rpm_get(up);
 
@@ -2114,8 +2114,8 @@ static void wait_for_xmitr(struct uart_8250_port *up, int bits)
 static int serial8250_get_poll_char(struct uart_port *port)
 {
        struct uart_8250_port *up = up_to_u8250p(port);
-       unsigned char lsr;
        int status;
+       u16 lsr;
 
        serial8250_rpm_get(up);
 
@@ -2170,8 +2170,9 @@ int serial8250_do_startup(struct uart_port *port)
 {
        struct uart_8250_port *up = up_to_u8250p(port);
        unsigned long flags;
-       unsigned char lsr, iir;
+       unsigned char iir;
        int retval;
+       u16 lsr;
 
        if (!port->fifosize)
                port->fifosize = uart_config[port->type].fifo_size;
index ff84a3ed10ea911c742978ba01863052d8d6a4ab..4565f25ba9a21209a6b60e23407d3bcb405f4391 100644 (file)
@@ -119,7 +119,7 @@ struct uart_8250_port {
         * be immediately processed.
         */
 #define LSR_SAVE_FLAGS UART_LSR_BRK_ERROR_BITS
-       unsigned char           lsr_saved_flags;
+       u16                     lsr_saved_flags;
 #define MSR_SAVE_FLAGS UART_MSR_ANY_DELTA
        unsigned char           msr_saved_flags;
 
@@ -170,8 +170,8 @@ extern void serial8250_do_set_divisor(struct uart_port *port, unsigned int baud,
                                      unsigned int quot_frac);
 extern int fsl8250_handle_irq(struct uart_port *port);
 int serial8250_handle_irq(struct uart_port *port, unsigned int iir);
-unsigned char serial8250_rx_chars(struct uart_8250_port *up, unsigned char lsr);
-void serial8250_read_char(struct uart_8250_port *up, unsigned char lsr);
+u16 serial8250_rx_chars(struct uart_8250_port *up, u16 lsr);
+void serial8250_read_char(struct uart_8250_port *up, u16 lsr);
 void serial8250_tx_chars(struct uart_8250_port *up);
 unsigned int serial8250_modem_status(struct uart_8250_port *up);
 void serial8250_init_port(struct uart_8250_port *up);