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 (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006 23 */ 24 25 #ifndef _OPLMSU_H 26 #define _OPLMSU_H 27 28 #pragma ident "%Z%%M% %I% %E% SMI" 29 30 #ifdef __cplusplus 31 extern "C" { 32 #endif 33 34 /* ack_flag */ 35 #define ACK_RES 0 36 #define NAK_RES -1 37 38 /* active_flag */ 39 #define ACTIVE_RES 0 40 #define NOT_ACTIVE_RES -1 41 42 /* undefined path number */ 43 #define UNDEFINED -1 44 45 /* sleep and wakeup control flag */ 46 #define CV_WAKEUP 0 47 #define CV_SLEEP 1 48 49 /* write/read control flag */ 50 #define MSU_WRITE_SIDE 0 51 #define MSU_READ_SIDE 1 52 53 /* message priority */ 54 #define MSU_HIGH 1 55 #define MSU_NORM 0 56 57 /* miscellaneous */ 58 #define SUCCESS 0 59 #define FAILURE -1 60 #if !defined(BUSY) /* warning: macro redefined */ 61 #define BUSY -2 62 #endif 63 64 /* timeout interval */ 65 #define MSU_TM_500MS 500000 /* 500ms */ 66 67 /* XON/XOFF code */ 68 #define MSU_XON 0x11 69 #define MSU_XOFF 0x13 70 #define MSU_XON_4 (MSU_XON << 24|MSU_XON << 16|MSU_XON << 8|MSU_XON) 71 #define MSU_XOFF_4 (MSU_XOFF << 24|MSU_XOFF << 16|MSU_XOFF << 8|MSU_XOFF) 72 73 /* main path code used by MSU_CMD_START ioctl */ 74 #define MAINPATHCODE 0x1000 75 #define MSU_OBP_CONSOLE -2 76 77 /* maximum number of minor device number */ 78 #define MAXDEVMINOR 256 79 80 /* node mask */ 81 #define USER_NODE_MASK 0x00000000 /* user control node */ 82 #define META_NODE_MASK 0x00010000 /* meta control node */ 83 84 /* node_flag */ 85 #define MSU_NODE_USER 0 /* user control node */ 86 #define MSU_NODE_META 1 /* meta control node */ 87 88 /* node_flag check macro */ 89 #define MSU_NODE_TYPE(dev) \ 90 (((dev) & (META_NODE_MASK|USER_NODE_MASK)) >> 16) 91 92 /* termio_flag */ 93 #define MSU_TIOS_TCSETS 1 /* TCSETS */ 94 #define MSU_TIOS_MSET 2 /* TIOCMSET */ 95 #define MSU_TIOS_PPS 3 /* TIOCSPPS */ 96 #define MSU_TIOS_WINSZP 4 /* TIOCSWINSZ */ 97 #define MSU_TIOS_SOFTCAR 5 /* TIOCSSOFTCAR */ 98 #define MSU_TIOS_END 6 /* termios end */ 99 100 /* binding name */ 101 #define MSU_CMUCH_FF "pci10cf,138f" 102 #define MSU_CMUCH_DC "pci10cf,1390" 103 #ifdef DEBUG 104 #define MSU_CMUCH_DBG "pci108e,8000" 105 #endif 106 107 /* tty-port# properties */ 108 #define MSU_TTY_PORT_PROP "tty-port#" 109 110 /* board# properties */ 111 #define MSU_BOARD_PROP "board#" 112 113 /* 114 * oplmsu command code 115 */ 116 #define MSU_CMD ('f' << 8) 117 #define MSU_CMD_STOP (MSU_CMD|0x14) 118 #define MSU_CMD_START (MSU_CMD|0x15) 119 #define MSU_CMD_ACTIVE (MSU_CMD|0x1a) 120 121 #define MSU_PATH_ALL (-1) /* path all instruction */ 122 123 /* 124 * oplmsu path status for status member on upper path info table 125 */ 126 #define MSU_PSTAT_EMPTY 0 127 #define MSU_PSTAT_ACTIVE 1 128 #define MSU_PSTAT_STANDBY 2 129 #define MSU_PSTAT_STOP 3 130 #define MSU_PSTAT_FAIL 4 131 #define MSU_PSTAT_DISCON 5 132 #define MSU_PSTAT_ENCAP 6 133 134 /* 135 * oplmsu additional status for traditional_status member on 136 * upper path info table 137 */ 138 #define MSU_UNLINK 0 /* initial state */ 139 #define MSU_EMPTY 1 /* MSU_STAT_EMPTY(00) state */ 140 #define MSU_LINK_NU 2 /* link state(no link ID, no upper path info) */ 141 #define MSU_SETID_NU 3 /* set ID state(link ID, no upper path info) */ 142 #define MSU_MAKE_INST 4 /* create instance node state */ 143 #define MSU_STOP 5 /* MSU_STAT_STOP(03) state */ 144 #define MSU_WSTR_ACK 6 /* wait ack/nak of MSU_CMD_START state */ 145 #define MSU_STANDBY 7 /* MSU_STAT_STANDBY(02) state */ 146 #define MSU_WTCS_ACK 8 /* wait ack/nak of TCSETS state */ 147 #define MSU_WTMS_ACK 9 /* wait ack/nak of TIOCMSET state */ 148 #define MSU_WPPS_ACK 10 /* wait ack/nak of TIOCSPPS state */ 149 #define MSU_WWSZ_ACK 11 /* wait ack/nak of TIOCSWINSZ state */ 150 #define MSU_WCAR_ACK 12 /* wait ack/nak of TIOCSSOFTCAR state */ 151 #define MSU_ACTIVE 13 /* MSU_STAT_ACTIVE(01) state */ 152 #define MSU_WSTP_ACK 14 /* wait ack/nak of MSU_CMD_STOP state */ 153 #define MSU_FAIL 15 /* MSU_STAT_FAIL(04) state */ 154 #define MSU_WCHK_ACK 16 /* wait ack/nak of OPLMSUSELFTEST */ 155 #define MSU_SETID 17 /* set ID state(link ID, upper path info) */ 156 #define MSU_DISCON 18 /* MSU_STAT_DISCON(05) state */ 157 #define MSU_LINK 19 /* link state(no link ID, upper path info) */ 158 #define MSU_WPTH_CHG 20 /* wait ack/nak of OPLMSUPATHCHG state */ 159 160 /* 161 * oplmsu instance status for inst_status member on 162 * upper instance info talbe 163 */ 164 #define INST_STAT_BUSY -1 /* busy */ 165 #define INST_STAT_ONLINE 10 /* online */ 166 #define INST_STAT_OFFLINE 11 /* offline */ 167 #define INST_STAT_UNCONFIGURED 12 /* unconfigured */ 168 169 /* 170 * oplmsu lower path Info table ext status for ext member on 171 * lower path info table 172 */ 173 #define MSU_EXT_NOTUSED -1 /* not used (default) */ 174 #define MSU_EXT_ACTIVE_CANDIDATE -2 /* active path candidate by */ 175 /* MSU_CMD_START */ 176 #define MSU_EXT_VOID -3 /* void status */ 177 178 /* oplmsu/su pathname size */ 179 #define MSU_PATHNAME_SIZE 128 180 181 /* control block(path parameter) */ 182 struct msu_path { 183 int num; /* total number of paths */ 184 int reserved; /* reserved */ 185 }; 186 187 /* control block(device parameter) */ 188 struct msu_dev { 189 dev_info_t *dip; /* pointer to dev_info_t */ 190 }; 191 192 /* serial device control block */ 193 typedef struct serial_devcb { 194 dev_info_t *dip; /* pointer to dev_info_t */ 195 int lsb; /* LSB number */ 196 } ser_devcb_t; 197 198 /* serial device countrl block list */ 199 typedef struct serial_devlist { 200 struct serial_devlist *next; 201 dev_info_t *dip; /* pointer to dev_info_t */ 202 } ser_devl_t; 203 204 /* upper path table */ 205 typedef struct upper_path_table { 206 struct upper_path_table *u_next; 207 struct upper_path_table *u_prev; 208 struct lower_path_table *lpath; 209 int path_no; 210 int reserved; 211 int status; 212 int prev_status; 213 ulong_t traditional_status; 214 ser_devcb_t ser_devcb; 215 } upath_t; 216 217 /* lower path table */ 218 typedef struct lower_path_table { 219 struct lower_path_table *l_next; 220 struct lower_path_table *l_prev; 221 mblk_t *first_lpri_hi; 222 mblk_t *last_lpri_hi; 223 mblk_t *hndl_mp; 224 queue_t *hndl_uqueue; 225 queue_t *lower_queue; 226 queue_t *uwq_queue; 227 struct upper_instance_table *uinst; 228 char *abt_char; 229 struct buf_tbl *rbuftbl; 230 bufcall_id_t rbuf_id; 231 timeout_id_t rtout_id; 232 upath_t *src_upath; 233 long status; 234 int path_no; 235 int link_id; 236 int uwq_flag; 237 int sw_flag; 238 kcondvar_t sw_cv; 239 } lpath_t; 240 241 /* control table */ 242 typedef struct control_table { 243 struct control_table *c_next; 244 struct control_table *c_prev; 245 mblk_t *first_upri_hi; 246 mblk_t *last_upri_hi; 247 queue_t *queue; 248 queue_t *lrq_queue; 249 queue_t *wait_queue; 250 minor_t minor; 251 int node_type; 252 struct buf_tbl *wbuftbl; 253 bufcall_id_t wbuf_id; 254 timeout_id_t wtout_id; 255 int lrq_flag; 256 int sleep_flag; 257 kcondvar_t cvp; 258 } ctrl_t; 259 260 #define MSU_MAX_ABTSLEN 24 /* maximum length for abort sequence */ 261 262 /* upper instance table */ 263 typedef struct upper_instance_table { 264 upath_t *first_upath; 265 upath_t *last_upath; 266 lpath_t *first_lpath; 267 lpath_t *last_lpath; 268 ctrl_t *meta_ctrl; 269 ctrl_t *user_ctrl; 270 queue_t *lower_queue; 271 dev_info_t *msu_dip; 272 int inst_status; 273 int path_num; 274 int reserved[2]; 275 krwlock_t lock; 276 kmutex_t u_lock; 277 kmutex_t l_lock; 278 kmutex_t c_lock; 279 mblk_t *tcsets_p; 280 mblk_t *tiocmset_p; 281 mblk_t *tiocspps_p; 282 mblk_t *tiocswinsz_p; 283 mblk_t *tiocssoftcar_p; 284 char abts[MSU_MAX_ABTSLEN]; 285 } uinst_t; 286 287 /* queue table for bufcall() and timeout() */ 288 struct buf_tbl { 289 queue_t *q; 290 int rw_flag; 291 }; 292 293 294 /* rwlock macro */ 295 #define OPLMSU_RWLOCK_UPGRADE() { \ 296 if (rw_tryupgrade(&oplmsu_uinst->lock) == 0) { \ 297 rw_exit(&oplmsu_uinst->lock); \ 298 rw_enter(&oplmsu_uinst->lock, RW_WRITER); \ 299 } \ 300 } 301 302 #ifdef DEBUG 303 typedef struct tracedata { 304 queue_t *q; 305 mblk_t *mp; 306 char op[3]; 307 uchar_t msg_type; 308 int pathno; 309 int msg_cmd; 310 ulong_t data; 311 } msu_trc_t; 312 313 #define MSU_TRC_USER ('u' << 24|'s' << 16|'e' << 8|'r') 314 #define MSU_TRC_META ('m' << 24|'e' << 16|'t' << 8|'a') 315 316 /* oplmsu_trace_on */ 317 #define MSU_TRACE_OFF 0 318 #define MSU_TRACE_ON 1 319 320 /* oplmsu_debug_mode */ 321 #define MSU_DPRINT_ON 1 /* enable print log */ 322 323 /* op type */ 324 #define MSU_TRC_UI 0 /* upper input */ 325 #define MSU_TRC_UO 1 /* upper output */ 326 #define MSU_TRC_LI 2 /* lower input */ 327 #define MSU_TRC_LO 3 /* lower output */ 328 #define MSU_TRC_OPN 4 /* open */ 329 #define MSU_TRC_CLS 5 /* close */ 330 331 /* trace macro */ 332 #define OPLMSU_TRACE(q, mp, op) { \ 333 if (oplmsu_trace_on == MSU_TRACE_ON) { \ 334 oplmsu_cmn_trace(q, mp, op); \ 335 } \ 336 } 337 338 /* debug print macro */ 339 #define DBG_PRINT(args) { \ 340 if (oplmsu_debug_mode & MSU_DPRINT_ON) { \ 341 cmn_err args; \ 342 } \ 343 } 344 345 #else /* ! DEBUG */ 346 347 /* trace macro */ 348 #define OPLMSU_TRACE(q, mp, op) 349 350 /* debug print macro */ 351 #define DBG_PRINT(args) 352 #endif 353 354 #ifdef __cplusplus 355 } 356 #endif 357 358 #endif /* _OPLMSU_H */ 359