aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/cio/cio.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/s390/cio/cio.c')
-rw-r--r--drivers/s390/cio/cio.c19
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));