
			The Lockronomicon

Your guide to the ancient and twisted locking policies of the tty layer and
the warped logic behind them. Beware all ye who read on.

FIXME: still need to work out the full set of BKL assumptions and document
them so they can eventually be killed off.


Line Discipline
---------------

Line disciplines are registered with tty_register_ldisc() passing the
discipline number and the ldisc structure. At the point of registration the 
discipline must be ready to use and it is possible it will get used before
the call returns success. If the call returns an error then it won't get
called. Do not re-use ldisc numbers as they are part of the userspace ABI
and writing over an existing ldisc will cause demons to eat your computer.
After the return the ldisc data has been copied so you may free your own 
copy of the structure. You must not re-register over the top of the line
discipline even with the same data or your computer again will be eaten by
demons.

In order to remove a line discipline call tty_unregister_ldisc().
In ancient times this always worked. In modern times the function will
return -EBUSY if the ldisc is currently in use. Since the ldisc referencing
code manages the module counts this should not usually be a concern.

Heed this warning: the reference count field of the registered copies of the
tty_ldisc structure in the ldisc table counts the number of lines using this
discipline. The reference count of the tty_ldisc structure within a tty 
counts the number of active users of the ldisc at this instant. In effect it
counts the number of threads of execution within an ldisc method (plus those
about to enter and exit although this detail matters not).

Line Discipline Methods
-----------------------

TTY side interfaces:

open()		-	Called when the line discipline is attached to
			the terminal. No other call into the line
			discipline for this tty will occur until it
			completes successfully. Returning an error will
			prevent the ldisc from being attached. Can sleep.

close()		-	This is called on a terminal when the line
			discipline is being unplugged. At the point of
			execution no further users will enter the
			ldisc code for this tty. Can sleep.

hangup()	-	Called when the tty line is hung up.
			The line discipline should cease I/O to the tty.
			No further calls into the ldisc code will occur.
			The return value is ignored. Can sleep.

write()		-	A process is writing data through the line
			discipline.  Multiple write calls are serialized
			by the tty layer for the ldisc.  May sleep. 

flush_buffer()	-	(optional) May be called at any point between
			open and close, and instructs the line discipline
			to empty its input buffer.

chars_in_buffer() -	(optional) Report the number of bytes in the input
			buffer.

set_termios()	-	(optional) Called on termios structure changes.
			The caller passes the old termios data and the
			current data is in the tty. Called under the
			termios semaphore so allowed to sleep. Serialized
			against itself only.

read()		-	Move data from the line discipline to the user.
			Multiple read calls may occur in parallel and the
			ldisc must deal with serialization issues. May 
			sleep.

poll()		-	Check the status for the poll/select calls. Multiple
			poll calls may occur in parallel. May sleep.

ioctl()		-	Called when an ioctl is handed to the tty layer
			that might be for the ldisc. Multiple ioctl calls
			may occur in parallel. May sleep. 

compat_ioctl()	-	Called when a 32 bit ioctl is handed to the tty layer
			that might be for the ldisc. Multiple ioctl calls
			may occur in parallel. May sleep.

Driver Side Interfaces:

