1 #include <linux/types.h>
2 #include <linux/errno.h>
4 #include <linux/sched.h>
10 #include <linux/string.h>
11 #include <linux/slab.h>
12 #include <linux/poll.h>
15 #include <linux/module.h>
16 #include <linux/device.h>
17 #include <linux/wait.h>
18 #include <linux/bitops.h>
41 static void put_ldisc(
struct tty_ldisc *ld)
60 module_put(ldo->
owner);
61 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
92 tty_ldiscs[disc] = new_ldisc;
93 new_ldisc->
num = disc;
95 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
125 tty_ldiscs[disc] =
NULL;
126 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
139 ldops = tty_ldiscs[disc];
142 if (try_module_get(ldops->
owner)) {
147 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
157 module_put(ldops->
owner);
158 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
174 static struct tty_ldisc *tty_ldisc_get(
int disc)
186 ldops = get_ldops(disc);
188 request_module(
"tty-ldisc-%d", disc);
189 ldops = get_ldops(disc);
191 return ERR_CAST(ldops);
207 static void *tty_ldiscs_seq_start(
struct seq_file *
m, loff_t *
pos)
212 static void *tty_ldiscs_seq_next(
struct seq_file *m,
void *
v, loff_t *pos)
218 static void tty_ldiscs_seq_stop(
struct seq_file *m,
void *v)
222 static int tty_ldiscs_seq_show(
struct seq_file *m,
void *v)
224 int i = *(loff_t *)v;
227 ldops = get_ldops(i);
236 .start = tty_ldiscs_seq_start,
237 .next = tty_ldiscs_seq_next,
238 .stop = tty_ldiscs_seq_stop,
239 .show = tty_ldiscs_seq_show,
244 return seq_open(file, &tty_ldiscs_seq_ops);
249 .open = proc_tty_ldiscs_open,
293 ld = get_ldisc(tty->
ldisc);
294 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
337 return tty_ldisc_try(tty);
357 static inline void tty_ldisc_put(
struct tty_ldisc *ld)
393 if (ld->
ops->flush_buffer)
394 ld->
ops->flush_buffer(tty);
413 static void tty_set_termios_ldisc(
struct tty_struct *tty,
int num)
416 tty->termios.c_line = num;
437 ret = ld->
ops->open(tty);
478 old = tty_ldisc_get(old->
ops->num);
480 tty_ldisc_assign(tty, old);
481 tty_set_termios_ldisc(tty, old->
ops->num);
482 if (tty_ldisc_open(tty, old) < 0) {
485 new_ldisc = tty_ldisc_get(
N_TTY);
486 if (IS_ERR(new_ldisc))
488 tty_ldisc_assign(tty, new_ldisc);
489 tty_set_termios_ldisc(tty,
N_TTY);
490 r = tty_ldisc_open(tty, new_ldisc);
492 panic(
"Couldn't open N_TTY ldisc for "
512 static int tty_ldisc_halt(
struct tty_struct *tty)
524 static void tty_ldisc_flush_works(
struct tty_struct *tty)
539 static int tty_ldisc_wait_idle(
struct tty_struct *tty,
long timeout)
544 return ret > 0 ? 0 : -
EBUSY;
564 int work, o_work = 0;
567 new_ldisc = tty_ldisc_get(ldisc);
568 if (IS_ERR(new_ldisc))
569 return PTR_ERR(new_ldisc);
584 if (tty->
ldisc->ops->num == ldisc) {
586 tty_ldisc_put(new_ldisc);
624 o_ldisc = tty->
ldisc;
638 work = tty_ldisc_halt(tty);
640 o_work = tty_ldisc_halt(o_tty);
649 tty_ldisc_flush_works(tty);
651 retval = tty_ldisc_wait_idle(tty, 5 *
HZ);
658 tty_ldisc_put(new_ldisc);
667 tty_ldisc_put(new_ldisc);
673 tty_ldisc_close(tty, o_ldisc);
676 tty_ldisc_assign(tty, new_ldisc);
677 tty_set_termios_ldisc(tty, ldisc);
679 retval = tty_ldisc_open(tty, new_ldisc);
682 tty_ldisc_put(new_ldisc);
683 tty_ldisc_restore(tty, o_ldisc);
690 if (tty->
ldisc->ops->num != o_ldisc->
ops->num && tty->
ops->set_ldisc)
691 tty->
ops->set_ldisc(tty);
693 tty_ldisc_put(o_ldisc);
722 static void tty_reset_termios(
struct tty_struct *tty)
725 tty->termios = tty->
driver->init_termios;
743 struct tty_ldisc *ld = tty_ldisc_get(ldisc);
748 tty_ldisc_close(tty, tty->
ldisc);
749 tty_ldisc_put(tty->
ldisc);
754 tty_ldisc_assign(tty, ld);
755 tty_set_termios_ldisc(tty, ldisc);
789 if (ld->
ops->flush_buffer)
790 ld->
ops->flush_buffer(tty);
793 ld->
ops->write_wakeup)
794 ld->
ops->write_wakeup(tty);
796 ld->
ops->hangup(tty);
833 long timeout = 3 *
HZ;
836 while (tty_ldisc_wait_idle(tty, timeout) == -
EBUSY) {
839 "%s: waiting (%s) for %s took too long, but we keep waiting...\n",
849 if (!tty_ldisc_reinit(tty, tty->termios.c_line))
850 err = tty_ldisc_open(tty, tty->
ldisc);
864 tty_reset_termios(tty);
882 retval = tty_ldisc_open(tty, ld);
887 retval = tty_ldisc_open(o_tty, o_tty->
ldisc);
889 tty_ldisc_close(tty, ld);
898 static void tty_ldisc_kill(
struct tty_struct *tty)
904 tty_ldisc_close(tty, tty->
ldisc);
905 tty_ldisc_put(tty->
ldisc);
910 tty_set_termios_ldisc(tty,
N_TTY);
934 tty_ldisc_flush_works(tty);
936 tty_ldisc_halt(o_tty);
937 tty_ldisc_flush_works(o_tty);
944 tty_ldisc_kill(o_tty);
963 panic(
"n_tty: init_tty");
964 tty_ldisc_assign(tty, ld);
976 put_ldisc(tty->
ldisc);
977 tty_ldisc_assign(tty,
NULL);