Lines Matching refs:tty
25 #define tty_ldisc_debug(tty, f, args...) tty_debug(tty, f, ##args) argument
27 #define tty_ldisc_debug(tty, f, args...) argument
151 static struct tty_ldisc *tty_ldisc_get(struct tty_struct *tty, int disc) in tty_ldisc_get() argument
178 ld->tty = tty; in tty_ldisc_get()
262 struct tty_ldisc *tty_ldisc_ref_wait(struct tty_struct *tty) in tty_ldisc_ref_wait() argument
264 ldsem_down_read(&tty->ldisc_sem, MAX_SCHEDULE_TIMEOUT); in tty_ldisc_ref_wait()
265 WARN_ON(!tty->ldisc); in tty_ldisc_ref_wait()
266 return tty->ldisc; in tty_ldisc_ref_wait()
279 struct tty_ldisc *tty_ldisc_ref(struct tty_struct *tty) in tty_ldisc_ref() argument
283 if (ldsem_down_read_trylock(&tty->ldisc_sem)) { in tty_ldisc_ref()
284 ld = tty->ldisc; in tty_ldisc_ref()
286 ldsem_up_read(&tty->ldisc_sem); in tty_ldisc_ref()
302 ldsem_up_read(&ld->tty->ldisc_sem); in tty_ldisc_deref()
308 __tty_ldisc_lock(struct tty_struct *tty, unsigned long timeout) in __tty_ldisc_lock() argument
310 return ldsem_down_write(&tty->ldisc_sem, timeout); in __tty_ldisc_lock()
314 __tty_ldisc_lock_nested(struct tty_struct *tty, unsigned long timeout) in __tty_ldisc_lock_nested() argument
316 return ldsem_down_write_nested(&tty->ldisc_sem, in __tty_ldisc_lock_nested()
320 static inline void __tty_ldisc_unlock(struct tty_struct *tty) in __tty_ldisc_unlock() argument
322 ldsem_up_write(&tty->ldisc_sem); in __tty_ldisc_unlock()
326 tty_ldisc_lock(struct tty_struct *tty, unsigned long timeout) in tty_ldisc_lock() argument
330 ret = __tty_ldisc_lock(tty, timeout); in tty_ldisc_lock()
333 set_bit(TTY_LDISC_HALTED, &tty->flags); in tty_ldisc_lock()
337 static void tty_ldisc_unlock(struct tty_struct *tty) in tty_ldisc_unlock() argument
339 clear_bit(TTY_LDISC_HALTED, &tty->flags); in tty_ldisc_unlock()
340 __tty_ldisc_unlock(tty); in tty_ldisc_unlock()
344 tty_ldisc_lock_pair_timeout(struct tty_struct *tty, struct tty_struct *tty2, in tty_ldisc_lock_pair_timeout() argument
349 if (tty < tty2) { in tty_ldisc_lock_pair_timeout()
350 ret = __tty_ldisc_lock(tty, timeout); in tty_ldisc_lock_pair_timeout()
354 __tty_ldisc_unlock(tty); in tty_ldisc_lock_pair_timeout()
358 WARN_ON_ONCE(tty == tty2); in tty_ldisc_lock_pair_timeout()
359 if (tty2 && tty != tty2) { in tty_ldisc_lock_pair_timeout()
362 ret = __tty_ldisc_lock_nested(tty, timeout); in tty_ldisc_lock_pair_timeout()
367 ret = __tty_ldisc_lock(tty, timeout); in tty_ldisc_lock_pair_timeout()
373 set_bit(TTY_LDISC_HALTED, &tty->flags); in tty_ldisc_lock_pair_timeout()
380 tty_ldisc_lock_pair(struct tty_struct *tty, struct tty_struct *tty2) in tty_ldisc_lock_pair() argument
382 tty_ldisc_lock_pair_timeout(tty, tty2, MAX_SCHEDULE_TIMEOUT); in tty_ldisc_lock_pair()
385 static void __lockfunc tty_ldisc_unlock_pair(struct tty_struct *tty, in tty_ldisc_unlock_pair() argument
388 __tty_ldisc_unlock(tty); in tty_ldisc_unlock_pair()
401 void tty_ldisc_flush(struct tty_struct *tty) in tty_ldisc_flush() argument
403 struct tty_ldisc *ld = tty_ldisc_ref(tty); in tty_ldisc_flush()
405 tty_buffer_flush(tty, ld); in tty_ldisc_flush()
423 static void tty_set_termios_ldisc(struct tty_struct *tty, int num) in tty_set_termios_ldisc() argument
425 down_write(&tty->termios_rwsem); in tty_set_termios_ldisc()
426 tty->termios.c_line = num; in tty_set_termios_ldisc()
427 up_write(&tty->termios_rwsem); in tty_set_termios_ldisc()
441 static int tty_ldisc_open(struct tty_struct *tty, struct tty_ldisc *ld) in tty_ldisc_open() argument
443 WARN_ON(test_and_set_bit(TTY_LDISC_OPEN, &tty->flags)); in tty_ldisc_open()
447 ret = ld->ops->open(tty); in tty_ldisc_open()
449 clear_bit(TTY_LDISC_OPEN, &tty->flags); in tty_ldisc_open()
451 tty_ldisc_debug(tty, "%p: opened\n", tty->ldisc); in tty_ldisc_open()
466 static void tty_ldisc_close(struct tty_struct *tty, struct tty_ldisc *ld) in tty_ldisc_close() argument
468 WARN_ON(!test_bit(TTY_LDISC_OPEN, &tty->flags)); in tty_ldisc_close()
469 clear_bit(TTY_LDISC_OPEN, &tty->flags); in tty_ldisc_close()
471 ld->ops->close(tty); in tty_ldisc_close()
472 tty_ldisc_debug(tty, "%p: closed\n", tty->ldisc); in tty_ldisc_close()
484 static void tty_ldisc_restore(struct tty_struct *tty, struct tty_ldisc *old) in tty_ldisc_restore() argument
490 old = tty_ldisc_get(tty, old->ops->num); in tty_ldisc_restore()
492 tty->ldisc = old; in tty_ldisc_restore()
493 tty_set_termios_ldisc(tty, old->ops->num); in tty_ldisc_restore()
494 if (tty_ldisc_open(tty, old) < 0) { in tty_ldisc_restore()
497 new_ldisc = tty_ldisc_get(tty, N_TTY); in tty_ldisc_restore()
500 tty->ldisc = new_ldisc; in tty_ldisc_restore()
501 tty_set_termios_ldisc(tty, N_TTY); in tty_ldisc_restore()
502 r = tty_ldisc_open(tty, new_ldisc); in tty_ldisc_restore()
506 tty_name(tty), r); in tty_ldisc_restore()
521 int tty_set_ldisc(struct tty_struct *tty, int ldisc) in tty_set_ldisc() argument
526 new_ldisc = tty_ldisc_get(tty, ldisc); in tty_set_ldisc()
530 tty_lock(tty); in tty_set_ldisc()
531 retval = tty_ldisc_lock(tty, 5 * HZ); in tty_set_ldisc()
534 tty_unlock(tty); in tty_set_ldisc()
542 if (tty->ldisc->ops->num == ldisc) { in tty_set_ldisc()
543 tty_ldisc_unlock(tty); in tty_set_ldisc()
545 tty_unlock(tty); in tty_set_ldisc()
549 old_ldisc = tty->ldisc; in tty_set_ldisc()
551 if (test_bit(TTY_HUPPED, &tty->flags)) { in tty_set_ldisc()
554 tty_ldisc_unlock(tty); in tty_set_ldisc()
556 tty_unlock(tty); in tty_set_ldisc()
561 tty_ldisc_close(tty, old_ldisc); in tty_set_ldisc()
564 tty->ldisc = new_ldisc; in tty_set_ldisc()
565 tty_set_termios_ldisc(tty, ldisc); in tty_set_ldisc()
567 retval = tty_ldisc_open(tty, new_ldisc); in tty_set_ldisc()
571 tty_ldisc_restore(tty, old_ldisc); in tty_set_ldisc()
574 if (tty->ldisc->ops->num != old_ldisc->ops->num && tty->ops->set_ldisc) { in tty_set_ldisc()
575 down_read(&tty->termios_rwsem); in tty_set_ldisc()
576 tty->ops->set_ldisc(tty); in tty_set_ldisc()
577 up_read(&tty->termios_rwsem); in tty_set_ldisc()
591 tty_ldisc_unlock(tty); in tty_set_ldisc()
595 tty_buffer_restart_work(tty->port); in tty_set_ldisc()
597 tty_unlock(tty); in tty_set_ldisc()
608 static void tty_reset_termios(struct tty_struct *tty) in tty_reset_termios() argument
610 down_write(&tty->termios_rwsem); in tty_reset_termios()
611 tty->termios = tty->driver->init_termios; in tty_reset_termios()
612 tty->termios.c_ispeed = tty_termios_input_baud_rate(&tty->termios); in tty_reset_termios()
613 tty->termios.c_ospeed = tty_termios_baud_rate(&tty->termios); in tty_reset_termios()
614 up_write(&tty->termios_rwsem); in tty_reset_termios()
627 static int tty_ldisc_reinit(struct tty_struct *tty, int ldisc) in tty_ldisc_reinit() argument
629 struct tty_ldisc *ld = tty_ldisc_get(tty, ldisc); in tty_ldisc_reinit()
634 tty_ldisc_close(tty, tty->ldisc); in tty_ldisc_reinit()
635 tty_ldisc_put(tty->ldisc); in tty_ldisc_reinit()
639 tty->ldisc = ld; in tty_ldisc_reinit()
640 tty_set_termios_ldisc(tty, ldisc); in tty_ldisc_reinit()
660 void tty_ldisc_hangup(struct tty_struct *tty) in tty_ldisc_hangup() argument
663 int reset = tty->driver->flags & TTY_DRIVER_RESET_TERMIOS; in tty_ldisc_hangup()
666 tty_ldisc_debug(tty, "%p: closing\n", tty->ldisc); in tty_ldisc_hangup()
668 ld = tty_ldisc_ref(tty); in tty_ldisc_hangup()
671 ld->ops->flush_buffer(tty); in tty_ldisc_hangup()
672 tty_driver_flush_buffer(tty); in tty_ldisc_hangup()
673 if ((test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) && in tty_ldisc_hangup()
675 ld->ops->write_wakeup(tty); in tty_ldisc_hangup()
677 ld->ops->hangup(tty); in tty_ldisc_hangup()
681 wake_up_interruptible_poll(&tty->write_wait, POLLOUT); in tty_ldisc_hangup()
682 wake_up_interruptible_poll(&tty->read_wait, POLLIN); in tty_ldisc_hangup()
690 tty_ldisc_lock(tty, MAX_SCHEDULE_TIMEOUT); in tty_ldisc_hangup()
692 if (tty->ldisc) { in tty_ldisc_hangup()
700 if (!tty_ldisc_reinit(tty, tty->termios.c_line)) in tty_ldisc_hangup()
701 err = tty_ldisc_open(tty, tty->ldisc); in tty_ldisc_hangup()
708 BUG_ON(tty_ldisc_reinit(tty, N_TTY)); in tty_ldisc_hangup()
709 WARN_ON(tty_ldisc_open(tty, tty->ldisc)); in tty_ldisc_hangup()
712 tty_ldisc_unlock(tty); in tty_ldisc_hangup()
714 tty_reset_termios(tty); in tty_ldisc_hangup()
716 tty_ldisc_debug(tty, "%p: re-opened\n", tty->ldisc); in tty_ldisc_hangup()
729 int tty_ldisc_setup(struct tty_struct *tty, struct tty_struct *o_tty) in tty_ldisc_setup() argument
731 struct tty_ldisc *ld = tty->ldisc; in tty_ldisc_setup()
734 retval = tty_ldisc_open(tty, ld); in tty_ldisc_setup()
741 tty_ldisc_close(tty, ld); in tty_ldisc_setup()
748 static void tty_ldisc_kill(struct tty_struct *tty) in tty_ldisc_kill() argument
753 tty_ldisc_close(tty, tty->ldisc); in tty_ldisc_kill()
754 tty_ldisc_put(tty->ldisc); in tty_ldisc_kill()
756 tty->ldisc = NULL; in tty_ldisc_kill()
759 tty_set_termios_ldisc(tty, N_TTY); in tty_ldisc_kill()
771 void tty_ldisc_release(struct tty_struct *tty) in tty_ldisc_release() argument
773 struct tty_struct *o_tty = tty->link; in tty_ldisc_release()
780 tty_ldisc_lock_pair(tty, o_tty); in tty_ldisc_release()
781 tty_ldisc_kill(tty); in tty_ldisc_release()
784 tty_ldisc_unlock_pair(tty, o_tty); in tty_ldisc_release()
789 tty_ldisc_debug(tty, "released\n"); in tty_ldisc_release()
800 void tty_ldisc_init(struct tty_struct *tty) in tty_ldisc_init() argument
802 struct tty_ldisc *ld = tty_ldisc_get(tty, N_TTY); in tty_ldisc_init()
805 tty->ldisc = ld; in tty_ldisc_init()
815 void tty_ldisc_deinit(struct tty_struct *tty) in tty_ldisc_deinit() argument
817 tty_ldisc_put(tty->ldisc); in tty_ldisc_deinit()
818 tty->ldisc = NULL; in tty_ldisc_deinit()