tty_ldisc.h 7.92 KB
Newer Older
Linus Torvalds's avatar
Linus Torvalds committed
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 *);
 *
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.
 *
Linus Torvalds's avatar
Linus Torvalds committed
16 17 18
 * void	(*close)(struct tty_struct *);
 *
 *	This function is called when the line discipline is being
19 20 21
 *	shutdown, either because the tty is being closed or because
 *	the tty is being changed to use a new line discipline
 *
Linus Torvalds's avatar
Linus Torvalds committed
22 23
 * void	(*flush_buffer)(struct tty_struct *tty);
 *
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.
 *
Linus Torvalds's avatar
Linus Torvalds committed
28 29
 * ssize_t (*chars_in_buffer)(struct tty_struct *tty);
 *
30
 *	This function returns the number of input characters the line
Linus Torvalds's avatar
Linus Torvalds committed
31 32
 *	discipline may have queued up to be delivered to the user mode
 *	process.
33
 *
Linus Torvalds's avatar
Linus Torvalds committed
34 35 36
 * ssize_t (*read)(struct tty_struct * tty, struct file * file,
 *		   unsigned char * buf, size_t nr);
 *
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.
 *
Linus Torvalds's avatar
Linus Torvalds committed
42
 * ssize_t (*write)(struct tty_struct * tty, struct file * file,
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.
 *
Linus Torvalds's avatar
Linus Torvalds committed
51
 * int	(*ioctl)(struct tty_struct * tty, struct file * file,
52
 *		 unsigned int cmd, unsigned long arg);
Linus Torvalds's avatar
Linus Torvalds committed
53 54
 *
 *	This function is called when the user requests an ioctl which
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.
 *
Paul Fulghum's avatar
Paul Fulghum committed
62
 * long	(*compat_ioctl)(struct tty_struct * tty, struct file * file,
63
 *		        unsigned int cmd, unsigned long arg);
Paul Fulghum's avatar
Paul Fulghum committed
64
 *
65
 *	Process ioctl calls from 32-bit process on 64-bit system
Paul Fulghum's avatar
Paul Fulghum committed
66
 *
67
 * void	(*set_termios)(struct tty_struct *tty, struct ktermios * old);
Linus Torvalds's avatar
Linus Torvalds committed
68
 *
69 70 71
 *	This function notifies the line discpline that a change has
 *	been made to the termios structure.
 *
Linus Torvalds's avatar
Linus Torvalds committed
72
 * int	(*poll)(struct tty_struct * tty, struct file * file,
73
 *		  poll_table *wait);
Linus Torvalds's avatar
Linus Torvalds committed
74
 *
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.
Linus Torvalds's avatar
Linus Torvalds committed
78
 *
79
 * void	(*receive_buf)(struct tty_struct *, const unsigned char *cp,
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
87 88
 *	received with a parity error, etc. <fp> may be NULL to indicate
 *	all data received is TTY_NORMAL.
89
 *
Linus Torvalds's avatar
Linus Torvalds committed
90 91
 * void	(*write_wakeup)(struct tty_struct *);
 *
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.
Linus Torvalds's avatar
Linus Torvalds committed
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.
103
 *
104 105 106 107 108
 * void (*fasync)(struct tty_struct *, int on)
 *
 *	Notify line discipline when signal-driven I/O is enabled or
 *	disabled.
 *
109
 * void (*dcd_change)(struct tty_struct *tty, unsigned int status)
110
 *
111 112
 *	Tells the discipline that the DCD pin has changed its status.
 *	Used exclusively by the N_PPS (Pulse-Per-Second) line discipline.
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
122 123
 *	received with a parity error, etc. <fp> may be NULL to indicate
 *	all data received is TTY_NORMAL.
124
 *	If assigned, prefer this function for automatic flow control.
Linus Torvalds's avatar
Linus Torvalds committed
125 126 127 128
 */

#include <linux/fs.h>
#include <linux/wait.h>
129
#include <linux/wait.h>
Linus Torvalds's avatar
Linus Torvalds committed
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 173 174 175 176

/*
 * 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


Alan Cox's avatar
Alan Cox committed
177
struct tty_ldisc_ops {
Linus Torvalds's avatar
Linus Torvalds committed
178 179 180 181
	int	magic;
	char	*name;
	int	num;
	int	flags;
182

Linus Torvalds's avatar
Linus Torvalds committed
183 184 185 186 187 188 189
	/*
	 * 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);
190 191 192 193 194
	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,
Linus Torvalds's avatar
Linus Torvalds committed
195
			 unsigned int cmd, unsigned long arg);
196
	long	(*compat_ioctl)(struct tty_struct *tty, struct file *file,
Paul Fulghum's avatar
Paul Fulghum committed
197
				unsigned int cmd, unsigned long arg);
198
	void	(*set_termios)(struct tty_struct *tty, struct ktermios *old);
Linus Torvalds's avatar
Linus Torvalds committed
199 200 201
	unsigned int (*poll)(struct tty_struct *, struct file *,
			     struct poll_table_struct *);
	int	(*hangup)(struct tty_struct *tty);
202

Linus Torvalds's avatar
Linus Torvalds committed
203 204 205
	/*
	 * The following routines are called from below.
	 */
206 207
	void	(*receive_buf)(struct tty_struct *, const unsigned char *cp,
			       char *fp, int count);
Linus Torvalds's avatar
Linus Torvalds committed
208
	void	(*write_wakeup)(struct tty_struct *);
209
	void	(*dcd_change)(struct tty_struct *, unsigned int);
210
	void	(*fasync)(struct tty_struct *tty, int on);
211 212
	int	(*receive_buf2)(struct tty_struct *, const unsigned char *cp,
				char *fp, int count);
Linus Torvalds's avatar
Linus Torvalds committed
213 214

	struct  module *owner;
215

Linus Torvalds's avatar
Linus Torvalds committed
216 217 218
	int refcount;
};

Alan Cox's avatar
Alan Cox committed
219 220
struct tty_ldisc {
	struct tty_ldisc_ops *ops;
221
	struct tty_struct *tty;
Alan Cox's avatar
Alan Cox committed
222 223
};

Linus Torvalds's avatar
Linus Torvalds committed
224 225 226 227 228 229 230 231
#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 */