1  /* SPDX-License-Identifier: GPL-2.0 */
2  #ifndef _LINUX_TTY_BUFFER_H
3  #define _LINUX_TTY_BUFFER_H
4  
5  #include <linux/atomic.h>
6  #include <linux/llist.h>
7  #include <linux/mutex.h>
8  #include <linux/workqueue.h>
9  
10  struct tty_buffer {
11  	union {
12  		struct tty_buffer *next;
13  		struct llist_node free;
14  	};
15  	unsigned int used;
16  	unsigned int size;
17  	unsigned int commit;
18  	unsigned int lookahead;		/* Lazy update on recv, can become less than "read" */
19  	unsigned int read;
20  	bool flags;
21  	/* Data points here */
22  	u8 data[] __aligned(sizeof(unsigned long));
23  };
24  
char_buf_ptr(struct tty_buffer * b,unsigned int ofs)25  static inline u8 *char_buf_ptr(struct tty_buffer *b, unsigned int ofs)
26  {
27  	return b->data + ofs;
28  }
29  
flag_buf_ptr(struct tty_buffer * b,unsigned int ofs)30  static inline u8 *flag_buf_ptr(struct tty_buffer *b, unsigned int ofs)
31  {
32  	return char_buf_ptr(b, ofs) + b->size;
33  }
34  
35  struct tty_bufhead {
36  	struct tty_buffer *head;	/* Queue head */
37  	struct work_struct work;
38  	struct mutex	   lock;
39  	atomic_t	   priority;
40  	struct tty_buffer sentinel;
41  	struct llist_head free;		/* Free queue head */
42  	atomic_t	   mem_used;    /* In-use buffers excluding free list */
43  	int		   mem_limit;
44  	struct tty_buffer *tail;	/* Active buffer */
45  };
46  
47  /*
48   * When a break, frame error, or parity error happens, these codes are
49   * stuffed into the flags buffer.
50   */
51  #define TTY_NORMAL	0
52  #define TTY_BREAK	1
53  #define TTY_FRAME	2
54  #define TTY_PARITY	3
55  #define TTY_OVERRUN	4
56  
57  #endif
58