| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 |  | 
|  | 2 | The Lockronomicon | 
|  | 3 |  | 
|  | 4 | Your guide to the ancient and twisted locking policies of the tty layer and | 
|  | 5 | the warped logic behind them. Beware all ye who read on. | 
|  | 6 |  | 
|  | 7 | FIXME: still need to work out the full set of BKL assumptions and document | 
|  | 8 | them so they can eventually be killed off. | 
|  | 9 |  | 
|  | 10 |  | 
|  | 11 | Line Discipline | 
|  | 12 | --------------- | 
|  | 13 |  | 
|  | 14 | Line disciplines are registered with tty_register_ldisc() passing the | 
|  | 15 | discipline number and the ldisc structure. At the point of registration the | 
|  | 16 | discipline must be ready to use and it is possible it will get used before | 
|  | 17 | the call returns success. If the call returns an error then it won't get | 
|  | 18 | called. Do not re-use ldisc numbers as they are part of the userspace ABI | 
|  | 19 | and writing over an existing ldisc will cause demons to eat your computer. | 
|  | 20 | After the return the ldisc data has been copied so you may free your own | 
|  | 21 | copy of the structure. You must not re-register over the top of the line | 
|  | 22 | discipline even with the same data or your computer again will be eaten by | 
|  | 23 | demons. | 
|  | 24 |  | 
| Alexey Dobriyan | bfb0759 | 2005-06-23 00:10:32 -0700 | [diff] [blame] | 25 | In order to remove a line discipline call tty_unregister_ldisc(). | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 26 | In ancient times this always worked. In modern times the function will | 
|  | 27 | return -EBUSY if the ldisc is currently in use. Since the ldisc referencing | 
|  | 28 | code manages the module counts this should not usually be a concern. | 
|  | 29 |  | 
|  | 30 | Heed this warning: the reference count field of the registered copies of the | 
|  | 31 | tty_ldisc structure in the ldisc table counts the number of lines using this | 
|  | 32 | discipline. The reference count of the tty_ldisc structure within a tty | 
|  | 33 | counts the number of active users of the ldisc at this instant. In effect it | 
|  | 34 | counts the number of threads of execution within an ldisc method (plus those | 
|  | 35 | about to enter and exit although this detail matters not). | 
|  | 36 |  | 
|  | 37 | Line Discipline Methods | 
|  | 38 | ----------------------- | 
|  | 39 |  | 
|  | 40 | TTY side interfaces: | 
|  | 41 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 42 | open()		-	Called when the line discipline is attached to | 
|  | 43 | the terminal. No other call into the line | 
|  | 44 | discipline for this tty will occur until it | 
|  | 45 | completes successfully. Can sleep. | 
|  | 46 |  | 
| Tilman Schmidt | 1f59c14 | 2006-12-29 16:48:03 -0800 | [diff] [blame] | 47 | close()		-	This is called on a terminal when the line | 
|  | 48 | discipline is being unplugged. At the point of | 
|  | 49 | execution no further users will enter the | 
|  | 50 | ldisc code for this tty. Can sleep. | 
|  | 51 |  | 
|  | 52 | hangup()	-	Called when the tty line is hung up. | 
|  | 53 | The line discipline should cease I/O to the tty. | 
|  | 54 | No further calls into the ldisc code will occur. | 
|  | 55 | Can sleep. | 
|  | 56 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 57 | write()		-	A process is writing data through the line | 
|  | 58 | discipline.  Multiple write calls are serialized | 
|  | 59 | by the tty layer for the ldisc.  May sleep. | 
|  | 60 |  | 
| Tilman Schmidt | 1f59c14 | 2006-12-29 16:48:03 -0800 | [diff] [blame] | 61 | flush_buffer()	-	(optional) May be called at any point between | 
|  | 62 | open and close, and instructs the line discipline | 
|  | 63 | to empty its input buffer. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 64 |  | 
| Tilman Schmidt | 1f59c14 | 2006-12-29 16:48:03 -0800 | [diff] [blame] | 65 | chars_in_buffer() -	(optional) Report the number of bytes in the input | 
|  | 66 | buffer. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 67 |  | 
| Tilman Schmidt | 1f59c14 | 2006-12-29 16:48:03 -0800 | [diff] [blame] | 68 | set_termios()	-	(optional) Called on termios structure changes. | 
|  | 69 | The caller passes the old termios data and the | 
|  | 70 | current data is in the tty. Called under the | 
|  | 71 | termios semaphore so allowed to sleep. Serialized | 
|  | 72 | against itself only. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 73 |  | 
|  | 74 | read()		-	Move data from the line discipline to the user. | 
|  | 75 | Multiple read calls may occur in parallel and the | 
|  | 76 | ldisc must deal with serialization issues. May | 
|  | 77 | sleep. | 
|  | 78 |  | 
|  | 79 | poll()		-	Check the status for the poll/select calls. Multiple | 
|  | 80 | poll calls may occur in parallel. May sleep. | 
|  | 81 |  | 
|  | 82 | ioctl()		-	Called when an ioctl is handed to the tty layer | 
|  | 83 | that might be for the ldisc. Multiple ioctl calls | 
|  | 84 | may occur in parallel. May sleep. | 
|  | 85 |  | 
|  | 86 | Driver Side Interfaces: | 
|  | 87 |  | 
|  | 88 | receive_buf()	-	Hand buffers of bytes from the driver to the ldisc | 
|  | 89 | for processing. Semantics currently rather | 
|  | 90 | mysterious 8( | 
|  | 91 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 92 | write_wakeup()	-	May be called at any point between open and close. | 
|  | 93 | The TTY_DO_WRITE_WAKEUP flag indicates if a call | 
|  | 94 | is needed but always races versus calls. Thus the | 
|  | 95 | ldisc must be careful about setting order and to | 
|  | 96 | handle unexpected calls. Must not sleep. | 
|  | 97 |  | 
|  | 98 | The driver is forbidden from calling this directly | 
|  | 99 | from the ->write call from the ldisc as the ldisc | 
|  | 100 | is permitted to call the driver write method from | 
|  | 101 | this function. In such a situation defer it. | 
|  | 102 |  | 
|  | 103 |  | 
| Tilman Schmidt | 1f59c14 | 2006-12-29 16:48:03 -0800 | [diff] [blame] | 104 | Driver Access | 
|  | 105 |  | 
|  | 106 | Line discipline methods can call the following methods of the underlying | 
|  | 107 | hardware driver through the function pointers within the tty->driver | 
|  | 108 | structure: | 
|  | 109 |  | 
|  | 110 | write()			Write a block of characters to the tty device. | 
| Alan | 6309ed7 | 2007-05-08 00:24:21 -0700 | [diff] [blame] | 111 | Returns the number of characters accepted. The | 
|  | 112 | character buffer passed to this method is already | 
|  | 113 | in kernel space. | 
| Tilman Schmidt | 1f59c14 | 2006-12-29 16:48:03 -0800 | [diff] [blame] | 114 |  | 
|  | 115 | put_char()		Queues a character for writing to the tty device. | 
|  | 116 | If there is no room in the queue, the character is | 
|  | 117 | ignored. | 
|  | 118 |  | 
|  | 119 | flush_chars()		(Optional) If defined, must be called after | 
|  | 120 | queueing characters with put_char() in order to | 
|  | 121 | start transmission. | 
|  | 122 |  | 
|  | 123 | write_room()		Returns the numbers of characters the tty driver | 
|  | 124 | will accept for queueing to be written. | 
|  | 125 |  | 
|  | 126 | ioctl()			Invoke device specific ioctl. | 
|  | 127 | Expects data pointers to refer to userspace. | 
|  | 128 | Returns ENOIOCTLCMD for unrecognized ioctl numbers. | 
|  | 129 |  | 
|  | 130 | set_termios()		Notify the tty driver that the device's termios | 
|  | 131 | settings have changed. New settings are in | 
|  | 132 | tty->termios. Previous settings should be passed in | 
|  | 133 | the "old" argument. | 
|  | 134 |  | 
| Alan Cox | 3ac40b9 | 2007-11-28 16:21:28 -0800 | [diff] [blame] | 135 | The API is defined such that the driver should return | 
|  | 136 | the actual modes selected. This means that the | 
|  | 137 | driver function is responsible for modifying any | 
|  | 138 | bits in the request it cannot fulfill to indicate | 
|  | 139 | the actual modes being used. A device with no | 
|  | 140 | hardware capability for change (eg a USB dongle or | 
|  | 141 | virtual port) can provide NULL for this method. | 
|  | 142 |  | 
| Tilman Schmidt | 1f59c14 | 2006-12-29 16:48:03 -0800 | [diff] [blame] | 143 | throttle()		Notify the tty driver that input buffers for the | 
|  | 144 | line discipline are close to full, and it should | 
|  | 145 | somehow signal that no more characters should be | 
|  | 146 | sent to the tty. | 
|  | 147 |  | 
|  | 148 | unthrottle()		Notify the tty driver that characters can now be | 
|  | 149 | sent to the tty without fear of overrunning the | 
|  | 150 | input buffers of the line disciplines. | 
|  | 151 |  | 
|  | 152 | stop()			Ask the tty driver to stop outputting characters | 
|  | 153 | to the tty device. | 
|  | 154 |  | 
|  | 155 | start()			Ask the tty driver to resume sending characters | 
|  | 156 | to the tty device. | 
|  | 157 |  | 
|  | 158 | hangup()		Ask the tty driver to hang up the tty device. | 
|  | 159 |  | 
|  | 160 | break_ctl()		(Optional) Ask the tty driver to turn on or off | 
|  | 161 | BREAK status on the RS-232 port.  If state is -1, | 
|  | 162 | then the BREAK status should be turned on; if | 
|  | 163 | state is 0, then BREAK should be turned off. | 
|  | 164 | If this routine is not implemented, use ioctls | 
|  | 165 | TIOCSBRK / TIOCCBRK instead. | 
|  | 166 |  | 
|  | 167 | wait_until_sent()	Waits until the device has written out all of the | 
|  | 168 | characters in its transmitter FIFO. | 
|  | 169 |  | 
|  | 170 | send_xchar()		Send a high-priority XON/XOFF character to the device. | 
|  | 171 |  | 
|  | 172 |  | 
|  | 173 | Flags | 
|  | 174 |  | 
|  | 175 | Line discipline methods have access to tty->flags field containing the | 
|  | 176 | following interesting flags: | 
|  | 177 |  | 
|  | 178 | TTY_THROTTLED		Driver input is throttled. The ldisc should call | 
|  | 179 | tty->driver->unthrottle() in order to resume | 
|  | 180 | reception when it is ready to process more data. | 
|  | 181 |  | 
|  | 182 | TTY_DO_WRITE_WAKEUP	If set, causes the driver to call the ldisc's | 
|  | 183 | write_wakeup() method in order to resume | 
|  | 184 | transmission when it can accept more data | 
|  | 185 | to transmit. | 
|  | 186 |  | 
|  | 187 | TTY_IO_ERROR		If set, causes all subsequent userspace read/write | 
|  | 188 | calls on the tty to fail, returning -EIO. | 
|  | 189 |  | 
|  | 190 | TTY_OTHER_CLOSED	Device is a pty and the other side has closed. | 
|  | 191 |  | 
|  | 192 | TTY_NO_WRITE_SPLIT	Prevent driver from splitting up writes into | 
|  | 193 | smaller chunks. | 
|  | 194 |  | 
|  | 195 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 196 | Locking | 
|  | 197 |  | 
|  | 198 | Callers to the line discipline functions from the tty layer are required to | 
|  | 199 | take line discipline locks. The same is true of calls from the driver side | 
|  | 200 | but not yet enforced. | 
|  | 201 |  | 
|  | 202 | Three calls are now provided | 
|  | 203 |  | 
|  | 204 | ldisc = tty_ldisc_ref(tty); | 
|  | 205 |  | 
|  | 206 | takes a handle to the line discipline in the tty and returns it. If no ldisc | 
|  | 207 | is currently attached or the ldisc is being closed and re-opened at this | 
|  | 208 | point then NULL is returned. While this handle is held the ldisc will not | 
|  | 209 | change or go away. | 
|  | 210 |  | 
|  | 211 | tty_ldisc_deref(ldisc) | 
|  | 212 |  | 
|  | 213 | Returns the ldisc reference and allows the ldisc to be closed. Returning the | 
|  | 214 | reference takes away your right to call the ldisc functions until you take | 
|  | 215 | a new reference. | 
|  | 216 |  | 
|  | 217 | ldisc = tty_ldisc_ref_wait(tty); | 
|  | 218 |  | 
|  | 219 | Performs the same function as tty_ldisc_ref except that it will wait for an | 
|  | 220 | ldisc change to complete and then return a reference to the new ldisc. | 
|  | 221 |  | 
|  | 222 | While these functions are slightly slower than the old code they should have | 
|  | 223 | minimal impact as most receive logic uses the flip buffers and they only | 
|  | 224 | need to take a reference when they push bits up through the driver. | 
|  | 225 |  | 
|  | 226 | A caution: The ldisc->open(), ldisc->close() and driver->set_ldisc | 
|  | 227 | functions are called with the ldisc unavailable. Thus tty_ldisc_ref will | 
|  | 228 | fail in this situation if used within these functions. Ldisc and driver | 
|  | 229 | code calling its own functions must be careful in this case. | 
|  | 230 |  | 
|  | 231 |  | 
|  | 232 | Driver Interface | 
|  | 233 | ---------------- | 
|  | 234 |  | 
|  | 235 | open()		-	Called when a device is opened. May sleep | 
|  | 236 |  | 
|  | 237 | close()		-	Called when a device is closed. At the point of | 
|  | 238 | return from this call the driver must make no | 
|  | 239 | further ldisc calls of any kind. May sleep | 
|  | 240 |  | 
|  | 241 | write()		-	Called to write bytes to the device. May not | 
|  | 242 | sleep. May occur in parallel in special cases. | 
|  | 243 | Because this includes panic paths drivers generally | 
|  | 244 | shouldn't try and do clever locking here. | 
|  | 245 |  | 
|  | 246 | put_char()	-	Stuff a single character onto the queue. The | 
|  | 247 | driver is guaranteed following up calls to | 
|  | 248 | flush_chars. | 
|  | 249 |  | 
|  | 250 | flush_chars()	-	Ask the kernel to write put_char queue | 
|  | 251 |  | 
|  | 252 | write_room()	-	Return the number of characters tht can be stuffed | 
|  | 253 | into the port buffers without overflow (or less). | 
|  | 254 | The ldisc is responsible for being intelligent | 
|  | 255 | about multi-threading of write_room/write calls | 
|  | 256 |  | 
|  | 257 | ioctl()		-	Called when an ioctl may be for the driver | 
|  | 258 |  | 
|  | 259 | set_termios()	-	Called on termios change, serialized against | 
|  | 260 | itself by a semaphore. May sleep. | 
|  | 261 |  | 
|  | 262 | set_ldisc()	-	Notifier for discipline change. At the point this | 
|  | 263 | is done the discipline is not yet usable. Can now | 
|  | 264 | sleep (I think) | 
|  | 265 |  | 
|  | 266 | throttle()	-	Called by the ldisc to ask the driver to do flow | 
|  | 267 | control.  Serialization including with unthrottle | 
|  | 268 | is the job of the ldisc layer. | 
|  | 269 |  | 
|  | 270 | unthrottle()	-	Called by the ldisc to ask the driver to stop flow | 
|  | 271 | control. | 
|  | 272 |  | 
|  | 273 | stop()		-	Ldisc notifier to the driver to stop output. As with | 
|  | 274 | throttle the serializations with start() are down | 
|  | 275 | to the ldisc layer. | 
|  | 276 |  | 
|  | 277 | start()		-	Ldisc notifier to the driver to start output. | 
|  | 278 |  | 
|  | 279 | hangup()	-	Ask the tty driver to cause a hangup initiated | 
|  | 280 | from the host side. [Can sleep ??] | 
|  | 281 |  | 
|  | 282 | break_ctl()	-	Send RS232 break. Can sleep. Can get called in | 
|  | 283 | parallel, driver must serialize (for now), and | 
|  | 284 | with write calls. | 
|  | 285 |  | 
|  | 286 | wait_until_sent() -	Wait for characters to exit the hardware queue | 
|  | 287 | of the driver. Can sleep | 
|  | 288 |  | 
|  | 289 | send_xchar()	  -	Send XON/XOFF and if possible jump the queue with | 
|  | 290 | it in order to get fast flow control responses. | 
|  | 291 | Cannot sleep ?? | 
|  | 292 |  |