|
@@ -104,44 +104,6 @@ cio_get_options (struct subchannel *sch)
|
|
|
return flags;
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * Use tpi to get a pending interrupt, call the interrupt handler and
|
|
|
- * return a pointer to the subchannel structure.
|
|
|
- */
|
|
|
-static int
|
|
|
-cio_tpi(void)
|
|
|
-{
|
|
|
- struct tpi_info *tpi_info;
|
|
|
- struct subchannel *sch;
|
|
|
- struct irb *irb;
|
|
|
- int irq_context;
|
|
|
-
|
|
|
- tpi_info = (struct tpi_info *) __LC_SUBCHANNEL_ID;
|
|
|
- if (tpi (NULL) != 1)
|
|
|
- return 0;
|
|
|
- irb = (struct irb *) __LC_IRB;
|
|
|
- /* Store interrupt response block to lowcore. */
|
|
|
- if (tsch (tpi_info->schid, irb) != 0)
|
|
|
- /* Not status pending or not operational. */
|
|
|
- return 1;
|
|
|
- sch = (struct subchannel *)(unsigned long)tpi_info->intparm;
|
|
|
- if (!sch)
|
|
|
- return 1;
|
|
|
- irq_context = in_interrupt();
|
|
|
- if (!irq_context)
|
|
|
- local_bh_disable();
|
|
|
- irq_enter ();
|
|
|
- spin_lock(sch->lock);
|
|
|
- memcpy(&sch->schib.scsw, &irb->scsw, sizeof(union scsw));
|
|
|
- if (sch->driver && sch->driver->irq)
|
|
|
- sch->driver->irq(sch);
|
|
|
- spin_unlock(sch->lock);
|
|
|
- irq_exit ();
|
|
|
- if (!irq_context)
|
|
|
- _local_bh_enable();
|
|
|
- return 1;
|
|
|
-}
|
|
|
-
|
|
|
static int
|
|
|
cio_start_handle_notoper(struct subchannel *sch, __u8 lpm)
|
|
|
{
|
|
@@ -687,6 +649,43 @@ static char console_sch_name[10] = "0.x.xxxx";
|
|
|
static struct io_subchannel_private console_priv;
|
|
|
static int console_subchannel_in_use;
|
|
|
|
|
|
+/*
|
|
|
+ * Use tpi to get a pending interrupt, call the interrupt handler and
|
|
|
+ * return a pointer to the subchannel structure.
|
|
|
+ */
|
|
|
+static int cio_tpi(void)
|
|
|
+{
|
|
|
+ struct tpi_info *tpi_info;
|
|
|
+ struct subchannel *sch;
|
|
|
+ struct irb *irb;
|
|
|
+ int irq_context;
|
|
|
+
|
|
|
+ tpi_info = (struct tpi_info *) __LC_SUBCHANNEL_ID;
|
|
|
+ if (tpi(NULL) != 1)
|
|
|
+ return 0;
|
|
|
+ irb = (struct irb *) __LC_IRB;
|
|
|
+ /* Store interrupt response block to lowcore. */
|
|
|
+ if (tsch(tpi_info->schid, irb) != 0)
|
|
|
+ /* Not status pending or not operational. */
|
|
|
+ return 1;
|
|
|
+ sch = (struct subchannel *)(unsigned long)tpi_info->intparm;
|
|
|
+ if (!sch)
|
|
|
+ return 1;
|
|
|
+ irq_context = in_interrupt();
|
|
|
+ if (!irq_context)
|
|
|
+ local_bh_disable();
|
|
|
+ irq_enter();
|
|
|
+ spin_lock(sch->lock);
|
|
|
+ memcpy(&sch->schib.scsw, &irb->scsw, sizeof(union scsw));
|
|
|
+ if (sch->driver && sch->driver->irq)
|
|
|
+ sch->driver->irq(sch);
|
|
|
+ spin_unlock(sch->lock);
|
|
|
+ irq_exit();
|
|
|
+ if (!irq_context)
|
|
|
+ _local_bh_enable();
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
void *cio_get_console_priv(void)
|
|
|
{
|
|
|
return &console_priv;
|