1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com) 4 */ 5 6 #ifndef __LINE_H__ 7 #define __LINE_H__ 8 9 #include <linux/list.h> 10 #include <linux/workqueue.h> 11 #include <linux/tty.h> 12 #include <linux/interrupt.h> 13 #include <linux/spinlock.h> 14 #include <linux/mutex.h> 15 #include "chan_user.h" 16 #include "mconsole_kern.h" 17 18 /* There's only two modifiable fields in this - .mc.list and .driver */ 19 struct line_driver { 20 const char *name; 21 const char *device_name; 22 const short major; 23 const short minor_start; 24 const short type; 25 const short subtype; 26 const int read_irq; 27 const char *read_irq_name; 28 const int write_irq; 29 const char *write_irq_name; 30 struct mc_device mc; 31 struct tty_driver *driver; 32 }; 33 34 struct line { 35 struct tty_port port; 36 int valid; 37 38 char *init_str; 39 struct list_head chan_list; 40 struct chan *chan_in, *chan_out; 41 42 /*This lock is actually, mostly, local to*/ 43 spinlock_t lock; 44 int throttled; 45 /* Yes, this is a real circular buffer. 46 * XXX: And this should become a struct kfifo! 47 * 48 * buffer points to a buffer allocated on demand, of length 49 * LINE_BUFSIZE, head to the start of the ring, tail to the end.*/ 50 char *buffer; 51 char *head; 52 char *tail; 53 54 int sigio; 55 struct delayed_work task; 56 const struct line_driver *driver; 57 }; 58 59 extern void line_close(struct tty_struct *tty, struct file * filp); 60 extern int line_open(struct tty_struct *tty, struct file *filp); 61 extern int line_install(struct tty_driver *driver, struct tty_struct *tty, 62 struct line *line); 63 extern void line_cleanup(struct tty_struct *tty); 64 extern void line_hangup(struct tty_struct *tty); 65 extern int line_setup(char **conf, unsigned nlines, char **def, 66 char *init, char *name); 67 extern int line_write(struct tty_struct *tty, const unsigned char *buf, 68 int len); 69 extern unsigned int line_chars_in_buffer(struct tty_struct *tty); 70 extern void line_flush_buffer(struct tty_struct *tty); 71 extern void line_flush_chars(struct tty_struct *tty); 72 extern unsigned int line_write_room(struct tty_struct *tty); 73 extern void line_throttle(struct tty_struct *tty); 74 extern void line_unthrottle(struct tty_struct *tty); 75 76 extern char *add_xterm_umid(char *base); 77 extern int line_setup_irq(int fd, int input, int output, struct line *line, 78 void *data); 79 extern void line_close_chan(struct line *line); 80 extern int register_lines(struct line_driver *line_driver, 81 const struct tty_operations *driver, 82 struct line *lines, int nlines); 83 extern int setup_one_line(struct line *lines, int n, char *init, 84 const struct chan_opts *opts, char **error_out); 85 extern void close_lines(struct line *lines, int nlines); 86 87 extern int line_config(struct line *lines, unsigned int sizeof_lines, 88 char *str, const struct chan_opts *opts, 89 char **error_out); 90 extern int line_id(char **str, int *start_out, int *end_out); 91 extern int line_remove(struct line *lines, unsigned int sizeof_lines, int n, 92 char **error_out); 93 extern int line_get_config(char *dev, struct line *lines, 94 unsigned int sizeof_lines, char *str, 95 int size, char **error_out); 96 97 #endif 98