Lines Matching refs:tty

26 #define tty_ldisc_debug(tty, f, args...)	tty_debug(tty, f, ##args)  argument
28 #define tty_ldisc_debug(tty, f, args...) argument
166 static struct tty_ldisc *tty_ldisc_get(struct tty_struct *tty, int disc) in tty_ldisc_get() argument
194 ld->tty = tty; in tty_ldisc_get()
268 struct tty_ldisc *tty_ldisc_ref_wait(struct tty_struct *tty) in tty_ldisc_ref_wait() argument
272 ldsem_down_read(&tty->ldisc_sem, MAX_SCHEDULE_TIMEOUT); in tty_ldisc_ref_wait()
273 ld = tty->ldisc; in tty_ldisc_ref_wait()
275 ldsem_up_read(&tty->ldisc_sem); in tty_ldisc_ref_wait()
289 struct tty_ldisc *tty_ldisc_ref(struct tty_struct *tty) in tty_ldisc_ref() argument
293 if (ldsem_down_read_trylock(&tty->ldisc_sem)) { in tty_ldisc_ref()
294 ld = tty->ldisc; in tty_ldisc_ref()
296 ldsem_up_read(&tty->ldisc_sem); in tty_ldisc_ref()
312 ldsem_up_read(&ld->tty->ldisc_sem); in tty_ldisc_deref()
318 __tty_ldisc_lock(struct tty_struct *tty, unsigned long timeout) in __tty_ldisc_lock() argument
320 return ldsem_down_write(&tty->ldisc_sem, timeout); in __tty_ldisc_lock()
324 __tty_ldisc_lock_nested(struct tty_struct *tty, unsigned long timeout) in __tty_ldisc_lock_nested() argument
326 return ldsem_down_write_nested(&tty->ldisc_sem, in __tty_ldisc_lock_nested()
330 static inline void __tty_ldisc_unlock(struct tty_struct *tty) in __tty_ldisc_unlock() argument
332 ldsem_up_write(&tty->ldisc_sem); in __tty_ldisc_unlock()
335 int tty_ldisc_lock(struct tty_struct *tty, unsigned long timeout) in tty_ldisc_lock() argument
340 set_bit(TTY_LDISC_CHANGING, &tty->flags); in tty_ldisc_lock()
341 wake_up_interruptible_all(&tty->read_wait); in tty_ldisc_lock()
342 wake_up_interruptible_all(&tty->write_wait); in tty_ldisc_lock()
344 ret = __tty_ldisc_lock(tty, timeout); in tty_ldisc_lock()
347 set_bit(TTY_LDISC_HALTED, &tty->flags); in tty_ldisc_lock()
351 void tty_ldisc_unlock(struct tty_struct *tty) in tty_ldisc_unlock() argument
353 clear_bit(TTY_LDISC_HALTED, &tty->flags); in tty_ldisc_unlock()
355 clear_bit(TTY_LDISC_CHANGING, &tty->flags); in tty_ldisc_unlock()
356 __tty_ldisc_unlock(tty); in tty_ldisc_unlock()
360 tty_ldisc_lock_pair_timeout(struct tty_struct *tty, struct tty_struct *tty2, in tty_ldisc_lock_pair_timeout() argument
365 if (tty < tty2) { in tty_ldisc_lock_pair_timeout()
366 ret = __tty_ldisc_lock(tty, timeout); in tty_ldisc_lock_pair_timeout()
370 __tty_ldisc_unlock(tty); in tty_ldisc_lock_pair_timeout()
374 WARN_ON_ONCE(tty == tty2); in tty_ldisc_lock_pair_timeout()
375 if (tty2 && tty != tty2) { in tty_ldisc_lock_pair_timeout()
378 ret = __tty_ldisc_lock_nested(tty, timeout); in tty_ldisc_lock_pair_timeout()
383 ret = __tty_ldisc_lock(tty, timeout); in tty_ldisc_lock_pair_timeout()
389 set_bit(TTY_LDISC_HALTED, &tty->flags); in tty_ldisc_lock_pair_timeout()
395 static void tty_ldisc_lock_pair(struct tty_struct *tty, struct tty_struct *tty2) in tty_ldisc_lock_pair() argument
397 tty_ldisc_lock_pair_timeout(tty, tty2, MAX_SCHEDULE_TIMEOUT); in tty_ldisc_lock_pair()
400 static void tty_ldisc_unlock_pair(struct tty_struct *tty, in tty_ldisc_unlock_pair() argument
403 __tty_ldisc_unlock(tty); in tty_ldisc_unlock_pair()
416 void tty_ldisc_flush(struct tty_struct *tty) in tty_ldisc_flush() argument
418 struct tty_ldisc *ld = tty_ldisc_ref(tty); in tty_ldisc_flush()
420 tty_buffer_flush(tty, ld); in tty_ldisc_flush()
442 static void tty_set_termios_ldisc(struct tty_struct *tty, int disc) in tty_set_termios_ldisc() argument
444 down_write(&tty->termios_rwsem); in tty_set_termios_ldisc()
445 tty->termios.c_line = disc; in tty_set_termios_ldisc()
446 up_write(&tty->termios_rwsem); in tty_set_termios_ldisc()
448 tty->disc_data = NULL; in tty_set_termios_ldisc()
449 tty->receive_room = 0; in tty_set_termios_ldisc()
463 static int tty_ldisc_open(struct tty_struct *tty, struct tty_ldisc *ld) in tty_ldisc_open() argument
465 WARN_ON(test_and_set_bit(TTY_LDISC_OPEN, &tty->flags)); in tty_ldisc_open()
469 ret = ld->ops->open(tty); in tty_ldisc_open()
471 clear_bit(TTY_LDISC_OPEN, &tty->flags); in tty_ldisc_open()
473 tty_ldisc_debug(tty, "%p: opened\n", ld); in tty_ldisc_open()
488 static void tty_ldisc_close(struct tty_struct *tty, struct tty_ldisc *ld) in tty_ldisc_close() argument
490 lockdep_assert_held_write(&tty->ldisc_sem); in tty_ldisc_close()
491 WARN_ON(!test_bit(TTY_LDISC_OPEN, &tty->flags)); in tty_ldisc_close()
492 clear_bit(TTY_LDISC_OPEN, &tty->flags); in tty_ldisc_close()
494 ld->ops->close(tty); in tty_ldisc_close()
495 tty_ldisc_debug(tty, "%p: closed\n", ld); in tty_ldisc_close()
507 static int tty_ldisc_failto(struct tty_struct *tty, int ld) in tty_ldisc_failto() argument
509 struct tty_ldisc *disc = tty_ldisc_get(tty, ld); in tty_ldisc_failto()
512 lockdep_assert_held_write(&tty->ldisc_sem); in tty_ldisc_failto()
515 tty->ldisc = disc; in tty_ldisc_failto()
516 tty_set_termios_ldisc(tty, ld); in tty_ldisc_failto()
517 if ((r = tty_ldisc_open(tty, disc)) < 0) in tty_ldisc_failto()
531 static void tty_ldisc_restore(struct tty_struct *tty, struct tty_ldisc *old) in tty_ldisc_restore() argument
534 if (tty_ldisc_failto(tty, old->ops->num) < 0) { in tty_ldisc_restore()
535 const char *name = tty_name(tty); in tty_ldisc_restore()
541 if (tty_ldisc_failto(tty, N_TTY) < 0 && in tty_ldisc_restore()
542 tty_ldisc_failto(tty, N_NULL) < 0) in tty_ldisc_restore()
558 int tty_set_ldisc(struct tty_struct *tty, int disc) in tty_set_ldisc() argument
563 new_ldisc = tty_ldisc_get(tty, disc); in tty_set_ldisc()
567 tty_lock(tty); in tty_set_ldisc()
568 retval = tty_ldisc_lock(tty, 5 * HZ); in tty_set_ldisc()
572 if (!tty->ldisc) { in tty_set_ldisc()
578 if (tty->ldisc->ops->num == disc) in tty_set_ldisc()
581 if (test_bit(TTY_HUPPED, &tty->flags)) { in tty_set_ldisc()
587 old_ldisc = tty->ldisc; in tty_set_ldisc()
590 tty_ldisc_close(tty, old_ldisc); in tty_set_ldisc()
593 tty->ldisc = new_ldisc; in tty_set_ldisc()
594 tty_set_termios_ldisc(tty, disc); in tty_set_ldisc()
596 retval = tty_ldisc_open(tty, new_ldisc); in tty_set_ldisc()
600 tty_ldisc_restore(tty, old_ldisc); in tty_set_ldisc()
603 if (tty->ldisc->ops->num != old_ldisc->ops->num && tty->ops->set_ldisc) { in tty_set_ldisc()
604 down_read(&tty->termios_rwsem); in tty_set_ldisc()
605 tty->ops->set_ldisc(tty); in tty_set_ldisc()
606 up_read(&tty->termios_rwsem); in tty_set_ldisc()
616 tty_ldisc_unlock(tty); in tty_set_ldisc()
620 tty_buffer_restart_work(tty->port); in tty_set_ldisc()
623 tty_unlock(tty); in tty_set_ldisc()
634 static void tty_ldisc_kill(struct tty_struct *tty) in tty_ldisc_kill() argument
636 lockdep_assert_held_write(&tty->ldisc_sem); in tty_ldisc_kill()
637 if (!tty->ldisc) in tty_ldisc_kill()
642 tty_ldisc_close(tty, tty->ldisc); in tty_ldisc_kill()
643 tty_ldisc_put(tty->ldisc); in tty_ldisc_kill()
645 tty->ldisc = NULL; in tty_ldisc_kill()
655 static void tty_reset_termios(struct tty_struct *tty) in tty_reset_termios() argument
657 down_write(&tty->termios_rwsem); in tty_reset_termios()
658 tty->termios = tty->driver->init_termios; in tty_reset_termios()
659 tty->termios.c_ispeed = tty_termios_input_baud_rate(&tty->termios); in tty_reset_termios()
660 tty->termios.c_ospeed = tty_termios_baud_rate(&tty->termios); in tty_reset_termios()
661 up_write(&tty->termios_rwsem); in tty_reset_termios()
679 int tty_ldisc_reinit(struct tty_struct *tty, int disc) in tty_ldisc_reinit() argument
684 lockdep_assert_held_write(&tty->ldisc_sem); in tty_ldisc_reinit()
685 ld = tty_ldisc_get(tty, disc); in tty_ldisc_reinit()
691 if (tty->ldisc) { in tty_ldisc_reinit()
692 tty_ldisc_close(tty, tty->ldisc); in tty_ldisc_reinit()
693 tty_ldisc_put(tty->ldisc); in tty_ldisc_reinit()
697 tty->ldisc = ld; in tty_ldisc_reinit()
698 tty_set_termios_ldisc(tty, disc); in tty_ldisc_reinit()
699 retval = tty_ldisc_open(tty, tty->ldisc); in tty_ldisc_reinit()
701 tty_ldisc_put(tty->ldisc); in tty_ldisc_reinit()
702 tty->ldisc = NULL; in tty_ldisc_reinit()
722 void tty_ldisc_hangup(struct tty_struct *tty, bool reinit) in tty_ldisc_hangup() argument
726 tty_ldisc_debug(tty, "%p: hangup\n", tty->ldisc); in tty_ldisc_hangup()
728 ld = tty_ldisc_ref(tty); in tty_ldisc_hangup()
731 ld->ops->flush_buffer(tty); in tty_ldisc_hangup()
732 tty_driver_flush_buffer(tty); in tty_ldisc_hangup()
733 if ((test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) && in tty_ldisc_hangup()
735 ld->ops->write_wakeup(tty); in tty_ldisc_hangup()
737 ld->ops->hangup(tty); in tty_ldisc_hangup()
741 wake_up_interruptible_poll(&tty->write_wait, EPOLLOUT); in tty_ldisc_hangup()
742 wake_up_interruptible_poll(&tty->read_wait, EPOLLIN); in tty_ldisc_hangup()
750 tty_ldisc_lock(tty, MAX_SCHEDULE_TIMEOUT); in tty_ldisc_hangup()
752 if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) in tty_ldisc_hangup()
753 tty_reset_termios(tty); in tty_ldisc_hangup()
755 if (tty->ldisc) { in tty_ldisc_hangup()
757 if (tty_ldisc_reinit(tty, tty->termios.c_line) < 0 && in tty_ldisc_hangup()
758 tty_ldisc_reinit(tty, N_TTY) < 0) in tty_ldisc_hangup()
759 WARN_ON(tty_ldisc_reinit(tty, N_NULL) < 0); in tty_ldisc_hangup()
761 tty_ldisc_kill(tty); in tty_ldisc_hangup()
763 tty_ldisc_unlock(tty); in tty_ldisc_hangup()
776 int tty_ldisc_setup(struct tty_struct *tty, struct tty_struct *o_tty) in tty_ldisc_setup() argument
778 int retval = tty_ldisc_open(tty, tty->ldisc); in tty_ldisc_setup()
789 tty_ldisc_close(tty, tty->ldisc); in tty_ldisc_setup()
804 void tty_ldisc_release(struct tty_struct *tty) in tty_ldisc_release() argument
806 struct tty_struct *o_tty = tty->link; in tty_ldisc_release()
813 tty_ldisc_lock_pair(tty, o_tty); in tty_ldisc_release()
814 tty_ldisc_kill(tty); in tty_ldisc_release()
817 tty_ldisc_unlock_pair(tty, o_tty); in tty_ldisc_release()
822 tty_ldisc_debug(tty, "released\n"); in tty_ldisc_release()
834 int tty_ldisc_init(struct tty_struct *tty) in tty_ldisc_init() argument
836 struct tty_ldisc *ld = tty_ldisc_get(tty, N_TTY); in tty_ldisc_init()
839 tty->ldisc = ld; in tty_ldisc_init()
850 void tty_ldisc_deinit(struct tty_struct *tty) in tty_ldisc_deinit() argument
853 if (tty->ldisc) in tty_ldisc_deinit()
854 tty_ldisc_put(tty->ldisc); in tty_ldisc_deinit()
855 tty->ldisc = NULL; in tty_ldisc_deinit()