Blame view

include/linux/tty_ldisc.h 7.9 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
  #ifndef _LINUX_TTY_LDISC_H
  #define _LINUX_TTY_LDISC_H
  
  /*
   * This structure defines the interface between the tty line discipline
   * implementation and the tty routines.  The following routines can be
   * defined; unless noted otherwise, they are optional, and can be
   * filled in with a null pointer.
   *
   * int	(*open)(struct tty_struct *);
   *
6be06e727   Peter Hurley   tty: Fix checkpat...
12
13
14
15
   *	This function is called when the line discipline is associated
   *	with the tty.  The line discipline can use this as an
   *	opportunity to initialize any state needed by the ldisc routines.
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
16
17
18
   * void	(*close)(struct tty_struct *);
   *
   *	This function is called when the line discipline is being
6be06e727   Peter Hurley   tty: Fix checkpat...
19
20
21
   *	shutdown, either because the tty is being closed or because
   *	the tty is being changed to use a new line discipline
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
22
23
   * void	(*flush_buffer)(struct tty_struct *tty);
   *
6be06e727   Peter Hurley   tty: Fix checkpat...
24
25
26
27
   *	This function instructs the line discipline to clear its
   *	buffers of any input characters it may have queued to be
   *	delivered to the user mode process.
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
28
29
   * ssize_t (*chars_in_buffer)(struct tty_struct *tty);
   *
6be06e727   Peter Hurley   tty: Fix checkpat...
30
   *	This function returns the number of input characters the line
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
31
32
   *	discipline may have queued up to be delivered to the user mode
   *	process.
6be06e727   Peter Hurley   tty: Fix checkpat...
33
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
34
35
36
   * ssize_t (*read)(struct tty_struct * tty, struct file * file,
   *		   unsigned char * buf, size_t nr);
   *
6be06e727   Peter Hurley   tty: Fix checkpat...
37
38
39
40
41
   *	This function is called when the user requests to read from
   *	the tty.  The line discipline will return whatever characters
   *	it has buffered up for the user.  If this function is not
   *	defined, the user will receive an EIO error.
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
42
   * ssize_t (*write)(struct tty_struct * tty, struct file * file,
6be06e727   Peter Hurley   tty: Fix checkpat...
43
44
45
46
47
48
49
50
   *		    const unsigned char * buf, size_t nr);
   *
   *	This function is called when the user requests to write to the
   *	tty.  The line discipline will deliver the characters to the
   *	low-level tty device for transmission, optionally performing
   *	some processing on the characters first.  If this function is
   *	not defined, the user will receive an EIO error.
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
51
   * int	(*ioctl)(struct tty_struct * tty, struct file * file,
6be06e727   Peter Hurley   tty: Fix checkpat...
52
   *		 unsigned int cmd, unsigned long arg);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
53
54
   *
   *	This function is called when the user requests an ioctl which
6be06e727   Peter Hurley   tty: Fix checkpat...
55
56
57
58
59
60
61
   *	is not handled by the tty layer or the low-level tty driver.
   *	It is intended for ioctls which affect line discpline
   *	operation.  Note that the search order for ioctls is (1) tty
   *	layer, (2) tty low-level driver, (3) line discpline.  So a
   *	low-level driver can "grab" an ioctl request before the line
   *	discpline has a chance to see it.
   *
e10cc1df1   Paul Fulghum   tty: add compat_i...
62
   * long	(*compat_ioctl)(struct tty_struct * tty, struct file * file,
6be06e727   Peter Hurley   tty: Fix checkpat...
63
   *		        unsigned int cmd, unsigned long arg);
e10cc1df1   Paul Fulghum   tty: add compat_i...
64
   *
6be06e727   Peter Hurley   tty: Fix checkpat...
65
   *	Process ioctl calls from 32-bit process on 64-bit system
e10cc1df1   Paul Fulghum   tty: add compat_i...
66
   *
edc6afc54   Alan Cox   [PATCH] tty: swit...
67
   * void	(*set_termios)(struct tty_struct *tty, struct ktermios * old);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
68
   *
6be06e727   Peter Hurley   tty: Fix checkpat...
69
70
71
   *	This function notifies the line discpline that a change has
   *	been made to the termios structure.
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
72
   * int	(*poll)(struct tty_struct * tty, struct file * file,
6be06e727   Peter Hurley   tty: Fix checkpat...
73
   *		  poll_table *wait);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
74
   *
6be06e727   Peter Hurley   tty: Fix checkpat...
75
76
77
   *	This function is called when a user attempts to select/poll on a
   *	tty device.  It is solely the responsibility of the line
   *	discipline to handle poll requests.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
78
   *
55db4c64e   Linus Torvalds   Revert "tty: make...
79
   * void	(*receive_buf)(struct tty_struct *, const unsigned char *cp,
6be06e727   Peter Hurley   tty: Fix checkpat...
80
81
82
83
84
85
86
   *		       char *fp, int count);
   *
   *	This function is called by the low-level tty driver to send
   *	characters received by the hardware to the line discpline for
   *	processing.  <cp> is a pointer to the buffer of input
   *	character received by the device.  <fp> is a pointer to a
   *	pointer of flag bytes which indicate whether a character was
82f91fe09   Peter Hurley   tty: Always handl...
87
88
   *	received with a parity error, etc. <fp> may be NULL to indicate
   *	all data received is TTY_NORMAL.
6be06e727   Peter Hurley   tty: Fix checkpat...
89
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
90
91
   * void	(*write_wakeup)(struct tty_struct *);
   *
6be06e727   Peter Hurley   tty: Fix checkpat...
92
93
94
95
   *	This function is called by the low-level tty driver to signal
   *	that line discpline should try to send more characters to the
   *	low-level driver for transmission.  If the line discpline does
   *	not have any more data to send, it can just return.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
96
97
98
99
100
101
102
   *
   * int (*hangup)(struct tty_struct *)
   *
   *	Called on a hangup. Tells the discipline that it should
   *	cease I/O to the tty driver. Can sleep. The driver should
   *	seek to perform this action quickly but should wait until
   *	any pending driver I/O is completed.
b3e63afe8   Rodolfo Giometti   ldisc: new dcd_ch...
103
   *
f6c8dbe6e   Peter Hurley   n_tty: Encapsulat...
104
105
106
107
108
   * void (*fasync)(struct tty_struct *, int on)
   *
   *	Notify line discipline when signal-driven I/O is enabled or
   *	disabled.
   *
593fb1ae4   George Spelvin   pps: Move timesta...
109
   * void (*dcd_change)(struct tty_struct *tty, unsigned int status)
b3e63afe8   Rodolfo Giometti   ldisc: new dcd_ch...
110
   *
593fb1ae4   George Spelvin   pps: Move timesta...
111
112
   *	Tells the discipline that the DCD pin has changed its status.
   *	Used exclusively by the N_PPS (Pulse-Per-Second) line discipline.
24a89d1cb   Peter Hurley   tty: Make ldisc i...
113
114
115
116
117
118
119
120
121
   *
   * int	(*receive_buf2)(struct tty_struct *, const unsigned char *cp,
   *			char *fp, int count);
   *
   *	This function is called by the low-level tty driver to send
   *	characters received by the hardware to the line discpline for
   *	processing.  <cp> is a pointer to the buffer of input
   *	character received by the device.  <fp> is a pointer to a
   *	pointer of flag bytes which indicate whether a character was
82f91fe09   Peter Hurley   tty: Always handl...
122
123
   *	received with a parity error, etc. <fp> may be NULL to indicate
   *	all data received is TTY_NORMAL.
24a89d1cb   Peter Hurley   tty: Make ldisc i...
124
   *	If assigned, prefer this function for automatic flow control.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
125
126
127
128
   */
  
  #include <linux/fs.h>
  #include <linux/wait.h>
