]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/commitdiff
s390/sclp: disable early sclp code as soon as the base sclp driver is active
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Fri, 27 Jan 2017 14:54:57 +0000 (15:54 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Wed, 8 Feb 2017 13:13:18 +0000 (14:13 +0100)
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>
drivers/s390/char/sclp.c
drivers/s390/char/sclp.h
drivers/s390/char/sclp_early_core.c

index 272898225dbb4f42fc84ee884fb0e6b7be3864b7..befc07acd3e00568df301c9fc78d2b23c2715747 100644 (file)
@@ -94,13 +94,6 @@ static struct timer_list sclp_request_timer;
 /* Timer for queued requests. */
 static struct timer_list sclp_queue_timer;
 
-/* Internal state: is the driver initialized? */
-static volatile enum sclp_init_state_t {
-       sclp_init_state_uninitialized,
-       sclp_init_state_initializing,
-       sclp_init_state_initialized
-} sclp_init_state = sclp_init_state_uninitialized;
-
 /* Internal state: is a request active at the sclp? */
 static volatile enum sclp_running_state_t {
        sclp_running_state_idle,
index e1fc7eb043d67dbb62403e1744d204be6bc01406..0c1fa376df9e7789a8740c4d8494a57c713df775 100644 (file)
@@ -211,6 +211,13 @@ int sclp_sync_request_timeout(sclp_cmdw_t command, void *sccb, int timeout);
 int sclp_sdias_init(void);
 void sclp_sdias_exit(void);
 
+enum {
+       sclp_init_state_uninitialized,
+       sclp_init_state_initializing,
+       sclp_init_state_initialized
+};
+
+extern int sclp_init_state;
 extern int sclp_console_pages;
 extern int sclp_console_drop;
 extern unsigned long sclp_console_full;
index f9c5b02d2685490a877c3ce0dfded544739159b7..2723ab56fb8fcf08bc0b66459fadbf13d398c10e 100644 (file)
@@ -16,6 +16,8 @@ static char _sclp_work_area[4096] __aligned(PAGE_SIZE) __section(data);
 static bool have_vt220 __section(data);
 static bool have_linemode __section(data);
 
+int sclp_init_state __section(data) = sclp_init_state_uninitialized;
+
 static void _sclp_wait_int(void)
 {
        unsigned long psw_mask, addr, flags;
@@ -198,6 +200,8 @@ static void _sclp_print_vt220(const char *str, unsigned int len)
  */
 void __sclp_print_early(const char *str, unsigned int len)
 {
+       if (sclp_init_state != sclp_init_state_uninitialized)
+               return;
        if (_sclp_setup(0) != 0)
                return;
        if (have_linemode)