serial_core: Un-ifdef sysrq SUPPORT_SYSRQ
authorDmitry Safonov <dima@arista.com>
Fri, 13 Dec 2019 00:06:02 +0000 (00:06 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 17 Dec 2019 14:10:17 +0000 (15:10 +0100)
The SUPPORT_SYSRQ is messy: every .c source should define it before
including "serial_core.h" if sysrq is supported or struct uart_port will
differ in sizes. Also this prevents moving to serial_core.c functions:
uart_handle_sysrq_char(), uart_prepare_sysrq_char(),
uart_unlock_and_check_sysrq().

It doesn't save many bytes in the structure, and a better way to reduce
it's size would be making rs485 and iso7816 pointers.

Introduce `has_sysrq` member to be used by serial line drivers further.

Signed-off-by: Dmitry Safonov <dima@arista.com>
Link: https://lore.kernel.org/r/20191213000657.931618-4-dima@arista.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
include/linux/serial_core.h

index bbbe57b..5f761c3 100644 (file)
@@ -240,14 +240,13 @@ struct uart_port {
        resource_size_t         mapsize;
        struct device           *dev;                   /* parent device */
 
-#if defined(CONFIG_SERIAL_CORE_CONSOLE) || defined(SUPPORT_SYSRQ)
        unsigned long           sysrq;                  /* sysrq timeout */
        unsigned int            sysrq_ch;               /* char for sysrq */
-#endif
+       unsigned char           has_sysrq;
 
        unsigned char           hub6;                   /* this should be in the 8250 driver */
        unsigned char           suspended;
-       unsigned char           unused[2];
+       unsigned char           unused;
        const char              *name;                  /* port name */
        struct attribute_group  *attr_group;            /* port specific attributes */
        const struct attribute_group **tty_groups;      /* all attributes (serial core use only) */
@@ -461,31 +460,46 @@ extern void uart_handle_cts_change(struct uart_port *uport,
 extern void uart_insert_char(struct uart_port *port, unsigned int status,
                 unsigned int overrun, unsigned int ch, unsigned int flag);
 
-#if defined(SUPPORT_SYSRQ) && defined(CONFIG_MAGIC_SYSRQ_SERIAL)
 static inline int
 uart_handle_sysrq_char(struct uart_port *port, unsigned int ch)
 {
-       if (port->sysrq) {
-               if (ch && time_before(jiffies, port->sysrq)) {
-                       handle_sysrq(ch);
-                       port->sysrq = 0;
-                       return 1;
-               }
+       if (!IS_ENABLED(CONFIG_MAGIC_SYSRQ_SERIAL))
+               return 0;
+
+       if (!port->has_sysrq && !IS_ENABLED(SUPPORT_SYSRQ))
+               return 0;
+
+       if (!port->sysrq)
+               return 0;
+
+       if (ch && time_before(jiffies, port->sysrq)) {
+               handle_sysrq(ch);
                port->sysrq = 0;
+               return 1;
        }
+       port->sysrq = 0;
+
        return 0;
 }
 static inline int
 uart_prepare_sysrq_char(struct uart_port *port, unsigned int ch)
 {
-       if (port->sysrq) {
-               if (ch && time_before(jiffies, port->sysrq)) {
-                       port->sysrq_ch = ch;
-                       port->sysrq = 0;
-                       return 1;
-               }
+       if (!IS_ENABLED(CONFIG_MAGIC_SYSRQ_SERIAL))
+               return 0;
+
+       if (!port->has_sysrq && !IS_ENABLED(SUPPORT_SYSRQ))
+               return 0;
+
+       if (!port->sysrq)
+               return 0;
+
+       if (ch && time_before(jiffies, port->sysrq)) {
+               port->sysrq_ch = ch;
                port->sysrq = 0;
+               return 1;
        }
+       port->sysrq = 0;
+
        return 0;
 }
 static inline void
@@ -493,6 +507,11 @@ uart_unlock_and_check_sysrq(struct uart_port *port, unsigned long irqflags)
 {
        int sysrq_ch;
 
+       if (!port->has_sysrq && !IS_ENABLED(SUPPORT_SYSRQ)) {
+               spin_unlock_irqrestore(&port->lock, irqflags);
+               return;
+       }
+
        sysrq_ch = port->sysrq_ch;
        port->sysrq_ch = 0;
 
@@ -501,17 +520,6 @@ uart_unlock_and_check_sysrq(struct uart_port *port, unsigned long irqflags)
        if (sysrq_ch)
                handle_sysrq(sysrq_ch);
 }
-#else
-static inline int
-uart_handle_sysrq_char(struct uart_port *port, unsigned int ch) { return 0; }
-static inline int
-uart_prepare_sysrq_char(struct uart_port *port, unsigned int ch) { return 0; }
-static inline void
-uart_unlock_and_check_sysrq(struct uart_port *port, unsigned long irqflags)
-{
-       spin_unlock_irqrestore(&port->lock, irqflags);
-}
-#endif
 
 /*
  * We do the SysRQ and SAK checking like this...
@@ -523,15 +531,16 @@ static inline int uart_handle_break(struct uart_port *port)
        if (port->handle_break)
                port->handle_break(port);
 
-#ifdef SUPPORT_SYSRQ
-       if (port->cons && port->cons->index == port->line) {
-               if (!port->sysrq) {
-                       port->sysrq = jiffies + HZ*5;
-                       return 1;
+       if (port->has_sysrq || IS_ENABLED(SUPPORT_SYSRQ)) {
+               if (port->cons && port->cons->index == port->line) {
+                       if (!port->sysrq) {
+                               port->sysrq = jiffies + HZ*5;
+                               return 1;
+                       }
+                       port->sysrq = 0;
                }
-               port->sysrq = 0;
        }
-#endif
+
        if (port->flags & UPF_SAK)
                do_SAK(state->port.tty);
        return 0;