line.h 3.07 KB
Newer Older
Linus Torvalds's avatar
Linus Torvalds committed
1
2
3
4
5
6
7
8
9
10
11
12
/* 
 * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
 * Licensed under the GPL
 */

#ifndef __LINE_H__
#define __LINE_H__

#include "linux/list.h"
#include "linux/workqueue.h"
#include "linux/tty.h"
#include "linux/interrupt.h"
13
#include "linux/spinlock.h"
Linus Torvalds's avatar
Linus Torvalds committed
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include "chan_user.h"
#include "mconsole_kern.h"

struct line_driver {
	char *name;
	char *device_name;
	char *devfs_name;
	short major;
	short minor_start;
	short type;
	short subtype;
	int read_irq;
	char *read_irq_name;
	int write_irq;
	char *write_irq_name;
	char *symlink_from;
	char *symlink_to;
	struct mc_device mc;
};

struct line {
	char *init_str;
	int init_pri;
	struct list_head chan_list;
	int valid;
	int count;
40
41
42
43
44
45
46
47
	/*This lock is actually, mostly, local to*/
	spinlock_t lock;

	/* Yes, this is a real circular buffer.
	 * XXX: And this should become a struct kfifo!
	 *
	 * buffer points to a buffer allocated on demand, of length
	 * LINE_BUFSIZE, head to the start of the ring, tail to the end.*/
Linus Torvalds's avatar
Linus Torvalds committed
48
49
50
	char *buffer;
	char *head;
	char *tail;
51

Linus Torvalds's avatar
Linus Torvalds committed
52
53
54
55
56
57
58
59
60
61
	int sigio;
	struct work_struct task;
	struct line_driver *driver;
	int have_irq;
};

#define LINE_INIT(str, d) \
	{ init_str :	str, \
	  init_pri :	INIT_STATIC, \
	  valid :	1, \
62
	  lock :	SPIN_LOCK_UNLOCKED, \
Linus Torvalds's avatar
Linus Torvalds committed
63
64
65
66
	  buffer :	NULL, \
	  head :	NULL, \
	  tail :	NULL, \
	  sigio :	0, \
Jeff Dike's avatar
Jeff Dike committed
67
68
	  driver :	d, \
	  have_irq :	0 }
Linus Torvalds's avatar
Linus Torvalds committed
69
70
71
72
73
74
75
76

struct lines {
	int num;
};

#define LINES_INIT(n) {  num :		n }

extern void line_close(struct tty_struct *tty, struct file * filp);
Jeff Dike's avatar
Jeff Dike committed
77
extern int line_open(struct line *lines, struct tty_struct *tty,
Linus Torvalds's avatar
Linus Torvalds committed
78
		     struct chan_opts *opts);
79
80
extern int line_setup(struct line *lines, unsigned int sizeof_lines,
		      char *init);
Jeff Dike's avatar
Jeff Dike committed
81
82
extern int line_write(struct tty_struct *tty, const unsigned char *buf,
		      int len);
Linus Torvalds's avatar
Linus Torvalds committed
83
84
85
extern void line_put_char(struct tty_struct *tty, unsigned char ch);
extern void line_set_termios(struct tty_struct *tty, struct termios * old);
extern int line_chars_in_buffer(struct tty_struct *tty);
86
87
extern void line_flush_buffer(struct tty_struct *tty);
extern void line_flush_chars(struct tty_struct *tty);
Linus Torvalds's avatar
Linus Torvalds committed
88
89
90
extern int line_write_room(struct tty_struct *tty);
extern int line_ioctl(struct tty_struct *tty, struct file * file,
		      unsigned int cmd, unsigned long arg);
91

Linus Torvalds's avatar
Linus Torvalds committed
92
extern char *add_xterm_umid(char *base);
Jeff Dike's avatar
Jeff Dike committed
93
94
extern int line_setup_irq(int fd, int input, int output,
			  struct tty_struct *tty);
Linus Torvalds's avatar
Linus Torvalds committed
95
96
extern void line_close_chan(struct line *line);
extern void line_disable(struct tty_struct *tty, int current_irq);
Jeff Dike's avatar
Jeff Dike committed
97
98
extern struct tty_driver * line_register_devfs(struct lines *set,
				struct line_driver *line_driver,
Linus Torvalds's avatar
Linus Torvalds committed
99
100
101
102
103
				struct tty_operations *driver,
				struct line *lines,
				int nlines);
extern void lines_init(struct line *lines, int nlines);
extern void close_lines(struct line *lines, int nlines);
104

Jeff Dike's avatar
Jeff Dike committed
105
106
extern int line_config(struct line *lines, unsigned int sizeof_lines,
		       char *str);
107
108
extern int line_id(char **str, int *start_out, int *end_out);
extern int line_remove(struct line *lines, unsigned int sizeof_lines, int n);
Jeff Dike's avatar
Jeff Dike committed
109
110
extern int line_get_config(char *dev, struct line *lines,
			   unsigned int sizeof_lines, char *str,
Linus Torvalds's avatar
Linus Torvalds committed
111
112
113
			   int size, char **error_out);

#endif