[PATCH] 2.5.34 s390 fixes (7/10): 3215 driver.

Martin Schwidefsky (schwidefsky@de.ibm.com)
Wed, 11 Sep 2002 18:08:58 +0200


Hi Linus,
some changes in the 3215 driver. Replace old style bottom half with tasklets
and use a special irq request function since the console is initialized
before the standard device sensing has been done.

blue skies,
Martin.

diff -urN linux-2.5.34/drivers/s390/char/con3215.c linux-2.5.34-s390/drivers/s390/char/con3215.c
--- linux-2.5.34/drivers/s390/char/con3215.c Mon Sep 9 19:35:03 2002
+++ linux-2.5.34-s390/drivers/s390/char/con3215.c Thu Jul 25 20:30:49 2002
@@ -89,7 +89,7 @@
int written; /* number of bytes in write requests */
devstat_t devstat; /* device status structure for do_IO */
struct tty_struct *tty; /* pointer to tty structure if present */
- struct tq_struct tqueue; /* task queue to bottom half */
+ struct tasklet_struct tasklet;
raw3215_req *queued_read; /* pointer to queued read requests */
raw3215_req *queued_write; /* pointer to queued write requests */
wait_queue_head_t empty_wait; /* wait queue for flushing */
@@ -341,7 +341,7 @@
* The bottom half handler routine for 3215 devices. It tries to start
* the next IO and wakes up processes waiting on the tty.
*/
-static void raw3215_softint(void *data)
+static void raw3215_tasklet(void *data)
{
raw3215_info *raw;
struct tty_struct *tty;
@@ -377,12 +377,7 @@
if (raw->flags & RAW3215_BH_PENDING)
return; /* already pending */
raw->flags |= RAW3215_BH_PENDING;
- INIT_LIST_HEAD(&raw->tqueue.list);
- raw->tqueue.sync = 0;
- raw->tqueue.routine = raw3215_softint;
- raw->tqueue.data = raw;
- queue_task(&raw->tqueue, &tq_immediate);
- mark_bh(IMMEDIATE_BH);
+ tasklet_hi_schedule(&raw->tasklet);
}

/*
@@ -698,13 +693,12 @@

if (raw->flags & RAW3215_ACTIVE)
return 0;
- if (request_irq(raw->irq, raw3215_irq, SA_INTERRUPT,
- "3215 terminal driver", &raw->devstat) != 0)
+ if (s390_request_console_irq(raw->irq, raw3215_irq, SA_INTERRUPT,
+ "3215 terminal driver", &raw->devstat) != 0)
return -1;
raw->line_pos = 0;
raw->flags |= RAW3215_ACTIVE;
s390irq_spin_lock_irqsave(raw->irq, flags);
- set_cons_dev(raw->irq);
raw3215_try_io(raw);
s390irq_spin_unlock_irqrestore(raw->irq, flags);

@@ -867,8 +861,9 @@
kfree(raw);
return -ENOMEM;
}
- raw->tqueue.routine = raw3215_softint;
- raw->tqueue.data = raw;
+ tasklet_init(&raw->tasklet,
+ (void (*)(unsigned long)) raw3215_tasklet,
+ (unsigned long) raw);
init_waitqueue_head(&raw->empty_wait);
raw3215[line] = raw;
}
@@ -1068,7 +1063,6 @@
/* Check if 3215 is to be the console */
if (!CONSOLE_IS_3215)
return;
- irq = raw3215_find_dev(0);

/* Set the console mode for VM */
if (MACHINE_IS_VM) {
@@ -1076,6 +1070,22 @@
cpcmd("TERM AUTOCR OFF", NULL, 0);
}

+ if (console_device != -1) {
+ /* use the device number that was specified on the
+ * command line */
+ irq = raw3215_find_dev(0);
+ } else if (MACHINE_IS_VM) {
+ /* under VM, the console is at device number 0009
+ * by default, so try that */
+ irq = get_irq_by_devno(0x0009);
+ } else {
+ /* unlike in 2.4, we cannot autoprobe here, since
+ * the channel subsystem is not fully initialized.
+ * With some luck, the HWC console can take over */
+ printk(KERN_WARNING "3215 console not found\n");
+ return;
+ }
+
/* allocate 3215 request structures */
raw3215_freelist = NULL;
spin_lock_init(&raw3215_freelist_lock);
@@ -1095,10 +1105,11 @@
raw->inbuf = (char *) alloc_bootmem_low(RAW3215_INBUF_SIZE);

/* Find the first console */
- raw->irq = raw3215_find_dev(0);
+ raw->irq = irq;
raw->flags |= RAW3215_FIXED;
- raw->tqueue.routine = raw3215_softint;
- raw->tqueue.data = raw;
+ tasklet_init(&raw->tasklet,
+ (void (*)(unsigned long)) raw3215_tasklet,
+ (unsigned long) raw);
init_waitqueue_head(&raw->empty_wait);

/* Request the console irq */

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/