| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | #ifndef _LINUX_TTY_LDISC_H | 
 | 2 | #define _LINUX_TTY_LDISC_H | 
 | 3 |  | 
 | 4 | /* | 
 | 5 |  * This structure defines the interface between the tty line discipline | 
 | 6 |  * implementation and the tty routines.  The following routines can be | 
 | 7 |  * defined; unless noted otherwise, they are optional, and can be | 
 | 8 |  * filled in with a null pointer. | 
 | 9 |  * | 
 | 10 |  * int	(*open)(struct tty_struct *); | 
 | 11 |  * | 
 | 12 |  * 	This function is called when the line discipline is associated | 
 | 13 |  * 	with the tty.  The line discipline can use this as an | 
 | 14 |  * 	opportunity to initialize any state needed by the ldisc routines. | 
 | 15 |  *  | 
 | 16 |  * void	(*close)(struct tty_struct *); | 
 | 17 |  * | 
 | 18 |  *	This function is called when the line discipline is being | 
 | 19 |  * 	shutdown, either because the tty is being closed or because | 
 | 20 |  * 	the tty is being changed to use a new line discipline | 
 | 21 |  *  | 
 | 22 |  * void	(*flush_buffer)(struct tty_struct *tty); | 
 | 23 |  * | 
 | 24 |  * 	This function instructs the line discipline to clear its | 
 | 25 |  * 	buffers of any input characters it may have queued to be | 
 | 26 |  * 	delivered to the user mode process. | 
 | 27 |  *  | 
 | 28 |  * ssize_t (*chars_in_buffer)(struct tty_struct *tty); | 
 | 29 |  * | 
 | 30 |  * 	This function returns the number of input characters the line | 
 | 31 |  *	discipline may have queued up to be delivered to the user mode | 
 | 32 |  *	process. | 
 | 33 |  *  | 
 | 34 |  * ssize_t (*read)(struct tty_struct * tty, struct file * file, | 
 | 35 |  *		   unsigned char * buf, size_t nr); | 
 | 36 |  * | 
 | 37 |  * 	This function is called when the user requests to read from | 
 | 38 |  * 	the tty.  The line discipline will return whatever characters | 
 | 39 |  * 	it has buffered up for the user.  If this function is not | 
 | 40 |  * 	defined, the user will receive an EIO error. | 
 | 41 |  *  | 
 | 42 |  * ssize_t (*write)(struct tty_struct * tty, struct file * file, | 
 | 43 |  * 		    const unsigned char * buf, size_t nr); | 
 | 44 |  * | 
 | 45 |  * 	This function is called when the user requests to write to the | 
 | 46 |  * 	tty.  The line discipline will deliver the characters to the | 
 | 47 |  * 	low-level tty device for transmission, optionally performing | 
 | 48 |  * 	some processing on the characters first.  If this function is | 
 | 49 |  * 	not defined, the user will receive an EIO error. | 
 | 50 |  *  | 
 | 51 |  * int	(*ioctl)(struct tty_struct * tty, struct file * file, | 
 | 52 |  * 		 unsigned int cmd, unsigned long arg); | 
 | 53 |  * | 
 | 54 |  *	This function is called when the user requests an ioctl which | 
 | 55 |  * 	is not handled by the tty layer or the low-level tty driver. | 
 | 56 |  * 	It is intended for ioctls which affect line discpline | 
 | 57 |  * 	operation.  Note that the search order for ioctls is (1) tty | 
 | 58 |  * 	layer, (2) tty low-level driver, (3) line discpline.  So a | 
 | 59 |  * 	low-level driver can "grab" an ioctl request before the line | 
 | 60 |  * 	discpline has a chance to see it. | 
 | 61 |  *  | 
| Paul Fulghum | e10cc1d | 2007-05-10 22:22:50 -0700 | [diff] [blame] | 62 |  * long	(*compat_ioctl)(struct tty_struct * tty, struct file * file, | 
 | 63 |  * 		        unsigned int cmd, unsigned long arg); | 
 | 64 |  * | 
 | 65 |  *      Process ioctl calls from 32-bit process on 64-bit system | 
 | 66 |  * | 
| Alan Cox | edc6afc | 2006-12-08 02:38:44 -0800 | [diff] [blame] | 67 |  * void	(*set_termios)(struct tty_struct *tty, struct ktermios * old); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 68 |  * | 
 | 69 |  * 	This function notifies the line discpline that a change has | 
 | 70 |  * 	been made to the termios structure. | 
 | 71 |  *  | 
 | 72 |  * int	(*poll)(struct tty_struct * tty, struct file * file, | 
 | 73 |  * 		  poll_table *wait); | 
 | 74 |  * | 
 | 75 |  * 	This function is called when a user attempts to select/poll on a | 
 | 76 |  * 	tty device.  It is solely the responsibility of the line | 
 | 77 |  * 	discipline to handle poll requests. | 
 | 78 |  * | 
 | 79 |  * void	(*receive_buf)(struct tty_struct *, const unsigned char *cp, | 
 | 80 |  * 		       char *fp, int count); | 
 | 81 |  * | 
 | 82 |  * 	This function is called by the low-level tty driver to send | 
 | 83 |  * 	characters received by the hardware to the line discpline for | 
 | 84 |  * 	processing.  <cp> is a pointer to the buffer of input | 
 | 85 |  * 	character received by the device.  <fp> is a pointer to a | 
 | 86 |  * 	pointer of flag bytes which indicate whether a character was | 
 | 87 |  * 	received with a parity error, etc. | 
 | 88 |  *  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 89 |  * void	(*write_wakeup)(struct tty_struct *); | 
 | 90 |  * | 
 | 91 |  * 	This function is called by the low-level tty driver to signal | 
 | 92 |  * 	that line discpline should try to send more characters to the | 
 | 93 |  * 	low-level driver for transmission.  If the line discpline does | 
 | 94 |  * 	not have any more data to send, it can just return. | 
 | 95 |  * | 
 | 96 |  * int (*hangup)(struct tty_struct *) | 
 | 97 |  * | 
 | 98 |  *	Called on a hangup. Tells the discipline that it should | 
 | 99 |  *	cease I/O to the tty driver. Can sleep. The driver should | 
 | 100 |  *	seek to perform this action quickly but should wait until | 
 | 101 |  *	any pending driver I/O is completed. | 
| Rodolfo Giometti | b3e63af | 2010-03-10 15:23:45 -0800 | [diff] [blame] | 102 |  * | 
 | 103 |  * void (*dcd_change)(struct tty_struct *tty, unsigned int status, | 
 | 104 |  * 			struct timespec *ts) | 
 | 105 |  * | 
 | 106 |  *	Tells the discipline that the DCD pin has changed its status and | 
 | 107 |  *	the relative timestamp. Pointer ts can be NULL. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 108 |  */ | 
 | 109 |  | 
 | 110 | #include <linux/fs.h> | 
 | 111 | #include <linux/wait.h> | 
 | 112 |  | 
