aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/kernel-parameters.txt10
-rw-r--r--Documentation/power/basic-pm-debugging.txt4
-rw-r--r--arch/powerpc/configs/pmac32_defconfig1
-rw-r--r--drivers/serial/serial_core.c10
-rw-r--r--include/linux/console.h7
-rw-r--r--kernel/power/Kconfig11
-rw-r--r--kernel/printk.c16
7 files changed, 32 insertions, 27 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index 98cf90f2631d..189df0bcab99 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -479,6 +479,16 @@ and is between 256 and 4096 characters. It is defined in the file
479 UART at the specified I/O port or MMIO address. 479 UART at the specified I/O port or MMIO address.
480 The options are the same as for ttyS, above. 480 The options are the same as for ttyS, above.
481 481
482 no_console_suspend
483 [HW] Never suspend the console
484 Disable suspending of consoles during suspend and
485 hibernate operations. Once disabled, debugging
486 messages can reach various consoles while the rest
487 of the system is being put to sleep (ie, while
488 debugging driver suspend/resume hooks). This may
489 not work reliably with all consoles, but is known
490 to work with serial and VGA consoles.
491
482 cpcihp_generic= [HW,PCI] Generic port I/O CompactPCI driver 492 cpcihp_generic= [HW,PCI] Generic port I/O CompactPCI driver
483 Format: 493 Format:
484 <first_slot>,<last_slot>,<port>,<enum_bit>[,<debug>] 494 <first_slot>,<last_slot>,<port>,<enum_bit>[,<debug>]
diff --git a/Documentation/power/basic-pm-debugging.txt b/Documentation/power/basic-pm-debugging.txt
index 1a85e2b964dc..57aef2f6e0de 100644
--- a/Documentation/power/basic-pm-debugging.txt
+++ b/Documentation/power/basic-pm-debugging.txt
@@ -78,8 +78,8 @@ c) Advanced debugging
78In case the STD does not work on your system even in the minimal configuration 78In case the STD does not work on your system even in the minimal configuration
79and compiling more drivers as modules is not practical or some modules cannot 79and compiling more drivers as modules is not practical or some modules cannot
80be unloaded, you can use one of the more advanced debugging techniques to find 80be unloaded, you can use one of the more advanced debugging techniques to find
81the problem. First, if there is a serial port in your box, you can set the 81the problem. First, if there is a serial port in your box, you can boot the
82CONFIG_DISABLE_CONSOLE_SUSPEND kernel configuration option and try to log kernel 82kernel with the 'no_console_suspend' parameter and try to log kernel
83messages using the serial console. This may provide you with some information 83messages using the serial console. This may provide you with some information
84about the reasons of the suspend (resume) failure. Alternatively, it may be 84about the reasons of the suspend (resume) failure. Alternatively, it may be
85possible to use a FireWire port for debugging with firescope 85possible to use a FireWire port for debugging with firescope
diff --git a/arch/powerpc/configs/pmac32_defconfig b/arch/powerpc/configs/pmac32_defconfig
index 95b823b60c97..8e5988c4a164 100644
--- a/arch/powerpc/configs/pmac32_defconfig
+++ b/arch/powerpc/configs/pmac32_defconfig
@@ -209,7 +209,6 @@ CONFIG_PM=y
209# CONFIG_PM_LEGACY is not set 209# CONFIG_PM_LEGACY is not set
210CONFIG_PM_DEBUG=y 210CONFIG_PM_DEBUG=y
211# CONFIG_PM_VERBOSE is not set 211# CONFIG_PM_VERBOSE is not set
212# CONFIG_DISABLE_CONSOLE_SUSPEND is not set
213CONFIG_PM_SLEEP=y 212CONFIG_PM_SLEEP=y
214CONFIG_SUSPEND=y 213CONFIG_SUSPEND=y
215CONFIG_HIBERNATION=y 214CONFIG_HIBERNATION=y
diff --git a/drivers/serial/serial_core.c b/drivers/serial/serial_core.c
index 68aa4da01865..103189095c80 100644
--- a/drivers/serial/serial_core.c
+++ b/drivers/serial/serial_core.c
@@ -1959,12 +1959,11 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *port)
1959 1959
1960 mutex_lock(&state->mutex); 1960 mutex_lock(&state->mutex);
1961 1961
1962#ifdef CONFIG_DISABLE_CONSOLE_SUSPEND 1962 if (!console_suspend_enabled && uart_console(port)) {
1963 if (uart_console(port)) { 1963 /* we're going to avoid suspending serial console */
1964 mutex_unlock(&state->mutex); 1964 mutex_unlock(&state->mutex);
1965 return 0; 1965 return 0;
1966 } 1966 }
1967#endif
1968 1967
1969 tty_dev = device_find_child(port->dev, &match, serial_match_port); 1968 tty_dev = device_find_child(port->dev, &match, serial_match_port);
1970 if (device_may_wakeup(tty_dev)) { 1969 if (device_may_wakeup(tty_dev)) {
@@ -2016,12 +2015,11 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *port)
2016 2015
2017 mutex_lock(&state->mutex); 2016 mutex_lock(&state->mutex);
2018 2017
2019#ifdef CONFIG_DISABLE_CONSOLE_SUSPEND 2018 if (!console_suspend_enabled && uart_console(port)) {
2020 if (uart_console(port)) { 2019 /* no need to resume serial console, it wasn't suspended */
2021 mutex_unlock(&state->mutex); 2020 mutex_unlock(&state->mutex);
2022 return 0; 2021 return 0;
2023 } 2022 }
2024#endif
2025 2023
2026 if (!port->suspended) { 2024 if (!port->suspended) {
2027 disable_irq_wake(port->irq); 2025 disable_irq_wake(port->irq);
diff --git a/include/linux/console.h b/include/linux/console.h
index 0a4542ddb73d..a5f88a6a259d 100644
--- a/include/linux/console.h
+++ b/include/linux/console.h
@@ -122,14 +122,11 @@ extern void console_stop(struct console *);
122extern void console_start(struct console *); 122extern void console_start(struct console *);
123extern int is_console_locked(void); 123extern int is_console_locked(void);
124 124
125#ifndef CONFIG_DISABLE_CONSOLE_SUSPEND 125extern int console_suspend_enabled;
126
126/* Suspend and resume console messages over PM events */ 127/* Suspend and resume console messages over PM events */
127extern void suspend_console(void); 128extern void suspend_console(void);
128extern void resume_console(void); 129extern void resume_console(void);
129#else
130static inline void suspend_console(void) {}
131static inline void resume_console(void) {}
132#endif /* CONFIG_DISABLE_CONSOLE_SUSPEND */
133 130
134int mda_console_init(void); 131int mda_console_init(void);
135void prom_con_init(void); 132void prom_con_init(void);
diff --git a/kernel/power/Kconfig b/kernel/power/Kconfig
index 14b0e10dc95c..8e186c678149 100644
--- a/kernel/power/Kconfig
+++ b/kernel/power/Kconfig
@@ -44,17 +44,6 @@ config PM_VERBOSE
44 ---help--- 44 ---help---
45 This option enables verbose messages from the Power Management code. 45 This option enables verbose messages from the Power Management code.
46 46
47config DISABLE_CONSOLE_SUSPEND
48 bool "Keep console(s) enabled during suspend/resume (DANGEROUS)"
49 depends on PM_DEBUG && PM_SLEEP
50 default n
51 ---help---
52 This option turns off the console suspend mechanism that prevents
53 debug messages from reaching the console during the suspend/resume
54 operations. This may be helpful when debugging device drivers'
55 suspend/resume routines, but may itself lead to problems, for example
56 if netconsole is used.
57
58config PM_TRACE 47config PM_TRACE
59 bool "Suspend/resume event tracing" 48 bool "Suspend/resume event tracing"
60 depends on PM_DEBUG && X86 && PM_SLEEP && EXPERIMENTAL 49 depends on PM_DEBUG && X86 && PM_SLEEP && EXPERIMENTAL
diff --git a/kernel/printk.c b/kernel/printk.c
index 52493474f0ab..a30fe33de395 100644
--- a/kernel/printk.c
+++ b/kernel/printk.c
@@ -862,7 +862,16 @@ int update_console_cmdline(char *name, int idx, char *name_new, int idx_new, cha
862 return -1; 862 return -1;
863} 863}
864 864
865#ifndef CONFIG_DISABLE_CONSOLE_SUSPEND 865int console_suspend_enabled = 1;
866EXPORT_SYMBOL(console_suspend_enabled);
867
868static int __init console_suspend_disable(char *str)
869{
870 console_suspend_enabled = 0;
871 return 1;
872}
873__setup("no_console_suspend", console_suspend_disable);
874
866/** 875/**
867 * suspend_console - suspend the console subsystem 876 * suspend_console - suspend the console subsystem
868 * 877 *
@@ -870,6 +879,8 @@ int update_console_cmdline(char *name, int idx, char *name_new, int idx_new, cha
870 */ 879 */
871void suspend_console(void) 880void suspend_console(void)
872{ 881{
882 if (!console_suspend_enabled)
883 return;
873 printk("Suspending console(s)\n"); 884 printk("Suspending console(s)\n");
874 acquire_console_sem(); 885 acquire_console_sem();
875 console_suspended = 1; 886 console_suspended = 1;
@@ -877,10 +888,11 @@ void suspend_console(void)
877 888
878void resume_console(void) 889void resume_console(void)
879{ 890{
891 if (!console_suspend_enabled)
892 return;
880 console_suspended = 0; 893 console_suspended = 0;
881 release_console_sem(); 894 release_console_sem();
882} 895}
883#endif /* CONFIG_DISABLE_CONSOLE_SUSPEND */
884 896
885/** 897/**
886 * acquire_console_sem - lock the console system for exclusive use. 898 * acquire_console_sem - lock the console system for exclusive use.