aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHeiko Carstens <heiko.carstens@de.ibm.com>2017-01-27 09:54:57 -0500
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2017-02-08 08:13:18 -0500
commit76fdf1416eed264dee18aa7db3a32dcfa8572e03 (patch)
treec628f9ac0f2908a2fbc2ae8e3d4ff14235f0b417
parent9090f3feb3637dfdc20a5a4af88ed897b2fa894f (diff)
s390/sclp: disable early sclp code as soon as the base sclp driver is active
Make sure the early sclp code does not generate any sclp requests anymore as soon as the base sclp driver is active. Otherwise both drivers may see unexpected requests or may miss expected interrupts. Reviewed-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
-rw-r--r--drivers/s390/char/sclp.c7
-rw-r--r--drivers/s390/char/sclp.h7
-rw-r--r--drivers/s390/char/sclp_early_core.c4
3 files changed, 11 insertions, 7 deletions
diff --git a/drivers/s390/char/sclp.c b/drivers/s390/char/sclp.c
index 272898225dbb..befc07acd3e0 100644
--- a/drivers/s390/char/sclp.c
+++ b/drivers/s390/char/sclp.c
@@ -94,13 +94,6 @@ static struct timer_list sclp_request_timer;
94/* Timer for queued requests. */ 94/* Timer for queued requests. */
95static struct timer_list sclp_queue_timer; 95static struct timer_list sclp_queue_timer;
96 96
97/* Internal state: is the driver initialized? */
98static volatile enum sclp_init_state_t {
99 sclp_init_state_uninitialized,
100 sclp_init_state_initializing,
101 sclp_init_state_initialized
102} sclp_init_state = sclp_init_state_uninitialized;
103
104/* Internal state: is a request active at the sclp? */ 97/* Internal state: is a request active at the sclp? */
105static volatile enum sclp_running_state_t { 98static volatile enum sclp_running_state_t {
106 sclp_running_state_idle, 99 sclp_running_state_idle,
diff --git a/drivers/s390/char/sclp.h b/drivers/s390/char/sclp.h
index e1fc7eb043d6..0c1fa376df9e 100644
--- a/drivers/s390/char/sclp.h
+++ b/drivers/s390/char/sclp.h
@@ -211,6 +211,13 @@ int sclp_sync_request_timeout(sclp_cmdw_t command, void *sccb, int timeout);
211int sclp_sdias_init(void); 211int sclp_sdias_init(void);
212void sclp_sdias_exit(void); 212void sclp_sdias_exit(void);
213 213
214enum {
215 sclp_init_state_uninitialized,
216 sclp_init_state_initializing,
217 sclp_init_state_initialized
218};
219
220extern int sclp_init_state;
214extern int sclp_console_pages; 221extern int sclp_console_pages;
215extern int sclp_console_drop; 222extern int sclp_console_drop;
216extern unsigned long sclp_console_full; 223extern unsigned long sclp_console_full;
diff --git a/drivers/s390/char/sclp_early_core.c b/drivers/s390/char/sclp_early_core.c
index f9c5b02d2685..2723ab56fb8f 100644
--- a/drivers/s390/char/sclp_early_core.c
+++ b/drivers/s390/char/sclp_early_core.c
@@ -16,6 +16,8 @@ static char _sclp_work_area[4096] __aligned(PAGE_SIZE) __section(data);
16static bool have_vt220 __section(data); 16static bool have_vt220 __section(data);
17static bool have_linemode __section(data); 17static bool have_linemode __section(data);
18 18
19int sclp_init_state __section(data) = sclp_init_state_uninitialized;
20
19static void _sclp_wait_int(void) 21static void _sclp_wait_int(void)
20{ 22{
21 unsigned long psw_mask, addr, flags; 23 unsigned long psw_mask, addr, flags;
@@ -198,6 +200,8 @@ static void _sclp_print_vt220(const char *str, unsigned int len)
198 */ 200 */
199void __sclp_print_early(const char *str, unsigned int len) 201void __sclp_print_early(const char *str, unsigned int len)
200{ 202{
203 if (sclp_init_state != sclp_init_state_uninitialized)
204 return;
201 if (_sclp_setup(0) != 0) 205 if (_sclp_setup(0) != 0)
202 return; 206 return;
203 if (have_linemode) 207 if (have_linemode)