fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / Documentation / tty.txt
index a496056..5f799e6 100644 (file)
@@ -22,7 +22,7 @@ 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_register_ldisc passing NULL.
+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.
@@ -39,29 +39,37 @@ 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. 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.
 
-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. 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.
+                       Can sleep.
 
-write()                -       A process is writing data from user space
-                       through the line discipline. Multiple write calls
-                       are serialized by the tty layer for the ldisc. May
-                       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() -       May be called at any point between open and close.
+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() -    Report the number of bytes in the buffer.
+chars_in_buffer() -    (optional) Report the number of bytes in the input
+                       buffer.
 
-set_termios()  -       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.
+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
@@ -81,19 +89,99 @@ receive_buf()       -       Hand buffers of bytes from the driver to the ldisc
                        for processing. Semantics currently rather
                        mysterious 8(
 
-receive_room() -       Can be called by the driver layer at any time when
-                       the ldisc is opened. The ldisc must be able to
-                       handle the reported amount of data at that instant.
-                       Synchronization between active receive_buf and
-                       receive_room calls is down to the driver not the
-                       ldisc. Must not sleep.
-
 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.
+
+
+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.
+
+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.
+
+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