Commit 9c9481ab authored by Jesse Barnes's avatar Jesse Barnes Committed by Linus Torvalds

[PATCH] fix sysrq support in sn_console.c

In porting the sn_console driver to the serial core, we lost sysrq support.
 This patch fixes it and removes a few unncessary #ifdefs.  Can you please
send it on to Linus asap?  sysrq is a *really* nice thing to have.
Signed-off-by: default avatarJesse Barnes <jbarnes@sgi.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 1685a771
...@@ -682,6 +682,7 @@ config SERIAL_SGI_L1_CONSOLE ...@@ -682,6 +682,7 @@ config SERIAL_SGI_L1_CONSOLE
bool "SGI Altix L1 serial console support" bool "SGI Altix L1 serial console support"
depends on IA64_GENERIC || IA64_SGI_SN2 depends on IA64_GENERIC || IA64_SGI_SN2
select SERIAL_CORE select SERIAL_CORE
select SERIAL_CORE_CONSOLE
help help
If you have an SGI Altix and you would like to use the system If you have an SGI Altix and you would like to use the system
controller serial port as your console (you want this!), controller serial port as your console (you want this!),
......
...@@ -81,6 +81,12 @@ ...@@ -81,6 +81,12 @@
#define DEVICE_MAJOR 204 #define DEVICE_MAJOR 204
#define DEVICE_MINOR 40 #define DEVICE_MINOR 40
#ifdef CONFIG_MAGIC_SYSRQ
static char sysrq_serial_str[] = "\eSYS";
static char *sysrq_serial_ptr = sysrq_serial_str;
static unsigned long sysrq_requested;
#endif /* CONFIG_MAGIC_SYSRQ */
/* /*
* Port definition - this kinda drives it all * Port definition - this kinda drives it all
*/ */
...@@ -533,13 +539,15 @@ sn_debug_printf(const char *fmt, ...) ...@@ -533,13 +539,15 @@ sn_debug_printf(const char *fmt, ...)
* sn_receive_chars - Grab characters, pass them to tty layer * sn_receive_chars - Grab characters, pass them to tty layer
* @port: Port to operate on * @port: Port to operate on
* @regs: Saved registers (needed by uart_handle_sysrq_char) * @regs: Saved registers (needed by uart_handle_sysrq_char)
* @flags: irq flags
* *
* Note: If we're not registered with the serial core infrastructure yet, * Note: If we're not registered with the serial core infrastructure yet,
* we don't try to send characters to it... * we don't try to send characters to it...
* *
*/ */
static void static void
sn_receive_chars(struct sn_cons_port *port, struct pt_regs *regs) sn_receive_chars(struct sn_cons_port *port, struct pt_regs *regs,
unsigned long flags)
{ {
int ch; int ch;
struct tty_struct *tty; struct tty_struct *tty;
...@@ -570,10 +578,29 @@ sn_receive_chars(struct sn_cons_port *port, struct pt_regs *regs) ...@@ -570,10 +578,29 @@ sn_receive_chars(struct sn_cons_port *port, struct pt_regs *regs)
"obtaining data from the console (0x%0x)\n", ch); "obtaining data from the console (0x%0x)\n", ch);
break; break;
} }
#if defined(CONFIG_SERIAL_SGI_L1_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) #ifdef CONFIG_MAGIC_SYSRQ
if (uart_handle_sysrq_char(&port->sc_port, ch, regs)) if (sysrq_requested) {
continue; unsigned long sysrq_timeout = sysrq_requested + HZ*5;
#endif /* CONFIG_SERIAL_SGI_L1_CONSOLE && CONFIG_MAGIC_SYSRQ */
sysrq_requested = 0;
if (ch && time_before(jiffies, sysrq_timeout)) {
spin_unlock_irqrestore(&port->sc_port.lock, flags);
handle_sysrq(ch, regs, NULL);
spin_lock_irqsave(&port->sc_port.lock, flags);
/* ignore actual sysrq command char */
continue;
}
}
if (ch == *sysrq_serial_ptr) {
if (!(*++sysrq_serial_ptr)) {
sysrq_requested = jiffies;
sysrq_serial_ptr = sysrq_serial_str;
}
continue; /* ignore the whole sysrq string */
}
else
sysrq_serial_ptr = sysrq_serial_str;
#endif /* CONFIG_MAGIC_SYSRQ */
/* record the character to pass up to the tty layer */ /* record the character to pass up to the tty layer */
if (tty) { if (tty) {
...@@ -696,7 +723,7 @@ sn_sal_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -696,7 +723,7 @@ sn_sal_interrupt(int irq, void *dev_id, struct pt_regs *regs)
spin_lock_irqsave(&port->sc_port.lock, flags); spin_lock_irqsave(&port->sc_port.lock, flags);
if (status & SAL_CONSOLE_INTR_RECV) { if (status & SAL_CONSOLE_INTR_RECV) {
sn_receive_chars(port, regs); sn_receive_chars(port, regs, flags);
} }
if (status & SAL_CONSOLE_INTR_XMIT) { if (status & SAL_CONSOLE_INTR_XMIT) {
sn_transmit_chars(port, TRANSMIT_BUFFERED); sn_transmit_chars(port, TRANSMIT_BUFFERED);
...@@ -745,7 +772,7 @@ sn_sal_timer_poll(unsigned long data) ...@@ -745,7 +772,7 @@ sn_sal_timer_poll(unsigned long data)
if (!port->sc_port.irq) { if (!port->sc_port.irq) {
spin_lock_irqsave(&port->sc_port.lock, flags); spin_lock_irqsave(&port->sc_port.lock, flags);
sn_receive_chars(port, NULL); sn_receive_chars(port, NULL, flags);
sn_transmit_chars(port, TRANSMIT_RAW); sn_transmit_chars(port, TRANSMIT_RAW);
spin_unlock_irqrestore(&port->sc_port.lock, flags); spin_unlock_irqrestore(&port->sc_port.lock, flags);
mod_timer(&port->sc_timer, mod_timer(&port->sc_timer,
...@@ -853,7 +880,6 @@ sn_sal_switch_to_interrupts(struct sn_cons_port *port) ...@@ -853,7 +880,6 @@ sn_sal_switch_to_interrupts(struct sn_cons_port *port)
* Kernel console definitions * Kernel console definitions
*/ */
#ifdef CONFIG_SERIAL_SGI_L1_CONSOLE
static void sn_sal_console_write(struct console *, const char *, unsigned); static void sn_sal_console_write(struct console *, const char *, unsigned);
static int __init sn_sal_console_setup(struct console *, char *); static int __init sn_sal_console_setup(struct console *, char *);
extern struct uart_driver sal_console_uart; extern struct uart_driver sal_console_uart;
...@@ -869,9 +895,6 @@ static struct console sal_console = { ...@@ -869,9 +895,6 @@ static struct console sal_console = {
}; };
#define SAL_CONSOLE &sal_console #define SAL_CONSOLE &sal_console
#else
#define SAL_CONSOLE 0
#endif /* CONFIG_SERIAL_SGI_L1_CONSOLE */
static struct uart_driver sal_console_uart = { static struct uart_driver sal_console_uart = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
...@@ -971,8 +994,6 @@ sn_sal_module_exit(void) ...@@ -971,8 +994,6 @@ sn_sal_module_exit(void)
module_init(sn_sal_module_init); module_init(sn_sal_module_init);
module_exit(sn_sal_module_exit); module_exit(sn_sal_module_exit);
#ifdef CONFIG_SERIAL_SGI_L1_CONSOLE
/** /**
* puts_raw_fixed - sn_sal_console_write helper for adding \r's as required * puts_raw_fixed - sn_sal_console_write helper for adding \r's as required
* @puts_raw : puts function to do the writing * @puts_raw : puts function to do the writing
...@@ -1194,5 +1215,3 @@ sn_sal_serial_console_init(void) ...@@ -1194,5 +1215,3 @@ sn_sal_serial_console_init(void)
} }
console_initcall(sn_sal_serial_console_init); console_initcall(sn_sal_serial_console_init);
#endif /* CONFIG_SERIAL_SGI_L1_CONSOLE */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment