diff options
Diffstat (limited to 'drivers/s390/cio/cio.c')
-rw-r--r-- | drivers/s390/cio/cio.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/drivers/s390/cio/cio.c b/drivers/s390/cio/cio.c index eb3140ee821e..dc67c397449e 100644 --- a/drivers/s390/cio/cio.c +++ b/drivers/s390/cio/cio.c | |||
@@ -622,6 +622,7 @@ void __irq_entry do_IRQ(struct pt_regs *regs) | |||
622 | sch = (struct subchannel *)(unsigned long)tpi_info->intparm; | 622 | sch = (struct subchannel *)(unsigned long)tpi_info->intparm; |
623 | if (!sch) { | 623 | if (!sch) { |
624 | /* Clear pending interrupt condition. */ | 624 | /* Clear pending interrupt condition. */ |
625 | kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++; | ||
625 | tsch(tpi_info->schid, irb); | 626 | tsch(tpi_info->schid, irb); |
626 | continue; | 627 | continue; |
627 | } | 628 | } |
@@ -634,7 +635,10 @@ void __irq_entry do_IRQ(struct pt_regs *regs) | |||
634 | /* Call interrupt handler if there is one. */ | 635 | /* Call interrupt handler if there is one. */ |
635 | if (sch->driver && sch->driver->irq) | 636 | if (sch->driver && sch->driver->irq) |
636 | sch->driver->irq(sch); | 637 | sch->driver->irq(sch); |
637 | } | 638 | else |
639 | kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++; | ||
640 | } else | ||
641 | kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++; | ||
638 | spin_unlock(sch->lock); | 642 | spin_unlock(sch->lock); |
639 | /* | 643 | /* |
640 | * Are more interrupts pending? | 644 | * Are more interrupts pending? |
@@ -667,18 +671,23 @@ static int cio_tpi(void) | |||
667 | tpi_info = (struct tpi_info *)&S390_lowcore.subchannel_id; | 671 | tpi_info = (struct tpi_info *)&S390_lowcore.subchannel_id; |
668 | if (tpi(NULL) != 1) | 672 | if (tpi(NULL) != 1) |
669 | return 0; | 673 | return 0; |
674 | kstat_cpu(smp_processor_id()).irqs[IO_INTERRUPT]++; | ||
670 | if (tpi_info->adapter_IO) { | 675 | if (tpi_info->adapter_IO) { |
671 | do_adapter_IO(tpi_info->isc); | 676 | do_adapter_IO(tpi_info->isc); |
672 | return 1; | 677 | return 1; |
673 | } | 678 | } |
674 | irb = (struct irb *)&S390_lowcore.irb; | 679 | irb = (struct irb *)&S390_lowcore.irb; |
675 | /* Store interrupt response block to lowcore. */ | 680 | /* Store interrupt response block to lowcore. */ |
676 | if (tsch(tpi_info->schid, irb) != 0) | 681 | if (tsch(tpi_info->schid, irb) != 0) { |
677 | /* Not status pending or not operational. */ | 682 | /* Not status pending or not operational. */ |
683 | kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++; | ||
678 | return 1; | 684 | return 1; |
685 | } | ||
679 | sch = (struct subchannel *)(unsigned long)tpi_info->intparm; | 686 | sch = (struct subchannel *)(unsigned long)tpi_info->intparm; |
680 | if (!sch) | 687 | if (!sch) { |
688 | kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++; | ||
681 | return 1; | 689 | return 1; |
690 | } | ||
682 | irq_context = in_interrupt(); | 691 | irq_context = in_interrupt(); |
683 | if (!irq_context) | 692 | if (!irq_context) |
684 | local_bh_disable(); | 693 | local_bh_disable(); |
@@ -687,6 +696,8 @@ static int cio_tpi(void) | |||
687 | memcpy(&sch->schib.scsw, &irb->scsw, sizeof(union scsw)); | 696 | memcpy(&sch->schib.scsw, &irb->scsw, sizeof(union scsw)); |
688 | if (sch->driver && sch->driver->irq) | 697 | if (sch->driver && sch->driver->irq) |
689 | sch->driver->irq(sch); | 698 | sch->driver->irq(sch); |
699 | else | ||
700 | kstat_cpu(smp_processor_id()).irqs[IOINT_CIO]++; | ||
690 | spin_unlock(sch->lock); | 701 | spin_unlock(sch->lock); |
691 | irq_exit(); | 702 | irq_exit(); |
692 | if (!irq_context) | 703 | if (!irq_context) |
@@ -1058,7 +1069,7 @@ void reipl_ccw_dev(struct ccw_dev_id *devid) | |||
1058 | { | 1069 | { |
1059 | struct subchannel_id schid; | 1070 | struct subchannel_id schid; |
1060 | 1071 | ||
1061 | s390_reset_system(); | 1072 | s390_reset_system(NULL, NULL); |
1062 | if (reipl_find_schid(devid, &schid) != 0) | 1073 | if (reipl_find_schid(devid, &schid) != 0) |
1063 | panic("IPL Device not found\n"); | 1074 | panic("IPL Device not found\n"); |
1064 | do_reipl_asm(*((__u32*)&schid)); | 1075 | do_reipl_asm(*((__u32*)&schid)); |