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 */