diff options
Diffstat (limited to 'drivers/s390/cio/cio.c')
-rw-r--r-- | drivers/s390/cio/cio.c | 45 |
1 files changed, 13 insertions, 32 deletions
diff --git a/drivers/s390/cio/cio.c b/drivers/s390/cio/cio.c index f4e6cf3aceb8..cbde448f9947 100644 --- a/drivers/s390/cio/cio.c +++ b/drivers/s390/cio/cio.c | |||
@@ -84,29 +84,14 @@ out_unregister: | |||
84 | 84 | ||
85 | arch_initcall (cio_debug_init); | 85 | arch_initcall (cio_debug_init); |
86 | 86 | ||
87 | int | 87 | int cio_set_options(struct subchannel *sch, int flags) |
88 | cio_set_options (struct subchannel *sch, int flags) | ||
89 | { | 88 | { |
90 | sch->options.suspend = (flags & DOIO_ALLOW_SUSPEND) != 0; | 89 | struct io_subchannel_private *priv = to_io_private(sch); |
91 | sch->options.prefetch = (flags & DOIO_DENY_PREFETCH) != 0; | ||
92 | sch->options.inter = (flags & DOIO_SUPPRESS_INTER) != 0; | ||
93 | return 0; | ||
94 | } | ||
95 | 90 | ||
96 | /* FIXME: who wants to use this? */ | 91 | priv->options.suspend = (flags & DOIO_ALLOW_SUSPEND) != 0; |
97 | int | 92 | priv->options.prefetch = (flags & DOIO_DENY_PREFETCH) != 0; |
98 | cio_get_options (struct subchannel *sch) | 93 | priv->options.inter = (flags & DOIO_SUPPRESS_INTER) != 0; |
99 | { | 94 | return 0; |
100 | int flags; | ||
101 | |||
102 | flags = 0; | ||
103 | if (sch->options.suspend) | ||
104 | flags |= DOIO_ALLOW_SUSPEND; | ||
105 | if (sch->options.prefetch) | ||
106 | flags |= DOIO_DENY_PREFETCH; | ||
107 | if (sch->options.inter) | ||
108 | flags |= DOIO_SUPPRESS_INTER; | ||
109 | return flags; | ||
110 | } | 95 | } |
111 | 96 | ||
112 | static int | 97 | static int |
@@ -139,21 +124,21 @@ cio_start_key (struct subchannel *sch, /* subchannel structure */ | |||
139 | __u8 lpm, /* logical path mask */ | 124 | __u8 lpm, /* logical path mask */ |
140 | __u8 key) /* storage key */ | 125 | __u8 key) /* storage key */ |
141 | { | 126 | { |
127 | struct io_subchannel_private *priv = to_io_private(sch); | ||
128 | union orb *orb = &priv->orb; | ||
142 | int ccode; | 129 | int ccode; |
143 | union orb *orb; | ||
144 | 130 | ||
145 | CIO_TRACE_EVENT(5, "stIO"); | 131 | CIO_TRACE_EVENT(5, "stIO"); |
146 | CIO_TRACE_EVENT(5, dev_name(&sch->dev)); | 132 | CIO_TRACE_EVENT(5, dev_name(&sch->dev)); |
147 | 133 | ||
148 | orb = &to_io_private(sch)->orb; | ||
149 | memset(orb, 0, sizeof(union orb)); | 134 | memset(orb, 0, sizeof(union orb)); |
150 | /* sch is always under 2G. */ | 135 | /* sch is always under 2G. */ |
151 | orb->cmd.intparm = (u32)(addr_t)sch; | 136 | orb->cmd.intparm = (u32)(addr_t)sch; |
152 | orb->cmd.fmt = 1; | 137 | orb->cmd.fmt = 1; |
153 | 138 | ||
154 | orb->cmd.pfch = sch->options.prefetch == 0; | 139 | orb->cmd.pfch = priv->options.prefetch == 0; |
155 | orb->cmd.spnd = sch->options.suspend; | 140 | orb->cmd.spnd = priv->options.suspend; |
156 | orb->cmd.ssic = sch->options.suspend && sch->options.inter; | 141 | orb->cmd.ssic = priv->options.suspend && priv->options.inter; |
157 | orb->cmd.lpm = (lpm != 0) ? lpm : sch->lpm; | 142 | orb->cmd.lpm = (lpm != 0) ? lpm : sch->lpm; |
158 | #ifdef CONFIG_64BIT | 143 | #ifdef CONFIG_64BIT |
159 | /* | 144 | /* |
@@ -619,7 +604,7 @@ void __irq_entry do_IRQ(struct pt_regs *regs) | |||
619 | s390_idle_check(regs, S390_lowcore.int_clock, | 604 | s390_idle_check(regs, S390_lowcore.int_clock, |
620 | S390_lowcore.async_enter_timer); | 605 | S390_lowcore.async_enter_timer); |
621 | irq_enter(); | 606 | irq_enter(); |
622 | __get_cpu_var(s390_idle).nohz_delay = 1; | 607 | __this_cpu_write(s390_idle.nohz_delay, 1); |
623 | if (S390_lowcore.int_clock >= S390_lowcore.clock_comparator) | 608 | if (S390_lowcore.int_clock >= S390_lowcore.clock_comparator) |
624 | /* Serve timer interrupts first. */ | 609 | /* Serve timer interrupts first. */ |
625 | clock_comparator_work(); | 610 | clock_comparator_work(); |
@@ -630,11 +615,7 @@ void __irq_entry do_IRQ(struct pt_regs *regs) | |||
630 | irb = (struct irb *)&S390_lowcore.irb; | 615 | irb = (struct irb *)&S390_lowcore.irb; |
631 | do { | 616 | do { |
632 | kstat_cpu(smp_processor_id()).irqs[IO_INTERRUPT]++; | 617 | kstat_cpu(smp_processor_id()).irqs[IO_INTERRUPT]++; |
633 | /* | 618 | if (tpi_info->adapter_IO) { |
634 | * Non I/O-subchannel thin interrupts are processed differently | ||
635 | */ | ||
636 | if (tpi_info->adapter_IO == 1 && | ||
637 | tpi_info->int_type == IO_INTERRUPT_TYPE) { | ||
638 | do_adapter_IO(tpi_info->isc); | 619 | do_adapter_IO(tpi_info->isc); |
639 | continue; | 620 | continue; |
640 | } | 621 | } |