| Alan Cox | a352def | 2008-07-16 21:53:12 +0100 | [diff] [blame] | 113 | struct tty_ldisc_ops { | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 114 | 	int	magic; | 
 | 115 | 	char	*name; | 
 | 116 | 	int	num; | 
 | 117 | 	int	flags; | 
 | 118 | 	 | 
 | 119 | 	/* | 
 | 120 | 	 * The following routines are called from above. | 
 | 121 | 	 */ | 
 | 122 | 	int	(*open)(struct tty_struct *); | 
 | 123 | 	void	(*close)(struct tty_struct *); | 
 | 124 | 	void	(*flush_buffer)(struct tty_struct *tty); | 
 | 125 | 	ssize_t	(*chars_in_buffer)(struct tty_struct *tty); | 
 | 126 | 	ssize_t	(*read)(struct tty_struct * tty, struct file * file, | 
 | 127 | 			unsigned char __user * buf, size_t nr); | 
 | 128 | 	ssize_t	(*write)(struct tty_struct * tty, struct file * file, | 
 | 129 | 			 const unsigned char * buf, size_t nr);	 | 
 | 130 | 	int	(*ioctl)(struct tty_struct * tty, struct file * file, | 
 | 131 | 			 unsigned int cmd, unsigned long arg); | 
| Paul Fulghum | e10cc1d | 2007-05-10 22:22:50 -0700 | [diff] [blame] | 132 | 	long	(*compat_ioctl)(struct tty_struct * tty, struct file * file, | 
 | 133 | 				unsigned int cmd, unsigned long arg); | 
| Alan Cox | edc6afc | 2006-12-08 02:38:44 -0800 | [diff] [blame] | 134 | 	void	(*set_termios)(struct tty_struct *tty, struct ktermios * old); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 135 | 	unsigned int (*poll)(struct tty_struct *, struct file *, | 
 | 136 | 			     struct poll_table_struct *); | 
 | 137 | 	int	(*hangup)(struct tty_struct *tty); | 
 | 138 | 	 | 
 | 139 | 	/* | 
 | 140 | 	 * The following routines are called from below. | 
 | 141 | 	 */ | 
 | 142 | 	void	(*receive_buf)(struct tty_struct *, const unsigned char *cp, | 
 | 143 | 			       char *fp, int count); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 144 | 	void	(*write_wakeup)(struct tty_struct *); | 
| Rodolfo Giometti | b3e63af | 2010-03-10 15:23:45 -0800 | [diff] [blame] | 145 | 	void	(*dcd_change)(struct tty_struct *, unsigned int, | 
 | 146 | 				struct timespec *); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 147 |  | 
 | 148 | 	struct  module *owner; | 
 | 149 | 	 | 
 | 150 | 	int refcount; | 
 | 151 | }; | 
 | 152 |  | 
| Alan Cox | a352def | 2008-07-16 21:53:12 +0100 | [diff] [blame] | 153 | struct tty_ldisc { | 
 | 154 | 	struct tty_ldisc_ops *ops; | 
| Linus Torvalds | 18eac1c | 2009-08-03 10:58:29 -0700 | [diff] [blame] | 155 | 	atomic_t users; | 
| Alan Cox | a352def | 2008-07-16 21:53:12 +0100 | [diff] [blame] | 156 | }; | 
 | 157 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 158 | #define TTY_LDISC_MAGIC	0x5403 | 
 | 159 |  | 
 | 160 | #define LDISC_FLAG_DEFINED	0x00000001 | 
 | 161 |  | 
 | 162 | #define MODULE_ALIAS_LDISC(ldisc) \ | 
 | 163 | 	MODULE_ALIAS("tty-ldisc-" __stringify(ldisc)) | 
 | 164 |  | 
 | 165 | #endif /* _LINUX_TTY_LDISC_H */ |