diff options
Diffstat (limited to 'drivers/s390/char/con3215.c')
| -rw-r--r-- | drivers/s390/char/con3215.c | 22 | 
1 files changed, 15 insertions, 7 deletions
diff --git a/drivers/s390/char/con3215.c b/drivers/s390/char/con3215.c index 934458ad55e..e71a50d4b22 100644 --- a/drivers/s390/char/con3215.c +++ b/drivers/s390/char/con3215.c @@ -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) */ @@ -334,19 +335,23 @@ 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;  }  |