summaryrefslogtreecommitdiff
path: root/usr/src/uts/sun/sys/ttymux.h
blob: 56596a66dc86eb03bf6e6269716dc71481e7e20e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright (c) 2001 by Sun Microsystems, Inc.
 * All rights reserved.
 */

#ifndef	_TTYMUX_H
#define	_TTYMUX_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"

#include <sys/obpdefs.h>
#include <sys/tty.h>
#include <sys/ttymuxuser.h>

#ifdef	__cplusplus
extern "C" {
#endif

#define	SM_MAX_ABSLEN	24	/* maximum length for the s/w abort sequence */
#define	SM_MIN_ABSLEN	2

#define	SM_COPYIN	0x1
#define	SM_COPYOUT	0x2

typedef
struct sm_iocdata {
	int sm_iocid;
	int sm_nacks;	/* number of responses expected */
	int sm_ackcnt;	/* number of ACKs received */
	int sm_nakcnt;	/* number of NAKs received */
	int sm_acnt;	/* number of responses received */
	int sm_acked;	/* has the message been acked (only one of them) */
	int sm_policy;	/* which policy is used for acknowleding this ioctl */
	uint_t sm_flags;
			/* indicates when copyin/out has been sent upstream */
	ulong_t  sm_timeval;
} sm_iocdata_t;

/*
 * Each minor (refered to as a logical device) created by the multiplexor
 * maps onto multiple real devices.
 * I/O on a logical device is duplicated across multiple real devices.
 * i.e. input from any of the real devices (identified by lqs) is funneled
 * through the queue identified in the ttycommon field of a logical unit.
 * output arriving on the queue identified in the ttycommon field of a logical
 * unit is distributed to all real devices identified by lqs.
 *
 * When a logical unit is open there is a unique queue upstream (identified
 * by ttycommon).
 * When a real unit is open there is a unique lower queue to the h/w driver
 * (identified by ttycommon).
 *
 * If the control lines on RS232 port for a physical unit are unknown and
 * a request for their status has been issued then flags contains the bits
 * TIOCM_PEND and tiocmgetid contains the id of the M_IOCTL streams	message
 * sent down the write queue to obtain the current status (placed in mbits).
 */
typedef
struct sm_uqi {
	int		sm_lunit;	/* logical unit */
	int		sm_protocol;	/* in use for this protocol */
	uint_t		sm_flags;	/* flags */
	uint_t		sm_mbits;	/* consolidated status of modem lines */
	tcflag_t	sm_cmask;	/* ignore these control bits */
	uint_t		sm_policy;	/* ioctl response policy */
	struct sm_lqi	*sm_lqs;	/* lower queues mapped to this lunit */
	int		sm_nlqs;
	kmutex_t	sm_umutex[1];	/* protects uflags */
	kcondvar_t	sm_ucv[1];	/* waiting for uflags to change */
	bufcall_id_t	sm_ttybid;	/* ttycommon bufcall */
	dev_t		sm_dev;		/* currently attached device */
	int		sm_nwaiters;	/* no. of threads waiting for carrier */
	queue_t		*sm_waitq;	/* identity of blocked queue */
	tty_common_t	sm_ttycommon[1];
					/* queue common data when is open */
	sm_iocdata_t	sm_siocdata;	/* active ioctl */
	sm_iocdata_t	sm_piocdata;	/* active private ioctl */
} sm_uqi_t;

typedef
struct sm_lqi {
	struct sm_lqi	*sm_nlqi;	/* chain units together into lists */
	sm_uqi_t	*sm_uqi;	/* this lunit and uqi are associated */
	int		sm_linkid;	/* mux id for the link */
	uint64_t	sm_tag;		/* tag for the link */
	uint_t		sm_flags;		/* flags */
	uint_t		sm_uqflags;	/* written by an upper queue */
	io_mode_t	sm_ioflag;	/* input and/or output stream */
	int		sm_ctrla_abort_on;
	int		sm_break_abort_on;
	uint_t		sm_mbits;	/* status of the modem control lines */
	tcflag_t	sm_cmask;	/* ignore these control bits */
	mblk_t		*sm_mp;		/* mblk for next write */
	bufcall_id_t	sm_bid;		/* bufcall id */
	bufcall_id_t	sm_ttybid;	/* ttymodes changed bufcall */
	kmutex_t	sm_umutex[1];	/* protects open code */
	kcondvar_t	sm_ucv[1];
	dev_info_t	*sm_dip;
	dev_t		sm_dev;
	int		sm_unit;
	unsigned char	*sm_hadkadbchar;
	char		*sm_nachar;
	int		sm_piocid;
	tty_common_t	sm_ttycommon[1];
					/* queue common data when open */
	char		sm_path[MAXPATHLEN];
} sm_lqi_t;

/*
 * This structure maintains the state of the console.
 */
typedef struct console {
	dev_t		sm_dev;		/* the minor node of a console */
	int		sm_muxid;	/* STREAM's link identifier */
	io_mode_t	sm_mode;	/* I/O mode */
	boolean_t	sm_obp_con;	/* is it an OBP console */
	ihandle_t	sm_i_ihdl;	/* ihandle of the OBP input device */
	ihandle_t	sm_o_ihdl;	/* ihandle of the OBP output device */
	char		*sm_path;	/* device tree device path */
	char		*sm_alias;	/* device path alias */
} sm_console_t;

/*
 * This structure contains the information for an open device.
 * If an instance of it exists it is available as a named pointer:
 */
#define	TTYMUXPTR "ttymuxconfig"

typedef struct mux_state {

	/* protects ttymux configuration */
	kmutex_t	sm_cons_mutex;

	/* Information about the standard I/O devices */
	sm_console_t	sm_cons_stdin;
	sm_console_t	sm_cons_stdout;

	/* List of multiplexed serial consoles */
	uint_t		sm_cons_cnt;
	char		*sm_ialias;
	char		*sm_oalias;
	sm_console_t	sm_cons_links[TTYMUX_MAX_LINKS];

} sm_mux_state_t;

/*
 * Driver instance private information.
 */
typedef
struct sm_ss
{
	dev_info_t	*sm_dip;	/* device tree information */
	uint_t		sm_trflag;	/* debug and information levels */
	sm_uqi_t	*sm_lconsole;	/* the current logical console */
	sm_mux_state_t	*sm_ms;		/* state associated with a console */

	sm_lqi_t	*sm_lqs;
	sm_uqi_t	*sm_uqs;
	uint_t		sm_break_abort_on;
	uint_t		sm_ctrla_abort_on;

	int		sm_min_redundancy;
	char		sm_abs[SM_MAX_ABSLEN];

} sm_ss_t;

#ifdef	__cplusplus
}
#endif

#endif	/* _TTYMUX_H */