diff options
author | Dmitry Safonov <dima@arista.com> | 2019-12-13 00:06:02 +0000 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2019-12-17 15:10:17 +0100 |
commit | 1997e9dfdc84c8f73d6fc318355cf9e313aba183 (patch) | |
tree | 45667cc951a1acdb82f63f05097ea9652e71cd43 /include/linux/serial_core.h | |
parent | 8336240ebb248b46c778f28123a7ceec9817c3d2 (diff) | |
download | blackbird-op-linux-1997e9dfdc84c8f73d6fc318355cf9e313aba183.tar.gz blackbird-op-linux-1997e9dfdc84c8f73d6fc318355cf9e313aba183.zip |
serial_core: Un-ifdef sysrq SUPPORT_SYSRQ
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>
Diffstat (limited to 'include/linux/serial_core.h')
-rw-r--r-- | include/linux/serial_core.h | 77 |
1 files changed, 43 insertions, 34 deletions
diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h index bbbe57bf5163..5f761c399282 100644 --- a/include/linux/serial_core.h +++ b/include/linux/serial_core.h @@ -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; |