4898e640c   Peter Hurley   tty: Add timed, w...
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
  
  /*
   * the semaphore definition
   */
  struct ld_semaphore {
  	long			count;
  	raw_spinlock_t		wait_lock;
  	unsigned int		wait_readers;
  	struct list_head	read_wait;
  	struct list_head	write_wait;
  #ifdef CONFIG_DEBUG_LOCK_ALLOC
  	struct lockdep_map	dep_map;
  #endif
  };
  
  extern void __init_ldsem(struct ld_semaphore *sem, const char *name,
  			 struct lock_class_key *key);
  
  #define init_ldsem(sem)						\
  do {								\
  	static struct lock_class_key __key;			\
  								\
  	__init_ldsem((sem), #sem, &__key);			\
  } while (0)
  
  
  extern int ldsem_down_read(struct ld_semaphore *sem, long timeout);
  extern int ldsem_down_read_trylock(struct ld_semaphore *sem);
  extern int ldsem_down_write(struct ld_semaphore *sem, long timeout);
  extern int ldsem_down_write_trylock(struct ld_semaphore *sem);
  extern void ldsem_up_read(struct ld_semaphore *sem);
  extern void ldsem_up_write(struct ld_semaphore *sem);
  
  #ifdef CONFIG_DEBUG_LOCK_ALLOC
  extern int ldsem_down_read_nested(struct ld_semaphore *sem, int subclass,
  				  long timeout);
  extern int ldsem_down_write_nested(struct ld_semaphore *sem, int subclass,
  				   long timeout);
  #else
  # define ldsem_down_read_nested(sem, subclass, timeout)		\
  		ldsem_down_read(sem, timeout)
  # define ldsem_down_write_nested(sem, subclass, timeout)	\
  		ldsem_down_write(sem, timeout)
  #endif
a352def21   Alan Cox   tty: Ldisc revamp
173
  struct tty_ldisc_ops {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
174
175
176
177
  	int	magic;
  	char	*name;
  	int	num;
  	int	flags;
6be06e727   Peter Hurley   tty: Fix checkpat...
178

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
179
180
181
182
183
184
185
  	/*
  	 * The following routines are called from above.
  	 */
  	int	(*open)(struct tty_struct *);
  	void	(*close)(struct tty_struct *);
  	void	(*flush_buffer)(struct tty_struct *tty);
  	ssize_t	(*chars_in_buffer)(struct tty_struct *tty);
6be06e727   Peter Hurley   tty: Fix checkpat...
186
187
188
189
190
  	ssize_t	(*read)(struct tty_struct *tty, struct file *file,
  			unsigned char __user *buf, size_t nr);
  	ssize_t	(*write)(struct tty_struct *tty, struct file *file,
  			 const unsigned char *buf, size_t nr);
  	int	(*ioctl)(struct tty_struct *tty, struct file *file,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
191
  			 unsigned int cmd, unsigned long arg);
6be06e727   Peter Hurley   tty: Fix checkpat...
192
  	long	(*compat_ioctl)(struct tty_struct *tty, struct file *file,
e10cc1df1   Paul Fulghum   tty: add compat_i...
193
  				unsigned int cmd, unsigned long arg);
6be06e727   Peter Hurley   tty: Fix checkpat...
194
  	void	(*set_termios)(struct tty_struct *tty, struct ktermios *old);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
195
196
197
  	unsigned int (*poll)(struct tty_struct *, struct file *,
  			     struct poll_table_struct *);
  	int	(*hangup)(struct tty_struct *tty);
6be06e727   Peter Hurley   tty: Fix checkpat...
198

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
199
200
201
  	/*
  	 * The following routines are called from below.
  	 */
55db4c64e   Linus Torvalds   Revert "tty: make...
202
203
  	void	(*receive_buf)(struct tty_struct *, const unsigned char *cp,
  			       char *fp, int count);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
204
  	void	(*write_wakeup)(struct tty_struct *);
593fb1ae4   George Spelvin   pps: Move timesta...
205
  	void	(*dcd_change)(struct tty_struct *, unsigned int);
f6c8dbe6e   Peter Hurley   n_tty: Encapsulat...
206
  	void	(*fasync)(struct tty_struct *tty, int on);
24a89d1cb   Peter Hurley   tty: Make ldisc i...
207
208
  	int	(*receive_buf2)(struct tty_struct *, const unsigned char *cp,
  				char *fp, int count);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
209
210
  
  	struct  module *owner;
6be06e727   Peter Hurley   tty: Fix checkpat...
211

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
212
213
  	int refcount;
  };
a352def21   Alan Cox   tty: Ldisc revamp
214
215
  struct tty_ldisc {
  	struct tty_ldisc_ops *ops;
36697529b   Peter Hurley   tty: Replace ldis...
216
  	struct tty_struct *tty;
a352def21   Alan Cox   tty: Ldisc revamp
217
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
218
219
220
221
222
223
224
225
  #define TTY_LDISC_MAGIC	0x5403
  
  #define LDISC_FLAG_DEFINED	0x00000001
  
  #define MODULE_ALIAS_LDISC(ldisc) \
  	MODULE_ALIAS("tty-ldisc-" __stringify(ldisc))
  
  #endif /* _LINUX_TTY_LDISC_H */