xref: /titanic_41/usr/src/uts/sun/io/zs_async.c (revision f3312ec0e8acbd249df97358fb8c3ca92f4e089c)
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