Home | History | Annotate | Download | only in io
      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  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 /*
     27  *	Asynchronous protocol handler for Z8530 chips
     28  *	Handles normal UNIX support for terminals & modems
     29  */
     30 
     31 #include <sys/types.h>
     32 #include <sys/param.h>
     33 #include <sys/systm.h>
     34 #include <sys/sysmacros.h>
     35 #include <sys/signal.h>
     36 #include <sys/kmem.h>
     37 #include <sys/termios.h>
     38 #include <sys/stropts.h>
     39 #include <sys/stream.h>
     40 #include <sys/strsun.h>
     41 #include <sys/tty.h>
     42 #include <sys/ptyvar.h>
     43 #include <sys/cred.h>
     44 #include <sys/user.h>
     45 #include <sys/proc.h>
     46 #include <sys/file.h>
     47 #include <sys/uio.h>
     48 #include <sys/buf.h>
     49 #include <sys/mkdev.h>
     50 #include <sys/cmn_err.h>
     51 #include <sys/strtty.h>
     52 #include <sys/consdev.h>
     53 #include <sys/zsdev.h>
     54 #include <sys/ser_async.h>
     55 #include <sys/debug.h>
     56 #include <sys/kbio.h>
     57 #include <sys/conf.h>
     58 #include <sys/ddi.h>
     59 #include <sys/sunddi.h>
     60 #include <sys/promif.h>
     61 #include <sys/policy.h>
     62 
     63 /*
     64  * PPS (Pulse Per Second) support.
     65  */
     66 extern void ddi_hardpps(struct timeval *, int);
     67 static struct ppsclockev ppsclockev;
     68 
     69 #ifdef PPSCLOCKLED
     70 /* XXX Use these to observe PPS latencies and jitter on a scope */
     71 #define	LED_ON
     72 #define	LED_OFF
     73 #else
     74 #define	LED_ON
     75 #define	LED_OFF
     76 #endif
     77 
     78 #define	ZSA_RCV_SIZE	64
     79 #define	ZA_KICK_RCV_COUNT	3
     80 #define	ZSA_GRACE_MIN_FLOW_CONTROL	5
     81 #define	ZSA_GRACE_MAX_FLOW_CONTROL	20
     82 
     83 int zsasoftdtr = 0;	/* if nonzero, softcarrier raises dtr at attach */
     84 int zsb134_weird = 0;	/* if set, old weird B134 behavior */
     85 int g_zsticks = 0;	/* if set, becomes the global zsticks value */
     86 int g_nocluster = 0;	/* if set, disables clustering of received data */
     87 
     88 unsigned int zsa_rstandby = ZSA_MIN_RSTANDBY;
     89 unsigned int zsa_rdone = ZSA_RDONE_MIN;
     90 unsigned int zsa_grace_flow_control = ZSA_GRACE_MIN_FLOW_CONTROL;
     91 
     92 
     93 #define	NSPEED	18	/* max # of speeds */
     94 ushort_t zs_speeds[NSPEED] = {
     95 	0,
     96 	ZSPEED(50),	/* 1 */
     97 	ZSPEED(75),	/* 2 */
     98 	ZSPEED(110),	/* 3 */
     99 #ifdef lint
    100 	ZSPEED(134),	/* 4 */
    101 #else
    102 	ZSPEED(269/2),			/* XXX - This is sleazy */
    103 #endif
    104 	ZSPEED(150),	/* 5 */
    105 	ZSPEED(200),	/* 6 */
    106 	ZSPEED(300),	/* 7 */
    107 	ZSPEED(600),	/* 8 */
    108 	ZSPEED(1200),	/* 9 */
    109 	ZSPEED(1800),	/* 10 */
    110 	ZSPEED(2400),	/* 11 */
    111 	ZSPEED(4800),	/* 12 */
    112 	ZSPEED(9600),	/* 13 */
    113 	ZSPEED(19200),	/* 14 */
    114 	ZSPEED(38400),	/* 15 */
    115 	ZSPEED(57680),	/* 16 */
    116 	ZSPEED(76800)	/* 17 */
    117 };
    118 
    119 ushort_t zsticks[NSPEED] = {
    120 	3,		/* 0 */
    121 	3,		/* 1 */
    122 	3,		/* 2 */
    123 	3,		/* 3 */
    124 	3,		/* 4 */
    125 	3,		/* 5 */
    126 	3,		/* 6 */
    127 	3,		/* 7 */
    128 	3,		/* 8 */
    129 	3,		/* 9 */
    130 	3,		/* 10 */
    131 	3,		/* 11 */
    132 	3,		/* 12 */
    133 	3,		/* 13 */
    134 	2,		/* 14 */
    135 	1,		/* 15 */
    136 	1,		/* 16 */
    137 	1		/* 17 */
    138 };
    139 
    140 #define	ztdelay(nsp)	(zsdelay[(nsp)]*(hz/100))
    141 
    142 ushort_t zsdelay[NSPEED] = {
    143 	0,
    144 	ZDELAY(50),	/* 1 */
    145 	ZDELAY(75),	/* 2 */
    146 	ZDELAY(110),    /* 3 */
    147 #ifdef lint
    148 	ZDELAY(134),    /* 4 */
    149 #else
    150 	ZDELAY(269/2),
    151 #endif
    152 	ZDELAY(150),    /* 5 */
    153 	ZDELAY(200),    /* 6 */
    154 	ZDELAY(300),    /* 7 */
    155 	ZDELAY(600),    /* 8 */
    156 	ZDELAY(1200),   /* 9 */
    157 	ZDELAY(1800),   /* 10 */
    158 	ZDELAY(2400),   /* 11 */
    159 	ZDELAY(4800),   /* 12 */
    160 	ZDELAY(9600),   /* 13 */
    161 	ZDELAY(19200),  /* 14 */
    162 	ZDELAY(38400),  /* 15 */
    163 	ZDELAY(57600),  /* 16 */
    164 	ZDELAY(76800)	/* 17 */
    165 };
    166 
    167 ushort_t zslowat[NSPEED] = {
    168 	3,		/* 0 */
    169 	3,		/* 1 */
    170 	3,		/* 2 */
    171 	3,		/* 3 */
    172 	3,		/* 4 */
    173 	3,		/* 5 */
    174 	3,		/* 6 */
    175 	2,		/* 7 */
    176 	2,		/* 8 */
    177 	2,		/* 9 */
    178 	2,		/* 10 */
    179 	1,		/* 11 */
    180 	1,		/* 12 */
    181 	1,		/* 13 */
    182 	1,		/* 14 */
    183 	1,		/* 15 */
    184 	1,		/* 16 */
    185 	1		/* 17 */
    186 };
    187 
    188 ushort_t zshiwat[NSPEED] = {
    189 	0,		/* 0 */
    190 	1,		/* 1 */
    191 	1,		/* 2 */
    192 	1,		/* 3 */
    193 	1,		/* 4 */
    194 	1,		/* 5 */
    195 	1,		/* 6 */
    196 	1,		/* 7 */
    197 	1,		/* 8 */
    198 	1,		/* 9 */
    199 	1,		/* 10 */
    200 	1,		/* 11 */
    201 	1,		/* 12 */
    202 	3,		/* 13 */
    203 	3,		/* 14 */
    204 	4,		/* 15 */
    205 	4,		/* 16 */
    206 	4		/* 17 */
    207 };
    208 
    209 #define	SLAVIO_BUG	/* this workaround required to fix bug 1102778 */
    210 
    211 #define	SPEED(cflag) \
    212 	((cflag) & CBAUDEXT) ? \
    213 		(((cflag) & 0x1) + CBAUD + 1) : ((cflag) & CBAUD)
    214 
    215 /*
    216  * Special macros to handle STREAMS operations.
    217  * These are required to address memory leakage problems.
    218  * WARNING : the macro do NOT call ZSSETSOFT
    219  */
    220 
    221 /*
    222  * Should be called holding only the adaptive (zs_excl) mutex.
    223  */
    224 #define	ZSA_GETBLOCK(zs, allocbcount) \
    225 { \
    226 	register int n = zsa_rstandby; \
    227 	while (--n >= 0 && allocbcount > 0) { \
    228 		if (!za->za_rstandby[n]) { \
    229 			if ((za->za_rstandby[n] = allocb(ZSA_RCV_SIZE, \
    230 			    BPRI_MED)) == NULL) { \
    231 				if (za->za_bufcid == 0) { \
    232 					za->za_bufcid = bufcall(ZSA_RCV_SIZE, \
    233 					    BPRI_MED, \
    234 					    zsa_callback, zs); \
    235 					break; \
    236 				} \
    237 			} \
    238 			allocbcount--; \
    239 		} \
    240 	} \
    241 	if (za->za_ttycommon.t_cflag & CRTSXOFF) { \
    242 		mutex_enter(zs->zs_excl_hi); \
    243 		if (!(zs->zs_wreg[5] & ZSWR5_RTS)) { \
    244 			register int usedcnt = 0; \
    245 			for (n = 0; n < zsa_rstandby; n++) \
    246 				if (!za->za_rstandby[n]) \
    247 					usedcnt++; \
    248 			if ((ushort_t)usedcnt <= \
    249 			    zslowat[SPEED(za->za_ttycommon.t_cflag)]) \
    250 				SCC_BIS(5, ZSWR5_RTS); \
    251 		} \
    252 		mutex_exit(zs->zs_excl_hi); \
    253 	} \
    254 }
    255 
    256 /*
    257  * Should be called holding the spin (zs_excl_hi) mutex.
    258  */
    259 #define	ZSA_ALLOCB(mp) \
    260 { \
    261 	register int n = zsa_rstandby; \
    262 	while (--n >= 0) { \
    263 		if ((mp = za->za_rstandby[n]) != NULL) { \
    264 			za->za_rstandby[n] = NULL; \
    265 			break; \
    266 		} \
    267 	} \
    268 	if (za->za_ttycommon.t_cflag & CRTSXOFF) { \
    269 		if (!mp) { \
    270 			if (zs->zs_wreg[5] & ZSWR5_RTS) \
    271 				SCC_BIC(5, ZSWR5_RTS); \
    272 			cmn_err(CE_WARN, "zs%d: message lost\n", \
    273 				UNIT(za->za_dev)); \
    274 		} else if (zs->zs_wreg[5] & ZSWR5_RTS) { \
    275 			register int usedcnt = 0; \
    276 			for (n = 0; n < zsa_rstandby; n++) \
    277 				if (!za->za_rstandby[n]) \
    278 					usedcnt++; \
    279 			if ((ushort_t)usedcnt >= (zsa_rstandby - \
    280 			    zshiwat[SPEED(za->za_ttycommon.t_cflag)])) \
    281 				SCC_BIC(5, ZSWR5_RTS); \
    282 		} \
    283 	} \
    284 }
    285 
    286 /*
    287  * Should get the spin (zs_excl_hi) mutex.
    288  */
    289 #define	ZSA_QREPLY(q, mp) \
    290 { \
    291 	mutex_enter(zs->zs_excl_hi); \
    292 	ZSA_PUTQ(mp); \
    293 	ZSSETSOFT(zs); \
    294 	mutex_exit(zs->zs_excl_hi); \
    295 }
    296 
    297 /*
    298  * Should be called holding the spin (zs_excl_hi) mutex.
    299  */
    300 #define	ZSA_PUTQ(mp) \
    301 { \
    302 	register int wptr, rptr; \
    303 	wptr = za->za_rdone_wptr; \
    304 	rptr = za->za_rdone_rptr; \
    305 	za->za_rdone[wptr] = mp; \
    306 	if ((wptr)+1 == zsa_rdone) { \
    307 		za->za_rdone_wptr = wptr = 0; \
    308 	} else \
    309 		za->za_rdone_wptr = ++wptr; \
    310 	if (wptr == rptr) { \
    311 		SCC_BIC(1, ZSWR1_INIT); \
    312 		cmn_err(CE_WARN, "zs%d disabled: input buffer overflow", \
    313 			UNIT(za->za_dev)); \
    314 	} \
    315 }
    316 
    317 /*
    318  * Should be called holding the spin (zs_excl_hi) mutex.
    319  */
    320 #define	ZSA_KICK_RCV \
    321 { \
    322 	register mblk_t *mp = za->za_rcvblk; \
    323 	if (mp) { \
    324 		if (zs->zs_rd_cur) {	/* M_DATA */ \
    325 			mp->b_wptr = zs->zs_rd_cur; \
    326 			zs->zs_rd_cur = NULL; \
    327 			zs->zs_rd_lim = NULL; \
    328 		} \
    329 		za->za_rcvblk = NULL; \
    330 		ZSA_PUTQ(mp); \
    331 		ZSSETSOFT(zs); \
    332 	} \
    333 }
    334 
    335 #define	ZSA_SEEQ(mp) \
    336 { \
    337 		if (za->za_rdone_rptr != za->za_rdone_wptr) { \
    338 			mp = za->za_rdone[za->za_rdone_rptr]; \
    339 		} else { \
    340 			mp = NULL; \
    341 		} \
    342 }
    343 
    344 
    345 /*
    346  * Should be called holding only the adaptive (zs_excl) mutex.
    347  */
    348 #define	ZSA_GETQ(mp) \
    349 { \
    350 	if (za->za_rdone_rptr != za->za_rdone_wptr) { \
    351 		mp = za->za_rdone[za->za_rdone_rptr]; \
    352 		za->za_rdone[za->za_rdone_rptr++] = NULL; \
    353 		if (za->za_rdone_rptr == zsa_rdone) \
    354 			za->za_rdone_rptr = 0; \
    355 	} else { \
    356 		mp = NULL; \
    357 	} \
    358 }
    359 
    360 /*
    361  * Should be called holding only the adaptive (zs_excl) mutex.
    362  */
    363 #define	ZSA_FLUSHQ \
    364 { \
    365 	register mblk_t *tmp; \
    366 	for (;;) { \
    367 		ZSA_GETQ(tmp); \
    368 		if (!(tmp)) \
    369 			break; \
    370 		freemsg(tmp); \
    371 	} \
    372 }
    373 
    374 
    375 /*
    376  * Logging definitions
    377  */
    378 
    379 #ifdef ZSA_DEBUG
    380 
    381 #ifdef ZS_DEBUG_ALL
    382 
    383 extern	char	zs_h_log[];
    384 extern	int	zs_h_log_n;
    385 
    386 #define	zsa_h_log_clear
    387 
    388 #define	zsa_h_log_add(c) \
    389 { \
    390 	if (zs_h_log_n >= ZS_H_LOG_MAX) \
    391 		zs_h_log_n = 0; \
    392 	zs_h_log[zs_h_log_n++] = 'A' + zs->zs_unit; \
    393 	zs_h_log[zs_h_log_n++] = c; \
    394 	zs_h_log[zs_h_log_n] = '\0'; \
    395 }
    396 
    397 #else /* ZS_DEBUG_ALL */
    398 
    399 #define	ZSA_H_LOG_MAX	0x4000
    400 char zsa_h_log[40][ZSA_H_LOG_MAX +10];
    401 int zsa_h_log_n[40];
    402 
    403 #define	zsa_h_log_add(c) \
    404 { \
    405 	if (zsa_h_log_n[zs->zs_unit] >= ZSA_H_LOG_MAX) \
    406 		zsa_h_log_n[zs->zs_unit] = 0; \
    407 	zsa_h_log[zs->zs_unit][zsa_h_log_n[zs->zs_unit]++] = c; \
    408 	zsa_h_log[zs->zs_unit][zsa_h_log_n[zs->zs_unit]] = '\0'; \
    409 }
    410 
    411 #define	zsa_h_log_clear \
    412 { \
    413 	register char *p; \
    414 	for (p = &zsa_h_log[zs->zs_unit][ZSA_H_LOG_MAX]; \
    415 		p >= &zsa_h_log[zs->zs_unit][0]; /* null */) \
    416 		*p-- = '\0'; \
    417 	zsa_h_log_n[zs->zs_unit] = 0; \
    418 }
    419 
    420 #endif /* ZS_DEBUG_ALL */
    421 
    422 #define	ZSA_R0_LOG(r0) \
    423 { \
    424 	if (r0 & ZSRR0_RX_READY) zsa_h_log_add('R'); \
    425 	if (r0 & ZSRR0_TIMER) zsa_h_log_add('Z'); \
    426 	if (r0 & ZSRR0_TX_READY) zsa_h_log_add('T'); \
    427 	if (r0 & ZSRR0_CD) zsa_h_log_add('D'); \
    428 	if (r0 & ZSRR0_SYNC) zsa_h_log_add('S'); \
    429 	if (r0 & ZSRR0_CTS) zsa_h_log_add('C'); \
    430 	if (r0 & ZSRR0_TXUNDER) zsa_h_log_add('U'); \
    431 	if (r0 & ZSRR0_BREAK) zsa_h_log_add('B'); \
    432 }
    433 
    434 #else /* ZSA_DEBUG */
    435 
    436 #define	zsa_h_log_clear
    437 #define	zsa_h_log_add(c)
    438 #define	 ZSA_R0_LOG(r0)
    439 
    440 #endif /* ZSA_DEBUG */
    441 
    442 
    443 
    444 static int zsa_open(queue_t *rq, dev_t *dev, int flag, int sflag, cred_t *cr);
    445 static int zsa_close(queue_t *q, int flag);
    446 static void zsa_wput(queue_t *q, mblk_t *mp);
    447 static void zsa_rsrv(queue_t *q);
    448 
    449 static struct module_info asyncm_info = {
    450 	0,
    451 	"zs",
    452 	0,
    453 	INFPSZ,
    454 	2048,
    455 	128
    456 };
    457 
    458 static struct qinit async_rinit = {
    459 	putq,
    460 	(int (*)())zsa_rsrv,
    461 	zsa_open,
    462 	zsa_close,
    463 	NULL,
    464 	&asyncm_info,
    465 	NULL
    466 };
    467 
    468 static struct qinit async_winit = {
    469 	(int (*)())zsa_wput,
    470 	NULL,
    471 	NULL,
    472 	NULL,
    473 	NULL,
    474 	&asyncm_info,
    475 	NULL
    476 };
    477 
    478 struct streamtab asynctab = {
    479 	&async_rinit,
    480 	&async_winit,
    481 	NULL,
    482 	NULL,
    483 };
    484 
    485 /*
    486  * The async interrupt entry points.
    487  */
    488 static void	zsa_txint(struct zscom *zs);
    489 static void	zsa_xsint(struct zscom *zs);
    490 static void	zsa_rxint(struct zscom *zs);
    491 static void	zsa_srint(struct zscom *zs);
    492 static int	zsa_softint(struct zscom *zs);
    493 static int	zsa_suspend(struct zscom *zs);
    494 static int	zsa_resume(struct zscom *zs);
    495 
    496 static void
    497 zsa_null(struct zscom *zs)
    498 {
    499 	/* LINTED */
    500 	register short	c;
    501 
    502 	SCC_WRITE0(ZSWR0_RESET_TXINT);
    503 	SCC_WRITE0(ZSWR0_RESET_STATUS);
    504 	c = SCC_READDATA();
    505 	ZSDELAY();
    506 	SCC_WRITE0(ZSWR0_RESET_ERRORS);
    507 }
    508 
    509 /*ARGSUSED*/
    510 static int
    511 zsa_null_int(struct zscom *zs)
    512 {
    513 	return (0);
    514 }
    515 
    516 struct zsops zsops_null_async = {
    517 	zsa_null,
    518 	zsa_null,
    519 	zsa_null,
    520 	zsa_null,
    521 	zsa_null_int,
    522 	zsa_null_int,
    523 	zsa_null_int
    524 };
    525 
    526 struct zsops zsops_async = {
    527 	zsa_txint,
    528 	zsa_xsint,
    529 	zsa_rxint,
    530 	zsa_srint,
    531 	zsa_softint,
    532 	zsa_suspend,
    533 	zsa_resume
    534 };
    535 
    536 static int	dmtozs(int bits);
    537 static int	zstodm(int bits);
    538 static void	zsa_restart(void *);
    539 static void	zsa_reioctl(void *);
    540 static void	zsa_ioctl(struct asyncline *za, queue_t *q, mblk_t *mp);
    541 static void	zsa_program(struct asyncline *za, int setibaud);
    542 static void	zsa_start(struct zscom *zs);
    543 static void 	zsa_kick_rcv(void *);
    544 static void 	zsa_callback(void *);
    545 static void	zsa_set_za_rcv_flags_mask(struct asyncline *za);
    546 int		zsgetspeed(dev_t dev);
    547 
    548 static boolean_t abort_charseq_recognize(uchar_t ch);
    549 
    550 /* ARGSUSED */
    551 int
    552 zsc_info(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg,
    553     void **result)
    554 {
    555 	register dev_t dev = (dev_t)arg;
    556 	register int unit, error;
    557 	register struct zscom *zs;
    558 
    559 	if ((unit = UNIT(dev)) >= nzs)
    560 		return (DDI_FAILURE);
    561 
    562 	switch (infocmd) {
    563 	case DDI_INFO_DEVT2DEVINFO:
    564 		zs = &zscom[unit];
    565 		*result = zs->zs_dip;
    566 		error = DDI_SUCCESS;
    567 		break;
    568 	case DDI_INFO_DEVT2INSTANCE:
    569 		*result = (void *)(uintptr_t)(unit / 2);
    570 		error = DDI_SUCCESS;
    571 		break;
    572 	default:
    573 		error = DDI_FAILURE;
    574 	}
    575 	return (error);
    576 }
    577 
    578 /*
    579  * The Asynchronous Driver.
    580  */
    581 
    582 /*
    583  * Determine if the zsminor device is in use as either a stdin or stdout
    584  * device, so we can be careful about how we initialize the DUART, if
    585  * it is, in fact, in use.
    586  *
    587  * Since this is expensive, we do it once and store away the answers,
    588  * since this gets called a number of times per phyical zs device.
    589  * Perhaps, this should be in a loadable module, so it can get thrown
    590  * away after all the zs devices are attached?
    591  */
    592 
    593 /*
    594  * To determine if a given unit is being used by the PROM,
    595  * we need to map stdin/stdout devices as known to the PROM
    596  * to zs internal minor device numbers:
    597  *
    598  * PROM (real device)	zs minor	device
    599  *
    600  * "zs", 0, "a"		 0		ttya
    601  * "zs", 0, "b"		 1		ttyb
    602  * "zs", 1, "a"		 2		keyboard
    603  * "zs", 1, "b"		 3		mouse
    604  * "zs", 2, "a"		 4		ttyc
    605  * "zs", 2, "b"		 5		ttyd
    606  *
    607  * The following value mapping lines assume that insource
    608  * and outsink map as "screen, a, b, c, d, ...", and that
    609  * zs minors are "a, b, kbd, mouse, c, d, ...".
    610  */
    611 
    612 static int zsa_inuse;		/* Strictly for debugging */
    613 
    614 int
    615 zsa_channel_is_active_in_rom(dev_info_t *dev, int zsminor)
    616 {
    617 	char pathname[OBP_MAXPATHLEN];
    618 	char default_pathname[OBP_MAXPATHLEN];
    619 	char *stdioname;
    620 	char minordata[3];
    621 
    622 	/*
    623 	 * Basically, get my name and compare it to stdio devnames
    624 	 * and if we get a match, then the device is in use as either
    625 	 * stdin or stdout device (console tip line or keyboard device).
    626 	 *
    627 	 * We get two forms of the pathname, one complete with the
    628 	 * the channel number, and if the channel is 'a', then
    629 	 * we also deal with the user's ability to default to
    630 	 * channel 'a', by omitting the channel number option.
    631 	 * We then compare these pathnames to both the stdin and
    632 	 * stdout pathnames. If any of these match, then the channel
    633 	 * is in use.
    634 	 */
    635 
    636 	(void) ddi_pathname(dev, pathname);	/* device pathname */
    637 	default_pathname[0] = (char)0;	/* default pathname if channel 'a' */
    638 	if ((zsminor & 1) == 0)
    639 		(void) strcpy(default_pathname, pathname);
    640 	minordata[0] = ':';
    641 	minordata[1] = (char)('a' + (zsminor & 1));
    642 	minordata[2] = (char)0;
    643 	(void) strcat(pathname, minordata);
    644 
    645 	stdioname = prom_stdinpath();
    646 	if (strcmp(pathname, stdioname) == 0) {
    647 		zsa_inuse |= (1 << zsminor);
    648 		return (1);
    649 	}
    650 	if (strcmp(default_pathname, stdioname) == 0) {
    651 		zsa_inuse |= (1 << zsminor);
    652 		return (1);
    653 	}
    654 
    655 	stdioname = prom_stdoutpath();
    656 	if (strcmp(pathname, stdioname) == 0) {
    657 		zsa_inuse |= (1 << zsminor);
    658 		return (1);
    659 	}
    660 	if (strcmp(default_pathname, stdioname) == 0) {
    661 		zsa_inuse |= (1 << zsminor);
    662 		return (1);
    663 	}
    664 
    665 	return (0);
    666 }
    667 
    668 /*
    669  * Initialize zs
    670  */
    671 void
    672 zsa_init(struct zscom *zs)
    673 {
    674 	/*
    675 	 * This routine is called near the end of the zs module's attach
    676 	 * process. It initializes the TTY protocol-private data for this
    677 	 * channel that needs to be in place before interrupts are enabled.
    678 	 */
    679 	mutex_enter(zs->zs_excl);
    680 	mutex_enter(zs->zs_excl_hi);
    681 
    682 	/*
    683 	 * Raise modem control lines on serial ports associated
    684 	 * with the console and (optionally) softcarrier lines.
    685 	 * Drop modem control lines on all others so that modems
    686 	 * will not answer and portselectors will skip these
    687 	 * lines until they are opened by a getty.
    688 	 */
    689 	if (zsa_channel_is_active_in_rom(zs->zs_dip, zs->zs_unit))
    690 		(void) zsmctl(zs, ZS_ON, DMSET);	/* raise dtr */
    691 	else if (zsasoftdtr && (zssoftCAR[zs->zs_unit]))
    692 		(void) zsmctl(zs, ZS_ON, DMSET);	/* raise dtr */
    693 	else
    694 		(void) zsmctl(zs, ZS_OFF, DMSET);	/* drop dtr */
    695 
    696 	if (zsa_rstandby > ZSA_MAX_RSTANDBY)
    697 		zsa_rstandby = ZSA_MAX_RSTANDBY;
    698 
    699 	if (zsa_rdone > ZSA_RDONE_MAX)
    700 		zsa_rdone = ZSA_RDONE_MAX;
    701 
    702 	if (zsa_grace_flow_control > ZSA_GRACE_MAX_FLOW_CONTROL)
    703 		zsa_grace_flow_control = ZSA_GRACE_MAX_FLOW_CONTROL;
    704 
    705 	mutex_exit(zs->zs_excl_hi);
    706 	mutex_exit(zs->zs_excl);
    707 }
    708 
    709 
    710 /*
    711  * Open routine.
    712  */
    713 /*ARGSUSED*/
    714 static int
    715 zsa_open(queue_t *rq, dev_t *dev, int flag, int sflag, cred_t *cr)
    716 {
    717 	register struct zscom *zs;
    718 	register struct asyncline *za;
    719 	register int	speed, unit;
    720 	struct termios *termiosp;
    721 	int len;
    722 	register int allocbcount = zsa_rstandby;
    723 	boolean_t set_zsoptinit = B_FALSE;
    724 
    725 	unit = UNIT(*dev);
    726 	if (unit >= nzs)
    727 		return (ENXIO);		/* unit not configured */
    728 
    729 	/* zscom is allocated by zsattach, and thus cannot be NULL here */
    730 	zs = &zscom[unit];
    731 	if (zs->zs_ops == NULL) {
    732 		return (ENXIO);	 /* device not found by autoconfig */
    733 	}
    734 
    735 	mutex_enter(zs->zs_ocexcl);
    736 	mutex_enter(zs->zs_excl);
    737 again:
    738 	if ((zs->zs_ops != &zsops_null) &&
    739 	    (zs->zs_ops != &zsops_async)) {
    740 		mutex_exit(zs->zs_excl);
    741 		mutex_exit(zs->zs_ocexcl);
    742 		return (EBUSY);	 /* another protocol got here first */
    743 	}
    744 
    745 	za = (struct asyncline *)&zs->zs_priv_str;
    746 
    747 	if (zs->zs_suspended) {
    748 		mutex_exit(zs->zs_excl);
    749 		mutex_exit(zs->zs_ocexcl);
    750 		(void) ddi_dev_is_needed(zs->zs_dip, 0, 1);
    751 		mutex_enter(zs->zs_ocexcl);
    752 		mutex_enter(zs->zs_excl);
    753 	}
    754 
    755 	/* Mark device as busy (for power management) */
    756 	(void) pm_busy_component(zs->zs_dip, unit%2+1);
    757 
    758 	if (zs->zs_ops == &zsops_null) {
    759 		bzero(za, sizeof (zs->zs_priv_str));
    760 		za->za_common = zs;
    761 		if (zssoftCAR[zs->zs_unit])
    762 			za->za_ttycommon.t_flags |= TS_SOFTCAR;
    763 		zsopinit(zs, &zsops_async);
    764 		set_zsoptinit = B_TRUE;
    765 		za->za_rdone_wptr = 0;
    766 		za->za_rdone_rptr = 0;
    767 	}
    768 
    769 	zs->zs_priv = (caddr_t)za;
    770 
    771 	/*
    772 	 * Block waiting for carrier to come up,
    773 	 * unless this is a no-delay open.
    774 	 */
    775 	mutex_enter(zs->zs_excl_hi);
    776 	if (!(za->za_flags & ZAS_ISOPEN)) {
    777 		/*
    778 		 * Get the default termios settings (cflag).
    779 		 * These are stored as a property in the
    780 		 * "options" node.
    781 		 */
    782 		mutex_exit(zs->zs_excl_hi);
    783 		if (ddi_getlongprop(DDI_DEV_T_ANY,
    784 		    ddi_root_node(), 0, "ttymodes",
    785 		    (caddr_t)&termiosp, &len) == DDI_PROP_SUCCESS &&
    786 		    len == sizeof (struct termios)) {
    787 
    788 			za->za_ttycommon.t_cflag = termiosp->c_cflag;
    789 			kmem_free(termiosp, len);
    790 		} else {
    791 			/*
    792 			 * Gack! Whine about it.
    793 			 */
    794 			cmn_err(CE_WARN,
    795 			    "zs: Couldn't get ttymodes property!");
    796 		}
    797 		mutex_enter(zs->zs_excl_hi);
    798 		if ((*dev == rconsdev) || (*dev == kbddev) ||
    799 		    (*dev == stdindev)) {
    800 			speed = zsgetspeed(*dev);
    801 			za->za_ttycommon.t_cflag &= ~(CBAUD);
    802 			if (speed > CBAUD) {
    803 				za->za_ttycommon.t_cflag |= CBAUDEXT;
    804 				za->za_ttycommon.t_cflag |=
    805 				    ((speed - CBAUD - 1) & CBAUD);
    806 			} else {
    807 				za->za_ttycommon.t_cflag &= ~CBAUDEXT;
    808 				za->za_ttycommon.t_cflag |= (speed & CBAUD);
    809 			}
    810 		}
    811 		za->za_overrun = 0;
    812 		za->za_ttycommon.t_iflag = 0;
    813 		za->za_ttycommon.t_iocpending = NULL;
    814 		za->za_ttycommon.t_size.ws_row = 0;
    815 		za->za_ttycommon.t_size.ws_col = 0;
    816 		za->za_ttycommon.t_size.ws_xpixel = 0;
    817 		za->za_ttycommon.t_size.ws_ypixel = 0;
    818 		za->za_dev = *dev;
    819 		za->za_wbufcid = 0;
    820 		zsa_program(za, za->za_ttycommon.t_cflag & (CIBAUDEXT|CIBAUD));
    821 		zsa_set_za_rcv_flags_mask(za);
    822 	} else if ((za->za_ttycommon.t_flags & TS_XCLUDE) &&
    823 	    secpolicy_excl_open(cr) != 0) {
    824 		mutex_exit(zs->zs_excl_hi);
    825 		if (set_zsoptinit && !(za->za_flags & ISOPEN))
    826 			zsopinit(zs, &zsops_null);
    827 		mutex_exit(zs->zs_excl);
    828 		mutex_exit(zs->zs_ocexcl);
    829 		return (EBUSY);
    830 	} else if ((*dev & OUTLINE) && !(za->za_flags & ZAS_OUT)) {
    831 		mutex_exit(zs->zs_excl_hi);
    832 		if (set_zsoptinit && !(za->za_flags & ISOPEN))
    833 			zsopinit(zs, &zsops_null);
    834 		mutex_exit(zs->zs_excl);
    835 		mutex_exit(zs->zs_ocexcl);
    836 		return (EBUSY);
    837 	}
    838 
    839 	if (*dev & OUTLINE)
    840 		za->za_flags |= ZAS_OUT;
    841 	(void) zsmctl(zs, ZS_ON, DMSET);
    842 
    843 	/*
    844 	 * Check carrier.
    845 	 */
    846 	if ((za->za_ttycommon.t_flags & TS_SOFTCAR) ||
    847 	    (zsmctl(zs, 0, DMGET) & ZSRR0_CD))
    848 		za->za_flags |= ZAS_CARR_ON;
    849 	mutex_exit(zs->zs_excl_hi);
    850 
    851 	/*
    852 	 * If FNDELAY and FNONBLOCK are clear, block until carrier up.
    853 	 * Quit on interrupt.
    854 	 */
    855 	if (!(flag & (FNDELAY|FNONBLOCK)) &&
    856 	    !(za->za_ttycommon.t_cflag & CLOCAL)) {
    857 		if (!(za->za_flags & (ZAS_CARR_ON|ZAS_OUT)) ||
    858 		    ((za->za_flags & ZAS_OUT) && !(*dev & OUTLINE))) {
    859 			za->za_flags |= ZAS_WOPEN;
    860 			mutex_exit(zs->zs_excl);
    861 			if (cv_wait_sig(&zs->zs_flags_cv, zs->zs_ocexcl) == 0) {
    862 				mutex_enter(zs->zs_excl);
    863 				if (zs->zs_suspended) {
    864 					mutex_exit(zs->zs_excl);
    865 					mutex_exit(zs->zs_ocexcl);
    866 					(void) ddi_dev_is_needed(zs->zs_dip,
    867 					    0, 1);
    868 					mutex_enter(zs->zs_ocexcl);
    869 					mutex_enter(zs->zs_excl);
    870 				}
    871 				za->za_flags &= ~ZAS_WOPEN;
    872 				if (set_zsoptinit && !(za->za_flags & ISOPEN))
    873 					zsopinit(zs, &zsops_null);
    874 				mutex_exit(zs->zs_excl);
    875 				mutex_exit(zs->zs_ocexcl);
    876 				return (EINTR);
    877 			}
    878 			mutex_enter(zs->zs_excl);
    879 			za->za_flags &= ~ZAS_WOPEN;
    880 			if ((zs->zs_ops == &zsops_null) ||
    881 			    (zs->zs_ops == &zsops_async))
    882 				goto again;
    883 			else {
    884 				if (set_zsoptinit && !(za->za_flags & ISOPEN))
    885 					zsopinit(zs, &zsops_null);
    886 				mutex_exit(zs->zs_excl);
    887 				mutex_exit(zs->zs_ocexcl);
    888 				return (EBUSY);
    889 			}
    890 		}
    891 	} else if ((za->za_flags & ZAS_OUT) && !(*dev & OUTLINE)) {
    892 		if (set_zsoptinit && !(za->za_flags & ISOPEN))
    893 			zsopinit(zs, &zsops_null);
    894 		mutex_exit(zs->zs_excl);
    895 		mutex_exit(zs->zs_ocexcl);
    896 		return (EBUSY);
    897 	}
    898 
    899 	za->za_ttycommon.t_readq = rq;
    900 	za->za_ttycommon.t_writeq = WR(rq);
    901 	rq->q_ptr = WR(rq)->q_ptr = (caddr_t)za;
    902 
    903 	za->za_flags |= ZAS_ISOPEN;
    904 	ZSA_GETBLOCK(zs, allocbcount);
    905 	qprocson(rq);
    906 	mutex_exit(zs->zs_excl);
    907 	mutex_exit(zs->zs_ocexcl);
    908 	return (0);
    909 }
    910 
    911 static void
    912 zs_progress_check(void *arg)
    913 {
    914 	struct asyncline *za = arg;
    915 	struct zscom *zs = za->za_common;
    916 	mblk_t *bp;
    917 
    918 	/*
    919 	 * We define "progress" as either waiting on a timed break or delay, or
    920 	 * having had at least one transmitter interrupt.  If none of these are
    921 	 * true, then just terminate the output and wake up that close thread.
    922 	 */
    923 	mutex_enter(zs->zs_excl);
    924 	if (!(zs->zs_flags & ZS_PROGRESS) &&
    925 	    !(za->za_flags & (ZAS_BREAK|ZAS_DELAY))) {
    926 		za->za_flags &= ~ZAS_BUSY;
    927 		mutex_enter(zs->zs_excl_hi);
    928 		za->za_rcv_flags_mask &= ~DO_RETRANSMIT;
    929 		zs->zs_wr_cur = NULL;
    930 		zs->zs_wr_lim = NULL;
    931 		bp = za->za_xmitblk;
    932 		za->za_xmitblk = NULL;
    933 		mutex_exit(zs->zs_excl_hi);
    934 		zs->zs_timer = 0;
    935 		mutex_exit(zs->zs_excl);
    936 		if (bp != NULL)
    937 			freeb(bp);
    938 		/*
    939 		 * Since this timer is running, we know that we're in exit(2).
    940 		 * That means that the user can't possibly be waiting on any
    941 		 * valid ioctl(2) completion anymore, and we should just flush
    942 		 * everything.
    943 		 */
    944 		flushq(za->za_ttycommon.t_writeq, FLUSHALL);
    945 		cv_broadcast(&zs->zs_flags_cv);
    946 	} else {
    947 		zs->zs_flags &= ~ZS_PROGRESS;
    948 		zs->zs_timer = timeout(zs_progress_check, za,
    949 		    drv_usectohz(zs_drain_check));
    950 		mutex_exit(zs->zs_excl);
    951 	}
    952 }
    953 
    954 /*
    955  * Close routine.
    956  *
    957  * Important locking note: the zs_ocexcl lock is not held at all in this
    958  * routine.  This is intentional.  That lock is used to coordinate multiple
    959  * simultaneous opens on a stream, and there's no such thing as multiple
    960  * simultaneous closes on a stream.
    961  */
    962 
    963 /*ARGSUSED*/
    964 static int
    965 zsa_close(queue_t *q, int flag)
    966 {
    967 	struct asyncline *za;
    968 	struct zscom *zs;
    969 	int i;
    970 	mblk_t *bp;
    971 	timeout_id_t za_zsa_restart_id, za_kick_rcv_id;
    972 	bufcall_id_t za_bufcid, za_wbufcid;
    973 	int	 tmp;
    974 
    975 	za = q->q_ptr;
    976 	ASSERT(za != NULL);
    977 
    978 	zs = za->za_common;
    979 
    980 	mutex_enter(zs->zs_excl);
    981 	zs->zs_flags |= ZS_CLOSING;
    982 
    983 	/*
    984 	 * There are two flavors of break -- timed (M_BREAK or TCSBRK) and
    985 	 * untimed (TIOCSBRK).  For the timed case, these are enqueued on our
    986 	 * write queue and there's a timer running, so we don't have to worry
    987 	 * about them.  For the untimed case, though, the user obviously made a
    988 	 * mistake, because these are handled immediately.  We'll terminate the
    989 	 * break now and honor his implicit request by discarding the rest of
    990 	 * the data.
    991 	 */
    992 	if (!(za->za_flags & ZAS_BREAK) && (zs->zs_wreg[5] & ZSWR5_BREAK))
    993 		goto nodrain;
    994 
    995 	/*
    996 	 * If the user told us not to delay the close ("non-blocking"), then
    997 	 * don't bother trying to drain.
    998 	 *
    999 	 * If the user did M_STOP (ASYNC_STOPPED), there's no hope of ever
   1000 	 * getting an M_START (since these messages aren't enqueued), and the
   1001 	 * only other way to clear the stop condition is by loss of DCD, which
   1002 	 * would discard the queue data.  Thus, we drop the output data if
   1003 	 * ASYNC_STOPPED is set.
   1004 	 */
   1005 	if ((flag & (FNDELAY|FNONBLOCK)) || (za->za_flags & ZAS_STOPPED))
   1006 		goto nodrain;
   1007 
   1008 	/*
   1009 	 * If there's any pending output, then we have to try to drain it.
   1010 	 * There are two main cases to be handled:
   1011 	 *	- called by close(2): need to drain until done or until
   1012 	 *	  a signal is received.  No timeout.
   1013 	 *	- called by exit(2): need to drain while making progress
   1014 	 *	  or until a timeout occurs.  No signals.
   1015 	 *
   1016 	 * If we can't rely on receiving a signal to get us out of a hung
   1017 	 * session, then we have to use a timer.  In this case, we set a timer
   1018 	 * to check for progress in sending the output data -- all that we ask
   1019 	 * (at each interval) is that there's been some progress made.  Since
   1020 	 * the interrupt routine grabs buffers from the write queue, we can't
   1021 	 * trust changes in zs_wr_cur.  Instead, we use a progress flag.
   1022 	 *
   1023 	 * Note that loss of carrier will cause the output queue to be flushed,
   1024 	 * and we'll wake up again and finish normally.
   1025 	 */
   1026 	if (!ddi_can_receive_sig() && zs_drain_check != 0) {
   1027 		zs->zs_flags &= ~ZS_PROGRESS;
   1028 		zs->zs_timer = timeout(zs_progress_check, za,
   1029 		    drv_usectohz(zs_drain_check));
   1030 	}
   1031 
   1032 	while (zs->zs_wr_cur != NULL ||
   1033 	    za->za_ttycommon.t_writeq->q_first != NULL ||
   1034 	    (za->za_flags & (ZAS_BUSY|ZAS_DELAY|ZAS_BREAK))) {
   1035 		if (cv_wait_sig(&zs->zs_flags_cv, zs->zs_excl) == 0)
   1036 			break;
   1037 	}
   1038 
   1039 	if (zs->zs_timer != 0) {
   1040 		(void) untimeout(zs->zs_timer);
   1041 		zs->zs_timer = 0;
   1042 	}
   1043 
   1044 nodrain:
   1045 	/*
   1046 	 * If break is in progress, stop it.
   1047 	 */
   1048 	mutex_enter(zs->zs_excl_hi);
   1049 	if (zs->zs_wreg[5] & ZSWR5_BREAK) {
   1050 		SCC_BIC(5, ZSWR5_BREAK);
   1051 		za->za_flags &= ~ZAS_BREAK;
   1052 	}
   1053 
   1054 	za_wbufcid = za->za_wbufcid;
   1055 	za_bufcid = za->za_bufcid;
   1056 	za_zsa_restart_id = za->za_zsa_restart_id;
   1057 	za_kick_rcv_id = za->za_kick_rcv_id;
   1058 
   1059 	za->za_wbufcid = za->za_bufcid = 0;
   1060 	za->za_zsa_restart_id = za->za_kick_rcv_id = 0;
   1061 
   1062 	/*
   1063 	 * If line has HUPCL set or is incompletely opened,
   1064 	 * and it is not the console or the keyboard,
   1065 	 * fix up the modem lines.
   1066 	 */
   1067 
   1068 	zsopinit(zs, &zsops_null_async);
   1069 
   1070 	/*
   1071 	 * Nobody, zsh or zs can now open this port until
   1072 	 * zsopinit(zs, &zsops_null);
   1073 	 *
   1074 	 */
   1075 
   1076 	if ((za->za_dev != rconsdev) && (za->za_dev != kbddev) &&
   1077 	    (za->za_dev != stdindev) &&
   1078 	    (((za->za_flags & (ZAS_WOPEN|ZAS_ISOPEN)) != ZAS_ISOPEN) ||
   1079 	    (za->za_ttycommon.t_cflag & HUPCL))) {
   1080 		/*
   1081 		 * If DTR is being held high by softcarrier,
   1082 		 * set up the ZS_ON set; if not, hang up.
   1083 		 */
   1084 		if (zsasoftdtr && (za->za_ttycommon.t_flags & TS_SOFTCAR))
   1085 			(void) zsmctl(zs, ZS_ON, DMSET);
   1086 		else
   1087 			(void) zsmctl(zs, ZS_OFF, DMSET);
   1088 		mutex_exit(zs->zs_excl_hi);
   1089 		/*
   1090 		 * Don't let an interrupt in the middle of close
   1091 		 * bounce us back to the top; just continue
   1092 		 * closing as if nothing had happened.
   1093 		 */
   1094 		tmp = cv_reltimedwait_sig(&zs->zs_flags_cv, zs->zs_excl,
   1095 		    drv_usectohz(10000), TR_CLOCK_TICK);
   1096 		if (zs->zs_suspended) {
   1097 			mutex_exit(zs->zs_excl);
   1098 			(void) ddi_dev_is_needed(zs->zs_dip, 0, 1);
   1099 			mutex_enter(zs->zs_excl);
   1100 		}
   1101 		if (tmp == 0)
   1102 			goto out;
   1103 		mutex_enter(zs->zs_excl_hi);
   1104 	}
   1105 
   1106 	/*
   1107 	 * If nobody's now using it, turn off receiver interrupts.
   1108 	 */
   1109 	if ((za->za_flags & (ZAS_ISOPEN|ZAS_WOPEN)) == 0)
   1110 		SCC_BIC(1, ZSWR1_RIE);
   1111 	mutex_exit(zs->zs_excl_hi);
   1112 
   1113 out:
   1114 	/*
   1115 	 * Clear out device state.
   1116 	 */
   1117 	ttycommon_close(&za->za_ttycommon);
   1118 
   1119 	za->za_ttycommon.t_readq = NULL;
   1120 	za->za_ttycommon.t_writeq = NULL;
   1121 
   1122 	mutex_enter(zs->zs_excl_hi);
   1123 	za->za_rcv_flags_mask &= ~DO_RETRANSMIT;
   1124 	zs->zs_wr_cur = NULL;
   1125 	zs->zs_wr_lim = NULL;
   1126 	bp = za->za_xmitblk;
   1127 	za->za_xmitblk = NULL;
   1128 	mutex_exit(zs->zs_excl_hi);
   1129 	if (bp)
   1130 		freemsg(bp);
   1131 
   1132 	mutex_enter(zs->zs_excl_hi);
   1133 	zs->zs_rd_cur = NULL;
   1134 	zs->zs_rd_lim = NULL;
   1135 	bp = za->za_rcvblk;
   1136 	za->za_rcvblk = NULL;
   1137 	mutex_exit(zs->zs_excl_hi);
   1138 	if (bp)
   1139 		freemsg(bp);
   1140 
   1141 	for (i = 0; i < zsa_rstandby; i++) {
   1142 		mutex_enter(zs->zs_excl_hi);
   1143 		bp = za->za_rstandby[i];
   1144 		za->za_rstandby[i] = NULL;
   1145 		mutex_exit(zs->zs_excl_hi);
   1146 		if (bp)
   1147 			freemsg(bp);
   1148 	}
   1149 
   1150 	if (za->za_soft_active || za->za_kick_active) {
   1151 		zs->zs_flags |= ZS_CLOSED;
   1152 		while (za->za_soft_active || za->za_kick_active)
   1153 			cv_wait(&zs->zs_flags_cv, zs->zs_excl);
   1154 	}
   1155 	if (zs->zs_suspended) {
   1156 		mutex_exit(zs->zs_excl);
   1157 		(void) ddi_dev_is_needed(zs->zs_dip, 0, 1);
   1158 		mutex_enter(zs->zs_excl);
   1159 	}
   1160 
   1161 	ZSA_FLUSHQ;
   1162 	bzero(za, sizeof (struct asyncline));
   1163 	qprocsoff(q);
   1164 	mutex_exit(zs->zs_excl);
   1165 
   1166 	/*
   1167 	 * Cancel outstanding "bufcall" request.
   1168 	 */
   1169 	if (za_wbufcid)
   1170 		unbufcall(za_wbufcid);
   1171 	if (za_bufcid)
   1172 		unbufcall(za_bufcid);
   1173 
   1174 	/*
   1175 	 * Cancel outstanding timeout.
   1176 	 */
   1177 	if (za_zsa_restart_id)
   1178 		(void) untimeout(za_zsa_restart_id);
   1179 
   1180 	if (za_kick_rcv_id)
   1181 		(void) untimeout(za_kick_rcv_id);
   1182 
   1183 	q->q_ptr = WR(q)->q_ptr = NULL;
   1184 	zsopinit(zs, &zsops_null);
   1185 	cv_broadcast(&zs->zs_flags_cv);
   1186 
   1187 	/* Mark device as available for power management */
   1188 	(void) pm_idle_component(zs->zs_dip, zs->zs_unit%2+1);
   1189 	return (0);
   1190 }
   1191 
   1192 /*
   1193  * Put procedure for write queue.
   1194  * Respond to M_STOP, M_START, M_IOCTL, and M_FLUSH messages here;
   1195  * set the flow control character for M_STOPI and M_STARTI messages;
   1196  * queue up M_BREAK, M_DELAY, and M_DATA messages for processing
   1197  * by the start routine, and then call the start routine; discard
   1198  * everything else. Note that this driver does not incorporate any
   1199  * mechanism to negotiate to handle the canonicalization process.
   1200  * It expects that these functions are handled in upper module(s),
   1201  * as we do in ldterm.
   1202  */
   1203 static void
   1204 zsa_wput(queue_t *q, mblk_t *mp)
   1205 {
   1206 	register struct asyncline	*za;
   1207 	register struct zscom		*zs;
   1208 	register struct copyresp	*resp;
   1209 	register mblk_t			*bp = NULL;
   1210 	int				error;
   1211 	struct iocblk			*iocp;
   1212 
   1213 	za = (struct asyncline *)q->q_ptr;
   1214 	zs = za->za_common;
   1215 	if (zs->zs_flags & ZS_NEEDSOFT) {
   1216 		zs->zs_flags &= ~ZS_NEEDSOFT;
   1217 		(void) zsa_softint(zs);
   1218 	}
   1219 
   1220 	switch (mp->b_datap->db_type) {
   1221 
   1222 	case M_STOP:
   1223 		/*
   1224 		 * Since we don't do real DMA, we can just let the
   1225 		 * chip coast to a stop after applying the brakes.
   1226 		 */
   1227 		mutex_enter(zs->zs_excl);
   1228 		mutex_enter(zs->zs_excl_hi);
   1229 		za->za_flags |= ZAS_STOPPED;
   1230 		if ((zs->zs_wr_cur) != NULL) {
   1231 			za->za_flags &= ~ZAS_BUSY;
   1232 			za->za_rcv_flags_mask &= ~DO_RETRANSMIT;
   1233 			bp = za->za_xmitblk;
   1234 			bp->b_rptr = zs->zs_wr_cur;
   1235 			zs->zs_wr_cur = NULL;
   1236 			zs->zs_wr_lim = NULL;
   1237 			za->za_xmitblk = NULL;
   1238 		}
   1239 		mutex_exit(zs->zs_excl_hi);
   1240 		if (bp)
   1241 			(void) putbq(q, bp);
   1242 		freemsg(mp);
   1243 		mutex_exit(zs->zs_excl);
   1244 		break;
   1245 
   1246 	case M_START:
   1247 		mutex_enter(zs->zs_excl);
   1248 		if (za->za_flags & ZAS_STOPPED) {
   1249 			za->za_flags &= ~ZAS_STOPPED;
   1250 			/*
   1251 			 * If an output operation is in progress,
   1252 			 * resume it. Otherwise, prod the start
   1253 			 * routine.
   1254 			 */
   1255 			zsa_start(zs);
   1256 		}
   1257 		freemsg(mp);
   1258 		mutex_exit(zs->zs_excl);
   1259 		break;
   1260 
   1261 	case M_IOCTL:
   1262 		mutex_enter(zs->zs_excl);
   1263 		iocp = (struct iocblk *)mp->b_rptr;
   1264 
   1265 		switch (iocp->ioc_cmd) {
   1266 
   1267 		case TIOCGPPS:
   1268 			/*
   1269 			 * Get PPS state.
   1270 			 */
   1271 			if (mp->b_cont != NULL)
   1272 				freemsg(mp->b_cont);
   1273 
   1274 			mp->b_cont = allocb(sizeof (int), BPRI_HI);
   1275 			if (mp->b_cont == NULL) {
   1276 				mp->b_datap->db_type = M_IOCNAK;
   1277 				iocp->ioc_error = ENOMEM;
   1278 				ZSA_QREPLY(q, mp);
   1279 				break;
   1280 			}
   1281 			if (za->za_pps)
   1282 				*(int *)mp->b_cont->b_wptr = 1;
   1283 			else
   1284 				*(int *)mp->b_cont->b_wptr = 0;
   1285 			mp->b_cont->b_wptr += sizeof (int);
   1286 			mp->b_datap->db_type = M_IOCACK;
   1287 			iocp->ioc_count = sizeof (int);
   1288 			ZSA_QREPLY(q, mp);
   1289 			break;
   1290 
   1291 		case TIOCSPPS:
   1292 			/*
   1293 			 * Set PPS state.
   1294 			 */
   1295 			error = miocpullup(mp, sizeof (int));
   1296 			if (error != 0) {
   1297 				mp->b_datap->db_type = M_IOCNAK;
   1298 				iocp->ioc_error = error;
   1299 				ZSA_QREPLY(q, mp);
   1300 				break;
   1301 			}
   1302 
   1303 			za->za_pps = (*(int *)mp->b_cont->b_rptr != 0);
   1304 			mp->b_datap->db_type = M_IOCACK;
   1305 			ZSA_QREPLY(q, mp);
   1306 			break;
   1307 
   1308 		case TIOCGPPSEV:
   1309 		{
   1310 			/*
   1311 			 * Get PPS event data.
   1312 			 */
   1313 			void *buf;
   1314 #ifdef _SYSCALL32_IMPL
   1315 			struct ppsclockev32 p32;
   1316 #endif
   1317 
   1318 			if (mp->b_cont != NULL) {
   1319 				freemsg(mp->b_cont);
   1320 				mp->b_cont = NULL;
   1321 			}
   1322 			if (za->za_pps == NULL) {
   1323 				mp->b_datap->db_type = M_IOCNAK;
   1324 				iocp->ioc_error = ENXIO;
   1325 				ZSA_QREPLY(q, mp);
   1326 				break;
   1327 			}
   1328 
   1329 #ifdef _SYSCALL32_IMPL
   1330 			if ((iocp->ioc_flag & IOC_MODELS) != IOC_NATIVE) {
   1331 				TIMEVAL_TO_TIMEVAL32(&p32.tv, &ppsclockev.tv);
   1332 				p32.serial = ppsclockev.serial;
   1333 				buf = &p32;
   1334 				iocp->ioc_count = sizeof (struct ppsclockev32);
   1335 			} else
   1336 #endif
   1337 			{
   1338 				buf = &ppsclockev;
   1339 				iocp->ioc_count = sizeof (struct ppsclockev);
   1340 			}
   1341 
   1342 			if ((bp = allocb(iocp->ioc_count, BPRI_HI)) == NULL) {
   1343 				mp->b_datap->db_type = M_IOCNAK;
   1344 				iocp->ioc_error = ENOMEM;
   1345 				ZSA_QREPLY(q, mp);
   1346 				break;
   1347 			}
   1348 			mp->b_cont = bp;
   1349 
   1350 			bcopy(buf, bp->b_wptr, iocp->ioc_count);
   1351 			bp->b_wptr += iocp->ioc_count;
   1352 			mp->b_datap->db_type = M_IOCACK;
   1353 			ZSA_QREPLY(q, mp);
   1354 			break;
   1355 		}
   1356 
   1357 		case TCSETSW:
   1358 		case TCSETSF:
   1359 		case TCSETAW:
   1360 		case TCSETAF:
   1361 		case TCSBRK:
   1362 			/*
   1363 			 * The changes do not take effect until all
   1364 			 * output queued before them is drained.
   1365 			 * Put this message on the queue, so that
   1366 			 * "zsa_start" will see it when it's done
   1367 			 * with the output before it. Poke the
   1368 			 * start routine, just in case.
   1369 			 */
   1370 			(void) putq(q, mp);
   1371 			zsa_start(zs);
   1372 			break;
   1373 
   1374 		default:
   1375 			/*
   1376 			 * Do it now.
   1377 			 */
   1378 			zsa_ioctl(za, q, mp);
   1379 			break;
   1380 		}
   1381 		mutex_exit(zs->zs_excl);
   1382 		break;
   1383 
   1384 
   1385 	case M_IOCDATA:
   1386 
   1387 		mutex_enter(zs->zs_excl);
   1388 		resp = (struct copyresp *)mp->b_rptr;
   1389 		if (resp->cp_rval) {
   1390 			/*
   1391 			 * Just free message on failure.
   1392 			 */
   1393 			freemsg(mp);
   1394 			mutex_exit(zs->zs_excl);
   1395 			break;
   1396 		}
   1397 		switch (resp->cp_cmd) {
   1398 
   1399 		case TIOCMSET:
   1400 			mutex_enter(zs->zs_excl_hi);
   1401 			(void) zsmctl(zs, dmtozs(*(int *)mp->b_cont->b_rptr),
   1402 			    DMSET);
   1403 			mutex_exit(zs->zs_excl_hi);
   1404 			mioc2ack(mp, NULL, 0, 0);
   1405 			ZSA_QREPLY(q, mp);
   1406 			break;
   1407 
   1408 		case TIOCMBIS:
   1409 			mutex_enter(zs->zs_excl_hi);
   1410 			(void) zsmctl(zs, dmtozs(*(int *)mp->b_cont->b_rptr),
   1411 			    DMBIS);
   1412 			mutex_exit(zs->zs_excl_hi);
   1413 			mioc2ack(mp, NULL, 0, 0);
   1414 			ZSA_QREPLY(q, mp);
   1415 			break;
   1416 
   1417 		case TIOCMBIC:
   1418 			mutex_enter(zs->zs_excl_hi);
   1419 			(void) zsmctl(zs, dmtozs(*(int *)mp->b_cont->b_rptr),
   1420 			    DMBIC);
   1421 			mutex_exit(zs->zs_excl_hi);
   1422 			mioc2ack(mp, NULL, 0, 0);
   1423 			ZSA_QREPLY(q, mp);
   1424 			break;
   1425 
   1426 		case TIOCMGET:
   1427 			mioc2ack(mp, NULL, 0, 0);
   1428 			ZSA_QREPLY(q, mp);
   1429 			break;
   1430 
   1431 		default:
   1432 			freemsg(mp);
   1433 
   1434 		}
   1435 		mutex_exit(zs->zs_excl);
   1436 		break;
   1437 
   1438 
   1439 	case M_FLUSH:
   1440 		mutex_enter(zs->zs_excl);
   1441 		if (*mp->b_rptr & FLUSHW) {
   1442 
   1443 			/*
   1444 			 * Abort any output in progress.
   1445 			 */
   1446 			if (za->za_flags & ZAS_BUSY) {
   1447 				za->za_flags &= ~ZAS_BUSY;
   1448 				mutex_enter(zs->zs_excl_hi);
   1449 				za->za_rcv_flags_mask &= ~DO_RETRANSMIT;
   1450 				zs->zs_wr_cur = NULL;
   1451 				zs->zs_wr_lim = NULL;
   1452 				bp = za->za_xmitblk;
   1453 				za->za_xmitblk = NULL;
   1454 				mutex_exit(zs->zs_excl_hi);
   1455 				if (bp)
   1456 					freemsg(bp);
   1457 			}
   1458 			/*
   1459 			 * Flush our write queue.
   1460 			 */
   1461 			flushq(q, FLUSHDATA);	/* XXX doesn't flush M_DELAY */
   1462 			*mp->b_rptr &= ~FLUSHW;	/* it has been flushed */
   1463 		}
   1464 		if (*mp->b_rptr & FLUSHR) {
   1465 			/*
   1466 			 * Flush any data in the temporary receive buffer
   1467 			 */
   1468 			mutex_enter(zs->zs_excl_hi);
   1469 			if ((za->za_ttycommon.t_flags & TS_SOFTCAR) ||
   1470 			    (SCC_READ0() & ZSRR0_CD)) {
   1471 				ZSA_KICK_RCV;
   1472 			} else {
   1473 				ZSA_KICK_RCV;
   1474 				if (!(SCC_READ0() & ZSRR0_RX_READY)) {
   1475 					/*
   1476 					 * settle time for 1 character shift
   1477 					 */
   1478 					mutex_exit(zs->zs_excl_hi);
   1479 					mutex_exit(zs->zs_excl);
   1480 					delay(ztdelay(SPEED(
   1481 					    za->za_ttycommon.t_cflag))/3 + 1);
   1482 					mutex_enter(zs->zs_excl);
   1483 					mutex_enter(zs->zs_excl_hi);
   1484 					if (!(SCC_READ0() & ZSRR0_CD))
   1485 						ZSA_KICK_RCV;
   1486 				}
   1487 				while ((SCC_READ0() &
   1488 				    (ZSRR0_CD | ZSRR0_RX_READY)) ==
   1489 				    ZSRR0_RX_READY) {
   1490 					/*
   1491 					 * Empty Receiver
   1492 					 */
   1493 					(void) SCC_READDATA();
   1494 				}
   1495 			}
   1496 			mutex_exit(zs->zs_excl_hi);
   1497 			flushq(RD(q), FLUSHDATA);
   1498 			ZSA_QREPLY(q, mp);
   1499 			/*
   1500 			 * give the read queues a crack at it
   1501 			 */
   1502 		} else
   1503 			freemsg(mp);
   1504 
   1505 		/*
   1506 		 * We must make sure we process messages that survive the
   1507 		 * write-side flush. Without this call, the close protocol
   1508 		 * with ldterm can hang forever.  (ldterm will have sent us a
   1509 		 * TCSBRK ioctl that it expects a response to.)
   1510 		 */
   1511 		zsa_start(zs);
   1512 		mutex_exit(zs->zs_excl);
   1513 		break;
   1514 
   1515 	case M_BREAK:
   1516 	case M_DELAY:
   1517 	case M_DATA:
   1518 		mutex_enter(zs->zs_excl);
   1519 		/*
   1520 		 * Queue the message up to be transmitted,
   1521 		 * and poke the start routine.
   1522 		 */
   1523 		(void) putq(q, mp);
   1524 		zsa_start(zs);
   1525 		mutex_exit(zs->zs_excl);
   1526 		break;
   1527 
   1528 	case M_STOPI:
   1529 		mutex_enter(zs->zs_excl);
   1530 		mutex_enter(zs->zs_excl_hi);
   1531 		za->za_flowc = za->za_ttycommon.t_stopc;
   1532 		if ((zs->zs_wr_cur) != NULL) {
   1533 			za->za_rcv_flags_mask &= ~DO_RETRANSMIT;
   1534 			bp = za->za_xmitblk;
   1535 			bp->b_rptr = zs->zs_wr_cur;
   1536 			zs->zs_wr_cur = NULL;
   1537 			zs->zs_wr_lim = NULL;
   1538 			za->za_xmitblk = NULL;
   1539 		}
   1540 		mutex_exit(zs->zs_excl_hi);
   1541 		if (bp)
   1542 			(void) putbq(q, bp);
   1543 		else
   1544 			zsa_start(zs);		/* poke the start routine */
   1545 		freemsg(mp);
   1546 		mutex_exit(zs->zs_excl);
   1547 		break;
   1548 
   1549 	case M_STARTI:
   1550 		mutex_enter(zs->zs_excl);
   1551 		mutex_enter(zs->zs_excl_hi);
   1552 		za->za_flowc = za->za_ttycommon.t_startc;
   1553 		if ((zs->zs_wr_cur) != NULL) {
   1554 			za->za_rcv_flags_mask &= ~DO_RETRANSMIT;
   1555 			bp = za->za_xmitblk;
   1556 			bp->b_rptr = zs->zs_wr_cur;
   1557 			zs->zs_wr_cur = NULL;
   1558 			zs->zs_wr_lim = NULL;
   1559 			za->za_xmitblk = NULL;
   1560 		}
   1561 		mutex_exit(zs->zs_excl_hi);
   1562 		if (bp)
   1563 			(void) putbq(q, bp);
   1564 		else
   1565 			zsa_start(zs);		/* poke the start routine */
   1566 		freemsg(mp);
   1567 		mutex_exit(zs->zs_excl);
   1568 		break;
   1569 
   1570 	case M_CTL:
   1571 		if (MBLKL(mp) >= sizeof (struct iocblk) &&
   1572 		    ((struct iocblk *)mp->b_rptr)->ioc_cmd == MC_POSIXQUERY) {
   1573 			((struct iocblk *)mp->b_rptr)->ioc_cmd = MC_HAS_POSIX;
   1574 			qreply(q, mp);
   1575 		} else {
   1576 			/*
   1577 			 * These MC_SERVICE type messages are used by upper
   1578 			 * modules to tell this driver to send input up
   1579 			 * immediately, or that it can wait for normal
   1580 			 * processing that may or may not be done. Sun
   1581 			 * requires these for the mouse module.
   1582 			 */
   1583 			mutex_enter(zs->zs_excl);
   1584 			switch (*mp->b_rptr) {
   1585 
   1586 			case MC_SERVICEIMM:
   1587 				mutex_enter(zs->zs_excl_hi);
   1588 				za->za_flags |= ZAS_SERVICEIMM;
   1589 				mutex_exit(zs->zs_excl_hi);
   1590 				break;
   1591 
   1592 			case MC_SERVICEDEF:
   1593 				mutex_enter(zs->zs_excl_hi);
   1594 				za->za_flags &= ~ZAS_SERVICEIMM;
   1595 				mutex_exit(zs->zs_excl_hi);
   1596 				break;
   1597 			}
   1598 			freemsg(mp);
   1599 			mutex_exit(zs->zs_excl);
   1600 		}
   1601 		break;
   1602 
   1603 	default:
   1604 		/*
   1605 		 * "No, I don't want a subscription to Chain Store Age,
   1606 		 * thank you anyway."
   1607 		 */
   1608 		freemsg(mp);
   1609 		break;
   1610 	}
   1611 }
   1612 
   1613 /*
   1614  * zs read service procedure
   1615  */
   1616 static void
   1617 zsa_rsrv(queue_t *q)
   1618 {
   1619 	struct asyncline	*za;
   1620 	struct zscom		*zs;
   1621 
   1622 	if (((za = (struct asyncline *)q->q_ptr) != NULL) &&
   1623 	    (za->za_ttycommon.t_cflag & CRTSXOFF)) {
   1624 		zs = za->za_common;
   1625 		mutex_enter(zs->zs_excl_hi);
   1626 		ZSSETSOFT(zs);
   1627 		mutex_exit(zs->zs_excl_hi);
   1628 	}
   1629 }
   1630 
   1631 /*
   1632  * Transmitter interrupt service routine.
   1633  * If there's more data to transmit in the current pseudo-DMA block,
   1634  * and the transmitter is ready, send the next character if output
   1635  * is not stopped or draining.
   1636  * Otherwise, queue up a soft interrupt.
   1637  */
   1638 static void
   1639 zsa_txint(struct zscom *zs)
   1640 {
   1641 	register struct asyncline *za = (struct asyncline *)&zs->zs_priv_str;
   1642 	register uchar_t *wr_cur;
   1643 	register uchar_t s0;
   1644 
   1645 	s0 = SCC_READ0();
   1646 
   1647 	if ((wr_cur = zs->zs_wr_cur) != NULL) {
   1648 		if (wr_cur < zs->zs_wr_lim) {
   1649 			if ((za->za_ttycommon.t_cflag & CRTSCTS) &&
   1650 			    !(s0 & ZSRR0_CTS)) {
   1651 				SCC_WRITE0(ZSWR0_RESET_TXINT);
   1652 				za->za_rcv_flags_mask |= DO_RETRANSMIT;
   1653 				return;
   1654 			}
   1655 			SCC_WRITEDATA(*wr_cur++);
   1656 #ifdef ZSA_DEBUG
   1657 			za->za_wr++;
   1658 #endif
   1659 			zs->zs_wr_cur = wr_cur;
   1660 			zs->zs_flags |= ZS_PROGRESS;
   1661 			return;
   1662 		} else {
   1663 			zs->zs_wr_cur = NULL;
   1664 			zs->zs_wr_lim = NULL;
   1665 			/*
   1666 			 * Use the rcv_flags_mask as it is set and
   1667 			 * test while holding the zs_excl_hi mutex
   1668 			 */
   1669 			za->za_rcv_flags_mask |= DO_TRANSMIT;
   1670 			SCC_WRITE0(ZSWR0_RESET_TXINT);
   1671 			ZSSETSOFT(zs);
   1672 			return;
   1673 		}
   1674 	}
   1675 
   1676 	if (za->za_flowc != '\0' && (!(za->za_flags & ZAS_DRAINING))) {
   1677 		if ((za->za_ttycommon.t_cflag & CRTSCTS) &&
   1678 		    !(s0 & ZSRR0_CTS)) {
   1679 			SCC_WRITE0(ZSWR0_RESET_TXINT);
   1680 			return;
   1681 		}
   1682 		SCC_WRITEDATA(za->za_flowc);
   1683 		za->za_flowc = '\0';
   1684 		return;
   1685 	}
   1686 	SCC_WRITE0(ZSWR0_RESET_TXINT);
   1687 	/*
   1688 	 * Set DO_TRANSMIT bit so that the soft interrupt can
   1689 	 * test it and unset the ZAS_BUSY in za_flags while holding
   1690 	 * the mutex zs_excl and zs_excl_hi
   1691 	 */
   1692 	za->za_rcv_flags_mask |= DO_TRANSMIT;
   1693 	ZSSETSOFT(zs);
   1694 }
   1695 
   1696 /*
   1697  * External/Status interrupt.
   1698  */
   1699 static void
   1700 zsa_xsint(struct zscom *zs)
   1701 {
   1702 	register struct asyncline *za = (struct asyncline *)&zs->zs_priv_str;
   1703 	register uchar_t s0, x0;
   1704 
   1705 	s0 = SCC_READ0();
   1706 	ZSA_R0_LOG(s0);
   1707 	x0 = s0 ^ za->za_rr0;
   1708 	za->za_rr0 = s0;
   1709 	SCC_WRITE0(ZSWR0_RESET_STATUS);
   1710 
   1711 	/*
   1712 	 * PPS (Pulse Per Second) support.
   1713 	 */
   1714 	if (za->za_pps && (x0 & ZSRR0_CD) && (s0 & ZSRR0_CD)) {
   1715 		/*
   1716 		 * This code captures a timestamp at the designated
   1717 		 * transition of the PPS signal (CD asserted).  The
   1718 		 * code provides a pointer to the timestamp, as well
   1719 		 * as the hardware counter value at the capture.
   1720 		 *
   1721 		 * Note: the kernel has nano based time values while
   1722 		 * NTP requires micro based, an in-line fast algorithm
   1723 		 * to convert nsec to usec is used here -- see hrt2ts()
   1724 		 * in common/os/timers.c for a full description.
   1725 		 */
   1726 		struct timeval *tvp = &ppsclockev.tv;
   1727 		timespec_t ts;
   1728 		int nsec, usec;
   1729 
   1730 		LED_OFF;
   1731 		gethrestime(&ts);
   1732 		LED_ON;
   1733 		nsec = ts.tv_nsec;
   1734 		usec = nsec + (nsec >> 2);
   1735 		usec = nsec + (usec >> 1);
   1736 		usec = nsec + (usec >> 2);
   1737 		usec = nsec + (usec >> 4);
   1738 		usec = nsec - (usec >> 3);
   1739 		usec = nsec + (usec >> 2);
   1740 		usec = nsec + (usec >> 3);
   1741 		usec = nsec + (usec >> 4);
   1742 		usec = nsec + (usec >> 1);
   1743 		usec = nsec + (usec >> 6);
   1744 		tvp->tv_usec = usec >> 10;
   1745 		tvp->tv_sec = ts.tv_sec;
   1746 
   1747 		++ppsclockev.serial;
   1748 
   1749 		/*
   1750 		 * Because the kernel keeps a high-resolution time, pass the
   1751 		 * current highres timestamp in tvp and zero in usec.
   1752 		 */
   1753 		ddi_hardpps(tvp, 0);
   1754 	}
   1755 
   1756 	ZSA_KICK_RCV;
   1757 
   1758 	if ((x0 & ZSRR0_BREAK) && (s0 & ZSRR0_BREAK) == 0) {
   1759 #ifdef SLAVIO_BUG
   1760 		/*
   1761 		 * ZSRR0_BREAK turned off.  This means that the break sequence
   1762 		 * has completed (i.e., the stop bit finally arrived).
   1763 		 */
   1764 		if ((s0 & ZSRR0_RX_READY) == 0) {
   1765 			/*
   1766 			 * SLAVIO will generate a separate STATUS change
   1767 			 * interrupt when the break sequence completes.
   1768 			 * SCC will combine both, taking the higher priority
   1769 			 * one, the receive.  Should still see the ext/stat.
   1770 			 * bit in REG3 on SCC.  If no ext/stat, it must be
   1771 			 * a SLAVIO.
   1772 			 */
   1773 			za->za_breakoff = 1;
   1774 		} else {
   1775 			/*
   1776 			 * The NUL character in the receiver is part of the
   1777 			 * break sequence; it is discarded.
   1778 			 */
   1779 			(void) SCC_READDATA(); /* swallow null */
   1780 		}
   1781 #else /* SLAVIO_BUG */
   1782 		/*
   1783 		 * ZSRR0_BREAK turned off.  This means that the break sequence
   1784 		 * has completed (i.e., the stop bit finally arrived).  The NUL
   1785 		 * character in the receiver is part of the break sequence;
   1786 		 * it is discarded.
   1787 		 */
   1788 		(void) SCC_READDATA(); /* swallow null */
   1789 #endif /* SLAVIO_BUG */
   1790 		SCC_WRITE0(ZSWR0_RESET_ERRORS);
   1791 
   1792 		/*
   1793 		 * Note: this will cause an abort if a break occurs on
   1794 		 * the "keyboard device", regardless of whether the
   1795 		 * "keyboard device" is a real keyboard or just a
   1796 		 * terminal on a serial line. This permits you to
   1797 		 * abort a workstation by unplugging the keyboard,
   1798 		 * even if the normal abort key sequence isn't working.
   1799 		 */
   1800 		if ((za->za_dev == kbddev) ||
   1801 		    ((za->za_dev == rconsdev) || (za->za_dev == stdindev)) &&
   1802 		    (abort_enable != KIOCABORTALTERNATE)) {
   1803 			abort_sequence_enter((char *)NULL);
   1804 			/*
   1805 			 * We just broke into the monitor or debugger,
   1806 			 * ignore the break in this case so whatever
   1807 			 * random program that was running doesn't get
   1808 			 * a SIGINT.
   1809 			 */
   1810 			return;
   1811 		}
   1812 		za->za_break = 1;
   1813 	}
   1814 
   1815 	/*
   1816 	 * If hardware flow control is enabled, (re)start output
   1817 	 * when CTS is reasserted.
   1818 	 */
   1819 	if ((za->za_ttycommon.t_cflag & CRTSCTS) &&
   1820 	    (x0 & ZSRR0_CTS) && (s0 & ZSRR0_CTS) &&
   1821 	    (za->za_rcv_flags_mask & DO_RETRANSMIT))
   1822 			za->za_rcv_flags_mask |= DO_TRANSMIT;
   1823 
   1824 	za->za_ext = 1;
   1825 	ZSSETSOFT(zs);
   1826 }
   1827 
   1828 /*
   1829  * Receive Interrupt
   1830  */
   1831 static void
   1832 zsa_rxint(struct zscom *zs)
   1833 {
   1834 	register struct asyncline *za = (struct asyncline *)&zs->zs_priv_str;
   1835 	register uchar_t c;
   1836 	register uchar_t *rd_cur = zs->zs_rd_cur;
   1837 	register uchar_t *rd_lim = zs->zs_rd_lim;
   1838 	register mblk_t	*bp;
   1839 	register uint_t	fm = za->za_rcv_flags_mask;
   1840 
   1841 
   1842 #ifdef ZSA_DEBUG
   1843 	za->za_rd++;
   1844 #endif
   1845 	c = (fm >> 16) & (SCC_READDATA());
   1846 
   1847 	/*
   1848 	 * Check for character break sequence
   1849 	 */
   1850 	if ((abort_enable == KIOCABORTALTERNATE) && (za->za_dev == rconsdev)) {
   1851 		if (abort_charseq_recognize(c))
   1852 			abort_sequence_enter((char *)NULL);
   1853 	}
   1854 
   1855 	if (!rd_cur) {
   1856 #ifdef SLAVIO_BUG
   1857 		/*
   1858 		 * SLAVIO generates FE for the start of break and
   1859 		 * during break when parity is set.  End of break is
   1860 		 * detected when the first character is received.
   1861 		 * This character is always garbage and is thrown away.
   1862 		 */
   1863 		if (za->za_slav_break) {
   1864 			za->za_slav_break = 0;
   1865 			za->za_rr0 |= ZSRR0_BREAK;
   1866 			zsa_xsint(zs);
   1867 			return;
   1868 		}
   1869 #endif /* SLAVIO_BUG */
   1870 
   1871 		if (c == 0 && (za->za_rr0 & ZSRR0_BREAK)) {
   1872 			/*
   1873 			 * A break sequence was under way, and a NUL character
   1874 			 * was received. Discard the NUL character, as it is
   1875 			 * part of the break sequence; if ZSRR0_BREAK turned
   1876 			 * off, indicating that the break sequence has com-
   1877 			 * pleted, call "zsa_xsint" to properly handle the
   1878 			 * error. It would appear that External/Status
   1879 			 * interrupts get lost occasionally, so this ensures
   1880 			 * that one is delivered.
   1881 			 */
   1882 			c = SCC_READ0();
   1883 			if (!(c & ZSRR0_BREAK))
   1884 				zsa_xsint(zs);
   1885 			return;
   1886 		}
   1887 
   1888 #ifdef SLAVIO_BUG
   1889 		if (c == 0 && za->za_breakoff) {
   1890 			/*
   1891 			 * A break sequence completed, but SLAVIO generates
   1892 			 * the NULL character interrupt late, so we throw the
   1893 			 * NULL away now.
   1894 			 */
   1895 			return;
   1896 		}
   1897 
   1898 		/*
   1899 		 * make sure it gets cleared.
   1900 		 */
   1901 		za->za_breakoff = 0;
   1902 #endif /* SLAVIO_BUG */
   1903 
   1904 		ZSA_KICK_RCV;	/* We can have M_BREAK msg */
   1905 		ZSA_ALLOCB(bp);
   1906 		if (!bp) {
   1907 			za->za_sw_overrun++;
   1908 			ZSSETSOFT(zs);
   1909 			return;
   1910 		}
   1911 		za->za_rcvblk = bp;
   1912 		zs->zs_rd_cur = rd_cur = bp->b_wptr;
   1913 		zs->zs_rd_lim = rd_lim = bp->b_datap->db_lim;
   1914 		if (za->za_kick_rcv_id == 0)
   1915 			ZSSETSOFT(zs);
   1916 	}
   1917 	if (c == 0377 && (fm & DO_ESC)) {
   1918 		if (rd_lim < rd_cur + 2) {
   1919 			ZSA_ALLOCB(bp);
   1920 			ZSA_KICK_RCV;
   1921 			if (!bp) {
   1922 				za->za_sw_overrun++;
   1923 				return;
   1924 			}
   1925 			za->za_rcvblk = bp;
   1926 			zs->zs_rd_cur = rd_cur = bp->b_wptr;
   1927 			zs->zs_rd_lim = rd_lim = bp->b_datap->db_lim;
   1928 		}
   1929 		*rd_cur++ = c;
   1930 	}
   1931 
   1932 
   1933 	*rd_cur++ = c;
   1934 	zs->zs_rd_cur = rd_cur;
   1935 
   1936 	if (rd_cur == rd_lim) {
   1937 		ZSA_KICK_RCV;
   1938 	} else if ((fm & DO_STOPC) && (c == (fm & 0xff))) {
   1939 		za->za_do_kick_rcv_in_softint = 1;
   1940 		ZSSETSOFT(zs);
   1941 	}
   1942 
   1943 	if ((za->za_flags & ZAS_SERVICEIMM) || g_nocluster) {
   1944 		/*
   1945 		 * Send the data up immediately
   1946 		 */
   1947 		ZSA_KICK_RCV;
   1948 	}
   1949 }
   1950 
   1951 /*
   1952  * Special receive condition interrupt handler.
   1953  */
   1954 static void
   1955 zsa_srint(struct zscom *zs)
   1956 {
   1957 	register struct asyncline *za = (struct asyncline *)&zs->zs_priv_str;
   1958 	register short s1;
   1959 	register uchar_t c;
   1960 	register uchar_t c1;
   1961 	register mblk_t *bp = za->za_rcvblk;
   1962 	register uchar_t *rd_cur = zs->zs_rd_cur;
   1963 
   1964 	SCC_READ(1, s1);
   1965 	if (s1 & (ZSRR1_FE | ZSRR1_PE | ZSRR1_DO)) {
   1966 		c = SCC_READDATA();	/* swallow bad character */
   1967 	}
   1968 #ifdef SLAVIO_BUG
   1969 	/*
   1970 	 * SLAVIO does not handle breaks properly when parity is enabled.
   1971 	 *
   1972 	 * In general, if a null character is received when a framing
   1973 	 * error occurs then it is a break condition and not a real
   1974 	 * framing error. The null character must be limited to the
   1975 	 * number of bits including the parity bit. For example, a 6
   1976 	 * bit character with parity would be null if the lower 7 bits
   1977 	 * read from the receive fifo were 0. (The higher order bits are
   1978 	 * padded with 1 and/or the stop bits.) The only exception to this
   1979 	 * general rule would be an 8 bit null character with parity being
   1980 	 * a 1 in the parity bit and a framing error. This exception
   1981 	 * can be determined by examining the parity error bit in RREG 1.
   1982 	 *
   1983 	 * A null character, even parity, 8 bits, no parity error,
   1984 	 * (0 0000 0000) with framing error is a break condition.
   1985 	 *
   1986 	 * A null character, even parity, 8 bits, parity error,
   1987 	 * (1 0000 0000) with framing error is a framing error.
   1988 	 *
   1989 	 * A null character, odd parity, 8 bits, parity error
   1990 	 * (0 0000 0000) with framing error is a break condition.
   1991 	 *
   1992 	 * A null character, odd parity, 8 bits, no parity error,
   1993 	 * (1 0000 0000) with framing error is a framing error.
   1994 	 */
   1995 	if (za->za_ttycommon.t_cflag & PARENB) {
   1996 		switch (za->za_ttycommon.t_cflag & CSIZE) {
   1997 
   1998 		case CS5:
   1999 			c1 = c & 0x3f;
   2000 			break;
   2001 
   2002 		case CS6:
   2003 			c1 = c & 0x7f;
   2004 			break;
   2005 
   2006 		case CS7:
   2007 			c1 = c & 0xff;
   2008 			break;
   2009 
   2010 		case CS8:
   2011 			if ((za->za_ttycommon.t_cflag & PARODD) &&
   2012 			    !(s1 & ZSRR1_PE))
   2013 				c1 = 0xff;
   2014 			else if (!(za->za_ttycommon.t_cflag & PARODD) &&
   2015 			    (s1 & ZSRR1_PE))
   2016 				c1 = 0xff;
   2017 			else
   2018 				c1 = c;
   2019 			break;
   2020 		}
   2021 
   2022 		/*
   2023 		 * We fake start of break condition.
   2024 		 */
   2025 		if ((s1 & ZSRR1_FE) && c1 == 0) {
   2026 			za->za_slav_break = 1;
   2027 			return;
   2028 		}
   2029 	}
   2030 #endif /* SLAVIO_BUG */
   2031 
   2032 	if (s1 & ZSRR1_PE) {
   2033 
   2034 		/*
   2035 		 * Mark the parity error so zsa_process will
   2036 		 * notice it and send it up in an M_BREAK
   2037 		 * message; ldterm will do the actual parity error
   2038 		 * processing
   2039 		 */
   2040 
   2041 		if (bp && zs->zs_rd_cur) {	/* M_DATA msg */
   2042 			ZSA_KICK_RCV;
   2043 			bp = NULL;
   2044 		}
   2045 		if (!bp)
   2046 			ZSA_ALLOCB(bp);
   2047 		if (!bp) {
   2048 			za->za_sw_overrun++;
   2049 			ZSSETSOFT(zs);
   2050 		} else {
   2051 			za->za_rcvblk = bp;
   2052 			zs->zs_rd_cur = rd_cur = bp->b_wptr;
   2053 			zs->zs_rd_lim = bp->b_datap->db_lim;
   2054 			*rd_cur++ = c;
   2055 			zs->zs_rd_cur = rd_cur;
   2056 			bp->b_datap->db_type = M_BREAK;
   2057 			if (bp->b_datap->db_lim <= rd_cur)
   2058 				ZSA_KICK_RCV;
   2059 			za->za_do_kick_rcv_in_softint = 1;
   2060 			ZSSETSOFT(zs);
   2061 
   2062 		}
   2063 	}
   2064 	SCC_WRITE0(ZSWR0_RESET_ERRORS);
   2065 	if (s1 & ZSRR1_DO) {
   2066 		za->za_hw_overrun++;
   2067 		ZSSETSOFT(zs);
   2068 	}
   2069 }
   2070 
   2071 /*
   2072  * Process software interrupts (or poll)
   2073  * Crucial points:
   2074  * 3.	BUG - breaks are handled "out-of-band" - their relative position
   2075  *	among input events is lost, as well as multiple breaks together.
   2076  *	This is probably not a problem in practice.
   2077  */
   2078 static int
   2079 zsa_softint(struct zscom *zs)
   2080 {
   2081 	register struct asyncline *za = (struct asyncline *)&zs->zs_priv_str;
   2082 	register uchar_t r0;
   2083 	register uchar_t za_kick_active;
   2084 	register int	m_error;
   2085 	register int	allocbcount = 0;
   2086 	register int 	do_ttycommon_qfull = 0;
   2087 	boolean_t	hangup = B_FALSE, unhangup = B_FALSE;
   2088 	boolean_t	m_break = B_FALSE, wakeup = B_FALSE;
   2089 	register queue_t *q;
   2090 	register mblk_t	*bp;
   2091 	register mblk_t *head = NULL, *tail = NULL;
   2092 
   2093 	mutex_enter(zs->zs_excl);
   2094 	if (zs->zs_suspended || (zs->zs_flags & ZS_CLOSED)) {
   2095 		mutex_exit(zs->zs_excl);
   2096 		return (0);
   2097 	}
   2098 	q = za->za_ttycommon.t_readq;
   2099 	if (za->za_flags & ZAS_WOPEN && !q) {
   2100 		if (za->za_ext) {
   2101 			mutex_enter(zs->zs_excl_hi);
   2102 			r0 = SCC_READ0();
   2103 			za->za_ext = 0;
   2104 			mutex_exit(zs->zs_excl_hi);
   2105 			/*
   2106 			 * carrier up?
   2107 			 */
   2108 			if ((r0 & ZSRR0_CD) ||
   2109 			    (za->za_ttycommon.t_flags & TS_SOFTCAR)) {
   2110 				/*
   2111 				 * carrier present
   2112 				 */
   2113 				if ((za->za_flags & ZAS_CARR_ON) == 0) {
   2114 					za->za_flags |= ZAS_CARR_ON;
   2115 					mutex_exit(zs->zs_excl);
   2116 					cv_broadcast(&zs->zs_flags_cv);
   2117 					return (0);
   2118 				}
   2119 			}
   2120 		}
   2121 		mutex_exit(zs->zs_excl);
   2122 		return (0);
   2123 	}
   2124 	q = za->za_ttycommon.t_readq;
   2125 	if (!q) {
   2126 		mutex_exit(zs->zs_excl);
   2127 		return (0);
   2128 	}
   2129 
   2130 	m_error = za->za_m_error;
   2131 	za->za_m_error = 0;
   2132 
   2133 	if (za->za_do_kick_rcv_in_softint) {
   2134 		mutex_enter(zs->zs_excl_hi);
   2135 		ZSA_KICK_RCV;
   2136 		za->za_do_kick_rcv_in_softint = 0;
   2137 		mutex_exit(zs->zs_excl_hi);
   2138 	}
   2139 
   2140 	za_kick_active = za->za_kick_active;
   2141 
   2142 	while (!za_kick_active) {
   2143 		ZSA_SEEQ(bp);
   2144 		if (!bp)
   2145 			break;
   2146 
   2147 		allocbcount++;
   2148 
   2149 		if (bp->b_datap->db_type <= QPCTL) {
   2150 			if (!(canputnext(q))) {
   2151 				if (za->za_grace_flow_control >=
   2152 				    zsa_grace_flow_control) {
   2153 					if (za->za_ttycommon.t_cflag &
   2154 					    CRTSXOFF) {
   2155 						allocbcount--;
   2156 						break;
   2157 					}
   2158 					ZSA_GETQ(bp);
   2159 					freemsg(bp);
   2160 					do_ttycommon_qfull = 1;
   2161 					continue;
   2162 				} else
   2163 					za->za_grace_flow_control++;
   2164 			} else
   2165 				za->za_grace_flow_control = 0;
   2166 		}
   2167 		ZSA_GETQ(bp);
   2168 		if (!head) {
   2169 			head = bp;
   2170 		} else {
   2171 			if (!tail)
   2172 				tail = head;
   2173 			tail->b_next = bp;
   2174 			tail = bp;
   2175 		}
   2176 	}
   2177 
   2178 	if (allocbcount)
   2179 		ZSA_GETBLOCK(zs, allocbcount);
   2180 
   2181 	if (za->za_ext) {
   2182 		mutex_enter(zs->zs_excl_hi);
   2183 		r0 = SCC_READ0();
   2184 		za->za_ext = 0;
   2185 		/*
   2186 		 * carrier up?
   2187 		 */
   2188 		if ((r0 & ZSRR0_CD) ||
   2189 		    (za->za_ttycommon.t_flags & TS_SOFTCAR)) {
   2190 			/*
   2191 			 * carrier present
   2192 			 */
   2193 			if ((za->za_flags & ZAS_CARR_ON) == 0) {
   2194 				za->za_flags |= ZAS_CARR_ON;
   2195 				unhangup = B_TRUE;
   2196 				wakeup = B_TRUE;
   2197 			}
   2198 		} else {
   2199 			if ((za->za_flags & ZAS_CARR_ON) &&
   2200 			    !(za->za_ttycommon.t_cflag & CLOCAL)) {
   2201 				/*
   2202 				 * Carrier went away.
   2203 				 * Drop DTR, abort any output in progress,
   2204 				 * indicate that output is not stopped, and
   2205 				 * send a hangup notification upstream.
   2206 				 */
   2207 				(void) zsmctl(zs, ZSWR5_DTR, DMBIC);
   2208 				if ((za->za_flags & ZAS_BUSY) &&
   2209 				    (zs->zs_wr_cur != NULL)) {
   2210 					zs->zs_wr_cur = NULL;
   2211 					zs->zs_wr_lim = NULL;
   2212 				}
   2213 				hangup = B_TRUE;
   2214 				wakeup = B_TRUE;
   2215 				za->za_flags &= ~(ZAS_STOPPED | ZAS_CARR_ON |
   2216 				    ZAS_BUSY);
   2217 				za->za_rcv_flags_mask &= ~(DO_TRANSMIT |
   2218 				    DO_RETRANSMIT);
   2219 			}
   2220 		}
   2221 		mutex_exit(zs->zs_excl_hi);
   2222 		if (hangup && (bp = za->za_xmitblk) != NULL) {
   2223 			za->za_xmitblk = NULL;
   2224 			freeb(bp);
   2225 		}
   2226 	}
   2227 
   2228 	if (za->za_break != 0) {
   2229 		mutex_enter(zs->zs_excl_hi);
   2230 		r0 = SCC_READ0();
   2231 		mutex_exit(zs->zs_excl_hi);
   2232 		if ((r0 & ZSRR0_BREAK) == 0) {
   2233 			za->za_break = 0;
   2234 			m_break = B_TRUE;
   2235 		}
   2236 	}
   2237 
   2238 	/*
   2239 	 * If a transmission has finished, indicate that it's
   2240 	 * finished, and start that line up again.
   2241 	 */
   2242 
   2243 	mutex_enter(zs->zs_excl_hi);
   2244 	if (za->za_rcv_flags_mask & DO_TRANSMIT) {
   2245 		za->za_rcv_flags_mask &= ~DO_TRANSMIT;
   2246 		za->za_flags &= ~ZAS_BUSY;
   2247 
   2248 		if ((za->za_ttycommon.t_cflag & CRTSCTS) &&
   2249 		    (za->za_rcv_flags_mask & DO_RETRANSMIT) &&
   2250 		    zs->zs_wr_cur)
   2251 			bp = NULL;
   2252 		else {
   2253 			za->za_rcv_flags_mask &= ~DO_RETRANSMIT;
   2254 			bp = za->za_xmitblk;
   2255 			za->za_xmitblk = 0;
   2256 		}
   2257 		mutex_exit(zs->zs_excl_hi);
   2258 		if (bp)
   2259 			freemsg(bp);
   2260 		zsa_start(zs);
   2261 		/* if we didn't start anything, then notify waiters */
   2262 		if (!(za->za_flags & ZAS_BUSY))
   2263 			wakeup = B_TRUE;
   2264 	} else {
   2265 		mutex_exit(zs->zs_excl_hi);
   2266 	}
   2267 
   2268 
   2269 	/*
   2270 	 * A note about these overrun bits: all they do is *tell* someone
   2271 	 * about an error- They do not track multiple errors. In fact,
   2272 	 * you could consider them latched register bits if you like.
   2273 	 * We are only interested in printing the error message once for
   2274 	 * any cluster of overrun errrors.
   2275 	 */
   2276 	if ((!za->za_kick_rcv_id) && (zs->zs_rd_cur || za_kick_active)) {
   2277 		if (g_zsticks)
   2278 			za->za_kick_rcv_id = timeout(zsa_kick_rcv, zs,
   2279 			    g_zsticks);
   2280 		else
   2281 			za->za_kick_rcv_id = timeout(zsa_kick_rcv, zs,
   2282 			    zsticks[SPEED(za->za_ttycommon.t_cflag)]);
   2283 		za->za_kick_rcv_count = ZA_KICK_RCV_COUNT;
   2284 	}
   2285 	za->za_soft_active = 1;
   2286 	mutex_exit(zs->zs_excl);
   2287 
   2288 	if (!hangup && do_ttycommon_qfull) {
   2289 		ttycommon_qfull(&za->za_ttycommon, q);
   2290 		mutex_enter(zs->zs_excl);
   2291 		zsa_start(zs);
   2292 		mutex_exit(zs->zs_excl);
   2293 	}
   2294 
   2295 	if (za->za_hw_overrun > 10) {
   2296 		cmn_err(CE_NOTE, "zs%d: silo overflow\n", UNIT(za->za_dev));
   2297 		za->za_hw_overrun = 0;
   2298 	}
   2299 
   2300 	if (za->za_sw_overrun > 10) {
   2301 		cmn_err(CE_NOTE, "zs%d:ring buffer overflow\n",
   2302 		    UNIT(za->za_dev));
   2303 		za->za_sw_overrun = 0;
   2304 	}
   2305 
   2306 	if (unhangup)
   2307 		(void) putnextctl(q, M_UNHANGUP);
   2308 
   2309 	if (m_break)
   2310 		(void) putnextctl(q, M_BREAK);
   2311 
   2312 	while (head) {
   2313 		if (!tail) {
   2314 			putnext(q, head);
   2315 			break;
   2316 		}
   2317 		bp = head;
   2318 		head = head->b_next;
   2319 		bp->b_next = NULL;
   2320 		putnext(q, bp);
   2321 	}
   2322 
   2323 	if (hangup) {
   2324 		int flushflag;
   2325 
   2326 		/*
   2327 		 * If we're in the midst of close, then flush everything.  Don't
   2328 		 * leave stale ioctls lying about.
   2329 		 */
   2330 		flushflag = (zs->zs_flags & ZS_CLOSING) ? FLUSHALL : FLUSHDATA;
   2331 		flushq(za->za_ttycommon.t_writeq, flushflag);
   2332 		(void) putnextctl(q, M_HANGUP);
   2333 	}
   2334 
   2335 	if (m_error)
   2336 		(void) putnextctl1(q, M_ERROR, m_error);
   2337 
   2338 	za->za_soft_active = 0;
   2339 
   2340 	if (wakeup || (zs->zs_flags & ZS_CLOSED))
   2341 		cv_broadcast(&zs->zs_flags_cv);
   2342 
   2343 	return (0);
   2344 }
   2345 
   2346 /*
   2347  * Start output on a line, unless it's busy, frozen, or otherwise.
   2348  */
   2349 static void
   2350 zsa_start(struct zscom *zs)
   2351 {
   2352 	register struct asyncline *za = (struct asyncline *)&zs->zs_priv_str;
   2353 	register int cc;
   2354 	register queue_t *q;
   2355 	register mblk_t *bp;
   2356 	uchar_t *rptr, *wptr;
   2357 
   2358 	/*
   2359 	 * If the chip is busy (i.e., we're waiting for a break timeout
   2360 	 * to expire, or for the current transmission to finish, or for
   2361 	 * output to finish draining from chip), don't grab anything new.
   2362 	 */
   2363 	if ((za->za_flags & (ZAS_BREAK|ZAS_BUSY|ZAS_DRAINING)) ||
   2364 	    zs->zs_suspended)
   2365 		return;
   2366 
   2367 	if (za->za_ttycommon.t_cflag & CRTSCTS) {
   2368 		mutex_enter(zs->zs_excl_hi);
   2369 		if (za->za_rcv_flags_mask & DO_RETRANSMIT) {
   2370 			rptr = zs->zs_wr_cur;
   2371 			wptr = zs->zs_wr_lim;
   2372 			goto zsa_start_retransmit;
   2373 
   2374 		}
   2375 		mutex_exit(zs->zs_excl_hi);
   2376 	}
   2377 
   2378 	/*
   2379 	 * If we have a flow-control character to transmit, do it now.
   2380 	 */
   2381 	if (za->za_flowc != '\0') {
   2382 		mutex_enter(zs->zs_excl_hi);
   2383 		if (za->za_ttycommon.t_cflag & CRTSCTS) {
   2384 			if ((SCC_READ0() & (ZSRR0_CTS|ZSRR0_TX_READY)) !=
   2385 			    (ZSRR0_CTS|ZSRR0_TX_READY)) {
   2386 				mutex_exit(zs->zs_excl_hi);
   2387 				return;
   2388 			}
   2389 		} else if (!(SCC_READ0() & ZSRR0_TX_READY)) {
   2390 			mutex_exit(zs->zs_excl_hi);
   2391 			return;
   2392 		}
   2393 
   2394 		ZSDELAY();
   2395 		SCC_WRITEDATA(za->za_flowc);
   2396 		za->za_flowc = '\0';
   2397 		mutex_exit(zs->zs_excl_hi);
   2398 		return;
   2399 	}
   2400 
   2401 	/*
   2402 	 * If we're waiting for a delay timeout to expire, don't grab
   2403 	 * anything new.
   2404 	 */
   2405 	if (za->za_flags & ZAS_DELAY)
   2406 		return;
   2407 
   2408 	if ((q = za->za_ttycommon.t_writeq) == NULL)
   2409 		return;	/* not attached to a stream */
   2410 
   2411 zsa_start_again:
   2412 	for (;;) {
   2413 		if ((bp = getq(q)) == NULL)
   2414 			return;	/* no data to transmit */
   2415 
   2416 		/*
   2417 		 * We have a message block to work on.
   2418 		 * Check whether it's a break, a delay, or an ioctl (the latter
   2419 		 * occurs if the ioctl in question was waiting for the output
   2420 		 * to drain). If it's one of those, process it immediately.
   2421 		 */
   2422 		switch (bp->b_datap->db_type) {
   2423 
   2424 		case M_BREAK:
   2425 			/*
   2426 			 * Set the break bit, and arrange for "zsa_restart"
   2427 			 * to be called in 1/4 second; it will turn the
   2428 			 * break bit off, and call "zsa_start" to grab
   2429 			 * the next message.
   2430 			 */
   2431 			mutex_enter(zs->zs_excl_hi);
   2432 			SCC_BIS(5, ZSWR5_BREAK);
   2433 			mutex_exit(zs->zs_excl_hi);
   2434 			if (!za->za_zsa_restart_id) {
   2435 				za->za_zsa_restart_id =
   2436 				    timeout(zsa_restart, zs, hz/4);
   2437 			}
   2438 			za->za_flags |= ZAS_BREAK;
   2439 			freemsg(bp);
   2440 			return;	/* wait for this to finish */
   2441 
   2442 		case M_DELAY:
   2443 			/*
   2444 			 * Arrange for "zsa_restart" to be called when the
   2445 			 * delay expires; it will turn MTS_DELAY off,
   2446 			 * and call "zsa_start" to grab the next message.
   2447 			 */
   2448 			if (! za->za_zsa_restart_id) {
   2449 				za->za_zsa_restart_id = timeout(zsa_restart,
   2450 				    zs,
   2451 				    (int)(*(unsigned char *)bp->b_rptr + 6));
   2452 			}
   2453 			za->za_flags |= ZAS_DELAY;
   2454 			freemsg(bp);
   2455 			return;	/* wait for this to finish */
   2456 
   2457 		case M_IOCTL:
   2458 			/*
   2459 			 * This ioctl was waiting for the output ahead of
   2460 			 * it to drain; obviously, it has. Do it, and
   2461 			 * then grab the next message after it.
   2462 			 */
   2463 			zsa_ioctl(za, q, bp);
   2464 			continue;
   2465 		default: /* M_DATA */
   2466 			goto zsa_start_transmit;
   2467 		}
   2468 
   2469 	}
   2470 zsa_start_transmit:
   2471 	/*
   2472 	 * We have data to transmit. If output is stopped, put
   2473 	 * it back and try again later.
   2474 	 */
   2475 	if (za->za_flags & ZAS_STOPPED) {
   2476 		(void) putbq(q, bp);
   2477 		return;
   2478 	}
   2479 
   2480 	za->za_xmitblk = bp;
   2481 	rptr = bp->b_rptr;
   2482 	wptr = bp->b_wptr;
   2483 	cc = wptr - rptr;
   2484 	bp = bp->b_cont;
   2485 	if (bp != NULL) {
   2486 		za->za_xmitblk->b_cont = NULL;
   2487 		(void) putbq(q, bp);	/* not done with this message yet */
   2488 	}
   2489 
   2490 	if (rptr >= wptr) {
   2491 		freeb(za->za_xmitblk);
   2492 		za->za_xmitblk = NULL;
   2493 		goto zsa_start_again;
   2494 	}
   2495 
   2496 	/*
   2497 	 * In 5-bit mode, the high order bits are used
   2498 	 * to indicate character sizes less than five,
   2499 	 * so we need to explicitly mask before transmitting
   2500 	 */
   2501 	if ((za->za_ttycommon.t_cflag & CSIZE) == CS5) {
   2502 		register unsigned char *p = rptr;
   2503 		register int cnt = cc;
   2504 
   2505 		while (cnt--)
   2506 			*p++ &= (unsigned char) 0x1f;
   2507 	}
   2508 
   2509 	/*
   2510 	 * Set up this block for pseudo-DMA.
   2511 	 */
   2512 
   2513 	mutex_enter(zs->zs_excl_hi);
   2514 	zs->zs_wr_cur = rptr;
   2515 	zs->zs_wr_lim = wptr;
   2516 
   2517 zsa_start_retransmit:
   2518 	za->za_rcv_flags_mask &= ~DO_TRANSMIT;
   2519 	if (za->za_ttycommon.t_cflag & CRTSCTS) {
   2520 		if ((SCC_READ0() & (ZSRR0_CTS|ZSRR0_TX_READY)) !=
   2521 		    (ZSRR0_CTS|ZSRR0_TX_READY)) {
   2522 			za->za_rcv_flags_mask |= DO_RETRANSMIT;
   2523 			za->za_flags |= ZAS_BUSY;
   2524 			mutex_exit(zs->zs_excl_hi);
   2525 			return;
   2526 		}
   2527 		za->za_rcv_flags_mask &= ~DO_RETRANSMIT;
   2528 	} else {
   2529 		if (!(SCC_READ0() & ZSRR0_TX_READY)) {
   2530 			za->za_flags |= ZAS_BUSY;
   2531 			mutex_exit(zs->zs_excl_hi);
   2532 			return;
   2533 		}
   2534 	}
   2535 	/*
   2536 	 * If the transmitter is ready, shove the first
   2537 	 * character out.
   2538 	 */
   2539 	ZSDELAY();
   2540 	SCC_WRITEDATA(*rptr++);
   2541 #ifdef ZSA_DEBUG
   2542 	za->za_wr++;
   2543 #endif
   2544 	zs->zs_wr_cur = rptr;
   2545 	za->za_flags |= ZAS_BUSY;
   2546 	zs->zs_flags |= ZS_PROGRESS;
   2547 	mutex_exit(zs->zs_excl_hi);
   2548 }
   2549 
   2550 /*
   2551  * Restart output on a line after a delay or break timer expired.
   2552  */
   2553 static void
   2554 zsa_restart(void *arg)
   2555 {
   2556 	struct zscom *zs = arg;
   2557 	struct asyncline *za = (struct asyncline *)&zs->zs_priv_str;
   2558 
   2559 	/*
   2560 	 * If break timer expired, turn off the break bit.
   2561 	 */
   2562 	mutex_enter(zs->zs_excl);
   2563 	if (!za->za_zsa_restart_id) {
   2564 		mutex_exit(zs->zs_excl);
   2565 		return;
   2566 	}
   2567 	za->za_zsa_restart_id = 0;
   2568 	if (za->za_flags & ZAS_BREAK) {
   2569 		mutex_enter(zs->zs_excl_hi);
   2570 		SCC_BIC(5, ZSWR5_BREAK);
   2571 		mutex_exit(zs->zs_excl_hi);
   2572 	}
   2573 	za->za_flags &= ~(ZAS_DELAY|ZAS_BREAK);
   2574 	if (za->za_ttycommon.t_writeq != NULL)
   2575 		zsa_start(zs);
   2576 	mutex_exit(zs->zs_excl);
   2577 	cv_broadcast(&zs->zs_flags_cv);
   2578 }
   2579 
   2580 /*
   2581  * See if the receiver has any data after zs_tick delay
   2582  */
   2583 static void
   2584 zsa_kick_rcv(void *arg)
   2585 {
   2586 	struct zscom *zs = arg;
   2587 	struct asyncline *za = (struct asyncline *)&zs->zs_priv_str;
   2588 	queue_t *q;
   2589 	int	tmp;
   2590 	mblk_t	*mp;
   2591 	uchar_t za_soft_active, za_kick_active;
   2592 	int	allocbcount = 0;
   2593 	int do_ttycommon_qfull = 0;
   2594 	mblk_t *head = NULL, *tail = NULL;
   2595 
   2596 	mutex_enter(zs->zs_excl);
   2597 	if (za->za_kick_rcv_id == 0 || (zs->zs_flags & ZS_CLOSED)) {
   2598 		mutex_exit(zs->zs_excl);
   2599 		return;
   2600 	}
   2601 	za_soft_active = za->za_soft_active;
   2602 	za_kick_active = za->za_kick_active;
   2603 	q = za->za_ttycommon.t_readq;
   2604 	if (!q) {
   2605 		mutex_exit(zs->zs_excl);
   2606 		return;
   2607 	}
   2608 	mutex_enter(zs->zs_excl_hi);
   2609 	if (zs->zs_rd_cur) {
   2610 		ZSA_KICK_RCV;
   2611 		za->za_kick_rcv_count = tmp = ZA_KICK_RCV_COUNT;
   2612 	} else
   2613 		tmp = --za->za_kick_rcv_count;
   2614 	if (tmp > 0 || za_soft_active || za_kick_active) {
   2615 		mutex_exit(zs->zs_excl_hi);
   2616 		if (g_zsticks)
   2617 			za->za_kick_rcv_id = timeout(zsa_kick_rcv,
   2618 			    zs, g_zsticks);
   2619 		else
   2620 			za->za_kick_rcv_id = timeout(zsa_kick_rcv,
   2621 			    zs, zsticks[SPEED(za->za_ttycommon.t_cflag)]);
   2622 		if (za_soft_active || za_kick_active) {
   2623 			mutex_exit(zs->zs_excl);
   2624 			return;
   2625 		}
   2626 	} else {
   2627 		za->za_kick_rcv_id = 0;
   2628 		mutex_exit(zs->zs_excl_hi);
   2629 	}
   2630 
   2631 
   2632 	for (;;) {
   2633 		ZSA_SEEQ(mp);
   2634 		if (!mp)
   2635 			break;
   2636 
   2637 		allocbcount++;
   2638 
   2639 		if (mp->b_datap->db_type <= QPCTL) {
   2640 			if (!(canputnext(q))) {
   2641 				if (za->za_grace_flow_control >=
   2642 				    zsa_grace_flow_control) {
   2643 					if (za->za_ttycommon.t_cflag &
   2644 					    CRTSXOFF) {
   2645 						allocbcount--;
   2646 						break;
   2647 					}
   2648 					ZSA_GETQ(mp);
   2649 					freemsg(mp);
   2650 					do_ttycommon_qfull = 1;
   2651 					continue;
   2652 				} else
   2653 					za->za_grace_flow_control++;
   2654 			} else
   2655 				za->za_grace_flow_control = 0;
   2656 		}
   2657 		ZSA_GETQ(mp);
   2658 		if (!head) {
   2659 			head = mp;
   2660 		} else {
   2661 			if (!tail)
   2662 				tail = head;
   2663 			tail->b_next = mp;
   2664 			tail = mp;
   2665 		}
   2666 	}
   2667 
   2668 	if (allocbcount)
   2669 		ZSA_GETBLOCK(zs, allocbcount);
   2670 
   2671 	za->za_kick_active = 1;
   2672 	mutex_exit(zs->zs_excl);
   2673 
   2674 	if (do_ttycommon_qfull) {
   2675 		ttycommon_qfull(&za->za_ttycommon, q);
   2676 		mutex_enter(zs->zs_excl);
   2677 		zsa_start(zs);
   2678 		mutex_exit(zs->zs_excl);
   2679 	}
   2680 
   2681 	while (head) {
   2682 		if (!tail) {
   2683 			putnext(q, head);
   2684 			break;
   2685 		}
   2686 		mp = head;
   2687 		head = head->b_next;
   2688 		mp->b_next = NULL;
   2689 		putnext(q, mp);
   2690 
   2691 	}
   2692 	za->za_kick_active = 0;
   2693 
   2694 	if (zs->zs_flags & ZS_CLOSED)
   2695 		cv_broadcast(&zs->zs_flags_cv);
   2696 }
   2697 
   2698 /*
   2699  * Retry an "ioctl", now that "bufcall" claims we may be able to allocate
   2700  * the buffer we need.
   2701  */
   2702 static void
   2703 zsa_reioctl(void *arg)
   2704 {
   2705 	struct asyncline *za = arg;
   2706 	struct zscom *zs = za->za_common;
   2707 	queue_t *q;
   2708 	mblk_t	 *mp;
   2709 
   2710 	/*
   2711 	 * The bufcall is no longer pending.
   2712 	 */
   2713 	mutex_enter(zs->zs_excl);
   2714 	if (!za->za_wbufcid) {
   2715 		mutex_exit(zs->zs_excl);
   2716 		return;
   2717 	}
   2718 	za->za_wbufcid = 0;
   2719 	if ((q = za->za_ttycommon.t_writeq) == NULL) {
   2720 		mutex_exit(zs->zs_excl);
   2721 		return;
   2722 	}
   2723 	if ((mp = za->za_ttycommon.t_iocpending) != NULL) {
   2724 		/*
   2725 		 * not pending any more
   2726 		 */
   2727 		za->za_ttycommon.t_iocpending = NULL;
   2728 		zsa_ioctl(za, q, mp);
   2729 	}
   2730 	mutex_exit(zs->zs_excl);
   2731 }
   2732 
   2733 /*
   2734  * Process an "ioctl" message sent down to us.
   2735  * Note that we don't need to get any locks until we are ready to access
   2736  * the hardware. Nothing we access until then is going to be altered
   2737  * outside of the STREAMS framework, so we should be safe.
   2738  */
   2739 static void
   2740 zsa_ioctl(struct asyncline *za, queue_t *wq, mblk_t *mp)
   2741 {
   2742 	register struct zscom *zs = za->za_common;
   2743 	register struct iocblk *iocp;
   2744 	register unsigned datasize;
   2745 	int error;
   2746 	register mblk_t *tmp;
   2747 
   2748 	if (za->za_ttycommon.t_iocpending != NULL) {
   2749 		/*
   2750 		 * We were holding an "ioctl" response pending the
   2751 		 * availability of an "mblk" to hold data to be passed up;
   2752 		 * another "ioctl" came through, which means that "ioctl"
   2753 		 * must have timed out or been aborted.
   2754 		 */
   2755 		freemsg(za->za_ttycommon.t_iocpending);
   2756 		za->za_ttycommon.t_iocpending = NULL;
   2757 	}
   2758 
   2759 	iocp = (struct iocblk *)mp->b_rptr;
   2760 
   2761 	/*
   2762 	 * The only way in which "ttycommon_ioctl" can fail is if the "ioctl"
   2763 	 * requires a response containing data to be returned to the user,
   2764 	 * and no mblk could be allocated for the data.
   2765 	 * No such "ioctl" alters our state. Thus, we always go ahead and
   2766 	 * do any state-changes the "ioctl" calls for. If we couldn't allocate
   2767 	 * the data, "ttycommon_ioctl" has stashed the "ioctl" away safely, so
   2768 	 * we just call "bufcall" to request that we be called back when we
   2769 	 * stand a better chance of allocating the data.
   2770 	 */
   2771 	mutex_exit(zs->zs_excl);
   2772 	datasize = ttycommon_ioctl(&za->za_ttycommon, wq, mp, &error);
   2773 	mutex_enter(zs->zs_excl);
   2774 	if (za->za_ttycommon.t_flags & TS_SOFTCAR)
   2775 		zssoftCAR[zs->zs_unit] = 1;
   2776 	else
   2777 		zssoftCAR[zs->zs_unit] = 0;
   2778 	if (datasize != 0) {
   2779 		if (za->za_wbufcid)
   2780 			unbufcall(za->za_wbufcid);
   2781 		za->za_wbufcid = bufcall(datasize, BPRI_HI, zsa_reioctl, za);
   2782 		return;
   2783 	}
   2784 
   2785 
   2786 	if (error == 0) {
   2787 		/*
   2788 		 * "ttycommon_ioctl" did most of the work; we just use the
   2789 		 * data it set up.
   2790 		 */
   2791 		switch (iocp->ioc_cmd) {
   2792 
   2793 		case TCSETS:
   2794 		case TCSETSW:
   2795 		case TCSETSF:
   2796 		case TCSETA:
   2797 		case TCSETAW:
   2798 		case TCSETAF:
   2799 			mutex_enter(zs->zs_excl_hi);
   2800 			zsa_program(za, 1);
   2801 			zsa_set_za_rcv_flags_mask(za);
   2802 			mutex_exit(zs->zs_excl_hi);
   2803 			break;
   2804 		}
   2805 	} else if (error < 0) {
   2806 		/*
   2807 		 * "ttycommon_ioctl" didn't do anything; we process it here.
   2808 		 */
   2809 		error = 0;
   2810 
   2811 		switch (iocp->ioc_cmd) {
   2812 
   2813 		case TCSBRK:
   2814 			error = miocpullup(mp, sizeof (int));
   2815 			if (error != 0)
   2816 				break;
   2817 
   2818 			if (*(int *)mp->b_cont->b_rptr == 0) {
   2819 				/*
   2820 				 * The delay ensures that a 3 byte transmit
   2821 				 * fifo is empty.
   2822 				 */
   2823 				mutex_exit(zs->zs_excl);
   2824 				delay(ztdelay(SPEED(za->za_ttycommon.t_cflag)));
   2825 				mutex_enter(zs->zs_excl);
   2826 
   2827 				/*
   2828 				 * Set the break bit, and arrange for
   2829 				 * "zsa_restart" to be called in 1/4 second;
   2830 				 * it will turn the break bit off, and call
   2831 				 * "zsa_start" to grab the next message.
   2832 				 */
   2833 				mutex_enter(zs->zs_excl_hi);
   2834 				SCC_BIS(5, ZSWR5_BREAK);
   2835 				if (!za->za_zsa_restart_id) {
   2836 					mutex_exit(zs->zs_excl_hi);
   2837 					za->za_zsa_restart_id =
   2838 					    timeout(zsa_restart, zs, hz / 4);
   2839 					mutex_enter(zs->zs_excl_hi);
   2840 				}
   2841 				za->za_flags |= ZAS_BREAK;
   2842 				mutex_exit(zs->zs_excl_hi);
   2843 			}
   2844 			break;
   2845 
   2846 		case TIOCSBRK:
   2847 			mutex_enter(zs->zs_excl_hi);
   2848 			SCC_BIS(5, ZSWR5_BREAK);
   2849 			mutex_exit(zs->zs_excl_hi);
   2850 			mioc2ack(mp, NULL, 0, 0);
   2851 			break;
   2852 
   2853 		case TIOCCBRK:
   2854 			mutex_enter(zs->zs_excl_hi);
   2855 			SCC_BIC(5, ZSWR5_BREAK);
   2856 			mutex_exit(zs->zs_excl_hi);
   2857 			mioc2ack(mp, NULL, 0, 0);
   2858 			break;
   2859 
   2860 		case TIOCMSET:
   2861 		case TIOCMBIS:
   2862 		case TIOCMBIC: {
   2863 			int mlines;
   2864 
   2865 			if (iocp->ioc_count == TRANSPARENT) {
   2866 				mcopyin(mp, NULL, sizeof (int), NULL);
   2867 				break;
   2868 			}
   2869 
   2870 			error = miocpullup(mp, sizeof (int));
   2871 			if (error != 0)
   2872 				break;
   2873 
   2874 			mlines = *(int *)mp->b_cont->b_rptr;
   2875 
   2876 			mutex_enter(zs->zs_excl_hi);
   2877 			switch (iocp->ioc_cmd) {
   2878 			case TIOCMSET:
   2879 				(void) zsmctl(zs, dmtozs(mlines), DMSET);
   2880 				break;
   2881 			case TIOCMBIS:
   2882 				(void) zsmctl(zs, dmtozs(mlines), DMBIS);
   2883 				break;
   2884 			case TIOCMBIC:
   2885 				(void) zsmctl(zs, dmtozs(mlines), DMBIC);
   2886 				break;
   2887 			}
   2888 			mutex_exit(zs->zs_excl_hi);
   2889 
   2890 			mioc2ack(mp, NULL, 0, 0);
   2891 			break;
   2892 		}
   2893 
   2894 		case TIOCMGET:
   2895 			tmp = allocb(sizeof (int), BPRI_MED);
   2896 			if (tmp == NULL) {
   2897 				error = EAGAIN;
   2898 				break;
   2899 			}
   2900 			if (iocp->ioc_count != TRANSPARENT)
   2901 				mioc2ack(mp, tmp, sizeof (int), 0);
   2902 			else
   2903 				mcopyout(mp, NULL, sizeof (int), NULL, tmp);
   2904 
   2905 			mutex_enter(zs->zs_excl_hi);
   2906 			*(int *)mp->b_cont->b_rptr =
   2907 			    zstodm(zsmctl(zs, 0, DMGET));
   2908 			mutex_exit(zs->zs_excl_hi);
   2909 			/*
   2910 			 * qreply done below
   2911 			 */
   2912 			break;
   2913 
   2914 		default:
   2915 			/*
   2916 			 * If we don't understand it, it's an error. NAK it.
   2917 			 */
   2918 			error = EINVAL;
   2919 			break;
   2920 		}
   2921 	}
   2922 
   2923 	if (error != 0) {
   2924 		iocp->ioc_error = error;
   2925 		mp->b_datap->db_type = M_IOCNAK;
   2926 	}
   2927 
   2928 	ZSA_QREPLY(wq, mp);
   2929 }
   2930 
   2931 
   2932 static int
   2933 dmtozs(int bits)
   2934 {
   2935 	register int b = 0;
   2936 
   2937 	if (bits & TIOCM_CAR)
   2938 		b |= ZSRR0_CD;
   2939 	if (bits & TIOCM_CTS)
   2940 		b |= ZSRR0_CTS;
   2941 	if (bits & TIOCM_RTS)
   2942 		b |= ZSWR5_RTS;
   2943 	if (bits & TIOCM_DTR)
   2944 		b |= ZSWR5_DTR;
   2945 	return (b);
   2946 }
   2947 
   2948 static int
   2949 zstodm(int bits)
   2950 {
   2951 	register int b;
   2952 
   2953 	b = 0;
   2954 	if (bits & ZSRR0_CD)
   2955 		b |= TIOCM_CAR;
   2956 	if (bits & ZSRR0_CTS)
   2957 		b |= TIOCM_CTS;
   2958 	if (bits & ZSWR5_RTS)
   2959 		b |= TIOCM_RTS;
   2960 	if (bits & ZSWR5_DTR)
   2961 		b |= TIOCM_DTR;
   2962 	return (b);
   2963 }
   2964 
   2965 /*
   2966  * Assemble registers and flags necessary to program the port to our liking.
   2967  * For async operation, most of this is based on the values of
   2968  * the "c_iflag" and "c_cflag" fields supplied to us.
   2969  */
   2970 static void
   2971 zsa_program(struct asyncline *za, int setibaud)
   2972 {
   2973 	register struct zscom *zs = za->za_common;
   2974 	register struct zs_prog *zspp;
   2975 	register int wr3, wr4, wr5, wr15, speed, baudrate, flags = 0;
   2976 
   2977 	if ((baudrate = SPEED(za->za_ttycommon.t_cflag)) == 0) {
   2978 		/*
   2979 		 * Hang up line.
   2980 		 */
   2981 		(void) zsmctl(zs, ZS_OFF, DMSET);
   2982 		return;
   2983 	}
   2984 
   2985 	/*
   2986 	 * set input speed same as output, as split speed not supported
   2987 	 */
   2988 	if (setibaud) {
   2989 		za->za_ttycommon.t_cflag &= ~(CIBAUD);
   2990 		if (baudrate > CBAUD) {
   2991 			za->za_ttycommon.t_cflag |= CIBAUDEXT;
   2992 			za->za_ttycommon.t_cflag |=
   2993 			    (((baudrate - CBAUD - 1) << IBSHIFT) & CIBAUD);
   2994 		} else {
   2995 			za->za_ttycommon.t_cflag &= ~CIBAUDEXT;
   2996 			za->za_ttycommon.t_cflag |=
   2997 			    ((baudrate << IBSHIFT) & CIBAUD);
   2998 		}
   2999 	}
   3000 
   3001 	/*
   3002 	 * Do not allow the console/keyboard device to have its receiver
   3003 	 * disabled; doing that would mean you couldn't type an abort
   3004 	 * sequence.
   3005 	 */
   3006 	if ((za->za_dev == rconsdev) || (za->za_dev == kbddev) ||
   3007 	    (za->za_dev == stdindev) || (za->za_ttycommon.t_cflag & CREAD))
   3008 		wr3 = ZSWR3_RX_ENABLE;
   3009 	else
   3010 		wr3 = 0;
   3011 	wr4 = ZSWR4_X16_CLK;
   3012 	wr5 = (zs->zs_wreg[5] & (ZSWR5_RTS|ZSWR5_DTR)) | ZSWR5_TX_ENABLE;
   3013 
   3014 	if (zsb134_weird && baudrate == B134) {	/* what a joke! */
   3015 		/*
   3016 		 * XXX - should B134 set all this crap in the compatibility
   3017 		 * module, leaving this stuff fairly clean?
   3018 		 */
   3019 		flags |= ZSP_PARITY_SPECIAL;
   3020 		wr3 |= ZSWR3_RX_6;
   3021 		wr4 |= ZSWR4_PARITY_ENABLE | ZSWR4_PARITY_EVEN;
   3022 		wr4 |= ZSWR4_1_5_STOP;
   3023 		wr5 |= ZSWR5_TX_6;
   3024 	} else {
   3025 
   3026 		switch (za->za_ttycommon.t_cflag & CSIZE) {
   3027 
   3028 		case CS5:
   3029 			wr3 |= ZSWR3_RX_5;
   3030 			wr5 |= ZSWR5_TX_5;
   3031 			break;
   3032 
   3033 		case CS6:
   3034 			wr3 |= ZSWR3_RX_6;
   3035 			wr5 |= ZSWR5_TX_6;
   3036 			break;
   3037 
   3038 		case CS7:
   3039 			wr3 |= ZSWR3_RX_7;
   3040 			wr5 |= ZSWR5_TX_7;
   3041 			break;
   3042 
   3043 		case CS8:
   3044 			wr3 |= ZSWR3_RX_8;
   3045 			wr5 |= ZSWR5_TX_8;
   3046 			break;
   3047 		}
   3048 
   3049 		if (za->za_ttycommon.t_cflag & PARENB) {
   3050 			/*
   3051 			 * The PARITY_SPECIAL bit causes a special rx
   3052 			 * interrupt on parity errors. Turn it on if
   3053 			 * we're checking the parity of characters.
   3054 			 */
   3055 			if (za->za_ttycommon.t_iflag & INPCK)
   3056 				flags |= ZSP_PARITY_SPECIAL;
   3057 			wr4 |= ZSWR4_PARITY_ENABLE;
   3058 			if (!(za->za_ttycommon.t_cflag & PARODD))
   3059 				wr4 |= ZSWR4_PARITY_EVEN;
   3060 		}
   3061 		wr4 |= (za->za_ttycommon.t_cflag & CSTOPB) ?
   3062 		    ZSWR4_2_STOP : ZSWR4_1_STOP;
   3063 	}
   3064 
   3065 #if 0
   3066 	/*
   3067 	 * The AUTO_CD_CTS flag enables the hardware flow control feature of
   3068 	 * the 8530, which allows the state of CTS and DCD to control the
   3069 	 * enabling of the transmitter and receiver, respectively. The
   3070 	 * receiver and transmitter still must have their enable bits set in
   3071 	 * WR3 and WR5, respectively, for CTS and DCD to be monitored this way.
   3072 	 * Hardware flow control can thus be implemented with no help from
   3073 	 * software.
   3074 	 */
   3075 	if (za->za_ttycommon.t_cflag & CRTSCTS)
   3076 		wr3 |= ZSWR3_AUTO_CD_CTS;
   3077 #endif
   3078 	if (za->za_ttycommon.t_cflag & CRTSCTS)
   3079 		wr15 = ZSR15_BREAK | ZSR15_TX_UNDER | ZSR15_CD | ZSR15_CTS;
   3080 	else
   3081 		wr15 = ZSR15_BREAK | ZSR15_TX_UNDER | ZSR15_CD;
   3082 
   3083 	speed = zs->zs_wreg[12] + (zs->zs_wreg[13] << 8);
   3084 
   3085 	/*
   3086 	 * Here we assemble a set of changes to be passed to zs_program.
   3087 	 * Note: Write Register 15 must be set to enable BREAK and UNDERrun
   3088 	 * interrupts.  It must also enable CD interrupts which, although
   3089 	 * not processed by the hardware interrupt handler, will be processed
   3090 	 * by zsa_process, indirectly resulting in a SIGHUP being delivered
   3091 	 * to the controlling process if CD drops.  CTS interrupts must NOT
   3092 	 * be enabled.  We don't use them at all, and they will hang IPC/IPX
   3093 	 * systems at boot time if synchronous modems that supply transmit
   3094 	 * clock are attached to any of their serial ports.
   3095 	 */
   3096 	if (((zs->zs_wreg[1] & ZSWR1_PARITY_SPECIAL) &&
   3097 	    !(flags & ZSP_PARITY_SPECIAL)) ||
   3098 	    (!(zs->zs_wreg[1] & ZSWR1_PARITY_SPECIAL) &&
   3099 	    (flags & ZSP_PARITY_SPECIAL)) ||
   3100 	    wr3 != zs->zs_wreg[3] || wr4 != zs->zs_wreg[4] ||
   3101 	    wr5 != zs->zs_wreg[5] || wr15 != zs->zs_wreg[15] ||
   3102 	    speed != zs_speeds[baudrate]) {
   3103 
   3104 		za->za_flags |= ZAS_DRAINING;
   3105 		zspp = &zs_prog[zs->zs_unit];
   3106 		zspp->zs = zs;
   3107 		zspp->flags = (uchar_t)flags;
   3108 		zspp->wr4 = (uchar_t)wr4;
   3109 		zspp->wr11 = (uchar_t)(ZSWR11_TXCLK_BAUD | ZSWR11_RXCLK_BAUD);
   3110 
   3111 		speed = zs_speeds[baudrate];
   3112 		zspp->wr12 = (uchar_t)(speed & 0xff);
   3113 		zspp->wr13 = (uchar_t)((speed >> 8) & 0xff);
   3114 		zspp->wr3 = (uchar_t)wr3;
   3115 		zspp->wr5 = (uchar_t)wr5;
   3116 		zspp->wr15 = (uchar_t)wr15;
   3117 
   3118 		zs_program(zspp);
   3119 		za->za_flags &= ~ZAS_DRAINING;
   3120 	}
   3121 }
   3122 
   3123 /*
   3124  * Get the current speed of the console and turn it into something
   3125  * UNIX knows about - used to preserve console speed when UNIX comes up.
   3126  */
   3127 int
   3128 zsgetspeed(dev_t dev)
   3129 {
   3130 	register struct zscom *zs;
   3131 	register int uspeed, zspeed;
   3132 	register uchar_t rr;
   3133 
   3134 	zs = &zscom[UNIT(dev)];
   3135 	SCC_READ(12, zspeed);
   3136 	SCC_READ(13, rr);
   3137 	zspeed |= rr << 8;
   3138 	for (uspeed = 0; uspeed < NSPEED; uspeed++)
   3139 		if (zs_speeds[uspeed] == zspeed)
   3140 			return (uspeed);
   3141 	/*
   3142 	 * 9600 baud if we can't figure it out
   3143 	 */
   3144 	return (ISPEED);
   3145 }
   3146 
   3147 /*
   3148  * callback routine when enough memory is available.
   3149  */
   3150 static void
   3151 zsa_callback(void *arg)
   3152 {
   3153 	struct zscom *zs = arg;
   3154 	struct asyncline *za = (struct asyncline *)&zs->zs_priv_str;
   3155 	int allocbcount = zsa_rstandby;
   3156 
   3157 	mutex_enter(zs->zs_excl);
   3158 	if (za->za_bufcid) {
   3159 		za->za_bufcid = 0;
   3160 		ZSA_GETBLOCK(zs, allocbcount);
   3161 	}
   3162 	mutex_exit(zs->zs_excl);
   3163 }
   3164 
   3165 /*
   3166  * Set the receiver flags
   3167  */
   3168 static void
   3169 zsa_set_za_rcv_flags_mask(struct asyncline *za)
   3170 {
   3171 	register uint_t mask;
   3172 
   3173 	za->za_rcv_flags_mask &= ~0xFF;
   3174 	switch (za->za_ttycommon.t_cflag & CSIZE) {
   3175 	case CS5:
   3176 		mask = 0x1f;
   3177 		break;
   3178 	case CS6:
   3179 		mask = 0x3f;
   3180 		break;
   3181 	case CS7:
   3182 		mask = 0x7f;
   3183 		break;
   3184 	default:
   3185 		mask = 0xff;
   3186 	}
   3187 
   3188 	za->za_rcv_flags_mask &= ~(0xFF << 16);
   3189 	za->za_rcv_flags_mask |=  mask << 16;
   3190 
   3191 	if ((za->za_ttycommon.t_iflag & PARMRK) &&
   3192 	    !(za->za_ttycommon.t_iflag & (IGNPAR|ISTRIP))) {
   3193 		za->za_rcv_flags_mask |= DO_ESC;
   3194 	} else
   3195 		za->za_rcv_flags_mask &= ~DO_ESC;
   3196 	if (za->za_ttycommon.t_iflag & IXON) {
   3197 		za->za_rcv_flags_mask |= DO_STOPC;
   3198 		za->za_rcv_flags_mask &= ~0xFF;
   3199 		za->za_rcv_flags_mask |= za->za_ttycommon.t_stopc;
   3200 	} else
   3201 		za->za_rcv_flags_mask &= ~DO_STOPC;
   3202 }
   3203 
   3204 static int
   3205 zsa_suspend(struct zscom *zs)
   3206 {
   3207 	struct asyncline	*za;
   3208 	queue_t			*q;
   3209 	mblk_t			*bp = NULL;
   3210 	timeout_id_t		restart_id, kick_rcv_id;
   3211 	struct zs_prog		*zspp;
   3212 
   3213 	za = (struct asyncline *)&zs->zs_priv_str;
   3214 	mutex_enter(zs->zs_excl);
   3215 	if (zs->zs_suspended) {
   3216 		mutex_exit(zs->zs_excl);
   3217 		return (DDI_SUCCESS);
   3218 	}
   3219 	zs->zs_suspended = 1;
   3220 
   3221 	/*
   3222 	 * Turn off interrupts and get any bytes in receiver
   3223 	 */
   3224 	mutex_enter(zs->zs_excl_hi);
   3225 	SCC_BIC(1, ZSWR1_INIT);
   3226 	ZSA_KICK_RCV;
   3227 	restart_id = za->za_zsa_restart_id;
   3228 	za->za_zsa_restart_id = 0;
   3229 	kick_rcv_id = za->za_kick_rcv_id;
   3230 	za->za_kick_rcv_id = 0;
   3231 	mutex_exit(zs->zs_excl_hi);
   3232 	mutex_exit(zs->zs_excl);
   3233 
   3234 	/*
   3235 	 * Cancel any timeouts
   3236 	 */
   3237 	if (restart_id)
   3238 		(void) untimeout(restart_id);
   3239 	if (kick_rcv_id)
   3240 		(void) untimeout(kick_rcv_id);
   3241 
   3242 	/*
   3243 	 * Since we have turned off interrupts, zsa_txint will not be called
   3244 	 * and no new chars will given to the chip. We just wait for the
   3245 	 * current character(s) to drain.
   3246 	 */
   3247 	delay(ztdelay(za->za_ttycommon.t_cflag & CBAUD));
   3248 
   3249 	/*
   3250 	 * Return remains of partially sent message to queue
   3251 	 */
   3252 	mutex_enter(zs->zs_excl);
   3253 	if ((q = za->za_ttycommon.t_writeq) != NULL) {
   3254 		mutex_enter(zs->zs_excl_hi);
   3255 		if ((zs->zs_wr_cur) != NULL) {
   3256 			za->za_flags &= ~ZAS_BUSY;
   3257 			za->za_rcv_flags_mask &= ~DO_RETRANSMIT;
   3258 			bp = za->za_xmitblk;
   3259 			bp->b_rptr = zs->zs_wr_cur;
   3260 			zs->zs_wr_cur = NULL;
   3261 			zs->zs_wr_lim = NULL;
   3262 			za->za_xmitblk = NULL;
   3263 		}
   3264 		mutex_exit(zs->zs_excl_hi);
   3265 		if (bp)
   3266 			(void) putbq(q, bp);
   3267 	}
   3268 
   3269 	/*
   3270 	 * Stop any breaks in progress.
   3271 	 */
   3272 	mutex_enter(zs->zs_excl_hi);
   3273 	if (zs->zs_wreg[5] & ZSWR5_BREAK) {
   3274 		SCC_BIC(5, ZSWR5_BREAK);
   3275 		za->za_flags &= ~ZAS_BREAK;
   3276 	}
   3277 
   3278 	/*
   3279 	 * Now get a copy of current registers setting.
   3280 	 */
   3281 	zspp = &zs_prog[zs->zs_unit];
   3282 	zspp->zs = zs;
   3283 	zspp->flags = 0;
   3284 	zspp->wr3 = zs->zs_wreg[3];
   3285 	zspp->wr4 = zs->zs_wreg[4];
   3286 	zspp->wr5 = zs->zs_wreg[5];
   3287 	zspp->wr11 = zs->zs_wreg[11];
   3288 	zspp->wr12 = zs->zs_wreg[12];
   3289 	zspp->wr13 = zs->zs_wreg[13];
   3290 	zspp->wr15 = zs->zs_wreg[15];
   3291 	mutex_exit(zs->zs_excl_hi);
   3292 	mutex_exit(zs->zs_excl);
   3293 	/*
   3294 	 * We do this on the off chance that zsa_close is waiting on a timed
   3295 	 * break to complete and nothing else.
   3296 	 */
   3297 	cv_broadcast(&zs->zs_flags_cv);
   3298 	return (DDI_SUCCESS);
   3299 }
   3300 
   3301 static int
   3302 zsa_resume(struct zscom *zs)
   3303 {
   3304 	register struct asyncline *za;
   3305 	struct zs_prog	*zspp;
   3306 
   3307 	za = (struct asyncline *)&zs->zs_priv_str;
   3308 	mutex_enter(zs->zs_excl);
   3309 	if (!(zs->zs_suspended)) {
   3310 		mutex_exit(zs->zs_excl);
   3311 		return (DDI_SUCCESS);
   3312 	}
   3313 
   3314 	/*
   3315 	 * Restore H/W state
   3316 	 */
   3317 	mutex_enter(zs->zs_excl_hi);
   3318 	zspp = &zs_prog[zs->zs_unit];
   3319 	zs_program(zspp);
   3320 
   3321 	/*
   3322 	 * Enable all interrupts for this chip and delay to let chip settle
   3323 	 */
   3324 	SCC_WRITE(9, ZSWR9_MASTER_IE | ZSWR9_VECTOR_INCL_STAT);
   3325 	DELAY(4000);
   3326 
   3327 	/*
   3328 	 * Restart receiving and transmitting
   3329 	 */
   3330 	zs->zs_suspended = 0;
   3331 	za->za_rcv_flags_mask |= DO_TRANSMIT;
   3332 	za->za_ext = 1;
   3333 	ZSSETSOFT(zs);
   3334 	mutex_exit(zs->zs_excl_hi);
   3335 	mutex_exit(zs->zs_excl);
   3336 
   3337 	return (DDI_SUCCESS);
   3338 }
   3339 
   3340 #ifdef ZSA_DEBUG
   3341 static void
   3342 zsa_print_info(struct zscom *zs)
   3343 {
   3344 	register struct asyncline *za = (struct asyncline *)&zs->zs_priv_str;
   3345 	register queue_t *q = za->za_ttycommon.t_writeq;
   3346 
   3347 	printf(" next q=%s\n", (RD(q))->q_next->q_qinfo->qi_minfo->mi_idname);
   3348 	printf("unit=%d\n", zs->zs_unit);
   3349 	printf("tflag:\n");
   3350 	if (za->za_ttycommon.t_flags & TS_SOFTCAR) printf(" t_fl:TS_SOFTCAR");
   3351 	if (za->za_ttycommon.t_flags & TS_XCLUDE) printf(" t_fl:TS_XCLUDE");
   3352 	if (za->za_ttycommon.t_iflag & IGNBRK) printf(" t_ifl:IGNBRK");
   3353 	if (za->za_ttycommon.t_iflag & BRKINT) printf(" t_ifl:BRKINT");
   3354 	if (za->za_ttycommon.t_iflag & IGNPAR) printf(" t_ifl:IGNPAR");
   3355 	if (za->za_ttycommon.t_iflag & PARMRK) printf(" t_ifl:PARMRK");
   3356 	if (za->za_ttycommon.t_iflag & INPCK) printf(" t_ifl:INPCK");
   3357 	if (za->za_ttycommon.t_iflag & ISTRIP) printf(" t_ifl:ISTRIP");
   3358 	if (za->za_ttycommon.t_iflag & INLCR) printf(" t_ifl:INLCR");
   3359 	if (za->za_ttycommon.t_iflag & IGNCR) printf(" t_ifl:IGNCR");
   3360 	if (za->za_ttycommon.t_iflag & ICRNL) printf(" t_ifl:ICRNL");
   3361 	if (za->za_ttycommon.t_iflag & IUCLC) printf(" t_ifl:IUCLC");
   3362 	if (za->za_ttycommon.t_iflag & IXON) printf(" t_ifl:IXON");
   3363 	if (za->za_ttycommon.t_iflag & IXOFF) printf(" t_ifl:IXOFF");
   3364 
   3365 	printf("\n");
   3366 
   3367 
   3368 	if (za->za_ttycommon.t_cflag & CSIZE == CS5) printf(" t_cfl:CS5");
   3369 	if (za->za_ttycommon.t_cflag & CSIZE == CS6) printf(" t_cfl:CS6");
   3370 	if (za->za_ttycommon.t_cflag & CSIZE == CS7) printf(" t_cfl:CS7");
   3371 	if (za->za_ttycommon.t_cflag & CSIZE == CS8) printf(" t_cfl:CS8");
   3372 	if (za->za_ttycommon.t_cflag & CSTOPB) printf(" t_cfl:CSTOPB");
   3373 	if (za->za_ttycommon.t_cflag & CREAD) printf(" t_cfl:CREAD");
   3374 	if (za->za_ttycommon.t_cflag & PARENB) printf(" t_cfl:PARENB");
   3375 	if (za->za_ttycommon.t_cflag & PARODD) printf(" t_cfl:PARODD");
   3376 	if (za->za_ttycommon.t_cflag & HUPCL) printf(" t_cfl:HUPCL");
   3377 	if (za->za_ttycommon.t_cflag & CLOCAL) printf(" t_cfl:CLOCAL");
   3378 	printf(" t_stopc=%x", za->za_ttycommon.t_stopc);
   3379 	printf("\n");
   3380 }
   3381 #endif
   3382 
   3383 /*
   3384  * Check for abort character sequence
   3385  */
   3386 static boolean_t
   3387 abort_charseq_recognize(uchar_t ch)
   3388 {
   3389 	static int state = 0;
   3390 #define	CNTRL(c) ((c)&037)
   3391 	static char sequence[] = { '\r', '~', CNTRL('b') };
   3392 
   3393 	if (ch == sequence[state]) {
   3394 		if (++state >= sizeof (sequence)) {
   3395 			state = 0;
   3396 			return (B_TRUE);
   3397 		}
   3398 	} else {
   3399 		state = (ch == sequence[0]) ? 1 : 0;
   3400 	}
   3401 	return (B_FALSE);
   3402 }
   3403