drm/radeon/kms: fix hotspot handling on pre-avivo chips
[linux-2.6] / drivers / char / tty_ldisc.c
1 #include <linux/types.h>
2 #include <linux/major.h>
3 #include <linux/errno.h>
4 #include <linux/signal.h>
5 #include <linux/fcntl.h>
6 #include <linux/sched.h>
7 #include <linux/interrupt.h>
8 #include <linux/tty.h>
9 #include <linux/tty_driver.h>
10 #include <linux/tty_flip.h>
11 #include <linux/devpts_fs.h>
12 #include <linux/file.h>
13 #include <linux/console.h>
14 #include <linux/timer.h>
15 #include <linux/ctype.h>
16 #include <linux/kd.h>
17 #include <linux/mm.h>
18 #include <linux/string.h>
19 #include <linux/slab.h>
20 #include <linux/poll.h>
21 #include <linux/proc_fs.h>
22 #include <linux/init.h>
23 #include <linux/module.h>
24 #include <linux/smp_lock.h>
25 #include <linux/device.h>
26 #include <linux/wait.h>
27 #include <linux/bitops.h>
28 #include <linux/delay.h>
29 #include <linux/seq_file.h>
30
31 #include <linux/uaccess.h>
32 #include <asm/system.h>
33
34 #include <linux/kbd_kern.h>
35 #include <linux/vt_kern.h>
36 #include <linux/selection.h>
37
38 #include <linux/kmod.h>
39 #include <linux/nsproxy.h>
40
41 /*
42  *      This guards the refcounted line discipline lists. The lock
43  *      must be taken with irqs off because there are hangup path
44  *      callers who will do ldisc lookups and cannot sleep.
45  */
46
47 static DEFINE_SPINLOCK(tty_ldisc_lock);
48 static DECLARE_WAIT_QUEUE_HEAD(tty_ldisc_wait);
49 /* Line disc dispatch table */
50 static struct tty_ldisc_ops *tty_ldiscs[NR_LDISCS];
51
52 /**
53  *      tty_register_ldisc      -       install a line discipline
54  *      @disc: ldisc number
55  *      @new_ldisc: pointer to the ldisc object
56  *
57  *      Installs a new line discipline into the kernel. The discipline
58  *      is set up as unreferenced and then made available to the kernel
59  *      from this point onwards.
60  *
61  *      Locking:
62  *              takes tty_ldisc_lock to guard against ldisc races
63  */
64
65 int tty_register_ldisc(int disc, struct tty_ldisc_ops *new_ldisc)
66 {
67         unsigned long flags;
68         int ret = 0;
69
70         if (disc < N_TTY || disc >= NR_LDISCS)
71                 return -EINVAL;
72
73         spin_lock_irqsave(&tty_ldisc_lock, flags);
74         tty_ldiscs[disc] = new_ldisc;
75         new_ldisc->num = disc;
76         new_ldisc->refcount = 0;
77         spin_unlock_irqrestore(&tty_ldisc_lock, flags);
78
79         return ret;
80 }
81 EXPORT_SYMBOL(tty_register_ldisc);
82
83 /**
84  *      tty_unregister_ldisc    -       unload a line discipline
85  *      @disc: ldisc number
86  *      @new_ldisc: pointer to the ldisc object
87  *
88  *      Remove a line discipline from the kernel providing it is not
89  *      currently in use.
90  *
91  *      Locking:
92  *              takes tty_ldisc_lock to guard against ldisc races
93  */
94
95 int tty_unregister_ldisc(int disc)
96 {
97         unsigned long flags;
98         int ret = 0;
99
100         if (disc < N_TTY || disc >= NR_LDISCS)
101                 return -EINVAL;
102
103         spin_lock_irqsave(&tty_ldisc_lock, flags);
104         if (tty_ldiscs[disc]->refcount)
105                 ret = -EBUSY;
106         else
107                 tty_ldiscs[disc] = NULL;
108         spin_unlock_irqrestore(&tty_ldisc_lock, flags);
109
110         return ret;
111 }
112 EXPORT_SYMBOL(tty_unregister_ldisc);
113
114
115 /**
116  *      tty_ldisc_try_get       -       try and reference an ldisc
117  *      @disc: ldisc number
118  *
119  *      Attempt to open and lock a line discipline into place. Return
120  *      the line discipline refcounted or an error.
121  */
122
123 static struct tty_ldisc *tty_ldisc_try_get(int disc)
124 {
125         unsigned long flags;
126         struct tty_ldisc *ld;
127         struct tty_ldisc_ops *ldops;
128         int err = -EINVAL;
129
130         ld = kmalloc(sizeof(struct tty_ldisc), GFP_KERNEL);
131         if (ld == NULL)
132                 return ERR_PTR(-ENOMEM);
133
134         spin_lock_irqsave(&tty_ldisc_lock, flags);
135         ld->ops = NULL;
136         ldops = tty_ldiscs[disc];
137         /* Check the entry is defined */
138         if (ldops) {
139                 /* If the module is being unloaded we can't use it */
140                 if (!try_module_get(ldops->owner))
141                         err = -EAGAIN;
142                 else {
143                         /* lock it */
144                         ldops->refcount++;
145                         ld->ops = ldops;
146                         ld->refcount = 0;
147                         err = 0;
148                 }
149         }
150         spin_unlock_irqrestore(&tty_ldisc_lock, flags);
151         if (err) {
152                 kfree(ld);
153                 return ERR_PTR(err);
154         }
155         return ld;
156 }
157
158 /**
159  *      tty_ldisc_get           -       take a reference to an ldisc
160  *      @disc: ldisc number
161  *
162  *      Takes a reference to a line discipline. Deals with refcounts and
163  *      module locking counts. Returns NULL if the discipline is not available.
164  *      Returns a pointer to the discipline and bumps the ref count if it is
165  *      available
166  *
167  *      Locking:
168  *              takes tty_ldisc_lock to guard against ldisc races
169  */
170
171 static struct tty_ldisc *tty_ldisc_get(int disc)
172 {
173         struct tty_ldisc *ld;
174
175         if (disc < N_TTY || disc >= NR_LDISCS)
176                 return ERR_PTR(-EINVAL);
177         ld = tty_ldisc_try_get(disc);
178         if (IS_ERR(ld)) {
179                 request_module("tty-ldisc-%d", disc);
180                 ld = tty_ldisc_try_get(disc);
181         }
182         return ld;
183 }
184
185 /**
186  *      tty_ldisc_put           -       drop ldisc reference
187  *      @ld: ldisc
188  *
189  *      Drop a reference to a line discipline. Manage refcounts and
190  *      module usage counts. Free the ldisc once the recount hits zero.
191  *
192  *      Locking:
193  *              takes tty_ldisc_lock to guard against ldisc races
194  */
195
196 static void tty_ldisc_put(struct tty_ldisc *ld)
197 {
198         unsigned long flags;
199         int disc = ld->ops->num;
200         struct tty_ldisc_ops *ldo;
201
202         BUG_ON(disc < N_TTY || disc >= NR_LDISCS);
203
204         spin_lock_irqsave(&tty_ldisc_lock, flags);
205         ldo = tty_ldiscs[disc];
206         BUG_ON(ldo->refcount == 0);
207         ldo->refcount--;
208         module_put(ldo->owner);
209         spin_unlock_irqrestore(&tty_ldisc_lock, flags);
210         WARN_ON(ld->refcount);
211         kfree(ld);
212 }
213
214 static void *tty_ldiscs_seq_start(struct seq_file *m, loff_t *pos)
215 {
216         return (*pos < NR_LDISCS) ? pos : NULL;
217 }
218
219 static void *tty_ldiscs_seq_next(struct seq_file *m, void *v, loff_t *pos)
220 {
221         (*pos)++;
222         return (*pos < NR_LDISCS) ? pos : NULL;
223 }
224
225 static void tty_ldiscs_seq_stop(struct seq_file *m, void *v)
226 {
227 }
228
229 static int tty_ldiscs_seq_show(struct seq_file *m, void *v)
230 {
231         int i = *(loff_t *)v;
232         struct tty_ldisc *ld;
233
234         ld = tty_ldisc_try_get(i);
235         if (IS_ERR(ld))
236                 return 0;
237         seq_printf(m, "%-10s %2d\n", ld->ops->name ? ld->ops->name : "???", i);
238         tty_ldisc_put(ld);
239         return 0;
240 }
241
242 static const struct seq_operations tty_ldiscs_seq_ops = {
243         .start  = tty_ldiscs_seq_start,
244         .next   = tty_ldiscs_seq_next,
245         .stop   = tty_ldiscs_seq_stop,
246         .show   = tty_ldiscs_seq_show,
247 };
248
249 static int proc_tty_ldiscs_open(struct inode *inode, struct file *file)
250 {
251         return seq_open(file, &tty_ldiscs_seq_ops);
252 }
253
254 const struct file_operations tty_ldiscs_proc_fops = {
255         .owner          = THIS_MODULE,
256         .open           = proc_tty_ldiscs_open,
257         .read           = seq_read,
258         .llseek         = seq_lseek,
259         .release        = seq_release,
260 };
261
262 /**
263  *      tty_ldisc_assign        -       set ldisc on a tty
264  *      @tty: tty to assign
265  *      @ld: line discipline
266  *
267  *      Install an instance of a line discipline into a tty structure. The
268  *      ldisc must have a reference count above zero to ensure it remains.
269  *      The tty instance refcount starts at zero.
270  *
271  *      Locking:
272  *              Caller must hold references
273  */
274
275 static void tty_ldisc_assign(struct tty_struct *tty, struct tty_ldisc *ld)
276 {
277         tty->ldisc = ld;
278 }
279
280 /**
281  *      tty_ldisc_try           -       internal helper
282  *      @tty: the tty
283  *
284  *      Make a single attempt to grab and bump the refcount on
285  *      the tty ldisc. Return 0 on failure or 1 on success. This is
286  *      used to implement both the waiting and non waiting versions
287  *      of tty_ldisc_ref
288  *
289  *      Locking: takes tty_ldisc_lock
290  */
291
292 static int tty_ldisc_try(struct tty_struct *tty)
293 {
294         unsigned long flags;
295         struct tty_ldisc *ld;
296         int ret = 0;
297
298         spin_lock_irqsave(&tty_ldisc_lock, flags);
299         ld = tty->ldisc;
300         if (test_bit(TTY_LDISC, &tty->flags)) {
301                 ld->refcount++;
302                 ret = 1;
303         }
304         spin_unlock_irqrestore(&tty_ldisc_lock, flags);
305         return ret;
306 }
307
308 /**
309  *      tty_ldisc_ref_wait      -       wait for the tty ldisc
310  *      @tty: tty device
311  *
312  *      Dereference the line discipline for the terminal and take a
313  *      reference to it. If the line discipline is in flux then
314  *      wait patiently until it changes.
315  *
316  *      Note: Must not be called from an IRQ/timer context. The caller
317  *      must also be careful not to hold other locks that will deadlock
318  *      against a discipline change, such as an existing ldisc reference
319  *      (which we check for)
320  *
321  *      Locking: call functions take tty_ldisc_lock
322  */
323
324 struct tty_ldisc *tty_ldisc_ref_wait(struct tty_struct *tty)
325 {
326         /* wait_event is a macro */
327         wait_event(tty_ldisc_wait, tty_ldisc_try(tty));
328         WARN_ON(tty->ldisc->refcount == 0);
329         return tty->ldisc;
330 }
331 EXPORT_SYMBOL_GPL(tty_ldisc_ref_wait);
332
333 /**
334  *      tty_ldisc_ref           -       get the tty ldisc
335  *      @tty: tty device
336  *
337  *      Dereference the line discipline for the terminal and take a
338  *      reference to it. If the line discipline is in flux then
339  *      return NULL. Can be called from IRQ and timer functions.
340  *
341  *      Locking: called functions take tty_ldisc_lock
342  */
343
344 struct tty_ldisc *tty_ldisc_ref(struct tty_struct *tty)
345 {
346         if (tty_ldisc_try(tty))
347                 return tty->ldisc;
348         return NULL;
349 }
350 EXPORT_SYMBOL_GPL(tty_ldisc_ref);
351
352 /**
353  *      tty_ldisc_deref         -       free a tty ldisc reference
354  *      @ld: reference to free up
355  *
356  *      Undoes the effect of tty_ldisc_ref or tty_ldisc_ref_wait. May
357  *      be called in IRQ context.
358  *
359  *      Locking: takes tty_ldisc_lock
360  */
361
362 void tty_ldisc_deref(struct tty_ldisc *ld)
363 {
364         unsigned long flags;
365
366         BUG_ON(ld == NULL);
367
368         spin_lock_irqsave(&tty_ldisc_lock, flags);
369         if (ld->refcount == 0)
370                 printk(KERN_ERR "tty_ldisc_deref: no references.\n");
371         else
372                 ld->refcount--;
373         if (ld->refcount == 0)
374                 wake_up(&tty_ldisc_wait);
375         spin_unlock_irqrestore(&tty_ldisc_lock, flags);
376 }
377 EXPORT_SYMBOL_GPL(tty_ldisc_deref);
378
379 /**
380  *      tty_ldisc_enable        -       allow ldisc use
381  *      @tty: terminal to activate ldisc on
382  *
383  *      Set the TTY_LDISC flag when the line discipline can be called
384  *      again. Do necessary wakeups for existing sleepers. Clear the LDISC
385  *      changing flag to indicate any ldisc change is now over.
386  *
387  *      Note: nobody should set the TTY_LDISC bit except via this function.
388  *      Clearing directly is allowed.
389  */
390
391 void tty_ldisc_enable(struct tty_struct *tty)
392 {
393         set_bit(TTY_LDISC, &tty->flags);
394         clear_bit(TTY_LDISC_CHANGING, &tty->flags);
395         wake_up(&tty_ldisc_wait);
396 }
397
398 /**
399  *      tty_ldisc_flush -       flush line discipline queue
400  *      @tty: tty
401  *
402  *      Flush the line discipline queue (if any) for this tty. If there
403  *      is no line discipline active this is a no-op.
404  */
405
406 void tty_ldisc_flush(struct tty_struct *tty)
407 {
408         struct tty_ldisc *ld = tty_ldisc_ref(tty);
409         if (ld) {
410                 if (ld->ops->flush_buffer)
411                         ld->ops->flush_buffer(tty);
412                 tty_ldisc_deref(ld);
413         }
414         tty_buffer_flush(tty);
415 }
416 EXPORT_SYMBOL_GPL(tty_ldisc_flush);
417
418 /**
419  *      tty_set_termios_ldisc           -       set ldisc field
420  *      @tty: tty structure
421  *      @num: line discipline number
422  *
423  *      This is probably overkill for real world processors but
424  *      they are not on hot paths so a little discipline won't do
425  *      any harm.
426  *
427  *      Locking: takes termios_mutex
428  */
429
430 static void tty_set_termios_ldisc(struct tty_struct *tty, int num)
431 {
432         mutex_lock(&tty->termios_mutex);
433         tty->termios->c_line = num;
434         mutex_unlock(&tty->termios_mutex);
435 }
436
437 /**
438  *      tty_ldisc_open          -       open a line discipline
439  *      @tty: tty we are opening the ldisc on
440  *      @ld: discipline to open
441  *
442  *      A helper opening method. Also a convenient debugging and check
443  *      point.
444  */
445
446 static int tty_ldisc_open(struct tty_struct *tty, struct tty_ldisc *ld)
447 {
448         WARN_ON(test_and_set_bit(TTY_LDISC_OPEN, &tty->flags));
449         if (ld->ops->open)
450                 return ld->ops->open(tty);
451         return 0;
452 }
453
454 /**
455  *      tty_ldisc_close         -       close a line discipline
456  *      @tty: tty we are opening the ldisc on
457  *      @ld: discipline to close
458  *
459  *      A helper close method. Also a convenient debugging and check
460  *      point.
461  */
462
463 static void tty_ldisc_close(struct tty_struct *tty, struct tty_ldisc *ld)
464 {
465         WARN_ON(!test_bit(TTY_LDISC_OPEN, &tty->flags));
466         clear_bit(TTY_LDISC_OPEN, &tty->flags);
467         if (ld->ops->close)
468                 ld->ops->close(tty);
469 }
470
471 /**
472  *      tty_ldisc_restore       -       helper for tty ldisc change
473  *      @tty: tty to recover
474  *      @old: previous ldisc
475  *
476  *      Restore the previous line discipline or N_TTY when a line discipline
477  *      change fails due to an open error
478  */
479
480 static void tty_ldisc_restore(struct tty_struct *tty, struct tty_ldisc *old)
481 {
482         char buf[64];
483         struct tty_ldisc *new_ldisc;
484         int r;
485
486         /* There is an outstanding reference here so this is safe */
487         old = tty_ldisc_get(old->ops->num);
488         WARN_ON(IS_ERR(old));
489         tty_ldisc_assign(tty, old);
490         tty_set_termios_ldisc(tty, old->ops->num);
491         if (tty_ldisc_open(tty, old) < 0) {
492                 tty_ldisc_put(old);
493                 /* This driver is always present */
494                 new_ldisc = tty_ldisc_get(N_TTY);
495                 if (IS_ERR(new_ldisc))
496                         panic("n_tty: get");
497                 tty_ldisc_assign(tty, new_ldisc);
498                 tty_set_termios_ldisc(tty, N_TTY);
499                 r = tty_ldisc_open(tty, new_ldisc);
500                 if (r < 0)
501                         panic("Couldn't open N_TTY ldisc for "
502                               "%s --- error %d.",
503                               tty_name(tty, buf), r);
504         }
505 }
506
507 /**
508  *      tty_ldisc_halt          -       shut down the line discipline
509  *      @tty: tty device
510  *
511  *      Shut down the line discipline and work queue for this tty device.
512  *      The TTY_LDISC flag being cleared ensures no further references can
513  *      be obtained while the delayed work queue halt ensures that no more
514  *      data is fed to the ldisc.
515  *
516  *      In order to wait for any existing references to complete see
517  *      tty_ldisc_wait_idle.
518  */
519
520 static int tty_ldisc_halt(struct tty_struct *tty)
521 {
522         clear_bit(TTY_LDISC, &tty->flags);
523         return cancel_delayed_work(&tty->buf.work);
524 }
525
526 /**
527  *      tty_ldisc_wait_idle     -       wait for the ldisc to become idle
528  *      @tty: tty to wait for
529  *
530  *      Wait for the line discipline to become idle. The discipline must
531  *      have been halted for this to guarantee it remains idle.
532  *
533  *      tty_ldisc_lock protects the ref counts currently.
534  */
535
536 static int tty_ldisc_wait_idle(struct tty_struct *tty)
537 {
538         unsigned long flags;
539         spin_lock_irqsave(&tty_ldisc_lock, flags);
540         while (tty->ldisc->refcount) {
541                 spin_unlock_irqrestore(&tty_ldisc_lock, flags);
542                 if (wait_event_timeout(tty_ldisc_wait,
543                                 tty->ldisc->refcount == 0, 5 * HZ) == 0)
544                         return -EBUSY;
545                 spin_lock_irqsave(&tty_ldisc_lock, flags);
546         }
547         spin_unlock_irqrestore(&tty_ldisc_lock, flags);
548         return 0;
549 }
550
551 /**
552  *      tty_set_ldisc           -       set line discipline
553  *      @tty: the terminal to set
554  *      @ldisc: the line discipline
555  *
556  *      Set the discipline of a tty line. Must be called from a process
557  *      context. The ldisc change logic has to protect itself against any
558  *      overlapping ldisc change (including on the other end of pty pairs),
559  *      the close of one side of a tty/pty pair, and eventually hangup.
560  *
561  *      Locking: takes tty_ldisc_lock, termios_mutex
562  */
563
564 int tty_set_ldisc(struct tty_struct *tty, int ldisc)
565 {
566         int retval;
567         struct tty_ldisc *o_ldisc, *new_ldisc;
568         int work, o_work = 0;
569         struct tty_struct *o_tty;
570
571         new_ldisc = tty_ldisc_get(ldisc);
572         if (IS_ERR(new_ldisc))
573                 return PTR_ERR(new_ldisc);
574
575         /*
576          *      We need to look at the tty locking here for pty/tty pairs
577          *      when both sides try to change in parallel.
578          */
579
580         o_tty = tty->link;      /* o_tty is the pty side or NULL */
581
582
583         /*
584          *      Check the no-op case
585          */
586
587         if (tty->ldisc->ops->num == ldisc) {
588                 tty_ldisc_put(new_ldisc);
589                 return 0;
590         }
591
592         /*
593          *      Problem: What do we do if this blocks ?
594          *      We could deadlock here
595          */
596
597         tty_wait_until_sent(tty, 0);
598
599         mutex_lock(&tty->ldisc_mutex);
600
601         /*
602          *      We could be midstream of another ldisc change which has
603          *      dropped the lock during processing. If so we need to wait.
604          */
605
606         while (test_bit(TTY_LDISC_CHANGING, &tty->flags)) {
607                 mutex_unlock(&tty->ldisc_mutex);
608                 wait_event(tty_ldisc_wait,
609                         test_bit(TTY_LDISC_CHANGING, &tty->flags) == 0);
610                 mutex_lock(&tty->ldisc_mutex);
611         }
612         set_bit(TTY_LDISC_CHANGING, &tty->flags);
613
614         /*
615          *      No more input please, we are switching. The new ldisc
616          *      will update this value in the ldisc open function
617          */
618
619         tty->receive_room = 0;
620
621         o_ldisc = tty->ldisc;
622         /*
623          *      Make sure we don't change while someone holds a
624          *      reference to the line discipline. The TTY_LDISC bit
625          *      prevents anyone taking a reference once it is clear.
626          *      We need the lock to avoid racing reference takers.
627          *
628          *      We must clear the TTY_LDISC bit here to avoid a livelock
629          *      with a userspace app continually trying to use the tty in
630          *      parallel to the change and re-referencing the tty.
631          */
632
633         work = tty_ldisc_halt(tty);
634         if (o_tty)
635                 o_work = tty_ldisc_halt(o_tty);
636
637         /*
638          * Wait for ->hangup_work and ->buf.work handlers to terminate.
639          * We must drop the mutex here in case a hangup is also in process.
640          */
641
642         mutex_unlock(&tty->ldisc_mutex);
643
644         flush_scheduled_work();
645
646         /* Let any existing reference holders finish */
647         retval = tty_ldisc_wait_idle(tty);
648         if (retval < 0) {
649                 clear_bit(TTY_LDISC_CHANGING, &tty->flags);
650                 tty_ldisc_put(new_ldisc);
651                 return retval;
652         }
653
654         mutex_lock(&tty->ldisc_mutex);
655         if (test_bit(TTY_HUPPED, &tty->flags)) {
656                 /* We were raced by the hangup method. It will have stomped
657                    the ldisc data and closed the ldisc down */
658                 clear_bit(TTY_LDISC_CHANGING, &tty->flags);
659                 mutex_unlock(&tty->ldisc_mutex);
660                 tty_ldisc_put(new_ldisc);
661                 return -EIO;
662         }
663
664         /* Shutdown the current discipline. */
665         tty_ldisc_close(tty, o_ldisc);
666
667         /* Now set up the new line discipline. */
668         tty_ldisc_assign(tty, new_ldisc);
669         tty_set_termios_ldisc(tty, ldisc);
670
671         retval = tty_ldisc_open(tty, new_ldisc);
672         if (retval < 0) {
673                 /* Back to the old one or N_TTY if we can't */
674                 tty_ldisc_put(new_ldisc);
675                 tty_ldisc_restore(tty, o_ldisc);
676         }
677
678         /* At this point we hold a reference to the new ldisc and a
679            a reference to the old ldisc. If we ended up flipping back
680            to the existing ldisc we have two references to it */
681
682         if (tty->ldisc->ops->num != o_ldisc->ops->num && tty->ops->set_ldisc)
683                 tty->ops->set_ldisc(tty);
684
685         tty_ldisc_put(o_ldisc);
686
687         /*
688          *      Allow ldisc referencing to occur again
689          */
690
691         tty_ldisc_enable(tty);
692         if (o_tty)
693                 tty_ldisc_enable(o_tty);
694
695         /* Restart the work queue in case no characters kick it off. Safe if
696            already running */
697         if (work)
698                 schedule_delayed_work(&tty->buf.work, 1);
699         if (o_work)
700                 schedule_delayed_work(&o_tty->buf.work, 1);
701         mutex_unlock(&tty->ldisc_mutex);
702         return retval;
703 }
704
705 /**
706  *      tty_reset_termios       -       reset terminal state
707  *      @tty: tty to reset
708  *
709  *      Restore a terminal to the driver default state.
710  */
711
712 static void tty_reset_termios(struct tty_struct *tty)
713 {
714         mutex_lock(&tty->termios_mutex);
715         *tty->termios = tty->driver->init_termios;
716         tty->termios->c_ispeed = tty_termios_input_baud_rate(tty->termios);
717         tty->termios->c_ospeed = tty_termios_baud_rate(tty->termios);
718         mutex_unlock(&tty->termios_mutex);
719 }
720
721
722 /**
723  *      tty_ldisc_reinit        -       reinitialise the tty ldisc
724  *      @tty: tty to reinit
725  *
726  *      Switch the tty back to N_TTY line discipline and leave the
727  *      ldisc state closed
728  */
729
730 static void tty_ldisc_reinit(struct tty_struct *tty)
731 {
732         struct tty_ldisc *ld;
733
734         tty_ldisc_close(tty, tty->ldisc);
735         tty_ldisc_put(tty->ldisc);
736         tty->ldisc = NULL;
737         /*
738          *      Switch the line discipline back
739          */
740         ld = tty_ldisc_get(N_TTY);
741         BUG_ON(IS_ERR(ld));
742         tty_ldisc_assign(tty, ld);
743         tty_set_termios_ldisc(tty, N_TTY);
744 }
745
746 /**
747  *      tty_ldisc_hangup                -       hangup ldisc reset
748  *      @tty: tty being hung up
749  *
750  *      Some tty devices reset their termios when they receive a hangup
751  *      event. In that situation we must also switch back to N_TTY properly
752  *      before we reset the termios data.
753  *
754  *      Locking: We can take the ldisc mutex as the rest of the code is
755  *      careful to allow for this.
756  *
757  *      In the pty pair case this occurs in the close() path of the
758  *      tty itself so we must be careful about locking rules.
759  */
760
761 void tty_ldisc_hangup(struct tty_struct *tty)
762 {
763         struct tty_ldisc *ld;
764
765         /*
766          * FIXME! What are the locking issues here? This may me overdoing
767          * things... This question is especially important now that we've
768          * removed the irqlock.
769          */
770         ld = tty_ldisc_ref(tty);
771         if (ld != NULL) {
772                 /* We may have no line discipline at this point */
773                 if (ld->ops->flush_buffer)
774                         ld->ops->flush_buffer(tty);
775                 tty_driver_flush_buffer(tty);
776                 if ((test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) &&
777                     ld->ops->write_wakeup)
778                         ld->ops->write_wakeup(tty);
779                 if (ld->ops->hangup)
780                         ld->ops->hangup(tty);
781                 tty_ldisc_deref(ld);
782         }
783         /*
784          * FIXME: Once we trust the LDISC code better we can wait here for
785          * ldisc completion and fix the driver call race
786          */
787         wake_up_interruptible_poll(&tty->write_wait, POLLOUT);
788         wake_up_interruptible_poll(&tty->read_wait, POLLIN);
789         /*
790          * Shutdown the current line discipline, and reset it to
791          * N_TTY.
792          */
793         if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) {
794                 /* Avoid racing set_ldisc */
795                 mutex_lock(&tty->ldisc_mutex);
796                 /* Switch back to N_TTY */
797                 tty_ldisc_halt(tty);
798                 tty_ldisc_wait_idle(tty);
799                 tty_ldisc_reinit(tty);
800                 /* At this point we have a closed ldisc and we want to
801                    reopen it. We could defer this to the next open but
802                    it means auditing a lot of other paths so this is a FIXME */
803                 WARN_ON(tty_ldisc_open(tty, tty->ldisc));
804                 tty_ldisc_enable(tty);
805                 mutex_unlock(&tty->ldisc_mutex);
806                 tty_reset_termios(tty);
807         }
808 }
809
810 /**
811  *      tty_ldisc_setup                 -       open line discipline
812  *      @tty: tty being shut down
813  *      @o_tty: pair tty for pty/tty pairs
814  *
815  *      Called during the initial open of a tty/pty pair in order to set up the
816  *      line disciplines and bind them to the tty. This has no locking issues
817  *      as the device isn't yet active.
818  */
819
820 int tty_ldisc_setup(struct tty_struct *tty, struct tty_struct *o_tty)
821 {
822         struct tty_ldisc *ld = tty->ldisc;
823         int retval;
824
825         retval = tty_ldisc_open(tty, ld);
826         if (retval)
827                 return retval;
828
829         if (o_tty) {
830                 retval = tty_ldisc_open(o_tty, o_tty->ldisc);
831                 if (retval) {
832                         tty_ldisc_close(tty, ld);
833                         return retval;
834                 }
835                 tty_ldisc_enable(o_tty);
836         }
837         tty_ldisc_enable(tty);
838         return 0;
839 }
840 /**
841  *      tty_ldisc_release               -       release line discipline
842  *      @tty: tty being shut down
843  *      @o_tty: pair tty for pty/tty pairs
844  *
845  *      Called during the final close of a tty/pty pair in order to shut down
846  *      the line discpline layer. On exit the ldisc assigned is N_TTY and the
847  *      ldisc has not been opened.
848  */
849
850 void tty_ldisc_release(struct tty_struct *tty, struct tty_struct *o_tty)
851 {
852         /*
853          * Prevent flush_to_ldisc() from rescheduling the work for later.  Then
854          * kill any delayed work. As this is the final close it does not
855          * race with the set_ldisc code path.
856          */
857
858         tty_ldisc_halt(tty);
859         flush_scheduled_work();
860
861         /*
862          * Wait for any short term users (we know they are just driver
863          * side waiters as the file is closing so user count on the file
864          * side is zero.
865          */
866
867         tty_ldisc_wait_idle(tty);
868
869         /*
870          * Now kill off the ldisc
871          */
872         tty_ldisc_close(tty, tty->ldisc);
873         tty_ldisc_put(tty->ldisc);
874         /* Force an oops if we mess this up */
875         tty->ldisc = NULL;
876
877         /* Ensure the next open requests the N_TTY ldisc */
878         tty_set_termios_ldisc(tty, N_TTY);
879
880         /* This will need doing differently if we need to lock */
881         if (o_tty)
882                 tty_ldisc_release(o_tty, NULL);
883
884         /* And the memory resources remaining (buffers, termios) will be
885            disposed of when the kref hits zero */
886 }
887
888 /**
889  *      tty_ldisc_init          -       ldisc setup for new tty
890  *      @tty: tty being allocated
891  *
892  *      Set up the line discipline objects for a newly allocated tty. Note that
893  *      the tty structure is not completely set up when this call is made.
894  */
895
896 void tty_ldisc_init(struct tty_struct *tty)
897 {
898         struct tty_ldisc *ld = tty_ldisc_get(N_TTY);
899         if (IS_ERR(ld))
900                 panic("n_tty: init_tty");
901         tty_ldisc_assign(tty, ld);
902 }
903
904 void tty_ldisc_begin(void)
905 {
906         /* Setup the default TTY line discipline. */
907         (void) tty_register_ldisc(N_TTY, &tty_ldisc_N_TTY);
908 }