diff options
Diffstat (limited to 'include/linux/tty.h')
-rw-r--r-- | include/linux/tty.h | 412 |
1 files changed, 412 insertions, 0 deletions
diff --git a/include/linux/tty.h b/include/linux/tty.h new file mode 100644 index 000000000000..1b76106272d3 --- /dev/null +++ b/include/linux/tty.h | |||
@@ -0,0 +1,412 @@ | |||
1 | #ifndef _LINUX_TTY_H | ||
2 | #define _LINUX_TTY_H | ||
3 | |||
4 | /* | ||
5 | * 'tty.h' defines some structures used by tty_io.c and some defines. | ||
6 | */ | ||
7 | |||
8 | /* | ||
9 | * These constants are also useful for user-level apps (e.g., VC | ||
10 | * resizing). | ||
11 | */ | ||
12 | #define MIN_NR_CONSOLES 1 /* must be at least 1 */ | ||
13 | #define MAX_NR_CONSOLES 63 /* serial lines start at 64 */ | ||
14 | #define MAX_NR_USER_CONSOLES 63 /* must be root to allocate above this */ | ||
15 | /* Note: the ioctl VT_GETSTATE does not work for | ||
16 | consoles 16 and higher (since it returns a short) */ | ||
17 | |||
18 | #ifdef __KERNEL__ | ||
19 | #include <linux/config.h> | ||
20 | #include <linux/fs.h> | ||
21 | #include <linux/major.h> | ||
22 | #include <linux/termios.h> | ||
23 | #include <linux/workqueue.h> | ||
24 | #include <linux/tty_driver.h> | ||
25 | #include <linux/tty_ldisc.h> | ||
26 | |||
27 | #include <asm/system.h> | ||
28 | |||
29 | |||
30 | /* | ||
31 | * (Note: the *_driver.minor_start values 1, 64, 128, 192 are | ||
32 | * hardcoded at present.) | ||
33 | */ | ||
34 | #define NR_PTYS CONFIG_LEGACY_PTY_COUNT /* Number of legacy ptys */ | ||
35 | #define NR_UNIX98_PTY_DEFAULT 4096 /* Default maximum for Unix98 ptys */ | ||
36 | #define NR_UNIX98_PTY_MAX (1 << MINORBITS) /* Absolute limit */ | ||
37 | #define NR_LDISCS 16 | ||
38 | |||
39 | /* | ||
40 | * These are set up by the setup-routine at boot-time: | ||
41 | */ | ||
42 | |||
43 | struct screen_info { | ||
44 | u8 orig_x; /* 0x00 */ | ||
45 | u8 orig_y; /* 0x01 */ | ||
46 | u16 dontuse1; /* 0x02 -- EXT_MEM_K sits here */ | ||
47 | u16 orig_video_page; /* 0x04 */ | ||
48 | u8 orig_video_mode; /* 0x06 */ | ||
49 | u8 orig_video_cols; /* 0x07 */ | ||
50 | u16 unused2; /* 0x08 */ | ||
51 | u16 orig_video_ega_bx; /* 0x0a */ | ||
52 | u16 unused3; /* 0x0c */ | ||
53 | u8 orig_video_lines; /* 0x0e */ | ||
54 | u8 orig_video_isVGA; /* 0x0f */ | ||
55 | u16 orig_video_points; /* 0x10 */ | ||
56 | |||
57 | /* VESA graphic mode -- linear frame buffer */ | ||
58 | u16 lfb_width; /* 0x12 */ | ||
59 | u16 lfb_height; /* 0x14 */ | ||
60 | u16 lfb_depth; /* 0x16 */ | ||
61 | u32 lfb_base; /* 0x18 */ | ||
62 | u32 lfb_size; /* 0x1c */ | ||
63 | u16 dontuse2, dontuse3; /* 0x20 -- CL_MAGIC and CL_OFFSET here */ | ||
64 | u16 lfb_linelength; /* 0x24 */ | ||
65 | u8 red_size; /* 0x26 */ | ||
66 | u8 red_pos; /* 0x27 */ | ||
67 | u8 green_size; /* 0x28 */ | ||
68 | u8 green_pos; /* 0x29 */ | ||
69 | u8 blue_size; /* 0x2a */ | ||
70 | u8 blue_pos; /* 0x2b */ | ||
71 | u8 rsvd_size; /* 0x2c */ | ||
72 | u8 rsvd_pos; /* 0x2d */ | ||
73 | u16 vesapm_seg; /* 0x2e */ | ||
74 | u16 vesapm_off; /* 0x30 */ | ||
75 | u16 pages; /* 0x32 */ | ||
76 | u16 vesa_attributes; /* 0x34 */ | ||
77 | /* 0x36 -- 0x3f reserved for future expansion */ | ||
78 | }; | ||
79 | |||
80 | extern struct screen_info screen_info; | ||
81 | |||
82 | #define ORIG_X (screen_info.orig_x) | ||
83 | #define ORIG_Y (screen_info.orig_y) | ||
84 | #define ORIG_VIDEO_MODE (screen_info.orig_video_mode) | ||
85 | #define ORIG_VIDEO_COLS (screen_info.orig_video_cols) | ||
86 | #define ORIG_VIDEO_EGA_BX (screen_info.orig_video_ega_bx) | ||
87 | #define ORIG_VIDEO_LINES (screen_info.orig_video_lines) | ||
88 | #define ORIG_VIDEO_ISVGA (screen_info.orig_video_isVGA) | ||
89 | #define ORIG_VIDEO_POINTS (screen_info.orig_video_points) | ||
90 | |||
91 | #define VIDEO_TYPE_MDA 0x10 /* Monochrome Text Display */ | ||
92 | #define VIDEO_TYPE_CGA 0x11 /* CGA Display */ | ||
93 | #define VIDEO_TYPE_EGAM 0x20 /* EGA/VGA in Monochrome Mode */ | ||
94 | #define VIDEO_TYPE_EGAC 0x21 /* EGA in Color Mode */ | ||
95 | #define VIDEO_TYPE_VGAC 0x22 /* VGA+ in Color Mode */ | ||
96 | #define VIDEO_TYPE_VLFB 0x23 /* VESA VGA in graphic mode */ | ||
97 | |||
98 | #define VIDEO_TYPE_PICA_S3 0x30 /* ACER PICA-61 local S3 video */ | ||
99 | #define VIDEO_TYPE_MIPS_G364 0x31 /* MIPS Magnum 4000 G364 video */ | ||
100 | #define VIDEO_TYPE_SGI 0x33 /* Various SGI graphics hardware */ | ||
101 | |||
102 | #define VIDEO_TYPE_TGAC 0x40 /* DEC TGA */ | ||
103 | |||
104 | #define VIDEO_TYPE_SUN 0x50 /* Sun frame buffer. */ | ||
105 | #define VIDEO_TYPE_SUNPCI 0x51 /* Sun PCI based frame buffer. */ | ||
106 | |||
107 | #define VIDEO_TYPE_PMAC 0x60 /* PowerMacintosh frame buffer. */ | ||
108 | |||
109 | /* | ||
110 | * This character is the same as _POSIX_VDISABLE: it cannot be used as | ||
111 | * a c_cc[] character, but indicates that a particular special character | ||
112 | * isn't in use (eg VINTR has no character etc) | ||
113 | */ | ||
114 | #define __DISABLED_CHAR '\0' | ||
115 | |||
116 | /* | ||
117 | * This is the flip buffer used for the tty driver. The buffer is | ||
118 | * located in the tty structure, and is used as a high speed interface | ||
119 | * between the tty driver and the tty line discipline. | ||
120 | */ | ||
121 | #define TTY_FLIPBUF_SIZE 512 | ||
122 | |||
123 | struct tty_flip_buffer { | ||
124 | struct work_struct work; | ||
125 | struct semaphore pty_sem; | ||
126 | char *char_buf_ptr; | ||
127 | unsigned char *flag_buf_ptr; | ||
128 | int count; | ||
129 | int buf_num; | ||
130 | unsigned char char_buf[2*TTY_FLIPBUF_SIZE]; | ||
131 | char flag_buf[2*TTY_FLIPBUF_SIZE]; | ||
132 | unsigned char slop[4]; /* N.B. bug overwrites buffer by 1 */ | ||
133 | }; | ||
134 | /* | ||
135 | * The pty uses char_buf and flag_buf as a contiguous buffer | ||
136 | */ | ||
137 | #define PTY_BUF_SIZE 4*TTY_FLIPBUF_SIZE | ||
138 | |||
139 | /* | ||
140 | * When a break, frame error, or parity error happens, these codes are | ||
141 | * stuffed into the flags buffer. | ||
142 | */ | ||
143 | #define TTY_NORMAL 0 | ||
144 | #define TTY_BREAK 1 | ||
145 | #define TTY_FRAME 2 | ||
146 | #define TTY_PARITY 3 | ||
147 | #define TTY_OVERRUN 4 | ||
148 | |||
149 | #define INTR_CHAR(tty) ((tty)->termios->c_cc[VINTR]) | ||
150 | #define QUIT_CHAR(tty) ((tty)->termios->c_cc[VQUIT]) | ||
151 | #define ERASE_CHAR(tty) ((tty)->termios->c_cc[VERASE]) | ||
152 | #define KILL_CHAR(tty) ((tty)->termios->c_cc[VKILL]) | ||
153 | #define EOF_CHAR(tty) ((tty)->termios->c_cc[VEOF]) | ||
154 | #define TIME_CHAR(tty) ((tty)->termios->c_cc[VTIME]) | ||
155 | #define MIN_CHAR(tty) ((tty)->termios->c_cc[VMIN]) | ||
156 | #define SWTC_CHAR(tty) ((tty)->termios->c_cc[VSWTC]) | ||
157 | #define START_CHAR(tty) ((tty)->termios->c_cc[VSTART]) | ||
158 | #define STOP_CHAR(tty) ((tty)->termios->c_cc[VSTOP]) | ||
159 | #define SUSP_CHAR(tty) ((tty)->termios->c_cc[VSUSP]) | ||
160 | #define EOL_CHAR(tty) ((tty)->termios->c_cc[VEOL]) | ||
161 | #define REPRINT_CHAR(tty) ((tty)->termios->c_cc[VREPRINT]) | ||
162 | #define DISCARD_CHAR(tty) ((tty)->termios->c_cc[VDISCARD]) | ||
163 | #define WERASE_CHAR(tty) ((tty)->termios->c_cc[VWERASE]) | ||
164 | #define LNEXT_CHAR(tty) ((tty)->termios->c_cc[VLNEXT]) | ||
165 | #define EOL2_CHAR(tty) ((tty)->termios->c_cc[VEOL2]) | ||
166 | |||
167 | #define _I_FLAG(tty,f) ((tty)->termios->c_iflag & (f)) | ||
168 | #define _O_FLAG(tty,f) ((tty)->termios->c_oflag & (f)) | ||
169 | #define _C_FLAG(tty,f) ((tty)->termios->c_cflag & (f)) | ||
170 | #define _L_FLAG(tty,f) ((tty)->termios->c_lflag & (f)) | ||
171 | |||
172 | #define I_IGNBRK(tty) _I_FLAG((tty),IGNBRK) | ||
173 | #define I_BRKINT(tty) _I_FLAG((tty),BRKINT) | ||
174 | #define I_IGNPAR(tty) _I_FLAG((tty),IGNPAR) | ||
175 | #define I_PARMRK(tty) _I_FLAG((tty),PARMRK) | ||
176 | #define I_INPCK(tty) _I_FLAG((tty),INPCK) | ||
177 | #define I_ISTRIP(tty) _I_FLAG((tty),ISTRIP) | ||
178 | #define I_INLCR(tty) _I_FLAG((tty),INLCR) | ||
179 | #define I_IGNCR(tty) _I_FLAG((tty),IGNCR) | ||
180 | #define I_ICRNL(tty) _I_FLAG((tty),ICRNL) | ||
181 | #define I_IUCLC(tty) _I_FLAG((tty),IUCLC) | ||
182 | #define I_IXON(tty) _I_FLAG((tty),IXON) | ||
183 | #define I_IXANY(tty) _I_FLAG((tty),IXANY) | ||
184 | #define I_IXOFF(tty) _I_FLAG((tty),IXOFF) | ||
185 | #define I_IMAXBEL(tty) _I_FLAG((tty),IMAXBEL) | ||
186 | #define I_IUTF8(tty) _I_FLAG((tty),IUTF8) | ||
187 | |||
188 | #define O_OPOST(tty) _O_FLAG((tty),OPOST) | ||
189 | #define O_OLCUC(tty) _O_FLAG((tty),OLCUC) | ||
190 | #define O_ONLCR(tty) _O_FLAG((tty),ONLCR) | ||
191 | #define O_OCRNL(tty) _O_FLAG((tty),OCRNL) | ||
192 | #define O_ONOCR(tty) _O_FLAG((tty),ONOCR) | ||
193 | #define O_ONLRET(tty) _O_FLAG((tty),ONLRET) | ||
194 | #define O_OFILL(tty) _O_FLAG((tty),OFILL) | ||
195 | #define O_OFDEL(tty) _O_FLAG((tty),OFDEL) | ||
196 | #define O_NLDLY(tty) _O_FLAG((tty),NLDLY) | ||
197 | #define O_CRDLY(tty) _O_FLAG((tty),CRDLY) | ||
198 | #define O_TABDLY(tty) _O_FLAG((tty),TABDLY) | ||
199 | #define O_BSDLY(tty) _O_FLAG((tty),BSDLY) | ||
200 | #define O_VTDLY(tty) _O_FLAG((tty),VTDLY) | ||
201 | #define O_FFDLY(tty) _O_FLAG((tty),FFDLY) | ||
202 | |||
203 | #define C_BAUD(tty) _C_FLAG((tty),CBAUD) | ||
204 | #define C_CSIZE(tty) _C_FLAG((tty),CSIZE) | ||
205 | #define C_CSTOPB(tty) _C_FLAG((tty),CSTOPB) | ||
206 | #define C_CREAD(tty) _C_FLAG((tty),CREAD) | ||
207 | #define C_PARENB(tty) _C_FLAG((tty),PARENB) | ||
208 | #define C_PARODD(tty) _C_FLAG((tty),PARODD) | ||
209 | #define C_HUPCL(tty) _C_FLAG((tty),HUPCL) | ||
210 | #define C_CLOCAL(tty) _C_FLAG((tty),CLOCAL) | ||
211 | #define C_CIBAUD(tty) _C_FLAG((tty),CIBAUD) | ||
212 | #define C_CRTSCTS(tty) _C_FLAG((tty),CRTSCTS) | ||
213 | |||
214 | #define L_ISIG(tty) _L_FLAG((tty),ISIG) | ||
215 | #define L_ICANON(tty) _L_FLAG((tty),ICANON) | ||
216 | #define L_XCASE(tty) _L_FLAG((tty),XCASE) | ||
217 | #define L_ECHO(tty) _L_FLAG((tty),ECHO) | ||
218 | #define L_ECHOE(tty) _L_FLAG((tty),ECHOE) | ||
219 | #define L_ECHOK(tty) _L_FLAG((tty),ECHOK) | ||
220 | #define L_ECHONL(tty) _L_FLAG((tty),ECHONL) | ||
221 | #define L_NOFLSH(tty) _L_FLAG((tty),NOFLSH) | ||
222 | #define L_TOSTOP(tty) _L_FLAG((tty),TOSTOP) | ||
223 | #define L_ECHOCTL(tty) _L_FLAG((tty),ECHOCTL) | ||
224 | #define L_ECHOPRT(tty) _L_FLAG((tty),ECHOPRT) | ||
225 | #define L_ECHOKE(tty) _L_FLAG((tty),ECHOKE) | ||
226 | #define L_FLUSHO(tty) _L_FLAG((tty),FLUSHO) | ||
227 | #define L_PENDIN(tty) _L_FLAG((tty),PENDIN) | ||
228 | #define L_IEXTEN(tty) _L_FLAG((tty),IEXTEN) | ||
229 | |||
230 | struct device; | ||
231 | /* | ||
232 | * Where all of the state associated with a tty is kept while the tty | ||
233 | * is open. Since the termios state should be kept even if the tty | ||
234 | * has been closed --- for things like the baud rate, etc --- it is | ||
235 | * not stored here, but rather a pointer to the real state is stored | ||
236 | * here. Possible the winsize structure should have the same | ||
237 | * treatment, but (1) the default 80x24 is usually right and (2) it's | ||
238 | * most often used by a windowing system, which will set the correct | ||
239 | * size each time the window is created or resized anyway. | ||
240 | * - TYT, 9/14/92 | ||
241 | */ | ||
242 | struct tty_struct { | ||
243 | int magic; | ||
244 | struct tty_driver *driver; | ||
245 | int index; | ||
246 | struct tty_ldisc ldisc; | ||
247 | struct semaphore termios_sem; | ||
248 | struct termios *termios, *termios_locked; | ||
249 | char name[64]; | ||
250 | int pgrp; | ||
251 | int session; | ||
252 | unsigned long flags; | ||
253 | int count; | ||
254 | struct winsize winsize; | ||
255 | unsigned char stopped:1, hw_stopped:1, flow_stopped:1, packet:1; | ||
256 | unsigned char low_latency:1, warned:1; | ||
257 | unsigned char ctrl_status; | ||
258 | |||
259 | struct tty_struct *link; | ||
260 | struct fasync_struct *fasync; | ||
261 | struct tty_flip_buffer flip; | ||
262 | int max_flip_cnt; | ||
263 | int alt_speed; /* For magic substitution of 38400 bps */ | ||
264 | wait_queue_head_t write_wait; | ||
265 | wait_queue_head_t read_wait; | ||
266 | struct work_struct hangup_work; | ||
267 | void *disc_data; | ||
268 | void *driver_data; | ||
269 | struct list_head tty_files; | ||
270 | |||
271 | #define N_TTY_BUF_SIZE 4096 | ||
272 | |||
273 | /* | ||
274 | * The following is data for the N_TTY line discipline. For | ||
275 | * historical reasons, this is included in the tty structure. | ||
276 | */ | ||
277 | unsigned int column; | ||
278 | unsigned char lnext:1, erasing:1, raw:1, real_raw:1, icanon:1; | ||
279 | unsigned char closing:1; | ||
280 | unsigned short minimum_to_wake; | ||
281 | unsigned long overrun_time; | ||
282 | int num_overrun; | ||
283 | unsigned long process_char_map[256/(8*sizeof(unsigned long))]; | ||
284 | char *read_buf; | ||
285 | int read_head; | ||
286 | int read_tail; | ||
287 | int read_cnt; | ||
288 | unsigned long read_flags[N_TTY_BUF_SIZE/(8*sizeof(unsigned long))]; | ||
289 | int canon_data; | ||
290 | unsigned long canon_head; | ||
291 | unsigned int canon_column; | ||
292 | struct semaphore atomic_read; | ||
293 | struct semaphore atomic_write; | ||
294 | unsigned char *write_buf; | ||
295 | int write_cnt; | ||
296 | spinlock_t read_lock; | ||
297 | /* If the tty has a pending do_SAK, queue it here - akpm */ | ||
298 | struct work_struct SAK_work; | ||
299 | }; | ||
300 | |||
301 | /* tty magic number */ | ||
302 | #define TTY_MAGIC 0x5401 | ||
303 | |||
304 | /* | ||
305 | * These bits are used in the flags field of the tty structure. | ||
306 | * | ||
307 | * So that interrupts won't be able to mess up the queues, | ||
308 | * copy_to_cooked must be atomic with respect to itself, as must | ||
309 | * tty->write. Thus, you must use the inline functions set_bit() and | ||
310 | * clear_bit() to make things atomic. | ||
311 | */ | ||
312 | #define TTY_THROTTLED 0 /* Call unthrottle() at threshold min */ | ||
313 | #define TTY_IO_ERROR 1 /* Canse an I/O error (may be no ldisc too) */ | ||
314 | #define TTY_OTHER_CLOSED 2 /* Other side (if any) has closed */ | ||
315 | #define TTY_EXCLUSIVE 3 /* Exclusive open mode */ | ||
316 | #define TTY_DEBUG 4 /* Debugging */ | ||
317 | #define TTY_DO_WRITE_WAKEUP 5 /* Call write_wakeup after queuing new */ | ||
318 | #define TTY_PUSH 6 /* n_tty private */ | ||
319 | #define TTY_CLOSING 7 /* ->close() in progress */ | ||
320 | #define TTY_DONT_FLIP 8 /* Defer buffer flip */ | ||
321 | #define TTY_LDISC 9 /* Line discipline attached */ | ||
322 | #define TTY_HW_COOK_OUT 14 /* Hardware can do output cooking */ | ||
323 | #define TTY_HW_COOK_IN 15 /* Hardware can do input cooking */ | ||
324 | #define TTY_PTY_LOCK 16 /* pty private */ | ||
325 | #define TTY_NO_WRITE_SPLIT 17 /* Preserve write boundaries to driver */ | ||
326 | #define TTY_HUPPED 18 /* Post driver->hangup() */ | ||
327 | |||
328 | #define TTY_WRITE_FLUSH(tty) tty_write_flush((tty)) | ||
329 | |||
330 | extern void tty_write_flush(struct tty_struct *); | ||
331 | |||
332 | extern struct termios tty_std_termios; | ||
333 | extern int fg_console, last_console, want_console; | ||
334 | |||
335 | extern int kmsg_redirect; | ||
336 | |||
337 | extern void console_init(void); | ||
338 | extern int vcs_init(void); | ||
339 | |||
340 | extern int tty_paranoia_check(struct tty_struct *tty, struct inode *inode, | ||
341 | const char *routine); | ||
342 | extern char *tty_name(struct tty_struct *tty, char *buf); | ||
343 | extern void tty_wait_until_sent(struct tty_struct * tty, long timeout); | ||
344 | extern int tty_check_change(struct tty_struct * tty); | ||
345 | extern void stop_tty(struct tty_struct * tty); | ||
346 | extern void start_tty(struct tty_struct * tty); | ||
347 | extern int tty_register_ldisc(int disc, struct tty_ldisc *new_ldisc); | ||
348 | extern int tty_register_driver(struct tty_driver *driver); | ||
349 | extern int tty_unregister_driver(struct tty_driver *driver); | ||
350 | extern void tty_register_device(struct tty_driver *driver, unsigned index, struct device *dev); | ||
351 | extern void tty_unregister_device(struct tty_driver *driver, unsigned index); | ||
352 | extern int tty_read_raw_data(struct tty_struct *tty, unsigned char *bufp, | ||
353 | int buflen); | ||
354 | extern void tty_write_message(struct tty_struct *tty, char *msg); | ||
355 | |||
356 | extern int is_orphaned_pgrp(int pgrp); | ||
357 | extern int is_ignored(int sig); | ||
358 | extern int tty_signal(int sig, struct tty_struct *tty); | ||
359 | extern void tty_hangup(struct tty_struct * tty); | ||
360 | extern void tty_vhangup(struct tty_struct * tty); | ||
361 | extern void tty_unhangup(struct file *filp); | ||
362 | extern int tty_hung_up_p(struct file * filp); | ||
363 | extern void do_SAK(struct tty_struct *tty); | ||
364 | extern void disassociate_ctty(int priv); | ||
365 | extern void tty_flip_buffer_push(struct tty_struct *tty); | ||
366 | extern int tty_get_baud_rate(struct tty_struct *tty); | ||
367 | extern int tty_termios_baud_rate(struct termios *termios); | ||
368 | |||
369 | extern struct tty_ldisc *tty_ldisc_ref(struct tty_struct *); | ||
370 | extern void tty_ldisc_deref(struct tty_ldisc *); | ||
371 | extern struct tty_ldisc *tty_ldisc_ref_wait(struct tty_struct *); | ||
372 | |||
373 | extern struct tty_ldisc *tty_ldisc_get(int); | ||
374 | extern void tty_ldisc_put(int); | ||
375 | |||
376 | extern void tty_wakeup(struct tty_struct *tty); | ||
377 | extern void tty_ldisc_flush(struct tty_struct *tty); | ||
378 | |||
379 | struct semaphore; | ||
380 | extern struct semaphore tty_sem; | ||
381 | |||
382 | /* n_tty.c */ | ||
383 | extern struct tty_ldisc tty_ldisc_N_TTY; | ||
384 | |||
385 | /* tty_ioctl.c */ | ||
386 | extern int n_tty_ioctl(struct tty_struct * tty, struct file * file, | ||
387 | unsigned int cmd, unsigned long arg); | ||
388 | |||
389 | /* serial.c */ | ||
390 | |||
391 | extern void serial_console_init(void); | ||
392 | |||
393 | /* pcxx.c */ | ||
394 | |||
395 | extern int pcxe_open(struct tty_struct *tty, struct file *filp); | ||
396 | |||
397 | /* printk.c */ | ||
398 | |||
399 | extern void console_print(const char *); | ||
400 | |||
401 | /* vt.c */ | ||
402 | |||
403 | extern int vt_ioctl(struct tty_struct *tty, struct file * file, | ||
404 | unsigned int cmd, unsigned long arg); | ||
405 | |||
406 | static inline dev_t tty_devnum(struct tty_struct *tty) | ||
407 | { | ||
408 | return MKDEV(tty->driver->major, tty->driver->minor_start) + tty->index; | ||
409 | } | ||
410 | |||
411 | #endif /* __KERNEL__ */ | ||
412 | #endif | ||