xref: /titanic_50/usr/src/uts/sun/io/zs_common.c (revision 3db86aab554edbb4244c8d1a1c90f152eee768af)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 /*
28  *	Serial I/O driver for Z8530 chips
29  */
30 
31 #pragma ident	"%Z%%M%	%I%	%E% SMI"
32 
33 #include	<sys/types.h>
34 #include	<sys/param.h>
35 #include	<sys/systm.h>
36 #include	<sys/sysmacros.h>
37 #include	<sys/stropts.h>
38 #include	<sys/stream.h>
39 #include	<sys/stat.h>
40 #include	<sys/mkdev.h>
41 #include	<sys/cmn_err.h>
42 #include	<sys/errno.h>
43 #include	<sys/kmem.h>
44 #include	<sys/zsdev.h>
45 #include	<sys/debug.h>
46 #include	<sys/machsystm.h>
47 
48 #include	<sys/conf.h>
49 #include	<sys/sunddi.h>
50 #include	<sys/errno.h>
51 
52 #define	 ZS_TRACING
53 #ifdef  ZS_TRACING
54 #include <sys/vtrace.h>
55 
56 /*
57  * Temp tracepoint definitions
58  */
59 #define	TR_FAC_ZS		51
60 
61 #define	TR_ZS_H_INT_START	1
62 #define	TR_ZS_H_INT_END		2
63 #define	TR_ZS_INT_START		3
64 #define	TR_ZS_INT_END		4
65 
66 #define	TR_FAC_ZS_INT		52
67 #define	TR_READ_START		1
68 #define	TR_READ_END		2
69 
70 #endif  /* ZSH_TRACING */
71 
72 #define	KIOIP		KSTAT_INTR_PTR(zs->intrstats)
73 
74 #ifndef	MAXZS
75 #define	MAXZS		4
76 #endif
77 int maxzs = MAXZS;
78 
79 int nzs = 0;
80 
81 struct zscom *zscom;
82 struct zscom *zscurr;
83 struct zscom *zslast;
84 struct zs_prog *zs_prog;
85 char  *zssoftCAR;
86 int	zs_watchdog_count = 10;	/* countdown to determine if tx hung */
87 
88 int zs_drain_check = 15000000;		/* tunable: exit drain check time */
89 
90 #ifdef ZS_DEBUG
91 char zs_h_log[ZS_H_LOG_MAX +10];
92 int zs_h_log_n = 0;
93 #define	zs_h_log_add(c) \
94 	{ \
95 		if (zs_h_log_n >= ZS_H_LOG_MAX) \
96 			zs_h_log_n = 0; \
97 		zs_h_log[zs_h_log_n++] = c; \
98 		zs_h_log[zs_h_log_n] = '\0'; \
99 	}
100 
101 #else /* NO_ZS_DEBUG */
102 #define	zs_h_log_add(c)
103 #endif /* ZS_DEBUG */
104 
105 
106 /*
107  * Driver data
108  */
109 
110 #define	GETPROP(dip, str, defval) \
111 	ddi_getprop(DDI_DEV_T_ANY, (dip), DDI_PROP_DONTPASS, (str), (defval))
112 
113 int	zs_usec_delay = 1;
114 int	zssoftpend;
115 ddi_softintr_t zs_softintr_id;
116 time_t	default_dtrlow = 3;	/* hold dtr low nearly this long on close */
117 static ddi_iblock_cookie_t zs_iblock;
118 static ddi_iblock_cookie_t zs_hi_iblock;
119 static int zs_addedsoft = 0;
120 
121 
122 /*
123  * Driver information for auto-configuration stuff.
124  */
125 
126 static int zsprobe(dev_info_t *dev);
127 static int zsattach(dev_info_t *dev, ddi_attach_cmd_t cmd);
128 static int zsdetach(dev_info_t *dev, ddi_detach_cmd_t cmd);
129 void	zsopinit(struct zscom *zs, struct zsops *zso);
130 
131 static void zsnull_intr(struct zscom *zs);
132 static int zsnull_softint(struct zscom *zs);
133 static int zsnull_suspend(struct zscom *zs);
134 static int zsnull_resume(struct zscom *zs);
135 
136 struct zsops zsops_null = {
137 			zsnull_intr,
138 			zsnull_intr,
139 			zsnull_intr,
140 			zsnull_intr,
141 			zsnull_softint,
142 			zsnull_suspend,
143 			zsnull_resume
144 };
145 
146 extern struct streamtab asynctab;	/* default -- from zs_async.c */
147 
148 uint_t zs_high_intr(caddr_t argzs);
149 uint_t zsintr(caddr_t intarg);
150 
151 extern int zsc_info(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg,
152 void **result);
153 
154 extern int ddi_create_internal_pathname(dev_info_t *dip, char *name,
155     int spec_type, minor_t minor_num);
156 
157 extern struct streamtab zsstab;
158 int		zssoftpend;		/* soft interrupt pending */
159 kmutex_t	zs_soft_lock;		/* adapt.lock,to use to protect data */
160 					/* common to sev. streams or ports   */
161 kmutex_t	zs_curr_lock;		/* lock protecting zscurr */
162 
163 extern kcondvar_t lbolt_cv;
164 
165 /*
166  * curently the only spin lock level 12 for all ocasions
167  */
168 
169 #define	ZSS_CONF_FLAG   (D_NEW | D_MP)
170 
171 static  struct cb_ops cb_zs_ops = {
172 	nulldev,		/* cb_open */
173 	nulldev,		/* cb_close */
174 	nodev,			/* cb_strategy */
175 	nodev,			/* cb_print */
176 	nodev,			/* cb_dump */
177 	nodev,			/* cb_read */
178 	nodev,			/* cb_write */
179 	nodev,			/* cb_ioctl */
180 	nodev,			/* cb_devmap */
181 	nodev,			/* cb_mmap */
182 	nodev,			/* cb_segmap */
183 	nochpoll,		/* cb_chpoll */
184 	ddi_prop_op,		/* cb_prop_op */
185 	&asynctab,		/* cb_stream */
186 	(int)(ZSS_CONF_FLAG)	/* cb_flag */
187 };
188 
189 struct dev_ops zs_ops = {
190 	DEVO_REV,		/* devo_rev */
191 	0,			/* devo_refcnt */
192 	zsc_info,		/* devo_getinfo */
193 	nulldev,		/* devo_identify */
194 	zsprobe,		/* devo_probe */
195 	zsattach,		/* devo_attach */
196 	zsdetach,		/* devo_detach */
197 	nodev,			/* devo_reset */
198 	&cb_zs_ops,		/* devo_cb_ops */
199 	(struct bus_ops *)NULL,	/* devo_bus_ops */
200 	ddi_power		/* devo_power */
201 };
202 
203 
204 /*
205  * This is the loadable module wrapper.
206  */
207 
208 #include <sys/modctl.h>
209 
210 /*
211  * Module linkage information for the kernel.
212  */
213 
214 extern struct mod_ops mod_driverops;
215 
216 static struct modldrv modldrv = {
217 		&mod_driverops, /* Type of module.  This one is a driver */
218 		"Z8530 serial driver V%I%",
219 		&zs_ops,	/* driver ops */
220 };
221 
222 static struct modlinkage modlinkage = {
223 			MODREV_1, (void *)&modldrv, NULL
224 };
225 
226 int
227 _init(void)
228 {
229 	return (mod_install(&modlinkage));
230 }
231 
232 int
233 _fini(void)
234 {
235 	return (EBUSY);
236 }
237 
238 int
239 _info(struct modinfo *modinfop)
240 {
241 	return (mod_info(&modlinkage, modinfop));
242 }
243 
244 static int
245 zsprobe(dev_info_t *dev)
246 {
247 	struct zscc_device *zsaddr;
248 	int	rval;
249 	auto char	c;
250 
251 	rval = DDI_PROBE_FAILURE;
252 
253 	/*
254 	 * temporarily map in  registers
255 	 */
256 	if (ddi_map_regs(dev, 0, (caddr_t *)&zsaddr, 0, 0)) {
257 		cmn_err(CE_WARN, "zsprobe: unable to map registers");
258 		return (rval);
259 	}
260 
261 	/*
262 	 * NON-DDI Compliant call
263 	 */
264 	mon_clock_stop();
265 
266 	/*
267 	 * get in sync with the chip
268 	 */
269 
270 	if (ddi_peek8(dev, (char *)&zsaddr->zscc_control, &c) != DDI_SUCCESS) {
271 		goto out;
272 	}
273 	drv_usecwait(2);
274 
275 	/*
276 	 * The traditional test for the presence of an 8530 has been to write
277 	 * a 15 (octal 017) to its control register address, then read it back.
278 	 * A Z8530 will respond to this with the contents of Read-Register 15.
279 	 * If this address were memory, or something else, we would expect to
280 	 * see the 15 again.  Normally, the contents of RR15 will be entirely
281 	 * different.  A Z8530 does not use the D0 and D2 bits of register 15,
282 	 * so they should equal zero.  Compatable chips should do the same.
283 	 * Beware of "enhanced" SCC's that do not guarantee this.
284 	 */
285 	if (ddi_poke8(dev, (char *)&zsaddr->zscc_control, '\017')
286 	    != DDI_SUCCESS) {
287 		goto out;
288 	}
289 	drv_usecwait(2);
290 	if (ddi_peek8(dev, (char *)&zsaddr->zscc_control, &c) != DDI_SUCCESS) {
291 		goto out;
292 	}
293 	drv_usecwait(2);
294 	if (c & 5) {
295 		goto out;
296 	}
297 
298 	rval = DDI_PROBE_SUCCESS;
299 
300 out:
301 	/*
302 	 * NON-DDI Compliant call
303 	 */
304 	mon_clock_start();
305 
306 	ddi_unmap_regs(dev, 0, (caddr_t *)&zsaddr, 0, 0);
307 	return (rval);
308 }
309 
310 /*ARGSUSED*/
311 static int
312 zsattach(dev_info_t *dev, ddi_attach_cmd_t cmd)
313 {
314 	struct zscom	*zs;
315 	int		loops, i;
316 	uint_t		s;
317 	int		rtsdtr_bits = 0;
318 	char			softcd;
319 	uchar_t	rr;
320 	short			speed[2];
321 	int			current_chip = ddi_get_instance(dev);
322 	struct zscc_device	*tmpzs;		/* for mapping purposes */
323 	char name[16];
324 	int keyboard_prop;
325 
326 	switch (cmd) {
327 	case DDI_ATTACH:
328 		break;
329 
330 	case DDI_RESUME:
331 		zs = &zscom[current_chip*2];
332 		/*
333 		 * Try to resume first channel
334 		 */
335 		if (!zs->zs_resume || (zs->zs_resume)(zs) != DDI_SUCCESS)
336 			return (DDI_FAILURE);
337 		/*
338 		 * And the second channel
339 		 */
340 		zs++;
341 		if (!zs->zs_resume || (zs->zs_resume)(zs) != DDI_SUCCESS) {
342 			zs--;
343 			if (!zs->zs_suspend ||
344 			    (zs->zs_suspend)(zs) != DDI_SUCCESS)
345 				cmn_err(CE_WARN,
346 				    "zs: inconsistent suspend/resume state");
347 			return (DDI_FAILURE);
348 		}
349 		return (DDI_SUCCESS);
350 
351 	default:
352 		return (DDI_FAILURE);
353 	}
354 
355 	if (zscom == NULL) {
356 		mutex_init(&zs_soft_lock, NULL, MUTEX_DRIVER, (void *)ZS_PL);
357 		mutex_init(&zs_curr_lock, NULL, MUTEX_DRIVER, (void *)ZS_PL_HI);
358 		zscom = kmem_zalloc(maxzs * sizeof (struct zscom), KM_SLEEP);
359 		zs_prog = kmem_zalloc(maxzs * sizeof (struct zs_prog),
360 		    KM_SLEEP);
361 		zssoftCAR = kmem_zalloc(maxzs, KM_SLEEP);
362 		/* don't set nzs until arrays are allocated */
363 		membar_producer();
364 		nzs = maxzs;
365 		zscurr = &zscom[(current_chip*2) + 1];
366 		zslast = &zscom[current_chip*2];
367 		i = GETPROP(dev, "zs-usec-delay", 0);
368 		zs_usec_delay = (i <= 0) ? 1 : i;
369 	}
370 
371 	if (2 * current_chip >=  maxzs) {
372 		cmn_err(CE_WARN,
373 		    "zs: unable to allocate resources for  chip %d.",
374 		    current_chip);
375 		cmn_err(CE_WARN, "Change zs:maxzs in /etc/system");
376 		return (DDI_FAILURE);
377 	}
378 	zs = &zscom[current_chip*2];
379 
380 	/*
381 	 * map in the device registers
382 	 */
383 	if (ddi_map_regs(dev, 0, (caddr_t *)&zs->zs_addr, 0, 0)) {
384 		cmn_err(CE_WARN, "zs%d: unable to map registers\n",
385 		    current_chip);
386 		return (DDI_FAILURE);
387 	}
388 
389 	tmpzs = zs->zs_addr;
390 
391 	/*
392 	 * Non-DDI compliant Sun-Ness specfic call(s)
393 	 */
394 
395 	/*
396 	 * Stop the monitor's polling interrupt.
397 	 *
398 	 * I know that this is not exactly obvious. On all sunmon PROM
399 	 * machines, the PROM has can have a high level periodic clock
400 	 * interrupt going at this time. It uses this periodic interrupt
401 	 * to poll the console tty or kbd uart to check for things like
402 	 * BREAK or L1-A (abort). While we're probing this device out we
403 	 * have to shut that off so the PROM won't get confused by what
404 	 * we're doing to the zs. This has caused some pretty funny bugs
405 	 * in its time.
406 	 *
407 	 * For OPENPROM machines, the prom  takes level12 interrupts directly,
408 	 * but we call this routine anyway (I forget why).
409 	 */
410 	mon_clock_stop();
411 
412 	/*
413 	 * Go critical to keep uart from urking.
414 	 */
415 	s = ddi_enter_critical();
416 
417 	/*
418 	 * We are about to issue a full reset to this chip.
419 	 * First, now that interrupts are blocked, we will delay up to a
420 	 * half-second, checking both channels for any stray activity.
421 	 * Next we will preserve the time constants from both channels,
422 	 * so that they can be restored after the reset.  This is especially
423 	 * important for the console device.  Finally, do the reset and
424 	 * follow it with an extended recovery while the chip settles down.
425 	 */
426 	for (loops = 0; loops++ <= 500; DELAY(1000)) {
427 		SCC_READA(1, rr);
428 		if ((rr & ZSRR1_ALL_SENT) == 0) continue;
429 		SCC_READB(1, rr);
430 		if ((rr & ZSRR1_ALL_SENT) == 0) continue;
431 		SCC_READA(0, rr);
432 		if ((rr & ZSRR0_TX_READY) == 0) continue;
433 		SCC_READB(0, rr);
434 		if ((rr & ZSRR0_TX_READY) != 0) break;
435 	}
436 
437 	SCC_READA(12, speed[0]);
438 	SCC_READA(13, rr);
439 	speed[0] |= rr << 8;
440 	SCC_READB(12, speed[1]);
441 	SCC_READB(13, rr);
442 	speed[1] |= rr << 8;
443 
444 	SCC_WRITE(9, ZSWR9_RESET_WORLD);
445 	DELAY(10);
446 
447 	/*
448 	 * Set up the other components of the zscom structs for this chip.
449 	 */
450 	for (i = 0; i < 2; i++) {
451 		/*
452 		 * Property for ignoring DCD.
453 		 * We switch between 'a' and 'b' ports for this device.
454 		 */
455 		static char *prop = "port-a-ignore-cd";
456 
457 		/*
458 		 * For this channel, set the hardware address, allocate the
459 		 * high-level mutex, and update the zscurr pointer.
460 		 * The high-level lock is shared by both channels because
461 		 * 8530 register addressing is non-atomic and asymetrical.
462 		 * Multiple threads crossing paths during this operation
463 		 * could trash the chip, and thus, possibly the system console.
464 		 */
465 		if (i == 0) {		/* port A */
466 			zs->zs_addr = (struct zscc_device *)
467 			    ((uintptr_t)tmpzs | ZSOFF);
468 			(zs+1)->zs_excl_hi = zs->zs_excl_hi = &zs_curr_lock;
469 		} else {		/* port B */
470 			zs++;
471 			zs->zs_addr = (struct zscc_device *)
472 			    ((uintptr_t)tmpzs & ~ZSOFF);
473 			zscurr = zs;
474 		}
475 		zs->zs_unit = current_chip * 2 + i;
476 		zs->zs_dip = dev;
477 		zs->zs_excl = kmem_zalloc(sizeof (kmutex_t), KM_SLEEP);
478 		mutex_init(zs->zs_excl, NULL, MUTEX_DRIVER, (void *)ZS_PL);
479 		zs->zs_ocexcl = kmem_zalloc(sizeof (kmutex_t), KM_SLEEP);
480 		mutex_init(zs->zs_ocexcl, NULL, MUTEX_DRIVER, (void *)ZS_PL);
481 
482 		zsopinit(zs, &zsops_null);
483 
484 		prop[5] = 'a' + i;
485 		softcd = GETPROP((dev_info_t *)(dev), prop, 0);
486 		zssoftCAR[zs->zs_unit] = softcd;
487 		if (softcd)
488 			rtsdtr_bits = ZSWR5_RTS | ZSWR5_DTR;
489 
490 		keyboard_prop = GETPROP((dev_info_t *)(zs->zs_dip),
491 		    "keyboard", 0);
492 
493 		mutex_enter(&zs_curr_lock);
494 
495 		/*
496 		 * Set up the default asynch modes
497 		 * so the monitor will still work
498 		 */
499 		SCC_WRITE(4, ZSWR4_PARITY_EVEN | ZSWR4_1_STOP | ZSWR4_X16_CLK);
500 		SCC_WRITE(3, ZSWR3_RX_8);
501 		SCC_WRITE(11, ZSWR11_TXCLK_BAUD | ZSWR11_RXCLK_BAUD);
502 		SCC_WRITE(12, (speed[i] & 0xff));
503 		SCC_WRITE(13, (speed[i] >> 8) & 0xff);
504 		SCC_WRITE(14, ZSWR14_BAUD_FROM_PCLK);
505 		SCC_WRITE(3, ZSWR3_RX_8 | ZSWR3_RX_ENABLE);
506 		SCC_WRITE(5, ZSWR5_TX_ENABLE | ZSWR5_TX_8 | rtsdtr_bits);
507 		SCC_WRITE(14, ZSWR14_BAUD_ENA | ZSWR14_BAUD_FROM_PCLK);
508 
509 		/*
510 		 * The SYNC pin on the second SCC (keyboard & mouse) may not
511 		 * be connected and noise creates transitions on this line.
512 		 * This floods the system with interrupts, unless the
513 		 * Sync/Hunt Interrupt Enable is cleared.  So write
514 		 * register 15 with everything we need but that one.
515 		 */
516 		if (keyboard_prop) {
517 			SCC_WRITE(15, ZSR15_BREAK | ZSR15_TX_UNDER |
518 			    ZSR15_CTS | ZSR15_CD);
519 		}
520 
521 		SCC_WRITE0(ZSWR0_RESET_ERRORS);
522 		SCC_WRITE0(ZSWR0_RESET_STATUS);
523 		mutex_exit(&zs_curr_lock);
524 
525 		zs->zs_dtrlow = gethrestime_sec() - default_dtrlow;
526 		cv_init(&zs->zs_flags_cv, NULL, CV_DEFAULT, NULL);
527 		zsa_init(zs);
528 	}
529 
530 	mutex_enter(&zs_curr_lock);
531 	SCC_WRITE(9, ZSWR9_MASTER_IE | ZSWR9_VECTOR_INCL_STAT);
532 	DELAY(4000);
533 	mutex_exit(&zs_curr_lock);
534 
535 	/*
536 	 * Two levels of interrupt - chip interrupts at a high level (12),
537 	 * (which is seen below as zs_high_intr), and then as a secondary
538 	 * stage soft interrupt as seen in zsintr below.
539 	 *
540 	 * Because zs_high_intr does a window save, as well as calls to
541 	 * other functions, we cannot install it as a "fast" interrupt
542 	 * that would execute right out of the trap window.  Too bad...
543 	 */
544 	if (ddi_add_intr(dev, (uint_t)0, &zs_hi_iblock,
545 	    (ddi_idevice_cookie_t *)0, zs_high_intr,
546 	    (caddr_t)0) != DDI_SUCCESS) {
547 		cmn_err(CE_PANIC, "cannot set high level zs interrupt");
548 		/*NOTREACHED*/
549 	}
550 
551 	if (zs_addedsoft == 0) {
552 		if (ddi_add_softintr(dev, DDI_SOFTINT_HIGH, &zs_softintr_id,
553 		    &zs_iblock, (ddi_idevice_cookie_t *)0,
554 		    zsintr, (caddr_t)0) != DDI_SUCCESS) {
555 			cmn_err(CE_PANIC,
556 				"cannot set second stage zs interrupt");
557 			/*NOTREACHED*/
558 		}
559 
560 		zs_addedsoft++;	/* we only need one zsintr! */
561 	}
562 
563 	if (zs > zslast)
564 		zslast = zs;
565 
566 	(void) ddi_exit_critical(s);
567 
568 	/*
569 	 * Non-DDI compliant Sun-Ness specific call
570 	 */
571 	mon_clock_start();	/* re-enable monitor's polling interrupt */
572 
573 	if (!GETPROP(zs->zs_dip, "keyboard", 0)) {
574 		static char *serial_line = DDI_NT_SERIAL_MB;
575 		static char *dial_out = DDI_NT_SERIAL_MB_DO;
576 
577 		/*
578 		 * Export names for channel a or b consconfig match...
579 		 * The names exported to the filesystem include the
580 		 * designated tty'a' type name and may not match the PROM
581 		 * pathname.
582 		 * Note the special name "obp-console-name" used in these calls.
583 		 * This keeps the ports and devlinks programs from seeing these
584 		 * names. (But allows ddi_pathname_to_dev_t to see them.)
585 		 * We don't need to do this if the instance number is zero,
586 		 * because we'll create them below, in this case.
587 		 */
588 
589 		if (ddi_get_instance(dev) != 0)  {
590 
591 			/*
592 			 * Select a node type unused by ddi/devfs
593 			 */
594 			static char *obp_type = "obp-console-name";
595 
596 			(void) strcpy(name, "a");
597 			if (ddi_create_minor_node(dev, name, S_IFCHR,
598 			    ddi_get_instance(dev) * 2,
599 			    obp_type, NULL) == DDI_FAILURE) {
600 				ddi_remove_minor_node(dev, NULL);
601 				return (DDI_FAILURE);
602 			}
603 			(void) strcpy(name, "b");
604 			if (ddi_create_minor_node(dev, name, S_IFCHR,
605 			    (ddi_get_instance(dev) * 2) + 1,
606 			    obp_type, NULL) == DDI_FAILURE) {
607 				ddi_remove_minor_node(dev, NULL);
608 				return (DDI_FAILURE);
609 			}
610 		}
611 
612 		/*
613 		 * Export normal device names...
614 		 */
615 		(void) sprintf(name, "%c", (ddi_get_instance(dev) + 'a'));
616 		if (ddi_create_minor_node(dev, name, S_IFCHR,
617 		    ddi_get_instance(dev) * 2,
618 		    serial_line, NULL) == DDI_FAILURE) {
619 			ddi_remove_minor_node(dev, NULL);
620 			return (DDI_FAILURE);
621 		}
622 		(void) sprintf(name, "%c", (ddi_get_instance(dev) + 'b'));
623 		if (ddi_create_minor_node(dev, name, S_IFCHR,
624 		    (ddi_get_instance(dev) * 2) + 1,
625 		    serial_line, NULL) == DDI_FAILURE) {
626 			ddi_remove_minor_node(dev, NULL);
627 			return (DDI_FAILURE);
628 		}
629 		(void) sprintf(name, "%c,cu", (ddi_get_instance(dev) + 'a'));
630 		if (ddi_create_minor_node(dev, name, S_IFCHR,
631 		    (ddi_get_instance(dev) * 2) | OUTLINE,
632 		    dial_out, NULL) == DDI_FAILURE) {
633 			ddi_remove_minor_node(dev, NULL);
634 			return (DDI_FAILURE);
635 		}
636 		(void) sprintf(name, "%c,cu", (ddi_get_instance(dev) + 'b'));
637 		if (ddi_create_minor_node(dev, name, S_IFCHR,
638 		    ((ddi_get_instance(dev)  * 2) + 1) | OUTLINE,
639 		    dial_out, NULL) == DDI_FAILURE) {
640 			ddi_remove_minor_node(dev, NULL);
641 			return (DDI_FAILURE);
642 		}
643 	} else {
644 
645 		/*
646 		 * Create keyboard and mouse nodes which devfs doesn't see
647 		 */
648 
649 		/*
650 		 * This set of minor nodes is for use with the consconfig_dacf
651 		 * module for the sun4u platforms.  (See PSARC/1998/212)
652 		 */
653 		if (ddi_create_internal_pathname(dev, "keyboard", S_IFCHR,
654 		    ddi_get_instance(dev) * 2) == DDI_FAILURE) {
655 			ddi_remove_minor_node(dev, NULL);
656 			return (DDI_FAILURE);
657 		}
658 
659 		if (ddi_create_internal_pathname(dev, "mouse", S_IFCHR,
660 		    (ddi_get_instance(dev) * 2) + 1) == DDI_FAILURE) {
661 			ddi_remove_minor_node(dev, NULL);
662 			return (DDI_FAILURE);
663 		}
664 
665 		/*
666 		 * These minor nodes are for use with pre-sun4u platforms.
667 		 * Either one set or the other will be opened by consconfig.
668 		 */
669 		(void) strcpy(name, "a");
670 		if (ddi_create_internal_pathname(dev, name, S_IFCHR,
671 			ddi_get_instance(dev) * 2) == DDI_FAILURE) {
672 			ddi_remove_minor_node(dev, NULL);
673 			return (DDI_FAILURE);
674 		}
675 
676 		(void) strcpy(name, "b");
677 		if (ddi_create_internal_pathname(dev, name, S_IFCHR,
678 			(ddi_get_instance(dev) * 2) + 1) == DDI_FAILURE) {
679 			ddi_remove_minor_node(dev, NULL);
680 			return (DDI_FAILURE);
681 		}
682 
683 	}
684 
685 	ddi_report_dev(dev);
686 	/*
687 	 * Initialize power management bookkeeping; components are
688 	 * created idle.
689 	 */
690 	if (pm_create_components(dev, 3) == DDI_SUCCESS) {
691 		(void) pm_busy_component(dev, 0);
692 		pm_set_normal_power(dev, 0, 1);
693 		pm_set_normal_power(dev, 1, 1);
694 		pm_set_normal_power(dev, 2, 1);
695 	} else {
696 		return (DDI_FAILURE);
697 	}
698 
699 	(void) sprintf(name, "zsc%d", current_chip);
700 	zs->intrstats = kstat_create("zs", current_chip, name, "controller",
701 		KSTAT_TYPE_INTR, 1, KSTAT_FLAG_PERSISTENT);
702 	if (zs->intrstats) {
703 		kstat_install(zs->intrstats);
704 	}
705 
706 	return (DDI_SUCCESS);
707 }
708 
709 static int
710 zsdetach(dev_info_t *dev, ddi_detach_cmd_t cmd)
711 {
712 	struct zscom *zs;
713 	int	current_chip = ddi_get_instance(dev);
714 
715 	switch (cmd) {
716 	case DDI_DETACH:
717 		return (DDI_FAILURE);
718 
719 	case DDI_SUSPEND:
720 		zs = &zscom[current_chip*2];
721 		/*
722 		 * Try to suspend first channel
723 		 */
724 		if (!zs->zs_suspend || (zs->zs_suspend)(zs) != DDI_SUCCESS)
725 			return (DDI_FAILURE);
726 		/*
727 		 * And the second channel
728 		 */
729 		zs++;
730 		if (!zs->zs_suspend || (zs->zs_suspend)(zs) != DDI_SUCCESS) {
731 			zs--;
732 			if (!zs->zs_resume ||
733 			    (zs->zs_resume)(zs) != DDI_SUCCESS)
734 				cmn_err(CE_WARN,
735 				    "zs: inconsistent suspend/resume state");
736 			return (DDI_FAILURE);
737 		}
738 		return (DDI_SUCCESS);
739 
740 	default:
741 		return (DDI_FAILURE);
742 	}
743 }
744 
745 /*
746  * SCC High Level Interrupt Handler
747  *
748  * This routine fields the level 12 interrupts generated by the 8530 chips.
749  * When the SCC interrupts the conditions that triggered it are available
750  * for reference in Read Register 3 of the A channel (RR3A).  We process
751  * all the pending interrupts before returning.  The maximum interrupts
752  * that will be processed before returning is set to 6, which is twice
753  * the size of RX-FIFO.
754  * We keep a pointer to the B side of the most recently interrupting chip
755  * in zscurr.
756  */
757 
758 /*
759  * 'argzs' actually 'struct zscom *argzs'
760  */
761 
762 #define	ZSRR3_INT_PENDING (ZSRR3_IP_B_STAT | ZSRR3_IP_B_TX | ZSRR3_IP_B_RX |\
763 			ZSRR3_IP_A_STAT | ZSRR3_IP_A_TX | ZSRR3_IP_A_RX)
764 
765 #define	ZSRR1_ANY_ERRORS (ZSRR1_PE | ZSRR1_DO | ZSRR1_FE | ZSRR1_RXEOF)
766 #define	ZS_HIGH_INTR_LOOPLIMIT 6
767 
768 /*ARGSUSED*/
769 uint_t
770 zs_high_intr(caddr_t argzs)
771 {
772 	struct zscom	*zs;
773 	uchar_t	stat, isource, count;
774 	int		unit;
775 
776 	TRACE_0(TR_FAC_ZS, TR_ZS_H_INT_START, "zs_h_int start");
777 	mutex_enter(&zs_curr_lock);
778 	zs = zscurr;				/* Points at Channel B */
779 
780 	ZSNEXTPOLL(zs, zscurr);
781 
782 	SCC_READA(3, isource);
783 start_zs_h:
784 	count = ZS_HIGH_INTR_LOOPLIMIT;
785 	while ((isource & ZSRR3_INT_PENDING) && (count--)) {
786 		if (isource & ZSRR3_IP_B_STAT)
787 			(zs->zs_xsint)(zs);
788 		else {
789 			if (isource & ZSRR3_IP_B_TX)
790 				(zs->zs_txint)(zs);
791 			if (isource & ZSRR3_IP_B_RX) {
792 				SCC_READ(1, stat);
793 				if (stat & ZSRR1_ANY_ERRORS)
794 					(zs->zs_srint)(zs);
795 				else if ((SCC_READ0()) & ZSRR0_RX_READY)
796 					(zs->zs_rxint)(zs);
797 			}
798 		}
799 
800 		zs -= 1;
801 		if (isource & ZSRR3_IP_A_STAT)
802 			(zs->zs_xsint)(zs);
803 		else {
804 			if (isource & ZSRR3_IP_A_TX)
805 				(zs->zs_txint)(zs);
806 			if (isource & ZSRR3_IP_A_RX) {
807 				SCC_READ(1, stat);
808 				if (stat & ZSRR1_ANY_ERRORS)
809 					(zs->zs_srint)(zs);
810 				else if ((SCC_READ0()) & ZSRR0_RX_READY)
811 					(zs->zs_rxint)(zs);
812 			}
813 		}
814 
815 		zs = zscurr;
816 		SCC_READA(3, isource);
817 	}
818 
819 	if (count == ZS_HIGH_INTR_LOOPLIMIT) {
820 		unit = (nzs >> 1) - 1;
821 		while (unit--) {
822 			zs += 2;	/* Always Channel B */
823 			if (zs > zslast)
824 				zs = &zscom[1];
825 			if (!zs->zs_ops)
826 				continue;
827 			SCC_READA(3, isource);
828 			if (isource & ZSRR3_INT_PENDING) {
829 				zscurr = zs;	/* update zscurr and */
830 				goto start_zs_h;
831 			}
832 		}
833 		if (zs->intrstats) {
834 			KIOIP->intrs[KSTAT_INTR_HARD]++;
835 		}
836 		mutex_exit(&zs_curr_lock);
837 		TRACE_0(TR_FAC_ZS, TR_ZS_H_INT_END, "zs_h_int end");
838 		return (DDI_INTR_UNCLAIMED);	/* Must not be for us. */
839 	}
840 	if (zs->intrstats) {
841 		KIOIP->intrs[KSTAT_INTR_HARD]++;
842 	}
843 	mutex_exit(&zs_curr_lock);	/* we're done with zscurr */
844 	TRACE_0(TR_FAC_ZS, TR_ZS_H_INT_END, "zs_h_int end");
845 	return (DDI_INTR_CLAIMED);
846 }
847 
848 /*
849  * Handle a second-stage interrupt.
850  */
851 /*ARGSUSED*/
852 uint_t
853 zsintr(caddr_t intarg)
854 {
855 	struct zscom *zs;
856 	int    rv;
857 
858 	/*
859 	 * Test and clear soft interrupt.
860 	 */
861 	TRACE_0(TR_FAC_ZS, TR_ZS_INT_START,
862 	    "zs_int start");
863 
864 	mutex_enter(&zs_curr_lock);
865 	rv = zssoftpend;
866 	if (rv != 0) {
867 		zssoftpend = 0;
868 	}
869 	mutex_exit(&zs_curr_lock);
870 
871 	if (rv) {
872 		for (zs = &zscom[0]; zs <= zslast; zs++) {
873 			if (zs->zs_flags & ZS_NEEDSOFT) {
874 				zs->zs_flags &= ~ZS_NEEDSOFT;
875 				(*zs->zs_ops->zsop_softint)(zs);
876 				if (zs->intrstats) {
877 					KIOIP->intrs[KSTAT_INTR_SOFT]++;
878 				}
879 			}
880 		}
881 	}
882 	TRACE_0(TR_FAC_ZS, TR_ZS_INT_END,
883 	    "zs_int end");
884 	return (rv);
885 }
886 
887 void
888 setzssoft(void)
889 {
890 	ddi_trigger_softintr(zs_softintr_id);
891 }
892 
893 /*
894  * Install a new ops vector into low level vector routine addresses
895  */
896 void
897 zsopinit(struct zscom *zs, struct zsops *zso)
898 {
899 	zs->zs_txint	= zso->zsop_txint;
900 	zs->zs_xsint	= zso->zsop_xsint;
901 	zs->zs_rxint	= zso->zsop_rxint;
902 	zs->zs_srint	= zso->zsop_srint;
903 	zs->zs_suspend	= zso->zsop_suspend;
904 	zs->zs_resume	= zso->zsop_resume;
905 	zs->zs_ops	= zso;
906 	zs->zs_flags	= 0;
907 }
908 
909 /*
910  * Set or get the modem control status.
911  *
912  * This routine relies on the fact that the bits of interest in RR0 (CD and
913  * CTS) do not overlap the bits of interest in WR5 (RTS and DTR).  Thus, they
914  * can be combined into a single 'int' without harm.
915  */
916 int
917 zsmctl(struct zscom *zs, int bits, int how)
918 {
919 	int mbits, obits;
920 	time_t now, held;
921 
922 	ASSERT(mutex_owned(zs->zs_excl_hi));
923 	ASSERT(mutex_owned(zs->zs_excl));
924 
925 again:
926 	mbits = zs->zs_wreg[5] & (ZSWR5_RTS|ZSWR5_DTR);
927 	SCC_WRITE0(ZSWR0_RESET_STATUS);
928 	mbits |= SCC_READ0() & (ZSRR0_CD|ZSRR0_CTS);
929 	ZSDELAY();
930 	obits = mbits;
931 
932 	switch (how) {
933 
934 	case DMSET:
935 		mbits = bits;
936 		break;
937 
938 	case DMBIS:
939 		mbits |= bits;
940 		break;
941 
942 	case DMBIC:
943 		mbits &= ~bits;
944 		break;
945 
946 	case DMGET:
947 		return (mbits);
948 	}
949 
950 	now = gethrestime_sec();
951 	held = now - zs->zs_dtrlow;
952 
953 	/*
954 	 * if DTR is going low, stash current time away
955 	 */
956 	if (~mbits & obits & ZSWR5_DTR)
957 		zs->zs_dtrlow = now;
958 
959 	/*
960 	 * if DTR is going high, sleep until it has been low a bit
961 	 */
962 	if ((mbits & ~obits & ZSWR5_DTR) && (held < default_dtrlow)) {
963 		mutex_exit(zs->zs_excl_hi);
964 		cv_wait(&lbolt_cv, zs->zs_excl);
965 		if (zs->zs_suspended)
966 			(void) ddi_dev_is_needed(zs->zs_dip, 0, 1);
967 		mutex_enter(zs->zs_excl_hi);
968 		goto again;
969 	}
970 
971 	zs->zs_wreg[5] &= ~(ZSWR5_RTS|ZSWR5_DTR);
972 	SCC_BIS(5, mbits & (ZSWR5_RTS|ZSWR5_DTR));
973 	return (mbits);
974 }
975 
976 /*
977  * Program the Z8530 registers.
978  */
979 void
980 zs_program(struct zs_prog *zspp)
981 {
982 	struct zscom *zs = zspp->zs;
983 	int	loops;
984 	uchar_t	c;
985 	uchar_t wr10 = 0, wr14 = 0;
986 
987 	ASSERT(mutex_owned(zs->zs_excl));
988 	ASSERT(mutex_owned(zs->zs_excl_hi));
989 
990 	/*
991 	 * There are some special cases to account for before reprogramming.
992 	 * We might be transmitting, so delay 100,000 usec (worst case at 110
993 	 * baud) for this to finish, then disable the receiver until later,
994 	 * reset the External Status Change latches and the error bits, and
995 	 * drain the receive FIFO.
996 	 * XXX: Doing any kind of reset (WR9) here causes trouble!
997 	 */
998 	if (zspp->flags & ZSP_SYNC) {
999 		SCC_WRITE(7, SDLCFLAG);
1000 		wr10 = ZSWR10_PRESET_ONES;
1001 		if (zspp->flags & ZSP_NRZI)
1002 			wr10 |= ZSWR10_NRZI;
1003 		SCC_WRITE(10, wr10);
1004 	} else {
1005 		for (loops = 1000; loops > 0; --loops) {
1006 			SCC_READ(1, c);
1007 			if (c & ZSRR1_ALL_SENT)
1008 				break;
1009 			DELAY(100);
1010 		}
1011 		SCC_WRITE(3, 0);
1012 		SCC_WRITE0(ZSWR0_RESET_STATUS);
1013 		SCC_WRITE0(ZSWR0_RESET_ERRORS);
1014 		c = SCC_READDATA();		/* Empty the FIFO */
1015 		c = SCC_READDATA();
1016 		c = SCC_READDATA();
1017 	}
1018 
1019 	/*
1020 	 * Programming the SCC is done in three phases.
1021 	 * Phase one sets operating modes:
1022 	 */
1023 	SCC_WRITE(4, zspp->wr4);
1024 	SCC_WRITE(11, zspp->wr11);
1025 	SCC_WRITE(12, zspp->wr12);
1026 	SCC_WRITE(13, zspp->wr13);
1027 	if (zspp->flags & ZSP_PLL) {
1028 		SCC_WRITE(14, ZSWR14_DPLL_SRC_BAUD);
1029 		SCC_WRITE(14, ZSWR14_DPLL_NRZI);
1030 	} else
1031 		SCC_WRITE(14, ZSWR14_DPLL_DISABLE);
1032 
1033 	/*
1034 	 * Phase two enables special hardware functions:
1035 	 */
1036 	wr14 = ZSWR14_BAUD_FROM_PCLK | ZSWR14_BAUD_ENA;
1037 	if (zspp->flags & ZSP_LOOP)
1038 		wr14 |= ZSWR14_LOCAL_LOOPBACK;
1039 	if (zspp->flags & ZSP_ECHO)
1040 		wr14 |= ZSWR14_AUTO_ECHO;
1041 	SCC_WRITE(14, wr14);
1042 	SCC_WRITE(3, zspp->wr3);
1043 	SCC_WRITE(5, zspp->wr5);
1044 
1045 	SCC_WRITE0(ZSWR0_RESET_TXCRC);
1046 
1047 	if (zspp->flags & ZSP_PARITY_SPECIAL) {
1048 		SCC_WRITE(1, ZSWR1_PARITY_SPECIAL);
1049 	} else {
1050 		SCC_WRITE(1, 0);
1051 	}
1052 
1053 	/*
1054 	 * Phase three enables interrupt sources:
1055 	 */
1056 	SCC_WRITE(15, zspp->wr15);
1057 	SCC_WRITE0(ZSWR0_RESET_STATUS);
1058 	SCC_WRITE0(ZSWR0_RESET_ERRORS);
1059 	SCC_BIS(1, ZSWR1_INIT);
1060 }
1061 
1062 static void
1063 zsnull_intr(struct zscom *zs)
1064 {
1065 	short	c;
1066 
1067 	SCC_WRITE0(ZSWR0_RESET_TXINT);
1068 	SCC_WRITE0(ZSWR0_RESET_STATUS);
1069 	c = SCC_READDATA();
1070 	ZSDELAY();
1071 #ifdef lint
1072 	c = c;
1073 #endif /* lint */
1074 	SCC_WRITE0(ZSWR0_RESET_ERRORS);
1075 }
1076 
1077 static int
1078 zsnull_softint(struct zscom *zs)
1079 {
1080 	cmn_err(CE_WARN, "zs%d: unexpected soft int\n", zs->zs_unit);
1081 	return (0);
1082 }
1083 
1084 /*
1085  * These will be called on suspend/resume for un-opened zs ports.
1086  */
1087 static int
1088 zsnull_suspend(struct zscom *zs)
1089 {
1090 	struct zs_prog	*zspp = &zs_prog[zs->zs_unit];
1091 
1092 	/*
1093 	 * Get a copy of the current registers
1094 	 */
1095 	mutex_enter(zs->zs_excl);
1096 	mutex_enter(zs->zs_excl_hi);
1097 	zspp->zs = zs;
1098 	zspp->flags = 0;
1099 	zspp->wr3 = zs->zs_wreg[3];
1100 	zspp->wr4 = zs->zs_wreg[4];
1101 	zspp->wr5 = zs->zs_wreg[5];
1102 	zspp->wr11 = zs->zs_wreg[11];
1103 	zspp->wr12 = zs->zs_wreg[12];
1104 	zspp->wr13 = zs->zs_wreg[13];
1105 	zspp->wr15 = zs->zs_wreg[15];
1106 	mutex_exit(zs->zs_excl_hi);
1107 	mutex_exit(zs->zs_excl);
1108 
1109 	return (DDI_SUCCESS);
1110 }
1111 
1112 static int
1113 zsnull_resume(struct zscom *zs)
1114 {
1115 	struct zs_prog	*zspp = &zs_prog[zs->zs_unit];
1116 
1117 	/*
1118 	 * Restore registers
1119 	 */
1120 	mutex_enter(zs->zs_excl);
1121 	mutex_enter(zs->zs_excl_hi);
1122 	zs_program(zspp);
1123 	SCC_WRITE(9, ZSWR9_MASTER_IE);
1124 	DELAY(4000);
1125 	mutex_exit(zs->zs_excl_hi);
1126 	mutex_exit(zs->zs_excl);
1127 	return (DDI_SUCCESS);
1128 }
1129