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