1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*
23 * Copyright (c) 2001 by Sun Microsystems, Inc.
24 * All rights reserved.
25 */
26
27#ifndef	_TTYMUX_H
28#define	_TTYMUX_H
29
30#pragma ident	"%Z%%M%	%I%	%E% SMI"
31
32#include <sys/obpdefs.h>
33#include <sys/tty.h>
34#include <sys/ttymuxuser.h>
35
36#ifdef	__cplusplus
37extern "C" {
38#endif
39
40#define	SM_MAX_ABSLEN	24	/* maximum length for the s/w abort sequence */
41#define	SM_MIN_ABSLEN	2
42
43#define	SM_COPYIN	0x1
44#define	SM_COPYOUT	0x2
45
46typedef
47struct sm_iocdata {
48	int sm_iocid;
49	int sm_nacks;	/* number of responses expected */
50	int sm_ackcnt;	/* number of ACKs received */
51	int sm_nakcnt;	/* number of NAKs received */
52	int sm_acnt;	/* number of responses received */
53	int sm_acked;	/* has the message been acked (only one of them) */
54	int sm_policy;	/* which policy is used for acknowleding this ioctl */
55	uint_t sm_flags;
56			/* indicates when copyin/out has been sent upstream */
57	ulong_t  sm_timeval;
58} sm_iocdata_t;
59
60/*
61 * Each minor (refered to as a logical device) created by the multiplexor
62 * maps onto multiple real devices.
63 * I/O on a logical device is duplicated across multiple real devices.
64 * i.e. input from any of the real devices (identified by lqs) is funneled
65 * through the queue identified in the ttycommon field of a logical unit.
66 * output arriving on the queue identified in the ttycommon field of a logical
67 * unit is distributed to all real devices identified by lqs.
68 *
69 * When a logical unit is open there is a unique queue upstream (identified
70 * by ttycommon).
71 * When a real unit is open there is a unique lower queue to the h/w driver
72 * (identified by ttycommon).
73 *
74 * If the control lines on RS232 port for a physical unit are unknown and
75 * a request for their status has been issued then flags contains the bits
76 * TIOCM_PEND and tiocmgetid contains the id of the M_IOCTL streams	message
77 * sent down the write queue to obtain the current status (placed in mbits).
78 */
79typedef
80struct sm_uqi {
81	int		sm_lunit;	/* logical unit */
82	int		sm_protocol;	/* in use for this protocol */
83	uint_t		sm_flags;	/* flags */
84	uint_t		sm_mbits;	/* consolidated status of modem lines */
85	tcflag_t	sm_cmask;	/* ignore these control bits */
86	uint_t		sm_policy;	/* ioctl response policy */
87	struct sm_lqi	*sm_lqs;	/* lower queues mapped to this lunit */
88	int		sm_nlqs;
89	kmutex_t	sm_umutex[1];	/* protects uflags */
90	kcondvar_t	sm_ucv[1];	/* waiting for uflags to change */
91	bufcall_id_t	sm_ttybid;	/* ttycommon bufcall */
92	dev_t		sm_dev;		/* currently attached device */
93	int		sm_nwaiters;	/* no. of threads waiting for carrier */
94	queue_t		*sm_waitq;	/* identity of blocked queue */
95	tty_common_t	sm_ttycommon[1];
96					/* queue common data when is open */
97	sm_iocdata_t	sm_siocdata;	/* active ioctl */
98	sm_iocdata_t	sm_piocdata;	/* active private ioctl */
99} sm_uqi_t;
100
101typedef
102struct sm_lqi {
103	struct sm_lqi	*sm_nlqi;	/* chain units together into lists */
104	sm_uqi_t	*sm_uqi;	/* this lunit and uqi are associated */
105	int		sm_linkid;	/* mux id for the link */
106	uint64_t	sm_tag;		/* tag for the link */
107	uint_t		sm_flags;		/* flags */
108	uint_t		sm_uqflags;	/* written by an upper queue */
109	io_mode_t	sm_ioflag;	/* input and/or output stream */
110	int		sm_ctrla_abort_on;
111	int		sm_break_abort_on;
112	uint_t		sm_mbits;	/* status of the modem control lines */
113	tcflag_t	sm_cmask;	/* ignore these control bits */
114	mblk_t		*sm_mp;		/* mblk for next write */
115	bufcall_id_t	sm_bid;		/* bufcall id */
116	bufcall_id_t	sm_ttybid;	/* ttymodes changed bufcall */
117	kmutex_t	sm_umutex[1];	/* protects open code */
118	kcondvar_t	sm_ucv[1];
119	dev_info_t	*sm_dip;
120	dev_t		sm_dev;
121	int		sm_unit;
122	unsigned char	*sm_hadkadbchar;
123	char		*sm_nachar;
124	int		sm_piocid;
125	tty_common_t	sm_ttycommon[1];
126					/* queue common data when open */
127	char		sm_path[MAXPATHLEN];
128} sm_lqi_t;
129
130/*
131 * This structure maintains the state of the console.
132 */
133typedef struct console {
134	dev_t		sm_dev;		/* the minor node of a console */
135	int		sm_muxid;	/* STREAM's link identifier */
136	io_mode_t	sm_mode;	/* I/O mode */
137	boolean_t	sm_obp_con;	/* is it an OBP console */
138	ihandle_t	sm_i_ihdl;	/* ihandle of the OBP input device */
139	ihandle_t	sm_o_ihdl;	/* ihandle of the OBP output device */
140	char		*sm_path;	/* device tree device path */
141	char		*sm_alias;	/* device path alias */
142} sm_console_t;
143
144/*
145 * This structure contains the information for an open device.
146 * If an instance of it exists it is available as a named pointer:
147 */
148#define	TTYMUXPTR "ttymuxconfig"
149
150typedef struct mux_state {
151
152	/* protects ttymux configuration */
153	kmutex_t	sm_cons_mutex;
154
155	/* Information about the standard I/O devices */
156	sm_console_t	sm_cons_stdin;
157	sm_console_t	sm_cons_stdout;
158
159	/* List of multiplexed serial consoles */
160	uint_t		sm_cons_cnt;
161	char		*sm_ialias;
162	char		*sm_oalias;
163	sm_console_t	sm_cons_links[TTYMUX_MAX_LINKS];
164
165} sm_mux_state_t;
166
167/*
168 * Driver instance private information.
169 */
170typedef
171struct sm_ss
172{
173	dev_info_t	*sm_dip;	/* device tree information */
174	uint_t		sm_trflag;	/* debug and information levels */
175	sm_uqi_t	*sm_lconsole;	/* the current logical console */
176	sm_mux_state_t	*sm_ms;		/* state associated with a console */
177
178	sm_lqi_t	*sm_lqs;
179	sm_uqi_t	*sm_uqs;
180	uint_t		sm_break_abort_on;
181	uint_t		sm_ctrla_abort_on;
182
183	int		sm_min_redundancy;
184	char		sm_abs[SM_MAX_ABSLEN];
185
186} sm_ss_t;
187
188#ifdef	__cplusplus
189}
190#endif
191
192#endif	/* _TTYMUX_H */
193