diff options
| -rw-r--r-- | arch/s390/lib/delay.c | 4 | ||||
| -rw-r--r-- | drivers/s390/char/sclp.c | 6 | ||||
| -rw-r--r-- | include/asm-s390/hardirq.h | 14 |
3 files changed, 20 insertions, 4 deletions
diff --git a/arch/s390/lib/delay.c b/arch/s390/lib/delay.c index eae21a8ac72d..fc6ab6094df8 100644 --- a/arch/s390/lib/delay.c +++ b/arch/s390/lib/delay.c | |||
| @@ -43,7 +43,7 @@ void __udelay(unsigned long usecs) | |||
| 43 | local_bh_disable(); | 43 | local_bh_disable(); |
| 44 | local_irq_save(flags); | 44 | local_irq_save(flags); |
| 45 | if (raw_irqs_disabled_flags(flags)) { | 45 | if (raw_irqs_disabled_flags(flags)) { |
| 46 | old_cc = S390_lowcore.clock_comparator; | 46 | old_cc = local_tick_disable(); |
| 47 | S390_lowcore.clock_comparator = -1ULL; | 47 | S390_lowcore.clock_comparator = -1ULL; |
| 48 | __ctl_store(cr0, 0, 0); | 48 | __ctl_store(cr0, 0, 0); |
| 49 | dummy = (cr0 & 0xffff00e0) | 0x00000800; | 49 | dummy = (cr0 & 0xffff00e0) | 0x00000800; |
| @@ -65,7 +65,7 @@ void __udelay(unsigned long usecs) | |||
| 65 | 65 | ||
| 66 | if (raw_irqs_disabled_flags(flags)) { | 66 | if (raw_irqs_disabled_flags(flags)) { |
| 67 | __ctl_load(cr0, 0, 0); | 67 | __ctl_load(cr0, 0, 0); |
| 68 | S390_lowcore.clock_comparator = old_cc; | 68 | local_tick_enable(old_cc); |
| 69 | } | 69 | } |
| 70 | if (!irq_context) | 70 | if (!irq_context) |
| 71 | _local_bh_enable(); | 71 | _local_bh_enable(); |
diff --git a/drivers/s390/char/sclp.c b/drivers/s390/char/sclp.c index 3c8b25e6c345..1fd8f2193ed8 100644 --- a/drivers/s390/char/sclp.c +++ b/drivers/s390/char/sclp.c | |||
| @@ -399,6 +399,7 @@ sclp_tod_from_jiffies(unsigned long jiffies) | |||
| 399 | void | 399 | void |
| 400 | sclp_sync_wait(void) | 400 | sclp_sync_wait(void) |
| 401 | { | 401 | { |
| 402 | unsigned long long old_tick; | ||
| 402 | unsigned long flags; | 403 | unsigned long flags; |
| 403 | unsigned long cr0, cr0_sync; | 404 | unsigned long cr0, cr0_sync; |
| 404 | u64 timeout; | 405 | u64 timeout; |
| @@ -419,11 +420,12 @@ sclp_sync_wait(void) | |||
| 419 | if (!irq_context) | 420 | if (!irq_context) |
| 420 | local_bh_disable(); | 421 | local_bh_disable(); |
| 421 | /* Enable service-signal interruption, disable timer interrupts */ | 422 | /* Enable service-signal interruption, disable timer interrupts */ |
| 423 | old_tick = local_tick_disable(); | ||
| 422 | trace_hardirqs_on(); | 424 | trace_hardirqs_on(); |
| 423 | __ctl_store(cr0, 0, 0); | 425 | __ctl_store(cr0, 0, 0); |
| 424 | cr0_sync = cr0; | 426 | cr0_sync = cr0; |
| 427 | cr0_sync &= 0xffff00a0; | ||
| 425 | cr0_sync |= 0x00000200; | 428 | cr0_sync |= 0x00000200; |
| 426 | cr0_sync &= 0xFFFFF3AC; | ||
| 427 | __ctl_load(cr0_sync, 0, 0); | 429 | __ctl_load(cr0_sync, 0, 0); |
| 428 | __raw_local_irq_stosm(0x01); | 430 | __raw_local_irq_stosm(0x01); |
| 429 | /* Loop until driver state indicates finished request */ | 431 | /* Loop until driver state indicates finished request */ |
| @@ -439,9 +441,9 @@ sclp_sync_wait(void) | |||
| 439 | __ctl_load(cr0, 0, 0); | 441 | __ctl_load(cr0, 0, 0); |
| 440 | if (!irq_context) | 442 | if (!irq_context) |
| 441 | _local_bh_enable(); | 443 | _local_bh_enable(); |
| 444 | local_tick_enable(old_tick); | ||
| 442 | local_irq_restore(flags); | 445 | local_irq_restore(flags); |
| 443 | } | 446 | } |
| 444 | |||
| 445 | EXPORT_SYMBOL(sclp_sync_wait); | 447 | EXPORT_SYMBOL(sclp_sync_wait); |
| 446 | 448 | ||
| 447 | /* Dispatch changes in send and receive mask to registered listeners. */ | 449 | /* Dispatch changes in send and receive mask to registered listeners. */ |
diff --git a/include/asm-s390/hardirq.h b/include/asm-s390/hardirq.h index 4b7cb964ff35..89ec7056da28 100644 --- a/include/asm-s390/hardirq.h +++ b/include/asm-s390/hardirq.h | |||
| @@ -34,4 +34,18 @@ typedef struct { | |||
| 34 | 34 | ||
| 35 | void clock_comparator_work(void); | 35 | void clock_comparator_work(void); |
| 36 | 36 | ||
| 37 | static inline unsigned long long local_tick_disable(void) | ||
| 38 | { | ||
| 39 | unsigned long long old; | ||
| 40 | |||
| 41 | old = S390_lowcore.clock_comparator; | ||
| 42 | S390_lowcore.clock_comparator = -1ULL; | ||
| 43 | return old; | ||
| 44 | } | ||
| 45 | |||
| 46 | static inline void local_tick_enable(unsigned long long comp) | ||
| 47 | { | ||
| 48 | S390_lowcore.clock_comparator = comp; | ||
| 49 | } | ||
| 50 | |||
| 37 | #endif /* __ASM_HARDIRQ_H */ | 51 | #endif /* __ASM_HARDIRQ_H */ |
