Merge branch 'master' of /usr/src/ntfs-2.6/
[linux-2.6] / include / asm-alpha / termios.h
1 #ifndef _ALPHA_TERMIOS_H
2 #define _ALPHA_TERMIOS_H
3
4 #include <asm/ioctls.h>
5 #include <asm/termbits.h>
6
7 struct sgttyb {
8         char    sg_ispeed;
9         char    sg_ospeed;
10         char    sg_erase;
11         char    sg_kill;
12         short   sg_flags;
13 };
14
15 struct tchars {
16         char    t_intrc;
17         char    t_quitc;
18         char    t_startc;
19         char    t_stopc;
20         char    t_eofc;
21         char    t_brkc;
22 };
23
24 struct ltchars {
25         char    t_suspc;
26         char    t_dsuspc;
27         char    t_rprntc;
28         char    t_flushc;
29         char    t_werasc;
30         char    t_lnextc;
31 };
32
33 struct winsize {
34         unsigned short ws_row;
35         unsigned short ws_col;
36         unsigned short ws_xpixel;
37         unsigned short ws_ypixel;
38 };
39
40 #define NCC 8
41 struct termio {
42         unsigned short c_iflag;         /* input mode flags */
43         unsigned short c_oflag;         /* output mode flags */
44         unsigned short c_cflag;         /* control mode flags */
45         unsigned short c_lflag;         /* local mode flags */
46         unsigned char c_line;           /* line discipline */
47         unsigned char c_cc[NCC];        /* control characters */
48 };
49
50 /*
51  * c_cc characters in the termio structure.  Oh, how I love being
52  * backwardly compatible.  Notice that character 4 and 5 are
53  * interpreted differently depending on whether ICANON is set in
54  * c_lflag.  If it's set, they are used as _VEOF and _VEOL, otherwise
55  * as _VMIN and V_TIME.  This is for compatibility with OSF/1 (which
56  * is compatible with sysV)...
57  */
58 #define _VINTR  0
59 #define _VQUIT  1
60 #define _VERASE 2
61 #define _VKILL  3
62 #define _VEOF   4
63 #define _VMIN   4
64 #define _VEOL   5
65 #define _VTIME  5
66 #define _VEOL2  6
67 #define _VSWTC  7
68
69 /* line disciplines */
70 #define N_TTY           0
71 #define N_SLIP          1
72 #define N_MOUSE         2
73 #define N_PPP           3
74 #define N_STRIP         4
75 #define N_AX25          5
76 #define N_X25           6       /* X.25 async */
77 #define N_6PACK         7
78 #define N_MASC          8       /* Reserved for Mobitex module <kaz@cafe.net> */
79 #define N_R3964         9       /* Reserved for Simatic R3964 module */
80 #define N_PROFIBUS_FDL  10      /* Reserved for Profibus <Dave@mvhi.com> */
81 #define N_IRDA          11      /* Linux IrDa - http://irda.sourceforge.net/ */
82 #define N_SMSBLOCK      12      /* SMS block mode - for talking to GSM data cards about SMS messages */
83 #define N_HDLC          13      /* synchronous HDLC */
84 #define N_SYNC_PPP      14
85 #define N_HCI           15  /* Bluetooth HCI UART */
86
87 #ifdef __KERNEL__
88 /*      eof=^D          eol=\0          eol2=\0         erase=del
89         werase=^W       kill=^U         reprint=^R      sxtc=\0
90         intr=^C         quit=^\         susp=^Z         <OSF/1 VDSUSP>
91         start=^Q        stop=^S         lnext=^V        discard=^U
92         vmin=\1         vtime=\0
93 */
94 #define INIT_C_CC "\004\000\000\177\027\025\022\000\003\034\032\000\021\023\026\025\001\000"
95
96 /*
97  * Translate a "termio" structure into a "termios". Ugh.
98  */
99
100 #define user_termio_to_kernel_termios(a_termios, u_termio)                      \
101 ({                                                                              \
102         struct termios *k_termios = (a_termios);                                \
103         struct termio k_termio;                                                 \
104         int canon, ret;                                                         \
105                                                                                 \
106         ret = copy_from_user(&k_termio, u_termio, sizeof(k_termio));            \
107         if (!ret) {                                                             \
108                 /* Overwrite only the low bits.  */                             \
109                 *(unsigned short *)&k_termios->c_iflag = k_termio.c_iflag;      \
110                 *(unsigned short *)&k_termios->c_oflag = k_termio.c_oflag;      \
111                 *(unsigned short *)&k_termios->c_cflag = k_termio.c_cflag;      \
112                 *(unsigned short *)&k_termios->c_lflag = k_termio.c_lflag;      \
113                 canon = k_termio.c_lflag & ICANON;                              \
114                                                                                 \
115                 k_termios->c_cc[VINTR]  = k_termio.c_cc[_VINTR];                \
116                 k_termios->c_cc[VQUIT]  = k_termio.c_cc[_VQUIT];                \
117                 k_termios->c_cc[VERASE] = k_termio.c_cc[_VERASE];               \
118                 k_termios->c_cc[VKILL]  = k_termio.c_cc[_VKILL];                \
119                 k_termios->c_cc[VEOL2]  = k_termio.c_cc[_VEOL2];                \
120                 k_termios->c_cc[VSWTC]  = k_termio.c_cc[_VSWTC];                \
121                 k_termios->c_cc[canon ? VEOF : VMIN]  = k_termio.c_cc[_VEOF];   \
122                 k_termios->c_cc[canon ? VEOL : VTIME] = k_termio.c_cc[_VEOL];   \
123         }                                                                       \
124         ret;                                                                    \
125 })
126
127 /*
128  * Translate a "termios" structure into a "termio". Ugh.
129  *
130  * Note the "fun" _VMIN overloading.
131  */
132 #define kernel_termios_to_user_termio(u_termio, a_termios)              \
133 ({                                                                      \
134         struct termios *k_termios = (a_termios);                        \
135         struct termio k_termio;                                         \
136         int canon;                                                      \
137                                                                         \
138         k_termio.c_iflag = k_termios->c_iflag;                          \
139         k_termio.c_oflag = k_termios->c_oflag;                          \
140         k_termio.c_cflag = k_termios->c_cflag;                          \
141         canon = (k_termio.c_lflag = k_termios->c_lflag) & ICANON;       \
142                                                                         \
143         k_termio.c_line = k_termios->c_line;                            \
144         k_termio.c_cc[_VINTR]  = k_termios->c_cc[VINTR];                \
145         k_termio.c_cc[_VQUIT]  = k_termios->c_cc[VQUIT];                \
146         k_termio.c_cc[_VERASE] = k_termios->c_cc[VERASE];               \
147         k_termio.c_cc[_VKILL]  = k_termios->c_cc[VKILL];                \
148         k_termio.c_cc[_VEOF]   = k_termios->c_cc[canon ? VEOF : VMIN];  \
149         k_termio.c_cc[_VEOL]   = k_termios->c_cc[canon ? VEOL : VTIME]; \
150         k_termio.c_cc[_VEOL2]  = k_termios->c_cc[VEOL2];                \
151         k_termio.c_cc[_VSWTC]  = k_termios->c_cc[VSWTC];                \
152                                                                         \
153         copy_to_user(u_termio, &k_termio, sizeof(k_termio));            \
154 })
155
156 #define user_termios_to_kernel_termios(k, u) \
157         copy_from_user(k, u, sizeof(struct termios))
158
159 #define kernel_termios_to_user_termios(u, k) \
160         copy_to_user(u, k, sizeof(struct termios))
161
162 #endif  /* __KERNEL__ */
163
164 #endif  /* _ALPHA_TERMIOS_H */