STRUCT TTY_PORT(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

🌈 struct tty_port(9) 🌈

okay bestie, welcome to the struct tty_port(9) page from the Kernel API Manual ✨ this is the port-level information situation, and it is literally main character energy for TTY drivers. no cap.


🌸 NAME 🌸

struct tty_port β€” port level information. periodt πŸ’…


✨ SYNOPSIS ✨

struct tty_port {
    struct tty_bufhead      buf;
    struct tty_struct       *tty;
    struct tty_struct       *itty;
    const struct tty_port_operations *ops;
    const struct tty_port_client_operations *client_ops;
    spinlock_t lock;
    int blocked_open;
    int count;
    wait_queue_head_t open_wait;
    wait_queue_head_t delta_msr_wait;
    unsigned long           flags;
    unsigned long           iflags;
    unsigned char           console:1;
    struct mutex            mutex;
    struct mutex            buf_mutex;
    u8 *xmit_buf;
    u8 *xmit_fifo;
    unsigned int            close_delay;
    unsigned int            closing_wait;
    int drain_delay;
    struct kref             kref;
    void *client_data;
 };

πŸŽ€ MEMBERS πŸŽ€

vibe check on every single member, no skips, no cap 🫢

  • buf β€” buffer for this port, locked internally.
  • tty β€” back pointer to struct tty_struct, valid only if the tty is open. Use tty_port_tty_get to obtain it (and tty_kref_put to release).
  • itty β€” internal back pointer to struct tty_struct. Avoid this. It should be eliminated in the long term. not me warning you bestie 😭
  • ops β€” tty port operations (like activate, shutdown), see struct tty_port_operations.
  • client_ops β€” tty port client operations (like receive_buf, write_wakeup). By default, tty_port_default_client_ops is used.
  • lock β€” lock protecting tty.
  • blocked_open β€” # of procs waiting for open in tty_port_block_til_ready.
  • count β€” usage count.
  • open_wait β€” open waiters queue (waiting e.g. for a carrier).
  • delta_msr_wait β€” modem status change queue (waiting for MSR changes).
  • flags β€” user TTY flags (ASYNC_).
  • iflags β€” internal flags (TTY_PORT_).
  • console β€” when set, the port is a console.
  • mutex β€” locking, for open, shutdown and other port operations.
  • buf_mutex β€” xmit_buf alloc lock.
  • xmit_buf β€” optional xmit buffer used by some drivers.
  • xmit_fifo β€” optional xmit buffer used by some drivers.
  • close_delay β€” delay in jiffies to wait when closing the port.
  • closing_wait β€” delay in jiffies for output to be sent before closing.
  • drain_delay β€” set to zero if no pure time based drain is needed else set to size of fifo.
  • kref β€” references counter. Reaching zero calls ops->destruct if non-NULL or frees the port otherwise.
  • client_data β€” pointer to private data, for client_ops.

πŸ¦‹ DESCRIPTION πŸ¦‹

Each device keeps its own port level information. struct tty_port was introduced as a common structure for such information. As every TTY device shall have a backing tty_port structure, every driver can use these members. iconic behavior, honestly πŸ’–

⚠️ The tty port has a different lifetime to the tty so must be kept apart. In addition be careful as tty -> port mappings are valid for the life of the tty object but in many cases port -> tty mappings are valid only until a hangup so don’t use the wrong path. fr fr, this is the danger zone πŸ’€

Tty port shall be initialized by tty_port_init and shut down either by tty_port_destroy (refcounting not used), or tty_port_put (refcounting).

There is a lot of helpers around struct tty_port too. To name the most significant ones: tty_port_open, tty_port_close (or tty_port_close_start and tty_port_close_end separately if need be), and tty_port_hangup. These call ops->activate and ops->shutdown as needed. slay πŸ”₯


πŸ’œ SEE ALSO πŸ’œ

  • Kernel file ./include/linux/tty_port.h
  • struct tty_port_operations(9)

and that’s the whole page, bestie 🫢 source/version situation: ./include/linux, dated October 2026, page struct tty_port(9) β€” mwah πŸ’‹βœ¨

πŸ“¦ where this page comes from