receive_buf()	-	Hand buffers of bytes from the driver to the ldisc
			for processing. Semantics currently rather
			mysterious 8(

write_wakeup()	-	May be called at any point between open and close.
			The TTY_DO_WRITE_WAKEUP flag indicates if a call
			is needed but always races versus calls. Thus the
			ldisc must be careful about setting order and to
			handle unexpected calls. Must not sleep.

			The driver is forbidden from calling this directly
			from the ->write call from the ldisc as the ldisc
			is permitted to call the driver write method from
			this function. In such a situation defer it.

dcd_change()	-	Report to the tty line the current DCD pin status
			changes and the relative timestamp. The timestamp
			cannot be NULL.


Driver Access

Line discipline methods can call the following methods of the underlying
hardware driver through the function pointers within the tty->driver
structure:

write()			Write a block of characters to the tty device.
			Returns the number of characters accepted. The
			character buffer passed to this method is already
			in kernel space.

put_char()		Queues a character for writing to the tty device.
			If there is no room in the queue, the character is
			ignored.

flush_chars()		(Optional) If defined, must be called after
			queueing characters with put_char() in order to
			start transmission.

write_room()		Returns the numbers of characters the tty driver
			will accept for queueing to be written.

ioctl()			Invoke device specific ioctl.
			Expects data pointers to refer to userspace.
			Returns ENOIOCTLCMD for unrecognized ioctl numbers.

set_termios()		Notify the tty driver that the device's termios
			settings have changed. New settings are in
			tty->termios. Previous settings should be passed in
			the "old" argument.

			The API is defined such that the driver should return
			the actual modes selected. This means that the
			driver function is responsible for modifying any
			bits in the request it cannot fulfill to indicate
			the actual modes being used. A device with no
			hardware capability for change (eg a USB dongle or
			virtual port) can provide NULL for this method.

throttle()		Notify the tty driver that input buffers for the
			line discipline are close to full, and it should
			somehow signal that no more characters should be
			sent to the tty.

unthrottle()		Notify the tty driver that characters can now be
			sent to the tty without fear of overrunning the
			input buffers of the line disciplines.

stop()			Ask the tty driver to stop outputting characters
			to the tty device.

start()			Ask the tty driver to resume sending characters
			to the tty device.

hangup()		Ask the tty driver to hang up the tty device.

break_ctl()		(Optional) Ask the tty driver to turn on or off
			BREAK status on the RS-232 port.  If state is -1,
			then the BREAK status should be turned on; if
			state is 0, then BREAK should be turned off.
			If this routine is not implemented, use ioctls
			TIOCSBRK / TIOCCBRK instead.

wait_until_sent()	Waits until the device has written out all of the
			characters in its transmitter FIFO.

send_xchar()		Send a high-priority XON/XOFF character to the device.


Flags

Line discipline methods have access to tty->flags field containing the
following interesting flags:

TTY_THROTTLED		Driver input is throttled. The ldisc should call
			tty->driver->unthrottle() in order to resume
			reception when it is ready to process more data.

TTY_DO_WRITE_WAKEUP	If set, causes the driver to call the ldisc's
			write_wakeup() method in order to resume
			transmission when it can accept more data
			to transmit.

TTY_IO_ERROR		If set, causes all subsequent userspace read/write
			calls on the tty to fail, returning -EIO.

TTY_OTHER_CLOSED	Device is a pty and the other side has closed.

TTY_NO_WRITE_SPLIT	Prevent driver from splitting up writes into
			smaller chunks.


Locking

Callers to the line discipline functions from the tty layer are required to
take line discipline locks. The same is true of calls from the driver side
but not yet enforced.

Three calls are now provided

	ldisc = tty_ldisc_ref(tty);

takes a handle to the line discipline in the tty and returns it. If no ldisc
is currently attached or the ldisc is being closed and re-opened at this
point then NULL is returned. While this handle is held the ldisc will not
change or go away.

	tty_ldisc_deref(ldisc)

Returns the ldisc reference and allows the ldisc to be closed. Returning the
reference takes away your right to call the ldisc functions until you take
a new reference.

	ldisc = tty_ldisc_ref_wait(tty);

Performs the same function as tty_ldisc_ref except that it will wait for an
ldisc change to complete and then return a reference to the new ldisc. 

While these functions are slightly slower than the old code they should have
minimal impact as most receive logic uses the flip buffers and they only
need to take a reference when they push bits up through the driver.

A caution: The ldisc->open(), ldisc->close() and driver->set_ldisc 
functions are called with the ldisc unavailable. Thus tty_ldisc_ref will
fail in this situation if used within these functions. Ldisc and driver
code calling its own functions must be careful in this case. 


Driver Interface
----------------

open()		-	Called when a device is opened. May sleep

close()		-	Called when a device is closed. At the point of
			return from this call the driver must make no 
			further ldisc calls of any kind. May sleep

write()		-	Called to write bytes to the device. May not
			sleep. May occur in parallel in special cases. 
			Because this includes panic paths drivers generally
			shouldn't try and do clever locking here.

put_char()	-	Stuff a single character onto the queue. The
			driver is guaranteed following up calls to
			flush_chars.

flush_chars()	-	Ask the kernel to write put_char queue

write_room()	-	Return the number of characters tht can be stuffed
			into the port buffers without overflow (or less).
			The ldisc is responsible for being intelligent
 			about multi-threading of write_room/write calls

ioctl()		-	Called when an ioctl may be for the driver

set_termios()	-	Called on termios change, serialized against
			itself by a semaphore. May sleep.

set_ldisc()	-	Notifier for discipline change. At the point this 
			is done the discipline is not yet usable. Can now
			sleep (I think)

throttle()	-	Called by the ldisc to ask the driver to do flow
			control.  Serialization including with unthrottle
			is the job of the ldisc layer.

unthrottle()	-	Called by the ldisc to ask the driver to stop flow
			control.

stop()		-	Ldisc notifier to the driver to stop output. As with
			throttle the serializations with start() are down
			to the ldisc layer.

start()		-	Ldisc notifier to the driver to start output.

hangup()	-	Ask the tty driver to cause a hangup initiated
			from the host side. [Can sleep ??]

break_ctl()	-	Send RS232 break. Can sleep. Can get called in
			parallel, driver must serialize (for now), and
			with write calls.

wait_until_sent() -	Wait for characters to exit the hardware queue
			of the driver. Can sleep

send_xchar()	  -	Send XON/XOFF and if possible jump the queue with
			it in order to get fast flow control responses.
			Cannot sleep ??

