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 37 extern "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 46 typedef 47 struct 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 */ 79 typedef 80 struct 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 101 typedef 102 struct 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 */ 133 typedef 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 150 typedef 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 */ 170 typedef 171 struct 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 */