/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _LINUX_TTY_LDISC_H
#define _LINUX_TTY_LDISC_H
struct tty_struct;
#include <linux/fs.h>
#include <linux/wait.h>
#include <linux/atomic.h>
#include <linux/list.h>
#include <linux/lockdep.h>
#include <linux/seq_file.h>
/*
* the semaphore definition
*/
struct ld_semaphore {
atomic_long_t count;
raw_spinlock_t wait_lock;
unsigned int wait_readers;
struct list_head read_wait;
struct list_head write_wait;
#ifdef CONFIG_DEBUG_LOCK_ALLOC
struct lockdep_map dep_map;
#endif
};
void __init_ldsem(struct ld_semaphore *sem, const char *name,
struct lock_class_key *key);
#define init_ldsem(sem) \
do { \
static struct lock_class_key __key; \
\
__init_ldsem((sem), #sem , &__key); \
} while (0 )
int ldsem_down_read(struct ld_semaphore *sem, long timeout);
int ldsem_down_read_trylock(struct ld_semaphore *sem);
int ldsem_down_write(struct ld_semaphore *sem, long timeout);
void ldsem_up_read(struct ld_semaphore *sem);
void ldsem_up_write(struct ld_semaphore *sem);
#ifdef CONFIG_DEBUG_LOCK_ALLOC
int ldsem_down_read_nested(struct ld_semaphore *sem, int subclass,
long timeout);
int ldsem_down_write_nested(struct ld_semaphore *sem, int subclass,
long timeout);
#else
# define ldsem_down_read_nested(sem, subclass, timeout) \
ldsem_down_read(sem, timeout)
# define ldsem_down_write_nested(sem, subclass, timeout) \
ldsem_down_write(sem, timeout)
#endif
/**
* struct tty_ldisc_ops - ldisc operations
*
* @ name : name of this ldisc rendered in / proc / tty / ldiscs
* @ num : ` ` N_ * ` ` number ( % N_TTY , % N_HDLC , . . . ) reserved to this ldisc
*
* @ open : [ TTY ] ` ` int ( ) ( struct tty_struct * tty ) ` `
*
* This function is called when the line discipline is associated with the
* @ tty . No other call into the line discipline for this tty will occur
* until it completes successfully . It should initialize any state needed
* by the ldisc , and set @ tty - > receive_room to the maximum amount of data
* the line discipline is willing to accept from the driver with a single
* call to @ receive_buf ( ) . Returning an error will prevent the ldisc from
* being attached .
*
* Optional . Can sleep .
*
* @ close : [ TTY ] ` ` void ( ) ( struct tty_struct * tty ) ` `
*
* This function is called when the line discipline is being shutdown ,
* either because the @ tty is being closed or because the @ tty is being
* changed to use a new line discipline . At the point of execution no
* further users will enter the ldisc code for this tty .
*
* Optional . Can sleep .
*
* @ flush_buffer : [ TTY ] ` ` void ( ) ( struct tty_struct * tty ) ` `
*
* This function instructs the line discipline to clear its buffers of any
* input characters it may have queued to be delivered to the user mode
* process . It may be called at any point between open and close .
*
* Optional .
*
* @ read : [ TTY ] ` ` ssize_t ( ) ( struct tty_struct * tty , struct file * file , u8 * buf ,
* size_t nr ) ` `
*
* This function is called when the user requests to read from the @ tty .
* The line discipline will return whatever characters it has buffered up
* for the user . If this function is not defined , the user will receive
* an % EIO error . Multiple read calls may occur in parallel and the ldisc
* must deal with serialization issues .
*
* Optional : % EIO unless provided . Can sleep .
*
* @ write : [ TTY ] ` ` ssize_t ( ) ( struct tty_struct * tty , struct file * file ,
* const u8 * buf , size_t nr ) ` `
*
* This function is called when the user requests to write to the @ tty .
* The line discipline will deliver the characters to the low - level tty
* device for transmission , optionally performing some processing on the
* characters first . If this function is not defined , the user will
* receive an % EIO error .
*
* Optional : % EIO unless provided . Can sleep .
*
* @ ioctl : [ TTY ] ` ` int ( ) ( struct tty_struct * tty , unsigned int cmd ,
* unsigned long arg ) ` `
*
* This function is called when the user requests an ioctl which is not
* handled by the tty layer or the low - level tty driver . It is intended
* for ioctls which affect line discpline operation . Note that the search
* order for ioctls is ( 1 ) tty layer , ( 2 ) tty low - level driver , ( 3 ) line
* discpline . So a low - level driver can " grab " an ioctl request before
* the line discpline has a chance to see it .
*
* Optional .
*
* @ compat_ioctl : [ TTY ] ` ` int ( ) ( struct tty_struct * tty , unsigned int cmd ,
* unsigned long arg ) ` `
*
* Process ioctl calls from 32 - bit process on 64 - bit system .
*
* Note that only ioctls that are neither " pointer to compatible
* structure " nor tty - generic . Something private that takes an integer or
* a pointer to wordsize - sensitive structure belongs here , but most of
* ldiscs will happily leave it % NULL .
*
* Optional .
*
* @ set_termios : [ TTY ] ` ` void ( ) ( struct tty_struct * tty , const struct ktermios * old ) ` `
*
* This function notifies the line discpline that a change has been made
* to the termios structure .
*
* Optional .
*
* @ poll : [ TTY ] ` ` int ( ) ( struct tty_struct * tty , struct file * file ,
* struct poll_table_struct * wait ) ` `
*
* This function is called when a user attempts to select / poll on a @ tty
* device . It is solely the responsibility of the line discipline to
* handle poll requests .
*
* Optional .
*
* @ hangup : [ TTY ] ` ` void ( ) ( struct tty_struct * tty ) ` `
*
* Called on a hangup . Tells the discipline that it should cease I / O to
* the tty driver . The driver should seek to perform this action quickly
* but should wait until any pending driver I / O is completed . No further
* calls into the ldisc code will occur .
*
* Optional . Can sleep .
*
* @ receive_buf : [ DRV ] ` ` void ( ) ( struct tty_struct * tty , const u8 * cp ,
* const u8 * fp , size_t count ) ` `
*
* This function is called by the low - level tty driver to send characters
* received by the hardware to the line discpline for processing . @ cp is
* a pointer to the buffer of input character received by the device . @ fp
* is a pointer to an array of flag bytes which indicate whether a
* character was received with a parity error , etc . @ fp may be % NULL to
* indicate all data received is % TTY_NORMAL .
*
* Optional .
*
* @ write_wakeup : [ DRV ] ` ` void ( ) ( struct tty_struct * tty ) ` `
*
* This function is called by the low - level tty driver to signal that line
* discpline should try to send more characters to the low - level driver
* for transmission . If the line discpline does not have any more data to
* send , it can just return . If the line discipline does have some data to
* send , please arise a tasklet or workqueue to do the real data transfer .
* Do not send data in this hook , it may lead to a deadlock .
*
* Optional .
*
* @ dcd_change : [ DRV ] ` ` void ( ) ( struct tty_struct * tty , bool active ) ` `
*
* Tells the discipline that the DCD pin has changed its status . Used
* exclusively by the % N_PPS ( Pulse - Per - Second ) line discipline .
*
* Optional .
*
* @ receive_buf2 : [ DRV ] ` ` ssize_t ( ) ( struct tty_struct * tty , const u8 * cp ,
* const u8 * fp , size_t count ) ` `
*
* This function is called by the low - level tty driver to send characters
* received by the hardware to the line discpline for processing . @ cp is a
* pointer to the buffer of input character received by the device . @ fp
* is a pointer to an array of flag bytes which indicate whether a
* character was received with a parity error , etc . @ fp may be % NULL to
* indicate all data received is % TTY_NORMAL . If assigned , prefer this
* function for automatic flow control .
*
* Optional .
*
* @ lookahead_buf : [ DRV ] ` ` void ( ) ( struct tty_struct * tty , const u8 * cp ,
* const u8 * fp , size_t count ) ` `
*
* This function is called by the low - level tty driver for characters
* not eaten by - > receive_buf ( ) or - > receive_buf2 ( ) . It is useful for
* processing high - priority characters such as software flow - control
* characters that could otherwise get stuck into the intermediate
* buffer until tty has room to receive them . Ldisc must be able to
* handle later a - > receive_buf ( ) or - > receive_buf2 ( ) call for the
* same characters ( e . g . by skipping the actions for high - priority
* characters already handled by - > lookahead_buf ( ) ) .
*
* Optional .
*
* @ owner : module containting this ldisc ( for reference counting )
*
* This structure defines the interface between the tty line discipline
* implementation and the tty routines . The above routines can be defined .
* Unless noted otherwise , they are optional , and can be filled in with a % NULL
* pointer .
*
* Hooks marked [ TTY ] are invoked from the TTY core , the [ DRV ] ones from the
* tty_driver side .
*/
struct tty_ldisc_ops {
char *name;
int num;
/*
* The following routines are called from above .
*/
int (*open)(struct tty_struct *tty);
void (*close)(struct tty_struct *tty);
void (*flush_buffer)(struct tty_struct *tty);
ssize_t (*read)(struct tty_struct *tty, struct file *file, u8 *buf,
size_t nr, void **cookie, unsigned long offset);
ssize_t (*write)(struct tty_struct *tty, struct file *file,
const u8 *buf, size_t nr);
int (*ioctl)(struct tty_struct *tty, unsigned int cmd,
unsigned long arg);
int (*compat_ioctl)(struct tty_struct *tty, unsigned int cmd,
unsigned long arg);
void (*set_termios)(struct tty_struct *tty, const struct ktermios *old);
__poll_t (*poll)(struct tty_struct *tty, struct file *file,
struct poll_table_struct *wait);
void (*hangup)(struct tty_struct *tty);
/*
* The following routines are called from below .
*/
void (*receive_buf)(struct tty_struct *tty, const u8 *cp,
const u8 *fp, size_t count);
void (*write_wakeup)(struct tty_struct *tty);
void (*dcd_change)(struct tty_struct *tty, bool active);
size_t (*receive_buf2)(struct tty_struct *tty, const u8 *cp,
const u8 *fp, size_t count);
void (*lookahead_buf)(struct tty_struct *tty, const u8 *cp,
const u8 *fp, size_t count);
struct module *owner;
};
struct tty_ldisc {
struct tty_ldisc_ops *ops;
struct tty_struct *tty;
};
#define MODULE_ALIAS_LDISC(ldisc) \
MODULE_ALIAS("tty-ldisc-" __stringify(ldisc))
extern const struct seq_operations tty_ldiscs_seq_ops;
struct tty_ldisc *tty_ldisc_ref(struct tty_struct *);
void tty_ldisc_deref(struct tty_ldisc *);
struct tty_ldisc *tty_ldisc_ref_wait(struct tty_struct *);
void tty_ldisc_flush(struct tty_struct *tty);
int tty_register_ldisc(struct tty_ldisc_ops *new_ldisc);
void tty_unregister_ldisc(struct tty_ldisc_ops *ldisc);
int tty_set_ldisc(struct tty_struct *tty, int disc);
#endif /* _LINUX_TTY_LDISC_H */
Messung V0.5 in Prozent C=98 H=97 G=97
¤ Dauer der Verarbeitung: 0.15 Sekunden
(vorverarbeitet am 2026-09-29)
¤
*© Formatika GbR, Deutschland