Lines Matching refs:tty

25 #define tty_ldisc_debug(tty, f, args...) ({				       \  argument
27 printk(KERN_DEBUG "%s: %s: " f, __func__, tty_name(tty, __b), ##args); \
30 #define tty_ldisc_debug(tty, f, args...) argument
154 static struct tty_ldisc *tty_ldisc_get(struct tty_struct *tty, int disc) in tty_ldisc_get() argument
181 ld->tty = tty; in tty_ldisc_get()
265 struct tty_ldisc *tty_ldisc_ref_wait(struct tty_struct *tty) in tty_ldisc_ref_wait() argument
267 ldsem_down_read(&tty->ldisc_sem, MAX_SCHEDULE_TIMEOUT); in tty_ldisc_ref_wait()
268 WARN_ON(!tty->ldisc); in tty_ldisc_ref_wait()
269 return tty->ldisc; in tty_ldisc_ref_wait()
282 struct tty_ldisc *tty_ldisc_ref(struct tty_struct *tty) in tty_ldisc_ref() argument
286 if (ldsem_down_read_trylock(&tty->ldisc_sem)) { in tty_ldisc_ref()
287 ld = tty->ldisc; in tty_ldisc_ref()
289 ldsem_up_read(&tty->ldisc_sem); in tty_ldisc_ref()
305 ldsem_up_read(&ld->tty->ldisc_sem); in tty_ldisc_deref()
311 __tty_ldisc_lock(struct tty_struct *tty, unsigned long timeout) in __tty_ldisc_lock() argument
313 return ldsem_down_write(&tty->ldisc_sem, timeout); in __tty_ldisc_lock()
317 __tty_ldisc_lock_nested(struct tty_struct *tty, unsigned long timeout) in __tty_ldisc_lock_nested() argument
319 return ldsem_down_write_nested(&tty->ldisc_sem, in __tty_ldisc_lock_nested()
323 static inline void __tty_ldisc_unlock(struct tty_struct *tty) in __tty_ldisc_unlock() argument
325 return ldsem_up_write(&tty->ldisc_sem); in __tty_ldisc_unlock()
329 tty_ldisc_lock(struct tty_struct *tty, unsigned long timeout) in tty_ldisc_lock() argument
333 ret = __tty_ldisc_lock(tty, timeout); in tty_ldisc_lock()
336 set_bit(TTY_LDISC_HALTED, &tty->flags); in tty_ldisc_lock()
340 static void tty_ldisc_unlock(struct tty_struct *tty) in tty_ldisc_unlock() argument
342 clear_bit(TTY_LDISC_HALTED, &tty->flags); in tty_ldisc_unlock()
343 __tty_ldisc_unlock(tty); in tty_ldisc_unlock()
347 tty_ldisc_lock_pair_timeout(struct tty_struct *tty, struct tty_struct *tty2, in tty_ldisc_lock_pair_timeout() argument
352 if (tty < tty2) { in tty_ldisc_lock_pair_timeout()
353 ret = __tty_ldisc_lock(tty, timeout); in tty_ldisc_lock_pair_timeout()
357 __tty_ldisc_unlock(tty); in tty_ldisc_lock_pair_timeout()
361 WARN_ON_ONCE(tty == tty2); in tty_ldisc_lock_pair_timeout()
362 if (tty2 && tty != tty2) { in tty_ldisc_lock_pair_timeout()
365 ret = __tty_ldisc_lock_nested(tty, timeout); in tty_ldisc_lock_pair_timeout()
370 ret = __tty_ldisc_lock(tty, timeout); in tty_ldisc_lock_pair_timeout()
376 set_bit(TTY_LDISC_HALTED, &tty->flags); in tty_ldisc_lock_pair_timeout()
383 tty_ldisc_lock_pair(struct tty_struct *tty, struct tty_struct *tty2) in tty_ldisc_lock_pair() argument
385 tty_ldisc_lock_pair_timeout(tty, tty2, MAX_SCHEDULE_TIMEOUT); in tty_ldisc_lock_pair()
388 static void __lockfunc tty_ldisc_unlock_pair(struct tty_struct *tty, in tty_ldisc_unlock_pair() argument
391 __tty_ldisc_unlock(tty); in tty_ldisc_unlock_pair()
404 void tty_ldisc_flush(struct tty_struct *tty) in tty_ldisc_flush() argument
406 struct tty_ldisc *ld = tty_ldisc_ref(tty); in tty_ldisc_flush()
408 tty_buffer_flush(tty, ld); in tty_ldisc_flush()
426 static void tty_set_termios_ldisc(struct tty_struct *tty, int num) in tty_set_termios_ldisc() argument
428 down_write(&tty->termios_rwsem); in tty_set_termios_ldisc()
429 tty->termios.c_line = num; in tty_set_termios_ldisc()
430 up_write(&tty->termios_rwsem); in tty_set_termios_ldisc()
444 static int tty_ldisc_open(struct tty_struct *tty, struct tty_ldisc *ld) in tty_ldisc_open() argument
446 WARN_ON(test_and_set_bit(TTY_LDISC_OPEN, &tty->flags)); in tty_ldisc_open()
450 ret = ld->ops->open(tty); in tty_ldisc_open()
452 clear_bit(TTY_LDISC_OPEN, &tty->flags); in tty_ldisc_open()
467 static void tty_ldisc_close(struct tty_struct *tty, struct tty_ldisc *ld) in tty_ldisc_close() argument
469 WARN_ON(!test_bit(TTY_LDISC_OPEN, &tty->flags)); in tty_ldisc_close()
470 clear_bit(TTY_LDISC_OPEN, &tty->flags); in tty_ldisc_close()
472 ld->ops->close(tty); in tty_ldisc_close()
484 static void tty_ldisc_restore(struct tty_struct *tty, struct tty_ldisc *old) in tty_ldisc_restore() argument
491 old = tty_ldisc_get(tty, old->ops->num); in tty_ldisc_restore()
493 tty->ldisc = old; in tty_ldisc_restore()
494 tty_set_termios_ldisc(tty, old->ops->num); in tty_ldisc_restore()
495 if (tty_ldisc_open(tty, old) < 0) { in tty_ldisc_restore()
498 new_ldisc = tty_ldisc_get(tty, N_TTY); in tty_ldisc_restore()
501 tty->ldisc = new_ldisc; in tty_ldisc_restore()
502 tty_set_termios_ldisc(tty, N_TTY); in tty_ldisc_restore()
503 r = tty_ldisc_open(tty, new_ldisc); in tty_ldisc_restore()
507 tty_name(tty, buf), r); in tty_ldisc_restore()
522 int tty_set_ldisc(struct tty_struct *tty, int ldisc) in tty_set_ldisc() argument
527 new_ldisc = tty_ldisc_get(tty, ldisc); in tty_set_ldisc()
531 tty_lock(tty); in tty_set_ldisc()
532 retval = tty_ldisc_lock(tty, 5 * HZ); in tty_set_ldisc()
535 tty_unlock(tty); in tty_set_ldisc()
543 if (tty->ldisc->ops->num == ldisc) { in tty_set_ldisc()
544 tty_ldisc_unlock(tty); in tty_set_ldisc()
546 tty_unlock(tty); in tty_set_ldisc()
550 old_ldisc = tty->ldisc; in tty_set_ldisc()
552 if (test_bit(TTY_HUPPED, &tty->flags)) { in tty_set_ldisc()
555 tty_ldisc_unlock(tty); in tty_set_ldisc()
557 tty_unlock(tty); in tty_set_ldisc()
562 tty_ldisc_close(tty, old_ldisc); in tty_set_ldisc()
565 tty->ldisc = new_ldisc; in tty_set_ldisc()
566 tty_set_termios_ldisc(tty, ldisc); in tty_set_ldisc()
568 retval = tty_ldisc_open(tty, new_ldisc); in tty_set_ldisc()
572 tty_ldisc_restore(tty, old_ldisc); in tty_set_ldisc()
575 if (tty->ldisc->ops->num != old_ldisc->ops->num && tty->ops->set_ldisc) { in tty_set_ldisc()
576 down_read(&tty->termios_rwsem); in tty_set_ldisc()
577 tty->ops->set_ldisc(tty); in tty_set_ldisc()
578 up_read(&tty->termios_rwsem); in tty_set_ldisc()
592 tty_ldisc_unlock(tty); in tty_set_ldisc()
596 schedule_work(&tty->port->buf.work); in tty_set_ldisc()
598 tty_unlock(tty); in tty_set_ldisc()
609 static void tty_reset_termios(struct tty_struct *tty) in tty_reset_termios() argument
611 down_write(&tty->termios_rwsem); in tty_reset_termios()
612 tty->termios = tty->driver->init_termios; in tty_reset_termios()
613 tty->termios.c_ispeed = tty_termios_input_baud_rate(&tty->termios); in tty_reset_termios()
614 tty->termios.c_ospeed = tty_termios_baud_rate(&tty->termios); in tty_reset_termios()
615 up_write(&tty->termios_rwsem); in tty_reset_termios()
628 static int tty_ldisc_reinit(struct tty_struct *tty, int ldisc) in tty_ldisc_reinit() argument
630 struct tty_ldisc *ld = tty_ldisc_get(tty, ldisc); in tty_ldisc_reinit()
635 tty_ldisc_close(tty, tty->ldisc); in tty_ldisc_reinit()
636 tty_ldisc_put(tty->ldisc); in tty_ldisc_reinit()
640 tty->ldisc = ld; in tty_ldisc_reinit()
641 tty_set_termios_ldisc(tty, ldisc); in tty_ldisc_reinit()
661 void tty_ldisc_hangup(struct tty_struct *tty) in tty_ldisc_hangup() argument
664 int reset = tty->driver->flags & TTY_DRIVER_RESET_TERMIOS; in tty_ldisc_hangup()
667 tty_ldisc_debug(tty, "closing ldisc: %p\n", tty->ldisc); in tty_ldisc_hangup()
669 ld = tty_ldisc_ref(tty); in tty_ldisc_hangup()
672 ld->ops->flush_buffer(tty); in tty_ldisc_hangup()
673 tty_driver_flush_buffer(tty); in tty_ldisc_hangup()
674 if ((test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) && in tty_ldisc_hangup()
676 ld->ops->write_wakeup(tty); in tty_ldisc_hangup()
678 ld->ops->hangup(tty); in tty_ldisc_hangup()
682 wake_up_interruptible_poll(&tty->write_wait, POLLOUT); in tty_ldisc_hangup()
683 wake_up_interruptible_poll(&tty->read_wait, POLLIN); in tty_ldisc_hangup()
691 tty_ldisc_lock(tty, MAX_SCHEDULE_TIMEOUT); in tty_ldisc_hangup()
693 if (tty->ldisc) { in tty_ldisc_hangup()
701 if (!tty_ldisc_reinit(tty, tty->termios.c_line)) in tty_ldisc_hangup()
702 err = tty_ldisc_open(tty, tty->ldisc); in tty_ldisc_hangup()
709 BUG_ON(tty_ldisc_reinit(tty, N_TTY)); in tty_ldisc_hangup()
710 WARN_ON(tty_ldisc_open(tty, tty->ldisc)); in tty_ldisc_hangup()
713 tty_ldisc_unlock(tty); in tty_ldisc_hangup()
715 tty_reset_termios(tty); in tty_ldisc_hangup()
717 tty_ldisc_debug(tty, "re-opened ldisc: %p\n", tty->ldisc); in tty_ldisc_hangup()
730 int tty_ldisc_setup(struct tty_struct *tty, struct tty_struct *o_tty) in tty_ldisc_setup() argument
732 struct tty_ldisc *ld = tty->ldisc; in tty_ldisc_setup()
735 retval = tty_ldisc_open(tty, ld); in tty_ldisc_setup()
742 tty_ldisc_close(tty, ld); in tty_ldisc_setup()
749 static void tty_ldisc_kill(struct tty_struct *tty) in tty_ldisc_kill() argument
754 tty_ldisc_close(tty, tty->ldisc); in tty_ldisc_kill()
755 tty_ldisc_put(tty->ldisc); in tty_ldisc_kill()
757 tty->ldisc = NULL; in tty_ldisc_kill()
760 tty_set_termios_ldisc(tty, N_TTY); in tty_ldisc_kill()
772 void tty_ldisc_release(struct tty_struct *tty) in tty_ldisc_release() argument
774 struct tty_struct *o_tty = tty->link; in tty_ldisc_release()
781 tty_ldisc_debug(tty, "closing ldisc: %p\n", tty->ldisc); in tty_ldisc_release()
783 tty_ldisc_lock_pair(tty, o_tty); in tty_ldisc_release()
784 tty_ldisc_kill(tty); in tty_ldisc_release()
787 tty_ldisc_unlock_pair(tty, o_tty); in tty_ldisc_release()
792 tty_ldisc_debug(tty, "ldisc closed\n"); in tty_ldisc_release()
803 void tty_ldisc_init(struct tty_struct *tty) in tty_ldisc_init() argument
805 struct tty_ldisc *ld = tty_ldisc_get(tty, N_TTY); in tty_ldisc_init()
808 tty->ldisc = ld; in tty_ldisc_init()
818 void tty_ldisc_deinit(struct tty_struct *tty) in tty_ldisc_deinit() argument
820 tty_ldisc_put(tty->ldisc); in tty_ldisc_deinit()
821 tty->ldisc = NULL; in tty_ldisc_deinit()