Merge remote-tracking branches 'asoc/fix/wm8960' and 'asoc/fix/wm8962' into asoc...
[firefly-linux-kernel-4.4.55.git] / drivers / tty / tty_ioctl.c
1 /*
2  *  Copyright (C) 1991, 1992, 1993, 1994  Linus Torvalds
3  *
4  * Modified by Fred N. van Kempen, 01/29/93, to add line disciplines
5  * which can be dynamically activated and de-activated by the line
6  * discipline handling modules (like SLIP).
7  */
8
9 #include <linux/types.h>
10 #include <linux/termios.h>
11 #include <linux/errno.h>
12 #include <linux/sched.h>
13 #include <linux/kernel.h>
14 #include <linux/major.h>
15 #include <linux/tty.h>
16 #include <linux/fcntl.h>
17 #include <linux/string.h>
18 #include <linux/mm.h>
19 #include <linux/module.h>
20 #include <linux/bitops.h>
21 #include <linux/mutex.h>
22 #include <linux/compat.h>
23
24 #include <asm/io.h>
25 #include <asm/uaccess.h>
26
27 #undef TTY_DEBUG_WAIT_UNTIL_SENT
28
29 #ifdef TTY_DEBUG_WAIT_UNTIL_SENT
30 # define tty_debug_wait_until_sent(tty, f, args...)    tty_debug(tty, f, ##args)
31 #else
32 # define tty_debug_wait_until_sent(tty, f, args...)    do {} while (0)
33 #endif
34
35 #undef  DEBUG
36
37 /*
38  * Internal flag options for termios setting behavior
39  */
40 #define TERMIOS_FLUSH   1
41 #define TERMIOS_WAIT    2
42 #define TERMIOS_TERMIO  4
43 #define TERMIOS_OLD     8
44
45
46 /**
47  *      tty_chars_in_buffer     -       characters pending
48  *      @tty: terminal
49  *
50  *      Return the number of bytes of data in the device private
51  *      output queue. If no private method is supplied there is assumed
52  *      to be no queue on the device.
53  */
54
55 int tty_chars_in_buffer(struct tty_struct *tty)
56 {
57         if (tty->ops->chars_in_buffer)
58                 return tty->ops->chars_in_buffer(tty);
59         else
60                 return 0;
61 }
62 EXPORT_SYMBOL(tty_chars_in_buffer);
63
64 /**
65  *      tty_write_room          -       write queue space
66  *      @tty: terminal
67  *
68  *      Return the number of bytes that can be queued to this device
69  *      at the present time. The result should be treated as a guarantee
70  *      and the driver cannot offer a value it later shrinks by more than
71  *      the number of bytes written. If no method is provided 2K is always
72  *      returned and data may be lost as there will be no flow control.
73  */
74  
75 int tty_write_room(struct tty_struct *tty)
76 {
77         if (tty->ops->write_room)
78                 return tty->ops->write_room(tty);
79         return 2048;
80 }
81 EXPORT_SYMBOL(tty_write_room);
82
83 /**
84  *      tty_driver_flush_buffer -       discard internal buffer
85  *      @tty: terminal
86  *
87  *      Discard the internal output buffer for this device. If no method
88  *      is provided then either the buffer cannot be hardware flushed or
89  *      there is no buffer driver side.
90  */
91 void tty_driver_flush_buffer(struct tty_struct *tty)
92 {
93         if (tty->ops->flush_buffer)
94                 tty->ops->flush_buffer(tty);
95 }
96 EXPORT_SYMBOL(tty_driver_flush_buffer);
97
98 /**
99  *      tty_throttle            -       flow control
100  *      @tty: terminal
101  *
102  *      Indicate that a tty should stop transmitting data down the stack.
103  *      Takes the termios rwsem to protect against parallel throttle/unthrottle
104  *      and also to ensure the driver can consistently reference its own
105  *      termios data at this point when implementing software flow control.
106  */
107
108 void tty_throttle(struct tty_struct *tty)
109 {
110         down_write(&tty->termios_rwsem);
111         /* check TTY_THROTTLED first so it indicates our state */
112         if (!test_and_set_bit(TTY_THROTTLED, &tty->flags) &&
113             tty->ops->throttle)
114                 tty->ops->throttle(tty);
115         tty->flow_change = 0;
116         up_write(&tty->termios_rwsem);
117 }
118 EXPORT_SYMBOL(tty_throttle);
119
120 /**
121  *      tty_unthrottle          -       flow control
122  *      @tty: terminal
123  *
124  *      Indicate that a tty may continue transmitting data down the stack.
125  *      Takes the termios rwsem to protect against parallel throttle/unthrottle
126  *      and also to ensure the driver can consistently reference its own
127  *      termios data at this point when implementing software flow control.
128  *
129  *      Drivers should however remember that the stack can issue a throttle,
130  *      then change flow control method, then unthrottle.
131  */
132
133 void tty_unthrottle(struct tty_struct *tty)
134 {
135         down_write(&tty->termios_rwsem);
136         if (test_and_clear_bit(TTY_THROTTLED, &tty->flags) &&
137             tty->ops->unthrottle)
138                 tty->ops->unthrottle(tty);
139         tty->flow_change = 0;
140         up_write(&tty->termios_rwsem);
141 }
142 EXPORT_SYMBOL(tty_unthrottle);
143
144 /**
145  *      tty_throttle_safe       -       flow control
146  *      @tty: terminal
147  *
148  *      Similar to tty_throttle() but will only attempt throttle
149  *      if tty->flow_change is TTY_THROTTLE_SAFE. Prevents an accidental
150  *      throttle due to race conditions when throttling is conditional
151  *      on factors evaluated prior to throttling.
152  *
153  *      Returns 0 if tty is throttled (or was already throttled)
154  */
155
156 int tty_throttle_safe(struct tty_struct *tty)
157 {
158         int ret = 0;
159
160         mutex_lock(&tty->throttle_mutex);
161         if (!test_bit(TTY_THROTTLED, &tty->flags)) {
162                 if (tty->flow_change != TTY_THROTTLE_SAFE)
163                         ret = 1;
164                 else {
165                         set_bit(TTY_THROTTLED, &tty->flags);
166                         if (tty->ops->throttle)
167                                 tty->ops->throttle(tty);
168                 }
169         }
170         mutex_unlock(&tty->throttle_mutex);
171
172         return ret;
173 }
174
175 /**
176  *      tty_unthrottle_safe     -       flow control
177  *      @tty: terminal
178  *
179  *      Similar to tty_unthrottle() but will only attempt unthrottle
180  *      if tty->flow_change is TTY_UNTHROTTLE_SAFE. Prevents an accidental
181  *      unthrottle due to race conditions when unthrottling is conditional
182  *      on factors evaluated prior to unthrottling.
183  *
184  *      Returns 0 if tty is unthrottled (or was already unthrottled)
185  */
186
187 int tty_unthrottle_safe(struct tty_struct *tty)
188 {
189         int ret = 0;
190
191         mutex_lock(&tty->throttle_mutex);
192         if (test_bit(TTY_THROTTLED, &tty->flags)) {
193                 if (tty->flow_change != TTY_UNTHROTTLE_SAFE)
194                         ret = 1;
195                 else {
196                         clear_bit(TTY_THROTTLED, &tty->flags);
197                         if (tty->ops->unthrottle)
198                                 tty->ops->unthrottle(tty);
199                 }
200         }
201         mutex_unlock(&tty->throttle_mutex);
202
203         return ret;
204 }
205
206 /**
207  *      tty_wait_until_sent     -       wait for I/O to finish
208  *      @tty: tty we are waiting for
209  *      @timeout: how long we will wait
210  *
211  *      Wait for characters pending in a tty driver to hit the wire, or
212  *      for a timeout to occur (eg due to flow control)
213  *
214  *      Locking: none
215  */
216
217 void tty_wait_until_sent(struct tty_struct *tty, long timeout)
218 {
219         tty_debug_wait_until_sent(tty, "\n");
220
221         if (!timeout)
222                 timeout = MAX_SCHEDULE_TIMEOUT;
223
224         timeout = wait_event_interruptible_timeout(tty->write_wait,
225                         !tty_chars_in_buffer(tty), timeout);
226         if (timeout <= 0)
227                 return;
228
229         if (timeout == MAX_SCHEDULE_TIMEOUT)
230                 timeout = 0;
231
232         if (tty->ops->wait_until_sent)
233                 tty->ops->wait_until_sent(tty, timeout);
234 }
235 EXPORT_SYMBOL(tty_wait_until_sent);
236
237
238 /*
239  *              Termios Helper Methods
240  */
241
242 static void unset_locked_termios(struct ktermios *termios,
243                                  struct ktermios *old,
244                                  struct ktermios *locked)
245 {
246         int     i;
247
248 #define NOSET_MASK(x, y, z) (x = ((x) & ~(z)) | ((y) & (z)))
249
250         if (!locked) {
251                 printk(KERN_WARNING "Warning?!? termios_locked is NULL.\n");
252                 return;
253         }
254
255         NOSET_MASK(termios->c_iflag, old->c_iflag, locked->c_iflag);
256         NOSET_MASK(termios->c_oflag, old->c_oflag, locked->c_oflag);
257         NOSET_MASK(termios->c_cflag, old->c_cflag, locked->c_cflag);
258         NOSET_MASK(termios->c_lflag, old->c_lflag, locked->c_lflag);
259         termios->c_line = locked->c_line ? old->c_line : termios->c_line;
260         for (i = 0; i < NCCS; i++)
261                 termios->c_cc[i] = locked->c_cc[i] ?
262                         old->c_cc[i] : termios->c_cc[i];
263         /* FIXME: What should we do for i/ospeed */
264 }
265
266 /*
267  * Routine which returns the baud rate of the tty
268  *
269  * Note that the baud_table needs to be kept in sync with the
270  * include/asm/termbits.h file.
271  */
272 static const speed_t baud_table[] = {
273         0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
274         9600, 19200, 38400, 57600, 115200, 230400, 460800,
275 #ifdef __sparc__
276         76800, 153600, 307200, 614400, 921600
277 #else
278         500000, 576000, 921600, 1000000, 1152000, 1500000, 2000000,
279         2500000, 3000000, 3500000, 4000000
280 #endif
281 };
282
283 #ifndef __sparc__
284 static const tcflag_t baud_bits[] = {
285         B0, B50, B75, B110, B134, B150, B200, B300, B600,
286         B1200, B1800, B2400, B4800, B9600, B19200, B38400,
287         B57600, B115200, B230400, B460800, B500000, B576000,
288         B921600, B1000000, B1152000, B1500000, B2000000, B2500000,
289         B3000000, B3500000, B4000000
290 };
291 #else
292 static const tcflag_t baud_bits[] = {
293         B0, B50, B75, B110, B134, B150, B200, B300, B600,
294         B1200, B1800, B2400, B4800, B9600, B19200, B38400,
295         B57600, B115200, B230400, B460800, B76800, B153600,
296         B307200, B614400, B921600
297 };
298 #endif
299
300 static int n_baud_table = ARRAY_SIZE(baud_table);
301
302 /**
303  *      tty_termios_baud_rate
304  *      @termios: termios structure
305  *
306  *      Convert termios baud rate data into a speed. This should be called
307  *      with the termios lock held if this termios is a terminal termios
308  *      structure. May change the termios data. Device drivers can call this
309  *      function but should use ->c_[io]speed directly as they are updated.
310  *
311  *      Locking: none
312  */
313
314 speed_t tty_termios_baud_rate(struct ktermios *termios)
315 {
316         unsigned int cbaud;
317
318         cbaud = termios->c_cflag & CBAUD;
319
320 #ifdef BOTHER
321         /* Magic token for arbitrary speed via c_ispeed/c_ospeed */
322         if (cbaud == BOTHER)
323                 return termios->c_ospeed;
324 #endif
325         if (cbaud & CBAUDEX) {
326                 cbaud &= ~CBAUDEX;
327
328                 if (cbaud < 1 || cbaud + 15 > n_baud_table)
329                         termios->c_cflag &= ~CBAUDEX;
330                 else
331                         cbaud += 15;
332         }
333         return baud_table[cbaud];
334 }
335 EXPORT_SYMBOL(tty_termios_baud_rate);
336
337 /**
338  *      tty_termios_input_baud_rate
339  *      @termios: termios structure
340  *
341  *      Convert termios baud rate data into a speed. This should be called
342  *      with the termios lock held if this termios is a terminal termios
343  *      structure. May change the termios data. Device drivers can call this
344  *      function but should use ->c_[io]speed directly as they are updated.
345  *
346  *      Locking: none
347  */
348
349 speed_t tty_termios_input_baud_rate(struct ktermios *termios)
350 {
351 #ifdef IBSHIFT
352         unsigned int cbaud = (termios->c_cflag >> IBSHIFT) & CBAUD;
353
354         if (cbaud == B0)
355                 return tty_termios_baud_rate(termios);
356
357         /* Magic token for arbitrary speed via c_ispeed*/
358         if (cbaud == BOTHER)
359                 return termios->c_ispeed;
360
361         if (cbaud & CBAUDEX) {
362                 cbaud &= ~CBAUDEX;
363
364                 if (cbaud < 1 || cbaud + 15 > n_baud_table)
365                         termios->c_cflag &= ~(CBAUDEX << IBSHIFT);
366                 else
367                         cbaud += 15;
368         }
369         return baud_table[cbaud];
370 #else
371         return tty_termios_baud_rate(termios);
372 #endif
373 }
374 EXPORT_SYMBOL(tty_termios_input_baud_rate);
375
376 /**
377  *      tty_termios_encode_baud_rate
378  *      @termios: ktermios structure holding user requested state
379  *      @ispeed: input speed
380  *      @ospeed: output speed
381  *
382  *      Encode the speeds set into the passed termios structure. This is
383  *      used as a library helper for drivers so that they can report back
384  *      the actual speed selected when it differs from the speed requested
385  *
386  *      For maximal back compatibility with legacy SYS5/POSIX *nix behaviour
387  *      we need to carefully set the bits when the user does not get the
388  *      desired speed. We allow small margins and preserve as much of possible
389  *      of the input intent to keep compatibility.
390  *
391  *      Locking: Caller should hold termios lock. This is already held
392  *      when calling this function from the driver termios handler.
393  *
394  *      The ifdefs deal with platforms whose owners have yet to update them
395  *      and will all go away once this is done.
396  */
397
398 void tty_termios_encode_baud_rate(struct ktermios *termios,
399                                   speed_t ibaud, speed_t obaud)
400 {
401         int i = 0;
402         int ifound = -1, ofound = -1;
403         int iclose = ibaud/50, oclose = obaud/50;
404         int ibinput = 0;
405
406         if (obaud == 0)                 /* CD dropped             */
407                 ibaud = 0;              /* Clear ibaud to be sure */
408
409         termios->c_ispeed = ibaud;
410         termios->c_ospeed = obaud;
411
412 #ifdef BOTHER
413         /* If the user asked for a precise weird speed give a precise weird
414            answer. If they asked for a Bfoo speed they may have problems
415            digesting non-exact replies so fuzz a bit */
416
417         if ((termios->c_cflag & CBAUD) == BOTHER)
418                 oclose = 0;
419         if (((termios->c_cflag >> IBSHIFT) & CBAUD) == BOTHER)
420                 iclose = 0;
421         if ((termios->c_cflag >> IBSHIFT) & CBAUD)
422                 ibinput = 1;    /* An input speed was specified */
423 #endif
424         termios->c_cflag &= ~CBAUD;
425
426         /*
427          *      Our goal is to find a close match to the standard baud rate
428          *      returned. Walk the baud rate table and if we get a very close
429          *      match then report back the speed as a POSIX Bxxxx value by
430          *      preference
431          */
432
433         do {
434                 if (obaud - oclose <= baud_table[i] &&
435                     obaud + oclose >= baud_table[i]) {
436                         termios->c_cflag |= baud_bits[i];
437                         ofound = i;
438                 }
439                 if (ibaud - iclose <= baud_table[i] &&
440                     ibaud + iclose >= baud_table[i]) {
441                         /* For the case input == output don't set IBAUD bits
442                            if the user didn't do so */
443                         if (ofound == i && !ibinput)
444                                 ifound  = i;
445 #ifdef IBSHIFT
446                         else {
447                                 ifound = i;
448                                 termios->c_cflag |= (baud_bits[i] << IBSHIFT);
449                         }
450 #endif
451                 }
452         } while (++i < n_baud_table);
453
454         /*
455          *      If we found no match then use BOTHER if provided or warn
456          *      the user their platform maintainer needs to wake up if not.
457          */
458 #ifdef BOTHER
459         if (ofound == -1)
460                 termios->c_cflag |= BOTHER;
461         /* Set exact input bits only if the input and output differ or the
462            user already did */
463         if (ifound == -1 && (ibaud != obaud || ibinput))
464                 termios->c_cflag |= (BOTHER << IBSHIFT);
465 #else
466         if (ifound == -1 || ofound == -1) {
467                 printk_once(KERN_WARNING "tty: Unable to return correct "
468                           "speed data as your architecture needs updating.\n");
469         }
470 #endif
471 }
472 EXPORT_SYMBOL_GPL(tty_termios_encode_baud_rate);
473
474 /**
475  *      tty_encode_baud_rate            -       set baud rate of the tty
476  *      @ibaud: input baud rate
477  *      @obad: output baud rate
478  *
479  *      Update the current termios data for the tty with the new speed
480  *      settings. The caller must hold the termios_rwsem for the tty in
481  *      question.
482  */
483
484 void tty_encode_baud_rate(struct tty_struct *tty, speed_t ibaud, speed_t obaud)
485 {
486         tty_termios_encode_baud_rate(&tty->termios, ibaud, obaud);
487 }
488 EXPORT_SYMBOL_GPL(tty_encode_baud_rate);
489
490 /**
491  *      tty_termios_copy_hw     -       copy hardware settings
492  *      @new: New termios
493  *      @old: Old termios
494  *
495  *      Propagate the hardware specific terminal setting bits from
496  *      the old termios structure to the new one. This is used in cases
497  *      where the hardware does not support reconfiguration or as a helper
498  *      in some cases where only minimal reconfiguration is supported
499  */
500
501 void tty_termios_copy_hw(struct ktermios *new, struct ktermios *old)
502 {
503         /* The bits a dumb device handles in software. Smart devices need
504            to always provide a set_termios method */
505         new->c_cflag &= HUPCL | CREAD | CLOCAL;
506         new->c_cflag |= old->c_cflag & ~(HUPCL | CREAD | CLOCAL);
507         new->c_ispeed = old->c_ispeed;
508         new->c_ospeed = old->c_ospeed;
509 }
510 EXPORT_SYMBOL(tty_termios_copy_hw);
511
512 /**
513  *      tty_termios_hw_change   -       check for setting change
514  *      @a: termios
515  *      @b: termios to compare
516  *
517  *      Check if any of the bits that affect a dumb device have changed
518  *      between the two termios structures, or a speed change is needed.
519  */
520
521 int tty_termios_hw_change(struct ktermios *a, struct ktermios *b)
522 {
523         if (a->c_ispeed != b->c_ispeed || a->c_ospeed != b->c_ospeed)
524                 return 1;
525         if ((a->c_cflag ^ b->c_cflag) & ~(HUPCL | CREAD | CLOCAL))
526                 return 1;
527         return 0;
528 }
529 EXPORT_SYMBOL(tty_termios_hw_change);
530
531 /**
532  *      tty_set_termios         -       update termios values
533  *      @tty: tty to update
534  *      @new_termios: desired new value
535  *
536  *      Perform updates to the termios values set on this terminal.
537  *      A master pty's termios should never be set.
538  *
539  *      Locking: termios_rwsem
540  */
541
542 int tty_set_termios(struct tty_struct *tty, struct ktermios *new_termios)
543 {
544         struct ktermios old_termios;
545         struct tty_ldisc *ld;
546
547         WARN_ON(tty->driver->type == TTY_DRIVER_TYPE_PTY &&
548                 tty->driver->subtype == PTY_TYPE_MASTER);
549         /*
550          *      Perform the actual termios internal changes under lock.
551          */
552
553
554         /* FIXME: we need to decide on some locking/ordering semantics
555            for the set_termios notification eventually */
556         down_write(&tty->termios_rwsem);
557         old_termios = tty->termios;
558         tty->termios = *new_termios;
559         unset_locked_termios(&tty->termios, &old_termios, &tty->termios_locked);
560
561         if (tty->ops->set_termios)
562                 tty->ops->set_termios(tty, &old_termios);
563         else
564                 tty_termios_copy_hw(&tty->termios, &old_termios);
565
566         ld = tty_ldisc_ref(tty);
567         if (ld != NULL) {
568                 if (ld->ops->set_termios)
569                         ld->ops->set_termios(tty, &old_termios);
570                 tty_ldisc_deref(ld);
571         }
572         up_write(&tty->termios_rwsem);
573         return 0;
574 }
575 EXPORT_SYMBOL_GPL(tty_set_termios);
576
577 /**
578  *      set_termios             -       set termios values for a tty
579  *      @tty: terminal device
580  *      @arg: user data
581  *      @opt: option information
582  *
583  *      Helper function to prepare termios data and run necessary other
584  *      functions before using tty_set_termios to do the actual changes.
585  *
586  *      Locking:
587  *              Called functions take ldisc and termios_rwsem locks
588  */
589
590 static int set_termios(struct tty_struct *tty, void __user *arg, int opt)
591 {
592         struct ktermios tmp_termios;
593         struct tty_ldisc *ld;
594         int retval = tty_check_change(tty);
595
596         if (retval)
597                 return retval;
598
599         down_read(&tty->termios_rwsem);
600         tmp_termios = tty->termios;
601         up_read(&tty->termios_rwsem);
602
603         if (opt & TERMIOS_TERMIO) {
604                 if (user_termio_to_kernel_termios(&tmp_termios,
605                                                 (struct termio __user *)arg))
606                         return -EFAULT;
607 #ifdef TCGETS2
608         } else if (opt & TERMIOS_OLD) {
609                 if (user_termios_to_kernel_termios_1(&tmp_termios,
610                                                 (struct termios __user *)arg))
611                         return -EFAULT;
612         } else {
613                 if (user_termios_to_kernel_termios(&tmp_termios,
614                                                 (struct termios2 __user *)arg))
615                         return -EFAULT;
616         }
617 #else
618         } else if (user_termios_to_kernel_termios(&tmp_termios,
619                                         (struct termios __user *)arg))
620                 return -EFAULT;
621 #endif
622
623         /* If old style Bfoo values are used then load c_ispeed/c_ospeed
624          * with the real speed so its unconditionally usable */
625         tmp_termios.c_ispeed = tty_termios_input_baud_rate(&tmp_termios);
626         tmp_termios.c_ospeed = tty_termios_baud_rate(&tmp_termios);
627
628         ld = tty_ldisc_ref(tty);
629
630         if (ld != NULL) {
631                 if ((opt & TERMIOS_FLUSH) && ld->ops->flush_buffer)
632                         ld->ops->flush_buffer(tty);
633                 tty_ldisc_deref(ld);
634         }
635
636         if (opt & TERMIOS_WAIT) {
637                 tty_wait_until_sent(tty, 0);
638                 if (signal_pending(current))
639                         return -ERESTARTSYS;
640         }
641
642         tty_set_termios(tty, &tmp_termios);
643
644         /* FIXME: Arguably if tmp_termios == tty->termios AND the
645            actual requested termios was not tmp_termios then we may
646            want to return an error as no user requested change has
647            succeeded */
648         return 0;
649 }
650
651 static void copy_termios(struct tty_struct *tty, struct ktermios *kterm)
652 {
653         down_read(&tty->termios_rwsem);
654         *kterm = tty->termios;
655         up_read(&tty->termios_rwsem);
656 }
657
658 static void copy_termios_locked(struct tty_struct *tty, struct ktermios *kterm)
659 {
660         down_read(&tty->termios_rwsem);
661         *kterm = tty->termios_locked;
662         up_read(&tty->termios_rwsem);
663 }
664
665 static int get_termio(struct tty_struct *tty, struct termio __user *termio)
666 {
667         struct ktermios kterm;
668         copy_termios(tty, &kterm);
669         if (kernel_termios_to_user_termio(termio, &kterm))
670                 return -EFAULT;
671         return 0;
672 }
673
674
675 #ifdef TCGETX
676
677 /**
678  *      set_termiox     -       set termiox fields if possible
679  *      @tty: terminal
680  *      @arg: termiox structure from user
681  *      @opt: option flags for ioctl type
682  *
683  *      Implement the device calling points for the SYS5 termiox ioctl
684  *      interface in Linux
685  */
686
687 static int set_termiox(struct tty_struct *tty, void __user *arg, int opt)
688 {
689         struct termiox tnew;
690         struct tty_ldisc *ld;
691
692         if (tty->termiox == NULL)
693                 return -EINVAL;
694         if (copy_from_user(&tnew, arg, sizeof(struct termiox)))
695                 return -EFAULT;
696
697         ld = tty_ldisc_ref(tty);
698         if (ld != NULL) {
699                 if ((opt & TERMIOS_FLUSH) && ld->ops->flush_buffer)
700                         ld->ops->flush_buffer(tty);
701                 tty_ldisc_deref(ld);
702         }
703         if (opt & TERMIOS_WAIT) {
704                 tty_wait_until_sent(tty, 0);
705                 if (signal_pending(current))
706                         return -ERESTARTSYS;
707         }
708
709         down_write(&tty->termios_rwsem);
710         if (tty->ops->set_termiox)
711                 tty->ops->set_termiox(tty, &tnew);
712         up_write(&tty->termios_rwsem);
713         return 0;
714 }
715
716 #endif
717
718
719 #ifdef TIOCGETP
720 /*
721  * These are deprecated, but there is limited support..
722  *
723  * The "sg_flags" translation is a joke..
724  */
725 static int get_sgflags(struct tty_struct *tty)
726 {
727         int flags = 0;
728
729         if (!(tty->termios.c_lflag & ICANON)) {
730                 if (tty->termios.c_lflag & ISIG)
731                         flags |= 0x02;          /* cbreak */
732                 else
733                         flags |= 0x20;          /* raw */
734         }
735         if (tty->termios.c_lflag & ECHO)
736                 flags |= 0x08;                  /* echo */
737         if (tty->termios.c_oflag & OPOST)
738                 if (tty->termios.c_oflag & ONLCR)
739                         flags |= 0x10;          /* crmod */
740         return flags;
741 }
742
743 static int get_sgttyb(struct tty_struct *tty, struct sgttyb __user *sgttyb)
744 {
745         struct sgttyb tmp;
746
747         down_read(&tty->termios_rwsem);
748         tmp.sg_ispeed = tty->termios.c_ispeed;
749         tmp.sg_ospeed = tty->termios.c_ospeed;
750         tmp.sg_erase = tty->termios.c_cc[VERASE];
751         tmp.sg_kill = tty->termios.c_cc[VKILL];
752         tmp.sg_flags = get_sgflags(tty);
753         up_read(&tty->termios_rwsem);
754
755         return copy_to_user(sgttyb, &tmp, sizeof(tmp)) ? -EFAULT : 0;
756 }
757
758 static void set_sgflags(struct ktermios *termios, int flags)
759 {
760         termios->c_iflag = ICRNL | IXON;
761         termios->c_oflag = 0;
762         termios->c_lflag = ISIG | ICANON;
763         if (flags & 0x02) {     /* cbreak */
764                 termios->c_iflag = 0;
765                 termios->c_lflag &= ~ICANON;
766         }
767         if (flags & 0x08) {             /* echo */
768                 termios->c_lflag |= ECHO | ECHOE | ECHOK |
769                                     ECHOCTL | ECHOKE | IEXTEN;
770         }
771         if (flags & 0x10) {             /* crmod */
772                 termios->c_oflag |= OPOST | ONLCR;
773         }
774         if (flags & 0x20) {     /* raw */
775                 termios->c_iflag = 0;
776                 termios->c_lflag &= ~(ISIG | ICANON);
777         }
778         if (!(termios->c_lflag & ICANON)) {
779                 termios->c_cc[VMIN] = 1;
780                 termios->c_cc[VTIME] = 0;
781         }
782 }
783
784 /**
785  *      set_sgttyb              -       set legacy terminal values
786  *      @tty: tty structure
787  *      @sgttyb: pointer to old style terminal structure
788  *
789  *      Updates a terminal from the legacy BSD style terminal information
790  *      structure.
791  *
792  *      Locking: termios_rwsem
793  */
794
795 static int set_sgttyb(struct tty_struct *tty, struct sgttyb __user *sgttyb)
796 {
797         int retval;
798         struct sgttyb tmp;
799         struct ktermios termios;
800
801         retval = tty_check_change(tty);
802         if (retval)
803                 return retval;
804
805         if (copy_from_user(&tmp, sgttyb, sizeof(tmp)))
806                 return -EFAULT;
807
808         down_write(&tty->termios_rwsem);
809         termios = tty->termios;
810         termios.c_cc[VERASE] = tmp.sg_erase;
811         termios.c_cc[VKILL] = tmp.sg_kill;
812         set_sgflags(&termios, tmp.sg_flags);
813         /* Try and encode into Bfoo format */
814 #ifdef BOTHER
815         tty_termios_encode_baud_rate(&termios, termios.c_ispeed,
816                                                 termios.c_ospeed);
817 #endif
818         up_write(&tty->termios_rwsem);
819         tty_set_termios(tty, &termios);
820         return 0;
821 }
822 #endif
823
824 #ifdef TIOCGETC
825 static int get_tchars(struct tty_struct *tty, struct tchars __user *tchars)
826 {
827         struct tchars tmp;
828
829         down_read(&tty->termios_rwsem);
830         tmp.t_intrc = tty->termios.c_cc[VINTR];
831         tmp.t_quitc = tty->termios.c_cc[VQUIT];
832         tmp.t_startc = tty->termios.c_cc[VSTART];
833         tmp.t_stopc = tty->termios.c_cc[VSTOP];
834         tmp.t_eofc = tty->termios.c_cc[VEOF];
835         tmp.t_brkc = tty->termios.c_cc[VEOL2];  /* what is brkc anyway? */
836         up_read(&tty->termios_rwsem);
837         return copy_to_user(tchars, &tmp, sizeof(tmp)) ? -EFAULT : 0;
838 }
839
840 static int set_tchars(struct tty_struct *tty, struct tchars __user *tchars)
841 {
842         struct tchars tmp;
843
844         if (copy_from_user(&tmp, tchars, sizeof(tmp)))
845                 return -EFAULT;
846         down_write(&tty->termios_rwsem);
847         tty->termios.c_cc[VINTR] = tmp.t_intrc;
848         tty->termios.c_cc[VQUIT] = tmp.t_quitc;
849         tty->termios.c_cc[VSTART] = tmp.t_startc;
850         tty->termios.c_cc[VSTOP] = tmp.t_stopc;
851         tty->termios.c_cc[VEOF] = tmp.t_eofc;
852         tty->termios.c_cc[VEOL2] = tmp.t_brkc;  /* what is brkc anyway? */
853         up_write(&tty->termios_rwsem);
854         return 0;
855 }
856 #endif
857
858 #ifdef TIOCGLTC
859 static int get_ltchars(struct tty_struct *tty, struct ltchars __user *ltchars)
860 {
861         struct ltchars tmp;
862
863         down_read(&tty->termios_rwsem);
864         tmp.t_suspc = tty->termios.c_cc[VSUSP];
865         /* what is dsuspc anyway? */
866         tmp.t_dsuspc = tty->termios.c_cc[VSUSP];
867         tmp.t_rprntc = tty->termios.c_cc[VREPRINT];
868         /* what is flushc anyway? */
869         tmp.t_flushc = tty->termios.c_cc[VEOL2];
870         tmp.t_werasc = tty->termios.c_cc[VWERASE];
871         tmp.t_lnextc = tty->termios.c_cc[VLNEXT];
872         up_read(&tty->termios_rwsem);
873         return copy_to_user(ltchars, &tmp, sizeof(tmp)) ? -EFAULT : 0;
874 }
875
876 static int set_ltchars(struct tty_struct *tty, struct ltchars __user *ltchars)
877 {
878         struct ltchars tmp;
879
880         if (copy_from_user(&tmp, ltchars, sizeof(tmp)))
881                 return -EFAULT;
882
883         down_write(&tty->termios_rwsem);
884         tty->termios.c_cc[VSUSP] = tmp.t_suspc;
885         /* what is dsuspc anyway? */
886         tty->termios.c_cc[VEOL2] = tmp.t_dsuspc;
887         tty->termios.c_cc[VREPRINT] = tmp.t_rprntc;
888         /* what is flushc anyway? */
889         tty->termios.c_cc[VEOL2] = tmp.t_flushc;
890         tty->termios.c_cc[VWERASE] = tmp.t_werasc;
891         tty->termios.c_cc[VLNEXT] = tmp.t_lnextc;
892         up_write(&tty->termios_rwsem);
893         return 0;
894 }
895 #endif
896
897 /**
898  *      tty_change_softcar      -       carrier change ioctl helper
899  *      @tty: tty to update
900  *      @arg: enable/disable CLOCAL
901  *
902  *      Perform a change to the CLOCAL state and call into the driver
903  *      layer to make it visible. All done with the termios rwsem
904  */
905
906 static int tty_change_softcar(struct tty_struct *tty, int arg)
907 {
908         int ret = 0;
909         int bit = arg ? CLOCAL : 0;
910         struct ktermios old;
911
912         down_write(&tty->termios_rwsem);
913         old = tty->termios;
914         tty->termios.c_cflag &= ~CLOCAL;
915         tty->termios.c_cflag |= bit;
916         if (tty->ops->set_termios)
917                 tty->ops->set_termios(tty, &old);
918         if ((tty->termios.c_cflag & CLOCAL) != bit)
919                 ret = -EINVAL;
920         up_write(&tty->termios_rwsem);
921         return ret;
922 }
923
924 /**
925  *      tty_mode_ioctl          -       mode related ioctls
926  *      @tty: tty for the ioctl
927  *      @file: file pointer for the tty
928  *      @cmd: command
929  *      @arg: ioctl argument
930  *
931  *      Perform non line discipline specific mode control ioctls. This
932  *      is designed to be called by line disciplines to ensure they provide
933  *      consistent mode setting.
934  */
935
936 int tty_mode_ioctl(struct tty_struct *tty, struct file *file,
937                         unsigned int cmd, unsigned long arg)
938 {
939         struct tty_struct *real_tty;
940         void __user *p = (void __user *)arg;
941         int ret = 0;
942         struct ktermios kterm;
943
944         BUG_ON(file == NULL);
945
946         if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
947             tty->driver->subtype == PTY_TYPE_MASTER)
948                 real_tty = tty->link;
949         else
950                 real_tty = tty;
951
952         switch (cmd) {
953 #ifdef TIOCGETP
954         case TIOCGETP:
955                 return get_sgttyb(real_tty, (struct sgttyb __user *) arg);
956         case TIOCSETP:
957         case TIOCSETN:
958                 return set_sgttyb(real_tty, (struct sgttyb __user *) arg);
959 #endif
960 #ifdef TIOCGETC
961         case TIOCGETC:
962                 return get_tchars(real_tty, p);
963         case TIOCSETC:
964                 return set_tchars(real_tty, p);
965 #endif
966 #ifdef TIOCGLTC
967         case TIOCGLTC:
968                 return get_ltchars(real_tty, p);
969         case TIOCSLTC:
970                 return set_ltchars(real_tty, p);
971 #endif
972         case TCSETSF:
973                 return set_termios(real_tty, p,  TERMIOS_FLUSH | TERMIOS_WAIT | TERMIOS_OLD);
974         case TCSETSW:
975                 return set_termios(real_tty, p, TERMIOS_WAIT | TERMIOS_OLD);
976         case TCSETS:
977                 return set_termios(real_tty, p, TERMIOS_OLD);
978 #ifndef TCGETS2
979         case TCGETS:
980                 copy_termios(real_tty, &kterm);
981                 if (kernel_termios_to_user_termios((struct termios __user *)arg, &kterm))
982                         ret = -EFAULT;
983                 return ret;
984 #else
985         case TCGETS:
986                 copy_termios(real_tty, &kterm);
987                 if (kernel_termios_to_user_termios_1((struct termios __user *)arg, &kterm))
988                         ret = -EFAULT;
989                 return ret;
990         case TCGETS2:
991                 copy_termios(real_tty, &kterm);
992                 if (kernel_termios_to_user_termios((struct termios2 __user *)arg, &kterm))
993                         ret = -EFAULT;
994                 return ret;
995         case TCSETSF2:
996                 return set_termios(real_tty, p,  TERMIOS_FLUSH | TERMIOS_WAIT);
997         case TCSETSW2:
998                 return set_termios(real_tty, p, TERMIOS_WAIT);
999         case TCSETS2:
1000                 return set_termios(real_tty, p, 0);
1001 #endif
1002         case TCGETA:
1003                 return get_termio(real_tty, p);
1004         case TCSETAF:
1005                 return set_termios(real_tty, p, TERMIOS_FLUSH | TERMIOS_WAIT | TERMIOS_TERMIO);
1006         case TCSETAW:
1007                 return set_termios(real_tty, p, TERMIOS_WAIT | TERMIOS_TERMIO);
1008         case TCSETA:
1009                 return set_termios(real_tty, p, TERMIOS_TERMIO);
1010 #ifndef TCGETS2
1011         case TIOCGLCKTRMIOS:
1012                 copy_termios_locked(real_tty, &kterm);
1013                 if (kernel_termios_to_user_termios((struct termios __user *)arg, &kterm))
1014                         ret = -EFAULT;
1015                 return ret;
1016         case TIOCSLCKTRMIOS:
1017                 if (!capable(CAP_SYS_ADMIN))
1018                         return -EPERM;
1019                 copy_termios_locked(real_tty, &kterm);
1020                 if (user_termios_to_kernel_termios(&kterm,
1021                                                (struct termios __user *) arg))
1022                         return -EFAULT;
1023                 down_write(&real_tty->termios_rwsem);
1024                 real_tty->termios_locked = kterm;
1025                 up_write(&real_tty->termios_rwsem);
1026                 return 0;
1027 #else
1028         case TIOCGLCKTRMIOS:
1029                 copy_termios_locked(real_tty, &kterm);
1030                 if (kernel_termios_to_user_termios_1((struct termios __user *)arg, &kterm))
1031                         ret = -EFAULT;
1032                 return ret;
1033         case TIOCSLCKTRMIOS:
1034                 if (!capable(CAP_SYS_ADMIN))
1035                         return -EPERM;
1036                 copy_termios_locked(real_tty, &kterm);
1037                 if (user_termios_to_kernel_termios_1(&kterm,
1038                                                (struct termios __user *) arg))
1039                         return -EFAULT;
1040                 down_write(&real_tty->termios_rwsem);
1041                 real_tty->termios_locked = kterm;
1042                 up_write(&real_tty->termios_rwsem);
1043                 return ret;
1044 #endif
1045 #ifdef TCGETX
1046         case TCGETX: {
1047                 struct termiox ktermx;
1048                 if (real_tty->termiox == NULL)
1049                         return -EINVAL;
1050                 down_read(&real_tty->termios_rwsem);
1051                 memcpy(&ktermx, real_tty->termiox, sizeof(struct termiox));
1052                 up_read(&real_tty->termios_rwsem);
1053                 if (copy_to_user(p, &ktermx, sizeof(struct termiox)))
1054                         ret = -EFAULT;
1055                 return ret;
1056         }
1057         case TCSETX:
1058                 return set_termiox(real_tty, p, 0);
1059         case TCSETXW:
1060                 return set_termiox(real_tty, p, TERMIOS_WAIT);
1061         case TCSETXF:
1062                 return set_termiox(real_tty, p, TERMIOS_FLUSH);
1063 #endif          
1064         case TIOCGSOFTCAR:
1065                 copy_termios(real_tty, &kterm);
1066                 ret = put_user((kterm.c_cflag & CLOCAL) ? 1 : 0,
1067                                                 (int __user *)arg);
1068                 return ret;
1069         case TIOCSSOFTCAR:
1070                 if (get_user(arg, (unsigned int __user *) arg))
1071                         return -EFAULT;
1072                 return tty_change_softcar(real_tty, arg);
1073         default:
1074                 return -ENOIOCTLCMD;
1075         }
1076 }
1077 EXPORT_SYMBOL_GPL(tty_mode_ioctl);
1078
1079
1080 /* Caller guarantees ldisc reference is held */
1081 static int __tty_perform_flush(struct tty_struct *tty, unsigned long arg)
1082 {
1083         struct tty_ldisc *ld = tty->ldisc;
1084
1085         switch (arg) {
1086         case TCIFLUSH:
1087                 if (ld && ld->ops->flush_buffer) {
1088                         ld->ops->flush_buffer(tty);
1089                         tty_unthrottle(tty);
1090                 }
1091                 break;
1092         case TCIOFLUSH:
1093                 if (ld && ld->ops->flush_buffer) {
1094                         ld->ops->flush_buffer(tty);
1095                         tty_unthrottle(tty);
1096                 }
1097                 /* fall through */
1098         case TCOFLUSH:
1099                 tty_driver_flush_buffer(tty);
1100                 break;
1101         default:
1102                 return -EINVAL;
1103         }
1104         return 0;
1105 }
1106
1107 int tty_perform_flush(struct tty_struct *tty, unsigned long arg)
1108 {
1109         struct tty_ldisc *ld;
1110         int retval = tty_check_change(tty);
1111         if (retval)
1112                 return retval;
1113
1114         ld = tty_ldisc_ref_wait(tty);
1115         retval = __tty_perform_flush(tty, arg);
1116         if (ld)
1117                 tty_ldisc_deref(ld);
1118         return retval;
1119 }
1120 EXPORT_SYMBOL_GPL(tty_perform_flush);
1121
1122 int n_tty_ioctl_helper(struct tty_struct *tty, struct file *file,
1123                        unsigned int cmd, unsigned long arg)
1124 {
1125         int retval;
1126
1127         switch (cmd) {
1128         case TCXONC:
1129                 retval = tty_check_change(tty);
1130                 if (retval)
1131                         return retval;
1132                 switch (arg) {
1133                 case TCOOFF:
1134                         spin_lock_irq(&tty->flow_lock);
1135                         if (!tty->flow_stopped) {
1136                                 tty->flow_stopped = 1;
1137                                 __stop_tty(tty);
1138                         }
1139                         spin_unlock_irq(&tty->flow_lock);
1140                         break;
1141                 case TCOON:
1142                         spin_lock_irq(&tty->flow_lock);
1143                         if (tty->flow_stopped) {
1144                                 tty->flow_stopped = 0;
1145                                 __start_tty(tty);
1146                         }
1147                         spin_unlock_irq(&tty->flow_lock);
1148                         break;
1149                 case TCIOFF:
1150                         down_read(&tty->termios_rwsem);
1151                         if (STOP_CHAR(tty) != __DISABLED_CHAR)
1152                                 retval = tty_send_xchar(tty, STOP_CHAR(tty));
1153                         up_read(&tty->termios_rwsem);
1154                         break;
1155                 case TCION:
1156                         down_read(&tty->termios_rwsem);
1157                         if (START_CHAR(tty) != __DISABLED_CHAR)
1158                                 retval = tty_send_xchar(tty, START_CHAR(tty));
1159                         up_read(&tty->termios_rwsem);
1160                         break;
1161                 default:
1162                         return -EINVAL;
1163                 }
1164                 return retval;
1165         case TCFLSH:
1166                 retval = tty_check_change(tty);
1167                 if (retval)
1168                         return retval;
1169                 return __tty_perform_flush(tty, arg);
1170         default:
1171                 /* Try the mode commands */
1172                 return tty_mode_ioctl(tty, file, cmd, arg);
1173         }
1174 }
1175 EXPORT_SYMBOL(n_tty_ioctl_helper);
1176
1177 #ifdef CONFIG_COMPAT
1178 long n_tty_compat_ioctl_helper(struct tty_struct *tty, struct file *file,
1179                                         unsigned int cmd, unsigned long arg)
1180 {
1181         switch (cmd) {
1182         case TIOCGLCKTRMIOS:
1183         case TIOCSLCKTRMIOS:
1184                 return tty_mode_ioctl(tty, file, cmd, (unsigned long) compat_ptr(arg));
1185         default:
1186                 return -ENOIOCTLCMD;
1187         }
1188 }
1189 EXPORT_SYMBOL(n_tty_compat_ioctl_helper);
1190 #endif
1191