diff options
Diffstat (limited to 'drivers/s390/cio/cio.c')
-rw-r--r-- | drivers/s390/cio/cio.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/drivers/s390/cio/cio.c b/drivers/s390/cio/cio.c index 41db3cc653f5..23ffcc4768a7 100644 --- a/drivers/s390/cio/cio.c +++ b/drivers/s390/cio/cio.c | |||
@@ -670,10 +670,14 @@ do_IRQ (struct pt_regs *regs) | |||
670 | continue; | 670 | continue; |
671 | } | 671 | } |
672 | sch = (struct subchannel *)(unsigned long)tpi_info->intparm; | 672 | sch = (struct subchannel *)(unsigned long)tpi_info->intparm; |
673 | if (sch) | 673 | if (!sch) { |
674 | spin_lock(sch->lock); | 674 | /* Clear pending interrupt condition. */ |
675 | tsch(tpi_info->schid, irb); | ||
676 | continue; | ||
677 | } | ||
678 | spin_lock(sch->lock); | ||
675 | /* Store interrupt response block to lowcore. */ | 679 | /* Store interrupt response block to lowcore. */ |
676 | if (tsch (tpi_info->schid, irb) == 0 && sch) { | 680 | if (tsch(tpi_info->schid, irb) == 0) { |
677 | /* Keep subchannel information word up to date. */ | 681 | /* Keep subchannel information word up to date. */ |
678 | memcpy (&sch->schib.scsw, &irb->scsw, | 682 | memcpy (&sch->schib.scsw, &irb->scsw, |
679 | sizeof (irb->scsw)); | 683 | sizeof (irb->scsw)); |
@@ -681,8 +685,7 @@ do_IRQ (struct pt_regs *regs) | |||
681 | if (sch->driver && sch->driver->irq) | 685 | if (sch->driver && sch->driver->irq) |
682 | sch->driver->irq(sch); | 686 | sch->driver->irq(sch); |
683 | } | 687 | } |
684 | if (sch) | 688 | spin_unlock(sch->lock); |
685 | spin_unlock(sch->lock); | ||
686 | /* | 689 | /* |
687 | * Are more interrupts pending? | 690 | * Are more interrupts pending? |
688 | * If so, the tpi instruction will update the lowcore | 691 | * If so, the tpi instruction will update the lowcore |
@@ -708,8 +711,9 @@ void *cio_get_console_priv(void) | |||
708 | /* | 711 | /* |
709 | * busy wait for the next interrupt on the console | 712 | * busy wait for the next interrupt on the console |
710 | */ | 713 | */ |
711 | void | 714 | void wait_cons_dev(void) |
712 | wait_cons_dev (void) | 715 | __releases(console_subchannel.lock) |
716 | __acquires(console_subchannel.lock) | ||
713 | { | 717 | { |
714 | unsigned long cr6 __attribute__ ((aligned (8))); | 718 | unsigned long cr6 __attribute__ ((aligned (8))); |
715 | unsigned long save_cr6 __attribute__ ((aligned (8))); | 719 | unsigned long save_cr6 __attribute__ ((aligned (8))); |