|
@@ -87,6 +87,7 @@ struct raw3215_info {
|
|
|
struct tty_struct *tty; /* pointer to tty structure if present */
|
|
|
struct raw3215_req *queued_read; /* pointer to queued read requests */
|
|
|
struct raw3215_req *queued_write;/* pointer to queued write requests */
|
|
|
+ struct tasklet_struct tlet; /* tasklet to invoke tty_wakeup */
|
|
|
wait_queue_head_t empty_wait; /* wait queue for flushing */
|
|
|
struct timer_list timer; /* timer for delayed output */
|
|
|
int line_pos; /* position on the line (for tabs) */
|
|
@@ -333,20 +334,24 @@ static inline void raw3215_try_io(struct raw3215_info *raw)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Call tty_wakeup from tasklet context
|
|
|
+ */
|
|
|
+static void raw3215_wakeup(unsigned long data)
|
|
|
+{
|
|
|
+ struct raw3215_info *raw = (struct raw3215_info *) data;
|
|
|
+ tty_wakeup(raw->tty);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Try to start the next IO and wake up processes waiting on the tty.
|
|
|
*/
|
|
|
static void raw3215_next_io(struct raw3215_info *raw)
|
|
|
{
|
|
|
- struct tty_struct *tty;
|
|
|
-
|
|
|
raw3215_mk_write_req(raw);
|
|
|
raw3215_try_io(raw);
|
|
|
- tty = raw->tty;
|
|
|
- if (tty != NULL &&
|
|
|
- RAW3215_BUFFER_SIZE - raw->count >= RAW3215_MIN_SPACE) {
|
|
|
- tty_wakeup(tty);
|
|
|
- }
|
|
|
+ if (raw->tty && RAW3215_BUFFER_SIZE - raw->count >= RAW3215_MIN_SPACE)
|
|
|
+ tasklet_schedule(&raw->tlet);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -682,6 +687,7 @@ static int raw3215_probe (struct ccw_device *cdev)
|
|
|
return -ENOMEM;
|
|
|
}
|
|
|
init_waitqueue_head(&raw->empty_wait);
|
|
|
+ tasklet_init(&raw->tlet, raw3215_wakeup, (unsigned long) raw);
|
|
|
|
|
|
dev_set_drvdata(&cdev->dev, raw);
|
|
|
cdev->handler = raw3215_irq;
|
|
@@ -901,6 +907,7 @@ static int __init con3215_init(void)
|
|
|
|
|
|
raw->flags |= RAW3215_FIXED;
|
|
|
init_waitqueue_head(&raw->empty_wait);
|
|
|
+ tasklet_init(&raw->tlet, raw3215_wakeup, (unsigned long) raw);
|
|
|
|
|
|
/* Request the console irq */
|
|
|
if (raw3215_startup(raw) != 0) {
|
|
@@ -966,6 +973,7 @@ static void tty3215_close(struct tty_struct *tty, struct file * filp)
|
|
|
tty->closing = 1;
|
|
|
/* Shutdown the terminal */
|
|
|
raw3215_shutdown(raw);
|
|
|
+ tasklet_kill(&raw->tlet);
|
|
|
tty->closing = 0;
|
|
|
raw->tty = NULL;
|
|
|
}
|