xref: /netbsd-src/sys/dev/marvell/gtmpsc.c (revision 7fa608457b817eca6e0977b37f758ae064f3c99c)
1 /*	$NetBSD: gtmpsc.c,v 1.26 2007/10/19 12:00:33 ad Exp $	*/
2 
3 /*
4  * Copyright (c) 2002 Allegro Networks, Inc., Wasabi Systems, Inc.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. All advertising materials mentioning features or use of this software
16  *    must display the following acknowledgement:
17  *      This product includes software developed for the NetBSD Project by
18  *      Allegro Networks, Inc., and Wasabi Systems, Inc.
19  * 4. The name of Allegro Networks, Inc. may not be used to endorse
20  *    or promote products derived from this software without specific prior
21  *    written permission.
22  * 5. The name of Wasabi Systems, Inc. may not be used to endorse
23  *    or promote products derived from this software without specific prior
24  *    written permission.
25  *
26  * THIS SOFTWARE IS PROVIDED BY ALLEGRO NETWORKS, INC. AND
27  * WASABI SYSTEMS, INC. ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
28  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
29  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
30  * IN NO EVENT SHALL EITHER ALLEGRO NETWORKS, INC. OR WASABI SYSTEMS, INC.
31  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37  * POSSIBILITY OF SUCH DAMAGE.
38  */
39 
40 /*
41  * mpsc.c - MPSC serial driver, supports UART mode only
42  *
43  *
44  * creation	Mon Apr  9 19:40:15 PDT 2001	cliff
45  */
46 
47 #include <sys/cdefs.h>
48 __KERNEL_RCSID(0, "$NetBSD: gtmpsc.c,v 1.26 2007/10/19 12:00:33 ad Exp $");
49 
50 #include "opt_kgdb.h"
51 
52 #include <sys/param.h>
53 #include <sys/conf.h>
54 #include <sys/device.h>
55 #include <sys/kauth.h>
56 #include <sys/proc.h>
57 #include <sys/systm.h>
58 #include <sys/tty.h>
59 #include <sys/callout.h>
60 #include <sys/fcntl.h>
61 #include <sys/intr.h>
62 #ifdef KGDB
63 #include <sys/kernel.h>
64 #include <sys/kgdb.h>
65 #endif
66 
67 #include <uvm/uvm_extern.h>
68 
69 #include <powerpc/atomic.h>
70 #include <dev/cons.h>
71 #include <sys/bus.h>
72 #include <sys/cpu.h>		/* for DELAY */
73 #include <machine/stdarg.h>
74 #include "gtmpsc.h"
75 
76 
77 #include <dev/marvell/gtreg.h>
78 #include <dev/marvell/gtvar.h>
79 #include <dev/marvell/gtintrreg.h>
80 #include <dev/marvell/gtmpscreg.h>
81 #include <dev/marvell/gtsdmareg.h>
82 #include <dev/marvell/gtmpscvar.h>
83 #include <dev/marvell/gtbrgreg.h>
84 
85 /*
86  * XXX these delays were derived empiracaly
87  */
88 #define GTMPSC_POLL_DELAY	1	/* 1 usec */
89 /*
90  * Wait 2 characters time for RESET_DELAY
91  */
92 #define GTMPSC_RESET_DELAY	(2*8*1000000 / GT_MPSC_DEFAULT_BAUD_RATE)
93 
94 #define BURSTLEN 128
95 
96 /*
97  * stat values for gtmpsc_common_pollc
98  */
99 #define GTMPSC_STAT_NONE	0
100 #define GTMPSC_STAT_BREAK	1
101 
102 
103 #define PRINTF(x)	gtmpsc_mem_printf x
104 
105 #if defined(DEBUG)
106 unsigned int gtmpsc_debug = 0;
107 # define STATIC
108 # define DPRINTF(x)	do { if (gtmpsc_debug) gtmpsc_mem_printf x ; } while (0)
109 #else
110 # define STATIC static
111 # define DPRINTF(x)
112 #endif
113 
114 #define GTMPSCUNIT_MASK    0x7ffff
115 #define GTMPSCDIALOUT_MASK 0x80000
116 
117 #define GTMPSCUNIT(x)      (minor(x) & GTMPSCUNIT_MASK)
118 #define GTMPSCDIALOUT(x)   (minor(x) & GTMPSCDIALOUT_MASK)
119 
120 STATIC void gtmpscinit(struct gtmpsc_softc *);
121 STATIC int  gtmpscmatch(struct device *, struct cfdata *, void *);
122 STATIC void gtmpscattach(struct device *, struct device *, void *);
123 STATIC int  compute_cdv(unsigned int);
124 STATIC void gtmpsc_loadchannelregs(struct gtmpsc_softc *);
125 STATIC void gtmpscshutdown(struct gtmpsc_softc *);
126 STATIC void gtmpscstart(struct tty *);
127 STATIC int  gtmpscparam(struct tty *, struct termios *);
128 STATIC int  gtmpsc_probe(void);
129 STATIC int  gtmpsc_intr(void *);
130 STATIC void gtmpsc_softintr(void *);
131 
132 STATIC void gtmpsc_common_putn(struct gtmpsc_softc *);
133 STATIC void gtmpsc_common_putc(unsigned int, unsigned char);
134 STATIC int  gtmpsc_common_getc(unsigned int);
135 STATIC int  gtmpsc_common_pollc(unsigned int, char *, int *);
136 STATIC void gtmpsc_poll(void *);
137 #ifdef KGDB
138 STATIC void gtmpsc_kgdb_poll(void *);
139 #endif
140 STATIC void gtmpsc_mem_printf(const char *, ...);
141 
142 STATIC void gtmpsc_txdesc_init(gtmpsc_poll_sdma_t *, gtmpsc_poll_sdma_t *);
143 STATIC void gtmpsc_rxdesc_init(gtmpsc_poll_sdma_t *, gtmpsc_poll_sdma_t *);
144 STATIC unsigned int gtmpsc_get_causes(void);
145 STATIC void gtmpsc_hackinit(struct gtmpsc_softc *, bus_space_tag_t,
146 	bus_space_handle_t, int);
147 STATIC void gtmpscinit_stop(struct gtmpsc_softc *, int);
148 STATIC void gtmpscinit_start(struct gtmpsc_softc *, int);
149 #if 0
150 void gtmpsc_printf(const char *fmt, ...);
151 #endif
152 void gtmpsc_puts(char *);
153 
154 void gtmpsccnprobe(struct consdev *);
155 void gtmpsccninit(struct consdev *);
156 int  gtmpsccngetc(dev_t);
157 void gtmpsccnputc(dev_t, int);
158 void gtmpsccnpollc(dev_t, int);
159 void gtmpsccnhalt(dev_t);
160 
161 STATIC void gtmpsc_txflush(gtmpsc_softc_t *);
162 STATIC void gtmpsc_iflush(gtmpsc_softc_t *);
163 STATIC void gtmpsc_shutdownhook(void *);
164 
165 dev_type_open(gtmpscopen);
166 dev_type_close(gtmpscclose);
167 dev_type_read(gtmpscread);
168 dev_type_write(gtmpscwrite);
169 dev_type_ioctl(gtmpscioctl);
170 dev_type_stop(gtmpscstop);
171 dev_type_tty(gtmpsctty);
172 dev_type_poll(gtmpscpoll);
173 
174 const struct cdevsw gtmpsc_cdevsw = {
175 	gtmpscopen, gtmpscclose, gtmpscread, gtmpscwrite, gtmpscioctl,
176 	gtmpscstop, gtmpsctty, gtmpscpoll, nommap, ttykqfilter, D_TTY
177 };
178 
179 CFATTACH_DECL(gtmpsc, sizeof(struct gtmpsc_softc),
180     gtmpscmatch, gtmpscattach, NULL, NULL);
181 
182 extern struct cfdriver gtmpsc_cd;
183 
184 static struct consdev gtmpsc_consdev = {
185 	0,
186 	gtmpsccninit,
187 	gtmpsccngetc,
188 	gtmpsccnputc,
189 	gtmpsccnpollc,
190 	NULL,		/* cn_bell */
191 	gtmpsccnhalt,
192 	NULL,		/* cn_flush */
193 	NODEV,
194 	CN_NORMAL
195 };
196 
197 STATIC void *gtmpsc_sdma_ih = NULL;
198 
199 gtmpsc_softc_t *gtmpsc_scp[GTMPSC_NCHAN] = { 0 };
200 
201 STATIC int gt_reva_gtmpsc_bug;
202 unsigned int sdma_imask;        /* soft copy of SDMA IMASK reg */
203 
204 #ifdef KGDB
205 static int gtmpsc_kgdb_addr;
206 static int gtmpsc_kgdb_attached;
207 
208 int kgdb_break_immediate /* = 0 */ ;
209 
210 STATIC int      gtmpsc_kgdb_getc(void *);
211 STATIC void     gtmpsc_kgdb_putc(void *, int);
212 #endif /* KGDB */
213 
214 /*
215  * hacks for console initialization
216  * which happens prior to autoconfig "attach"
217  *
218  * XXX Assumes PAGE_SIZE is a constant!
219  */
220 STATIC unsigned int gtmpsccninit_done = 0;
221 STATIC gtmpsc_softc_t gtmpsc_fake_softc;
222 STATIC unsigned char gtmpsc_earlybuf[PAGE_SIZE]
223     __attribute__ ((aligned(PAGE_SIZE)));
224 STATIC unsigned char gtmpsc_fake_dmapage[PAGE_SIZE]
225     __attribute__ ((aligned(PAGE_SIZE)));
226 
227 
228 #define GTMPSC_PRINT_BUF_SIZE	4096
229 STATIC unsigned char gtmpsc_print_buf[GTMPSC_PRINT_BUF_SIZE] = { 0 };
230 
231 unsigned int gtmpsc_poll_putc_cnt = 0;
232 unsigned int gtmpsc_poll_putn_cnt = 0;
233 unsigned int gtmpsc_poll_getc_cnt = 0;
234 unsigned int gtmpsc_poll_pollc_cnt = 0;
235 unsigned int gtmpsc_poll_putc_miss = 0;
236 unsigned int gtmpsc_poll_putn_miss = 0;
237 unsigned int gtmpsc_poll_getc_miss = 0;
238 unsigned int gtmpsc_poll_pollc_miss = 0;
239 
240 #ifndef SDMA_COHERENT
241 /*
242  * inlines to flush, invalidate cache
243  * required if DMA cache coherency is broken
244  * note that pointer `p' args are assumed to be cache aligned
245  * and the size is assumed to be one CACHELINESIZE block
246  */
247 
248 #define GTMPSC_CACHE_FLUSH(p)		gtmpsc_cache_flush(p)
249 #define GTMPSC_CACHE_INVALIDATE(p)	gtmpsc_cache_invalidate(p)
250 
251 static inline void
252 gtmpsc_cache_flush(void *p)
253 {
254 	__asm volatile ("eieio; dcbf 0,%0; lwz %0,0(%0); sync;"
255 					: "+r"(p):);
256 }
257 
258 static inline void
259 gtmpsc_cache_invalidate(void *p)
260 {
261 	__asm volatile ("eieio; dcbi 0,%0; sync;" :: "r"(p));
262 }
263 #else
264 
265 #define GTMPSC_CACHE_FLUSH(p)
266 #define GTMPSC_CACHE_INVALIDATE(p)
267 
268 #endif	/* SDMA_COHERENT */
269 
270 #define GT_READ(sc,o) \
271 	bus_space_read_4((sc)->gtmpsc_memt, (sc)->gtmpsc_memh, (o))
272 #define GT_WRITE(sc,o,v) \
273 	bus_space_write_4((sc)->gtmpsc_memt, (sc)->gtmpsc_memh, (o), (v))
274 
275 
276 #define SDMA_IMASK_ENABLE(sc, bit)  do { \
277 	unsigned int    __r; \
278 	GT_WRITE(sc, SDMA_ICAUSE, ~(bit)); \
279 	if (gt_reva_gtmpsc_bug) \
280 		__r = sdma_imask; \
281 	else \
282 		__r = GT_READ(sc, SDMA_IMASK); \
283 	__r |= (bit); \
284 	sdma_imask = __r; \
285 	GT_WRITE(sc, SDMA_IMASK, __r); \
286 } while (/*CONSTCOND*/ 0)
287 
288 #define SDMA_IMASK_DISABLE(sc, bit)  do { \
289 	unsigned int    __r; \
290 	if (gt_reva_gtmpsc_bug) \
291 		__r = sdma_imask; \
292 	else \
293 		__r = GT_READ(sc, SDMA_IMASK); \
294 	__r &= ~(bit); \
295 	sdma_imask = __r; \
296 	GT_WRITE(sc, SDMA_IMASK, __r); \
297 } while (/*CONSTCOND*/ 0)
298 
299 static inline unsigned int
300 desc_read(unsigned int *ip)
301 {
302 	unsigned int rv;
303 
304 	__asm volatile ("lwzx %0,0,%1; eieio;"
305 		: "=r"(rv) : "r"(ip));
306 	return rv;
307 }
308 
309 static inline void
310 desc_write(unsigned int *ip, unsigned int val)
311 {
312 	__asm volatile ("stwx %0,0,%1; eieio;"
313 		:: "r"(val), "r"(ip));
314 }
315 
316 
317 /*
318  * gtmpsc_txdesc_init - set up TX descriptor ring
319  */
320 STATIC void
321 gtmpsc_txdesc_init(gtmpsc_poll_sdma_t *vmps, gtmpsc_poll_sdma_t *pmps)
322 {
323 	int n;
324 	sdma_desc_t *dp;
325 	gtmpsc_polltx_t *vtxp;
326 	gtmpsc_polltx_t *ptxp;
327 	gtmpsc_polltx_t *next_ptxp;
328 	gtmpsc_polltx_t *first_ptxp;
329 
330 	first_ptxp = ptxp = &pmps->tx[0];
331 	vtxp = &vmps->tx[0];
332 	next_ptxp = ptxp + 1;
333 	for (n = (GTMPSC_NTXDESC - 1); n--; ) {
334 		dp = &vtxp->txdesc;
335 		desc_write(&dp->sdma_csr, 0);
336 		desc_write(&dp->sdma_cnt, 0);
337 		desc_write(&dp->sdma_bufp, (u_int32_t)&ptxp->txbuf);
338 		desc_write(&dp->sdma_next, (u_int32_t)&next_ptxp->txdesc);
339 		GTMPSC_CACHE_FLUSH(dp);
340 		vtxp++;
341 		ptxp++;
342 		next_ptxp++;
343 	}
344 	dp = &vtxp->txdesc;
345 	desc_write(&dp->sdma_csr, 0);
346 	desc_write(&dp->sdma_cnt, 0);
347 	desc_write(&dp->sdma_bufp, (u_int32_t)&ptxp->txbuf);
348 	desc_write(&dp->sdma_next, (u_int32_t)&first_ptxp->txdesc);
349 	GTMPSC_CACHE_FLUSH(dp);
350 }
351 
352 /*
353  * gtmpsc_rxdesc_init - set up RX descriptor ring
354  */
355 STATIC void
356 gtmpsc_rxdesc_init(gtmpsc_poll_sdma_t *vmps, gtmpsc_poll_sdma_t *pmps)
357 {
358 	int n;
359 	sdma_desc_t *dp;
360 	gtmpsc_pollrx_t *vrxp;
361 	gtmpsc_pollrx_t *prxp;
362 	gtmpsc_pollrx_t *next_prxp;
363 	gtmpsc_pollrx_t *first_prxp;
364 	unsigned int csr;
365 
366 	csr = SDMA_CSR_RX_L|SDMA_CSR_RX_F|SDMA_CSR_RX_OWN|SDMA_CSR_RX_EI;
367 	first_prxp = prxp = &pmps->rx[0];
368 	vrxp = &vmps->rx[0];
369 	next_prxp = prxp + 1;
370 	for (n = (GTMPSC_NRXDESC - 1); n--; ) {
371 		dp = &vrxp->rxdesc;
372 		desc_write(&dp->sdma_csr, csr);
373 		desc_write(&dp->sdma_cnt,
374 			GTMPSC_RXBUFSZ << SDMA_RX_CNT_BUFSZ_SHIFT);
375 		desc_write(&dp->sdma_bufp, (u_int32_t)&prxp->rxbuf);
376 		desc_write(&dp->sdma_next, (u_int32_t)&next_prxp->rxdesc);
377 		GTMPSC_CACHE_FLUSH(dp);
378 		vrxp++;
379 		prxp++;
380 		next_prxp++;
381 	}
382 	dp = &vrxp->rxdesc;
383 	desc_write(&dp->sdma_csr, SDMA_CSR_RX_OWN);
384 	desc_write(&dp->sdma_cnt,
385 		GTMPSC_RXBUFSZ << SDMA_RX_CNT_BUFSZ_SHIFT);
386 	desc_write(&dp->sdma_bufp, (u_int32_t)&prxp->rxbuf);
387 	desc_write(&dp->sdma_next, (u_int32_t)&first_prxp->rxdesc);
388 	GTMPSC_CACHE_FLUSH(dp);
389 }
390 
391 /*
392  * Compute the BRG countdown value (CDV in BRG_BCR)
393  */
394 
395 STATIC int
396 compute_cdv(unsigned int baud)
397 {
398 	unsigned int    cdv;
399 
400 	if (baud == 0)
401 		return 0;
402 	cdv = (GT_MPSC_FREQUENCY / (baud * GTMPSC_CLOCK_DIVIDER) + 1) / 2 - 1;
403 	if (cdv > BRG_BCR_CDV_MAX)
404 		return -1;
405 	return cdv;
406 }
407 
408 STATIC void
409 gtmpsc_loadchannelregs(struct gtmpsc_softc *sc)
410 {
411 	u_int   brg_bcr;
412 	u_int   unit;
413 
414 	unit = sc->gtmpsc_unit;
415 	brg_bcr = unit ? BRG_BCR1 : BRG_BCR0;
416 
417 	GT_WRITE(sc, brg_bcr, sc->gtmpsc_brg_bcr);
418 	GT_WRITE(sc, GTMPSC_U_CHRN(unit, 3), sc->gtmpsc_chr3);
419 }
420 
421 STATIC int
422 gtmpscmatch(struct device *parent, struct cfdata *self, void *aux)
423 {
424 	struct gt_softc *gt = device_private(parent);
425 	struct gt_attach_args *ga = aux;
426 
427 	return GT_MPSCOK(gt, ga, &gtmpsc_cd);
428 }
429 
430 STATIC void
431 gtmpscattach(struct device *parent, struct device *self, void *aux)
432 {
433 	struct gt_attach_args *ga = aux;
434 	struct gt_softc *gt = device_private(parent);
435 	struct gtmpsc_softc *sc = device_private(self);
436 	gtmpsc_poll_sdma_t *vmps;
437 	gtmpsc_poll_sdma_t *pmps;
438 	struct tty *tp;
439 	void *kva;
440 	int rsegs;
441 	int err;
442 	int s;
443 	int is_console = 0;
444 
445 	DPRINTF(("mpscattach\n"));
446 
447 	GT_MPSCFOUND(gt, ga);
448 
449 	s = splhigh();
450 
451 	sc->gtmpsc_memt = ga->ga_memt;
452 	sc->gtmpsc_memh = ga->ga_memh;
453 	sc->gtmpsc_dmat = ga->ga_dmat;
454 	sc->gtmpsc_unit = ga->ga_unit;
455 
456 	aprint_normal(": SDMA");
457 	err = bus_dmamem_alloc(sc->gtmpsc_dmat, PAGE_SIZE, PAGE_SIZE, PAGE_SIZE,
458 	    sc->gtmpsc_dma_segs, 1, &rsegs, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW);
459 	if (err) {
460 		PRINTF(("mpscattach: bus_dmamem_alloc error 0x%x\n", err));
461 		splx(s);
462 		return;
463 	}
464 #ifndef SDMA_COHERENT
465 	err = bus_dmamem_map(sc->gtmpsc_dmat, sc->gtmpsc_dma_segs, 1, PAGE_SIZE,
466 	    &kva, BUS_DMA_NOWAIT);
467 #else
468 	err = bus_dmamem_map(sc->gtmpsc_dmat, sc->gtmpsc_dma_segs, 1, PAGE_SIZE,
469 	    &kva, BUS_DMA_NOWAIT|BUS_DMA_NOCACHE);
470 #endif
471 	if (err) {
472 		PRINTF(("mpscattach: bus_dmamem_map error 0x%x\n", err));
473 		splx(s);
474 		return;
475 	}
476 
477 	err = bus_dmamap_create(sc->gtmpsc_dmat, PAGE_SIZE, 1, PAGE_SIZE,
478 	    PAGE_SIZE, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW, &sc->gtmpsc_dma_map);
479 	if (err) {
480 		PRINTF(("mpscattach: bus_dmamap_create error 0x%x\n", err));
481 		splx(s);
482 		return;
483 	}
484 
485 	err = bus_dmamap_load(sc->gtmpsc_dmat, sc->gtmpsc_dma_map, kva,
486 	    PAGE_SIZE, NULL, 0);
487 	if (err) {
488 		PRINTF(("mpscattach: bus_dmamap_load error 0x%x\n", err));
489 		splx(s);
490 		return;
491 	}
492 	memset(kva, 0, PAGE_SIZE);	/* paranoid/superfluous */
493 
494 	vmps = (gtmpsc_poll_sdma_t *)kva;				    /* KVA */
495 	pmps = (gtmpsc_poll_sdma_t *)sc->gtmpsc_dma_map->dm_segs[0].ds_addr;    /* PA */
496 #if defined(DEBUG)
497 	printf(" at %p/%p", vmps, pmps);
498 #endif
499 	gtmpsc_txdesc_init(vmps, pmps);
500 	gtmpsc_rxdesc_init(vmps, pmps);
501 	sc->gtmpsc_poll_sdmapage = vmps;
502 
503 	if (gtmpsc_scp[sc->gtmpsc_unit] != NULL)
504 		gtmpsc_txflush(gtmpsc_scp[sc->gtmpsc_unit]);
505 
506 	sc->gtmpsc_tty = tp = ttymalloc();
507 	tp->t_oproc = gtmpscstart;
508 	tp->t_param = gtmpscparam;
509 	tty_attach(tp);
510 
511 	if (gtmpsc_sdma_ih == NULL) {
512 		gtmpsc_sdma_ih = intr_establish(IRQ_SDMA, IST_LEVEL, IPL_SERIAL,
513 			gtmpsc_intr, &sc);
514 		if (gtmpsc_sdma_ih == NULL)
515 			panic("mpscattach: cannot intr_establish IRQ_SDMA");
516 	}
517 
518 	sc->sc_si = softint_establish(SOFTINT_SERIAL, gtmpsc_softintr, sc);
519 	if (sc->sc_si == NULL)
520 		panic("mpscattach: cannot softint_establish IPL_SOFTSERIAL");
521 
522 	shutdownhook_establish(gtmpsc_shutdownhook, sc);
523 
524 	gtmpsc_scp[sc->gtmpsc_unit] = sc;
525 	gtmpscinit(sc);
526 
527 	if (cn_tab == &gtmpsc_consdev &&
528 	    cn_tab->cn_dev == makedev(0, sc->gtmpsc_unit)) {
529 		cn_tab->cn_dev = makedev(cdevsw_lookup_major(&gtmpsc_cdevsw),
530 		    device_unit(&sc->gtmpsc_dev));
531 		is_console = 1;
532 	}
533 
534 	aprint_normal(" irq %s%s\n",
535 	    intr_string(IRQ_SDMA),
536 	    (gt_reva_gtmpsc_bug) ? " [Rev A. bug]" : "");
537 
538 	if (is_console)
539 		aprint_normal("%s: console\n", sc->gtmpsc_dev.dv_xname);
540 
541 #ifdef DDB
542 	if (is_console == 0)
543 		SDMA_IMASK_ENABLE(sc, SDMA_INTR_RXBUF(sc->gtmpsc_unit));
544 #endif	/* DDB */
545 
546 	splx(s);
547 #ifdef KGDB
548 	/*
549 	 * Allow kgdb to "take over" this port.  If this is
550 	 * the kgdb device, it has exclusive use.
551 	 */
552 	if (sc->gtmpsc_unit == comkgdbport) {
553 		if (comkgdbport == 0) { /* FIXME */
554 			printf("%s(kgdb): cannot share with console\n",
555 				sc->gtmpsc_dev.dv_xname);
556 			return;
557 		}
558 
559 		sc->gtmpsc_flags |= GTMPSCF_KGDB;
560 		printf("%s: kgdb\n", sc->gtmpsc_dev.dv_xname);
561 		gtmpsc_txflush(gtmpsc_scp[0]);
562 		kgdb_attach(gtmpsc_kgdb_getc, gtmpsc_kgdb_putc, NULL);
563 		kgdb_dev = 123; /* unneeded, only to satisfy some tests */
564 		gtmpsc_kgdb_attached = 1;
565 		SDMA_IMASK_ENABLE(sc, SDMA_INTR_RXBUF(sc->gtmpsc_unit));
566 		kgdb_connect(1);
567 	}
568 #endif /* KGDB */
569 }
570 
571 STATIC void
572 gtmpscshutdown(struct gtmpsc_softc *sc)
573 {
574 	struct tty *tp;
575 	int     s;
576 
577 #ifdef KGDB
578 	if (sc->gtmpsc_flags & GTMPSCF_KGDB != 0)
579 		return;
580 #endif
581 	tp = sc->gtmpsc_tty;
582 	s = splserial();
583 	/* Fake carrier off */
584 	(void) (*tp->t_linesw->l_modem)(tp, 0);
585 	SDMA_IMASK_DISABLE(sc, SDMA_INTR_RXBUF(sc->gtmpsc_unit));
586 	splx(s);
587 }
588 
589 int
590 gtmpscopen(dev_t dev, int flag, int mode, struct lwp *l)
591 {
592 	struct gtmpsc_softc *sc;
593 	int unit = GTMPSCUNIT(dev);
594 	struct tty *tp;
595 	int s;
596 	int s2;
597 	int error;
598 
599 	if (unit >= gtmpsc_cd.cd_ndevs)
600 		return ENXIO;
601 	sc = gtmpsc_cd.cd_devs[unit];
602 	if (!sc)
603 		return ENXIO;
604 #ifdef KGDB
605 	/*
606 	 * If this is the kgdb port, no other use is permitted.
607 	 */
608 	if (sc->gtmpsc_flags & GTMPSCF_KGDB != 0)
609 		return (EBUSY);
610 #endif
611 	tp = sc->gtmpsc_tty;
612 	if (kauth_authorize_device_tty(l->l_cred, KAUTH_DEVICE_TTY_OPEN, tp))
613 		return (EBUSY);
614 
615 	s = spltty();
616 
617 	if (!(tp->t_state & TS_ISOPEN)) {
618 		struct termios t;
619 
620 		tp->t_dev = dev;
621 		s2 = splserial();
622 		SDMA_IMASK_ENABLE(sc, SDMA_INTR_RXBUF(unit));
623 		splx(s2);
624 		t.c_ispeed = 0;
625 #if 0
626 		t.c_ospeed = TTYDEF_SPEED;
627 #else
628 		t.c_ospeed = GT_MPSC_DEFAULT_BAUD_RATE;
629 #endif
630 		t.c_cflag = TTYDEF_CFLAG;
631 		/* Make sure gtmpscparam() will do something. */
632 		tp->t_ospeed = 0;
633 		(void) gtmpscparam(tp, &t);
634 		tp->t_iflag = TTYDEF_IFLAG;
635 		tp->t_oflag = TTYDEF_OFLAG;
636 		tp->t_lflag = TTYDEF_LFLAG;
637 		ttychars(tp);
638 		ttsetwater(tp);
639 		s2 = splserial();
640 		/* Clear the input ring */
641 		sc->gtmpsc_rxfifo_putix = 0;
642 		sc->gtmpsc_rxfifo_getix = 0;
643 		sc->gtmpsc_rxfifo_navail = GTMPSC_RXFIFOSZ;
644 		gtmpsc_iflush(sc);
645 		splx(s2);
646 	}
647 	splx(s);
648 	error = ttyopen(tp, GTMPSCDIALOUT(dev), ISSET(flag, O_NONBLOCK));
649 	if (error)
650 		goto bad;
651 
652 	error = (*tp->t_linesw->l_open)(dev, tp);
653 	if (error)
654 		goto bad;
655 
656 	return (0);
657 
658 bad:
659 	if (!ISSET(tp->t_state, TS_ISOPEN) && tp->t_wopen == 0) {
660 		/*
661 		 * We failed to open the device, and nobody else had it opened.
662 		 * Clean up the state as appropriate.
663 		 */
664 		gtmpscshutdown(sc);
665 	}
666 
667 	return (error);
668 }
669 
670 int
671 gtmpscclose(dev_t dev, int flag, int mode, struct lwp *l)
672 {
673 	int unit = GTMPSCUNIT(dev);
674 	struct gtmpsc_softc *sc = gtmpsc_cd.cd_devs[unit];
675 	struct tty *tp = sc->gtmpsc_tty;
676 	int s;
677 
678 	s = splserial();
679 	if (!ISSET(tp->t_state, TS_ISOPEN)) {
680 		splx(s);
681 		return (0);
682 	}
683 
684 	(*tp->t_linesw->l_close)(tp, flag);
685 	ttyclose(tp);
686 	if (!ISSET(tp->t_state, TS_ISOPEN) && tp->t_wopen == 0) {
687 		/*
688 		 * Although we got a last close, the device may still be in
689 		 * use; e.g. if this was the dialout node, and there are still
690 		 * processes waiting for carrier on the non-dialout node.
691 		 */
692 		gtmpscshutdown(sc);
693 	}
694 
695 	splx(s);
696 	return (0);
697 }
698 
699 int
700 gtmpscread(dev_t dev, struct uio *uio, int flag)
701 {
702 	struct gtmpsc_softc *sc = gtmpsc_cd.cd_devs[GTMPSCUNIT(dev)];
703 	struct tty *tp = sc->gtmpsc_tty;
704 
705 	return (*tp->t_linesw->l_read)(tp, uio, flag);
706 }
707 
708 int
709 gtmpscwrite(dev_t dev, struct uio *uio, int flag)
710 {
711 	struct gtmpsc_softc *sc = gtmpsc_cd.cd_devs[GTMPSCUNIT(dev)];
712 	struct tty *tp = sc->gtmpsc_tty;
713 
714 	return (*tp->t_linesw->l_write)(tp, uio, flag);
715 }
716 
717 int
718 gtmpscpoll(dev_t dev, int events, struct lwp *l)
719 {
720 	struct gtmpsc_softc *sc = gtmpsc_cd.cd_devs[GTMPSCUNIT(dev)];
721 	struct tty *tp = sc->gtmpsc_tty;
722 
723 	return ((*tp->t_linesw->l_poll)(tp, events, l));
724 }
725 
726 int
727 gtmpscioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
728 {
729 	struct gtmpsc_softc *sc = gtmpsc_cd.cd_devs[GTMPSCUNIT(dev)];
730 	struct tty *tp = sc->gtmpsc_tty;
731 	int error;
732 
733 	if ((error = (*tp->t_linesw->l_ioctl)(tp, cmd, data, flag, l)) >= 0)
734 		return error;
735 	if ((error = ttioctl(tp, cmd, data, flag, l)) >= 0)
736 		return error;
737 	return ENOTTY;
738 }
739 
740 struct tty *
741 gtmpsctty(dev_t dev)
742 {
743 	struct gtmpsc_softc *sc = gtmpsc_cd.cd_devs[GTMPSCUNIT(dev)];
744 
745 	return sc->gtmpsc_tty;
746 }
747 
748 void
749 gtmpscstop(struct tty *tp, int flag)
750 {
751 }
752 
753 STATIC void
754 gtmpscstart(struct tty *tp)
755 {
756 	struct gtmpsc_softc *sc;
757 	unsigned char *tba;
758 	unsigned int unit;
759 	int s, s2, tbc;
760 
761 	unit = GTMPSCUNIT(tp->t_dev);
762 	sc = gtmpsc_cd.cd_devs[unit];
763 	if (sc == NULL)
764 		return;
765 
766 	s = spltty();
767 	if (tp->t_state & (TS_TIMEOUT | TS_BUSY | TS_TTSTOP))
768 		goto out;
769 	if (sc->sc_tx_stopped)
770 		goto out;
771 	if (tp->t_outq.c_cc <= tp->t_lowat) {
772 		if ((tp->t_state & TS_ASLEEP) != 0) {
773 			tp->t_state &= ~TS_ASLEEP;
774 			wakeup(&tp->t_outq);
775 		}
776 		selwakeup(&tp->t_wsel);
777 		if (tp->t_outq.c_cc == 0)
778 			goto out;
779 	}
780 
781 	/* Grab the first contiguous region of buffer space. */
782 	tba = tp->t_outq.c_cf;
783 	tbc = ndqb(&tp->t_outq, 0);
784 
785 	s2 = splserial();
786 
787 	sc->sc_tba = tba;
788 	sc->sc_tbc = tbc;
789 	sc->cnt_tx_from_ldisc += tbc;
790 	SDMA_IMASK_ENABLE(sc, SDMA_INTR_TXBUF(unit));
791 	tp->t_state |= TS_BUSY;
792 	sc->sc_tx_busy = 1;
793 	gtmpsc_common_putn(sc);
794 
795 	splx(s2);
796 out:
797 	splx(s);
798 }
799 
800 STATIC int
801 gtmpscparam(struct tty *tp, struct termios *t)
802 {
803 	struct gtmpsc_softc *sc = gtmpsc_cd.cd_devs[GTMPSCUNIT(tp->t_dev)];
804 	int ospeed = compute_cdv(t->c_ospeed);
805 	int s;
806 
807 	/* Check requested parameters. */
808 	if (ospeed < 0)
809 		return (EINVAL);
810 	if (t->c_ispeed && t->c_ispeed != t->c_ospeed)
811 		return (EINVAL);
812 
813 	/*
814 	 * If there were no changes, don't do anything.  This avoids dropping
815 	 * input and improves performance when all we did was frob things like
816 	 * VMIN and VTIME.
817 	 */
818 	if (tp->t_ospeed == t->c_ospeed &&
819 	    tp->t_cflag == t->c_cflag)
820 		return (0);
821 
822 	s = splserial();
823 
824 	sc->gtmpsc_brg_bcr = BRG_BCR_EN | GT_MPSC_CLOCK_SOURCE | ospeed;
825 	sc->gtmpsc_chr3 = GTMPSC_MAXIDLE(t->c_ospeed);
826 
827 	/* And copy to tty. */
828 	tp->t_ispeed = 0;
829 	tp->t_ospeed = t->c_ospeed;
830 	tp->t_cflag = t->c_cflag;
831 
832 	if (!sc->sc_heldchange) {
833 		if (sc->sc_tx_busy) {
834 			sc->sc_heldtbc = sc->sc_tbc;
835 			sc->sc_tbc = 0;
836 			sc->sc_heldchange = 1;
837 		} else
838 			gtmpsc_loadchannelregs(sc);
839 	}
840 
841 	splx(s);
842 
843 	/* Fake carrier on */
844 	(void) (*tp->t_linesw->l_modem)(tp, 1);
845 
846 	return 0;
847 }
848 
849 STATIC int
850 gtmpsc_probe(void)
851 {
852 	return 1;		/* XXX */
853 }
854 
855 STATIC unsigned int
856 gtmpsc_get_causes(void)
857 {
858 	int                     i;
859 	struct gtmpsc_softc       *sc;
860 	unsigned int            cause = 0;
861 	static unsigned int     bits[4] = {
862 				SDMA_INTR_RXBUF(0),
863 				SDMA_INTR_TXBUF(0),
864 				SDMA_INTR_RXBUF(1),
865 				SDMA_INTR_TXBUF(1),
866 	};
867 	sdma_desc_t             *desc_addr[4];
868 	static unsigned int     fake_once = SDMA_INTR_RXBUF(0)
869 						| SDMA_INTR_RXBUF(1);
870 
871 	desc_addr[0] = 0;
872 	desc_addr[1] = 0;
873 	desc_addr[2] = 0;
874 	desc_addr[3] = 0;
875 	sc = gtmpsc_cd.cd_devs[0];
876 	if (sc != 0) {
877 	    if (sdma_imask & SDMA_INTR_RXBUF(0)) {
878 		desc_addr[0] =
879 		    &sc->gtmpsc_poll_sdmapage->rx[sc->gtmpsc_poll_rxix].rxdesc;
880 		    GTMPSC_CACHE_INVALIDATE(desc_addr[0]);
881 		    __asm volatile ("dcbt 0,%0" :: "r"(desc_addr[0]));
882 	    }
883 	    if (sdma_imask & SDMA_INTR_TXBUF(0)) {
884 		desc_addr[1] =
885 		    &sc->gtmpsc_poll_sdmapage->tx[sc->gtmpsc_poll_txix].txdesc;
886 		    GTMPSC_CACHE_INVALIDATE(desc_addr[1]);
887 		    __asm volatile ("dcbt 0,%0" :: "r"(desc_addr[1]));
888 	    }
889 	}
890 	sc = gtmpsc_cd.cd_devs[1];
891 	if (sc != 0) {
892 	    if (sdma_imask & SDMA_INTR_RXBUF(1)) {
893 		desc_addr[2] =
894 		    &sc->gtmpsc_poll_sdmapage->rx[sc->gtmpsc_poll_rxix].rxdesc;
895 		    GTMPSC_CACHE_INVALIDATE(desc_addr[2]);
896 		    __asm volatile ("dcbt 0,%0" :: "r"(desc_addr[2]));
897 	    }
898 	    if (sdma_imask & SDMA_INTR_TXBUF(1)) {
899 		desc_addr[3] =
900 		    &sc->gtmpsc_poll_sdmapage->tx[sc->gtmpsc_poll_txix].txdesc;
901 		    GTMPSC_CACHE_INVALIDATE(desc_addr[3]);
902 		    __asm volatile ("dcbt 0,%0" :: "r"(desc_addr[3]));
903 	    }
904 	}
905 
906 	for (i = 0; i < 4; ++i)
907 		if ((sdma_imask & bits[i]) && desc_addr[i] != 0 &&
908 			    (desc_addr[i]->sdma_csr & SDMA_CSR_TX_OWN) == 0)
909 			cause |= bits[i];
910 	if (fake_once & sdma_imask) {
911 		cause |= fake_once & sdma_imask;
912 	/*	fake_once &= ~(cause & fake_once); */
913 	}
914 	return cause;
915 }
916 
917 STATIC int
918 gtmpsc_intr(void *arg)
919 {
920 	struct gtmpsc_softc       *sc;
921 	unsigned int            unit;
922 	int                     spurious = 1;
923 	unsigned int            r;
924 	unsigned int            cause=0;
925 
926 	if (gt_reva_gtmpsc_bug)
927 		cause = gtmpsc_get_causes();
928 
929 #ifdef KGDB
930 	if (kgdb_break_immediate) {
931 		unit = comkgdbport;
932 		sc = gtmpsc_cd.cd_devs[unit];
933 		if (sc == 0 || (sc->gtmpsc_flags & GTMPSCF_KGDB) == 0)
934 			goto skip_kgdb;
935 		if (gt_reva_gtmpsc_bug)
936 			r = cause & sdma_imask;
937 		else {
938 			r = GT_READ(sc, SDMA_ICAUSE);
939 			r &= GT_READ(sc, SDMA_IMASK);
940 		}
941 		r &= SDMA_INTR_RXBUF(unit);
942 		if (r == 0)
943 			goto skip_kgdb;
944 		GT_WRITE(sc, SDMA_ICAUSE, ~r);
945 		spurious = 0;
946 		gtmpsc_kgdb_poll(sc);
947 	}
948 skip_kgdb:
949 #endif
950 	for (unit = 0; unit < GTMPSC_NCHAN; ++unit) {
951 		sc = gtmpsc_cd.cd_devs[unit];
952 		if (sc == 0)
953 			continue;
954 		if (gt_reva_gtmpsc_bug)
955 			r = cause & sdma_imask;
956 		else {
957 			r = GT_READ(sc, SDMA_ICAUSE);
958 			r &= GT_READ(sc, SDMA_IMASK);
959 		}
960 		r &= SDMA_U_INTR_MASK(unit);
961 		if (r == 0)
962 			continue;
963 		GT_WRITE(sc, SDMA_ICAUSE, ~r);
964 		spurious = 0;
965 		if (r & SDMA_INTR_RXBUF(unit)) {
966 #ifdef KGDB
967 			if (sc->gtmpsc_flags & GTMPSCF_KGDB)
968 				gtmpsc_kgdb_poll(sc);
969 			else
970 #endif
971 				gtmpsc_poll(sc);
972 		}
973 		if (r & SDMA_INTR_TXBUF(unit)) {
974 			/*
975 			 * If we've delayed a parameter change, do it now,
976 			 * and restart output.
977 			 */
978 			if (sc->sc_heldchange) {
979 				gtmpsc_loadchannelregs(sc);
980 				sc->sc_heldchange = 0;
981 				sc->sc_tbc = sc->sc_heldtbc;
982 				sc->sc_heldtbc = 0;
983 			}
984 
985 			/* Output the next chunk of the contiguous buffer,
986 								if any. */
987 			if (sc->sc_tbc > 0)
988 				gtmpsc_common_putn(sc);
989 			if (sc->sc_tbc == 0 && sc->sc_tx_busy) {
990 				sc->sc_tx_busy = 0;
991 				sc->sc_tx_done = 1;
992 				softint_schedule(sc->sc_si);
993 				SDMA_IMASK_DISABLE(sc, SDMA_INTR_TXBUF(unit));
994 			}
995 		}
996 	}
997 	return 1;
998 	/* return !spurious; */
999 }
1000 
1001 STATIC void
1002 gtmpsc_softintr(void *arg)
1003 {
1004 	struct gtmpsc_softc	*sc = arg;
1005 	struct tty              *tp;
1006 	int                     (*rint)(int, struct tty *);
1007 	int                     jobs;
1008 	int                     s;
1009 
1010 	tp = sc->gtmpsc_tty;
1011 	rint = tp->t_linesw->l_rint;
1012 	do {
1013 		jobs = 0;
1014 		if (sc->gtmpsc_rxfifo_navail < GTMPSC_RXFIFOSZ) {
1015 			s = spltty();
1016 			rint(sc->gtmpsc_rxfifo[sc->gtmpsc_rxfifo_getix++],
1017 								tp);
1018 			if (sc->gtmpsc_rxfifo_getix >= GTMPSC_RXFIFOSZ)
1019 				sc->gtmpsc_rxfifo_getix = 0;
1020 			++sc->cnt_rx_from_fifo;
1021 			/* atomic_add() returns the previous value */
1022 			jobs += atomic_add(&sc->gtmpsc_rxfifo_navail, 1) + 1
1023 								< GTMPSC_RXFIFOSZ;
1024 			splx(s);
1025 		}
1026 		if (sc->sc_tx_done) {
1027 			++jobs;
1028 			sc->sc_tx_done = 0;
1029 			s = spltty();
1030 			tp->t_state &= ~TS_BUSY;
1031 			if ((tp->t_state & TS_FLUSH) != 0)
1032 			    tp->t_state &= ~TS_FLUSH;
1033 			else
1034 			    ndflush(&tp->t_outq, (int)(sc->sc_tba - tp->t_outq.c_cf));
1035 			(*tp->t_linesw->l_start)(tp);
1036 			splx(s);
1037 		}
1038 	} while (jobs);
1039 }
1040 
1041 /*
1042  * Console support functions
1043  */
1044 void
1045 gtmpsccnprobe(struct consdev *cd)
1046 {
1047 	int maj;
1048 /* {extern void return_to_dink(int); return_to_dink(gtbase);} */
1049 
1050 	if (!gtmpsc_probe())
1051 		return;
1052 
1053 	maj = cdevsw_lookup_major(&gtmpsc_cdevsw);
1054 	cd->cn_dev = makedev(maj, 0);
1055 	cd->cn_pri = CN_INTERNAL;
1056 }
1057 
1058 /*
1059  * gtmpsc_hackinit - hacks required to supprt GTMPSC console
1060  */
1061 STATIC void
1062 gtmpsc_hackinit(struct gtmpsc_softc *sc, bus_space_tag_t memt,
1063 	bus_space_handle_t memh, int unit)
1064 {
1065 	gtmpsc_poll_sdma_t *vmps;
1066 	gtmpsc_poll_sdma_t *pmps;
1067 
1068 	DPRINTF(("hackinit\n"));
1069 
1070 	bzero(sc, sizeof(struct gtmpsc_softc));
1071 	sc->gtmpsc_memt = memt;
1072 	sc->gtmpsc_memh = memh;
1073 	sc->gtmpsc_unit = unit;
1074 	gtmpsc_scp[sc->gtmpsc_unit] = sc;
1075 
1076 	vmps = (gtmpsc_poll_sdma_t *)gtmpsc_fake_dmapage;	/* KVA */
1077 	pmps = (gtmpsc_poll_sdma_t *)gtmpsc_fake_dmapage;	/* PA */
1078 
1079 	gtmpsc_txdesc_init(vmps, pmps);
1080 	gtmpsc_rxdesc_init(vmps, pmps);
1081 
1082 	sc->gtmpsc_poll_sdmapage = vmps;
1083 }
1084 
1085 /*
1086  * gtmpsc_txflush - wait for output to drain
1087  */
1088 STATIC void
1089 gtmpsc_txflush(gtmpsc_softc_t *sc)
1090 {
1091 	unsigned int csr;
1092 	unsigned int *csrp;
1093 	gtmpsc_polltx_t *vtxp;
1094 	int limit = 4000000;	/* 4 seconds */
1095 	int ix;
1096 
1097 	ix = sc->gtmpsc_poll_txix - 1;
1098 	if (ix < 0)
1099 		ix = GTMPSC_NTXDESC - 1;
1100 
1101 	vtxp = &sc->gtmpsc_poll_sdmapage->tx[ix];
1102 	csrp = &vtxp->txdesc.sdma_csr;
1103 	while (limit > 0) {
1104 		GTMPSC_CACHE_INVALIDATE(csrp);
1105 		csr = desc_read(csrp);
1106 		if ((csr & SDMA_CSR_TX_OWN) == 0)
1107 			break;
1108 		DELAY(GTMPSC_POLL_DELAY);
1109 		limit -= GTMPSC_POLL_DELAY;
1110 	}
1111 }
1112 
1113 STATIC void
1114 gtmpsc_iflush(gtmpsc_softc_t *sc)
1115 {
1116 	int     timo;
1117 	char    c;
1118 	int     stat;
1119 
1120 	for (timo = 50000; timo; timo--)
1121 		if (gtmpsc_common_pollc(sc->gtmpsc_unit, &c, &stat) == 0)
1122 			return;
1123 #ifdef DIAGNOSTIC
1124 	printf("%s: gtmpsc_iflush timeout %02x\n", sc->gtmpsc_dev.dv_xname, c);
1125 #endif
1126 }
1127 
1128 STATIC void
1129 gtmpscinit_stop(struct gtmpsc_softc *sc, int once)
1130 {
1131 	unsigned int r;
1132 	unsigned int unit = sc->gtmpsc_unit;
1133 
1134 	/*
1135 	 * XXX HACK FIXME
1136 	 * PMON output has not been flushed.  give him a chance
1137 	 */
1138 #if 1
1139 	if (! once)
1140 		DELAY(100000);	/* XXX */
1141 #endif
1142 
1143 	DPRINTF(("gtmpscinit_stop: unit 0x%x\n", unit));
1144 	if (unit >= GTMPSC_NCHAN) {
1145 		PRINTF(("mpscinit: undefined unit %d\n", sc->gtmpsc_unit));
1146 		return;
1147 	}
1148 
1149 	sc->gtmpsc_chr2 = 0;      /* Default value of CHR2 */
1150 
1151 	/*
1152 	 * stop GTMPSC unit
1153 	 */
1154 	r = sc->gtmpsc_chr2 | GTMPSC_CHR2_RXABORT|GTMPSC_CHR2_TXABORT;
1155 	GT_WRITE(sc, GTMPSC_U_CHRN(unit, 2), r);
1156 
1157 	DELAY(GTMPSC_RESET_DELAY);
1158 
1159 	/*
1160 	 * abort SDMA TX, RX for GTMPSC unit
1161 	 */
1162 	GT_WRITE(sc, SDMA_U_SDCM(unit), SDMA_SDCM_AR|SDMA_SDCM_AT);
1163 
1164 	if (once == 0) {
1165 		/*
1166 		 * Determine if this is the buggy GT-64260A case.
1167 		 * If this is, then most of GTMPSC and SDMA registers
1168 		 * are unreadable.
1169 		 * (They always yield -1).
1170 		 */
1171 		GT_WRITE(sc, SDMA_IMASK, 0);
1172 		r = GT_READ(sc, SDMA_IMASK);
1173 		gt_reva_gtmpsc_bug = r == ~0;
1174 		sdma_imask = 0;
1175 	}
1176 
1177 	/*
1178 	 * If Rx is disabled, we don't need to wait around for
1179 	 * abort completion.
1180 	 */
1181 	if ((GT_READ(sc, GTMPSC_U_MMCR_LO(unit)) & GTMPSC_MMCR_LO_ER) == 0)
1182 		return;
1183 
1184 	/*
1185 	 * poll for GTMPSC RX abort completion
1186 	 */
1187 	if (gt_reva_gtmpsc_bug) {
1188 		/* Sync up with the device first */
1189 		r = GT_READ(sc, GTMPSC_U_CHRN(unit, 2));
1190 		DELAY(GTMPSC_RESET_DELAY);
1191 	} else
1192 		for (;;) {
1193 			r = GT_READ(sc, GTMPSC_U_CHRN(unit, 2));
1194 			if (! (r & GTMPSC_CHR2_RXABORT))
1195 				break;
1196 		}
1197 
1198 	/*
1199 	 * poll for SDMA RX abort completion
1200 	 */
1201 	for (;;) {
1202 		r = GT_READ(sc, SDMA_U_SDCM(unit));
1203 		if (! (r & (SDMA_SDCM_AR|SDMA_SDCM_AT)))
1204 			break;
1205 		DELAY(50);
1206 	}
1207 
1208 }
1209 
1210 STATIC void
1211 gtmpscinit_start(struct gtmpsc_softc *sc, int once)
1212 {
1213 	unsigned int r;
1214 	unsigned int unit = sc->gtmpsc_unit;
1215 
1216 	/*
1217 	 * initialize softc's "current" transfer indicies & counts
1218 	 */
1219 	sc->gtmpsc_cx = 0;
1220 	sc->gtmpsc_nc = 0;
1221 	sc->gtmpsc_poll_txix = 0;
1222 	sc->gtmpsc_poll_rxix = 0;
1223 
1224 	/*
1225 	 * initialize softc's RX softintr FIFO
1226 	 */
1227 	sc->gtmpsc_rxfifo_putix = 0;
1228 	sc->gtmpsc_rxfifo_getix = 0;
1229 	sc->gtmpsc_rxfifo_navail = GTMPSC_RXFIFOSZ;
1230 	memset(&sc->gtmpsc_rxfifo[0], 0, GTMPSC_RXFIFOSZ);
1231 
1232 	/*
1233 	 * set SDMA unit port TX descriptor pointers
1234 	 * "next" pointer of last descriptor is start of ring
1235 	 */
1236 	r = desc_read(
1237 	    &sc->gtmpsc_poll_sdmapage->tx[GTMPSC_NTXDESC-1].txdesc.sdma_next);
1238 	GT_WRITE(sc, SDMA_U_SCTDP(unit), r);   /* current */
1239 	(void)GT_READ(sc, SDMA_U_SCTDP(unit));
1240 	GT_WRITE(sc, SDMA_U_SFTDP(unit), r);   /* first   */
1241 	(void)GT_READ(sc, SDMA_U_SFTDP(unit));
1242 	/*
1243 	 * set SDMA unit port RX descriptor pointer
1244 	 * "next" pointer of last descriptor is start of ring
1245 	 */
1246 	r = desc_read(
1247 	    &sc->gtmpsc_poll_sdmapage->rx[GTMPSC_NRXDESC-1].rxdesc.sdma_next);
1248 	GT_WRITE(sc, SDMA_U_SCRDP(unit), r);   /* current */
1249 
1250 	/*
1251 	 * initialize SDMA unit Configuration Register
1252 	 */
1253 	r = SDMA_SDC_BSZ_8x64|SDMA_SDC_SFM|SDMA_SDC_RFT;
1254 	GT_WRITE(sc, SDMA_U_SDC(unit), r);
1255 
1256 	/*
1257 	 * enable SDMA receive
1258 	 */
1259 	GT_WRITE(sc, SDMA_U_SDCM(unit), SDMA_SDCM_ERD);
1260 
1261 	if (once == 0) {
1262 		/*
1263 		 * GTMPSC Routing:
1264 		 *	MR0 --> Serial Port 0
1265 		 *	MR1 --> Serial Port 1
1266 		 */
1267 		GT_WRITE(sc, GTMPSC_MRR, GTMPSC_MRR_RES);
1268 
1269 		/*
1270 		 * RX and TX Clock Routing:
1271 		 *      CRR0 --> BRG0
1272 		 *      CRR1 --> BRG1
1273 		 */
1274 		r = GTMPSC_CRR_BRG0 | (GTMPSC_CRR_BRG1 << GTMPSC_CRR1_SHIFT);
1275 		GT_WRITE(sc, GTMPSC_RCRR, r);
1276 		GT_WRITE(sc, GTMPSC_TCRR, r);
1277 	}
1278 	sc->gtmpsc_brg_bcr = BRG_BCR_EN | GT_MPSC_CLOCK_SOURCE |
1279 	    compute_cdv(GT_MPSC_DEFAULT_BAUD_RATE);
1280 	sc->gtmpsc_chr3 = GTMPSC_MAXIDLE(GT_MPSC_DEFAULT_BAUD_RATE);
1281 	gtmpsc_loadchannelregs(sc);
1282 
1283 	/*
1284 	 * set MPSC Protocol configuration register for GTMPSC unit
1285 	 */
1286 	GT_WRITE(sc, GTMPSC_U_MPCR(unit), GTMPSC_MPCR_CL_8);
1287 
1288 	/*
1289 	 * set MPSC LO and HI port config registers for GTMPSC unit
1290  	 */
1291 	r = GTMPSC_MMCR_LO_MODE_UART
1292 	   |GTMPSC_MMCR_LO_ET
1293 	   |GTMPSC_MMCR_LO_ER
1294 	   |GTMPSC_MMCR_LO_NLM;
1295 	GT_WRITE(sc, GTMPSC_U_MMCR_LO(unit), r);
1296 
1297 	r =
1298 	    GTMPSC_MMCR_HI_TCDV_DEFAULT
1299 	   |GTMPSC_MMCR_HI_RDW
1300 	   |GTMPSC_MMCR_HI_RCDV_DEFAULT;
1301 	GT_WRITE(sc, GTMPSC_U_MMCR_HI(unit), r);
1302 
1303 	/*
1304 	 * tell MPSC receive the Enter Hunt
1305 	 */
1306 	r = sc->gtmpsc_chr2 | GTMPSC_CHR2_EH;
1307 	GT_WRITE(sc, GTMPSC_U_CHRN(unit, 2), r);
1308 
1309 	/*
1310 	 * clear any pending SDMA interrupts for this unit
1311 	 */
1312 	r = GT_READ(sc, SDMA_ICAUSE);
1313 	r &= ~SDMA_U_INTR_MASK(unit);
1314 	GT_WRITE(sc, SDMA_ICAUSE, r);	/* ??? */
1315 
1316 	DPRINTF(("gtmpscinit: OK\n"));
1317 }
1318 
1319 /*
1320  * gtmpscinit - prepare MPSC for operation
1321  *
1322  *	assumes we are called at ipl >= IPL_SERIAL
1323  */
1324 STATIC void
1325 gtmpscinit(struct gtmpsc_softc *sc)
1326 {
1327 	static int once = 0;
1328 
1329 	gtmpscinit_stop(sc, once);
1330 	gtmpscinit_start(sc, once);
1331 	once = 1;
1332 }
1333 
1334 /*
1335  * gtmpsccninit - initialize the driver and the mpsc device
1336  */
1337 void
1338 gtmpsccninit(struct consdev *cd)
1339 {
1340 }
1341 
1342 int
1343 gtmpsccngetc(dev_t dev)
1344 {
1345 	unsigned int unit = 0;
1346 	int c;
1347 
1348 	unit = GTMPSCUNIT(dev);
1349 	if (major(dev) != 0) {
1350 		struct gtmpsc_softc *sc = device_lookup(&gtmpsc_cd, unit);
1351 		if (sc == NULL)
1352 			return 0;
1353 		unit = sc->gtmpsc_unit;
1354 	}
1355 	if (unit >= GTMPSC_NCHAN)
1356 		return 0;
1357 	c = gtmpsc_common_getc(unit);
1358 
1359 	return c;
1360 }
1361 
1362 void
1363 gtmpsccnputc(dev_t dev, int c)
1364 {
1365 	unsigned int unit = 0;
1366 	char ch = c;
1367 	static int ix = 0;
1368 
1369 	if (gtmpsccninit_done == 0) {
1370 		if ((minor(dev) == 0) && (ix < sizeof(gtmpsc_earlybuf)))
1371 			gtmpsc_earlybuf[ix++] = (unsigned char)c;
1372 		return;
1373 	}
1374 
1375 	unit = GTMPSCUNIT(dev);
1376 	if (major(dev) != 0) {
1377 		struct gtmpsc_softc *sc = device_lookup(&gtmpsc_cd, unit);
1378 		if (sc == NULL)
1379 			return;
1380 		unit = sc->gtmpsc_unit;
1381 	}
1382 
1383 	if (unit >= GTMPSC_NCHAN)
1384 		return;
1385 
1386 	gtmpsc_common_putc(unit, ch);
1387 }
1388 
1389 void
1390 gtmpsccnpollc(dev_t dev, int on)
1391 {
1392 }
1393 
1394 int
1395 gtmpsccnattach(bus_space_tag_t memt, bus_space_handle_t memh, int unit,
1396 	int speed, tcflag_t tcflag)
1397 {
1398 	struct gtmpsc_softc *sc = &gtmpsc_fake_softc;
1399 	unsigned char *cp;
1400 	unsigned char c;
1401 	unsigned int i;
1402 
1403 	if (gtmpsccninit_done)
1404 		return 0;
1405 
1406 	DPRINTF(("gtmpsccnattach\n"));
1407 	gtmpsc_hackinit(sc, memt, memh, unit);
1408 	DPRINTF(("gtmpscinit\n"));
1409 	gtmpscinit(sc);
1410 	gtmpsccninit_done = 1;
1411 	cp = gtmpsc_earlybuf;
1412 	strcpy(gtmpsc_earlybuf, "\r\nMPSC Lives!\r\n");
1413 	for (i=0; i < sizeof(gtmpsc_earlybuf); i++) {
1414 		c = *cp++;
1415 		if (c == 0)
1416 			break;
1417 		gtmpsc_common_putc(unit, c);
1418 	}
1419 	DPRINTF(("switching cn_tab\n"));
1420 	gtmpsc_consdev.cn_dev = makedev(0, unit);
1421 	cn_tab = &gtmpsc_consdev;
1422 	DPRINTF(("switched cn_tab!\n"));
1423 	return 0;
1424 }
1425 
1426 /*
1427  * gtmpsc_common_pollc - non-blocking console read
1428  *
1429  *	if there is an RX char, return it in *cp
1430  *	set *statp if Break detected
1431  *
1432  *	assumes we are called at ipl >= IPL_SERIAL
1433  *
1434  * return 1 if there is RX data
1435  * otherwise return 0
1436  */
1437 STATIC int
1438 gtmpsc_common_pollc(unsigned int unit, char *cp, int *statp)
1439 {
1440 	struct gtmpsc_softc *sc = gtmpsc_scp[unit];
1441 	gtmpsc_pollrx_t *vrxp;
1442 	unsigned int ix;
1443 	unsigned int cx;
1444 	unsigned int nc;
1445 
1446 	*statp = GTMPSC_STAT_NONE;
1447 	ix = sc->gtmpsc_poll_rxix;
1448 	nc = sc->gtmpsc_nc;
1449 	cx = sc->gtmpsc_cx;
1450 	if (nc == 0) {
1451 		unsigned int *csrp;
1452 		unsigned int csr;
1453 
1454 		vrxp = &sc->gtmpsc_poll_sdmapage->rx[ix];
1455 		csrp = &vrxp->rxdesc.sdma_csr;
1456 		cx = 0;
1457 
1458 		GTMPSC_CACHE_INVALIDATE(csrp);
1459 		csr = desc_read(csrp);
1460 		if (csr & SDMA_CSR_RX_OWN)
1461 			return 0;
1462 		if (csr & SDMA_CSR_RX_BR)
1463 			*statp = GTMPSC_STAT_BREAK;
1464 		if (csr & SDMA_CSR_RX_ES)
1465 			PRINTF(("mpsc 0 RX error, rxdesc csr 0x%x\n", csr));
1466 
1467 		nc = desc_read(&vrxp->rxdesc.sdma_cnt);
1468 		nc &= SDMA_RX_CNT_BCNT_MASK;
1469 		csr = SDMA_CSR_RX_L|SDMA_CSR_RX_F|SDMA_CSR_RX_OWN
1470 							      |SDMA_CSR_RX_EI;
1471 		if (nc == 0) {
1472 			if ((++ix) >= GTMPSC_NRXDESC)
1473 				ix = 0;
1474 			sc->gtmpsc_poll_rxix = ix;
1475 			desc_write(csrp, csr);
1476 			GTMPSC_CACHE_FLUSH(csrp);
1477 			return 0;
1478 		}
1479 		bcopy(vrxp->rxbuf, sc->gtmpsc_rxbuf, nc);
1480 		desc_write(csrp, csr);
1481 		GTMPSC_CACHE_FLUSH(csrp);
1482 	}
1483 	gtmpsc_poll_pollc_cnt++;
1484 	nc--;
1485 	*cp = sc->gtmpsc_rxbuf[cx++];
1486 	if (nc == 0) {
1487 		if ((++ix) >= GTMPSC_NRXDESC)
1488 			ix = 0;
1489 		sc->gtmpsc_poll_rxix = ix;
1490 	}
1491 	sc->gtmpsc_cx = cx;
1492 	sc->gtmpsc_nc = nc;
1493 	return 1;
1494 }
1495 
1496 /*
1497  * gtmpsc_common_getc - polled console read
1498  *
1499  *	We copy data from the DMA buffers into a buffer in the softc
1500  *	to reduce descriptor ownership turnaround time
1501  *	MPSC can crater if it wraps descriptor rings,
1502  *	which is asynchronous and throttled only by line speed.
1503  *
1504  *	This code assumes the buffer PA==KVA
1505  *	and assumes we are called at ipl >= IPL_SERIAL
1506  */
1507 STATIC int
1508 gtmpsc_common_getc(unsigned int unit)
1509 {
1510 	struct gtmpsc_softc *sc = gtmpsc_scp[unit];
1511 	gtmpsc_pollrx_t *vrxp;
1512 	unsigned int ix;
1513 	unsigned int cx;
1514 	unsigned int nc;
1515 	unsigned int wdog_interval;
1516 	int c;
1517 
1518 	ix = sc->gtmpsc_poll_rxix;
1519 	nc = sc->gtmpsc_nc;
1520 	cx = sc->gtmpsc_cx;
1521 	wdog_interval = 0;
1522 	while (nc == 0) {
1523 		unsigned int *csrp;
1524 		unsigned int csr;
1525 		unsigned int r;
1526 
1527 		vrxp = &sc->gtmpsc_poll_sdmapage->rx[ix];
1528 		csrp = &vrxp->rxdesc.sdma_csr;
1529 		cx = 0;
1530 
1531 		GTMPSC_CACHE_INVALIDATE(csrp);
1532 		csr = desc_read(csrp);
1533 		if (csr & SDMA_CSR_RX_OWN) {
1534 			r = sc->gtmpsc_chr2 | GTMPSC_CHR2_CRD;
1535 			GT_WRITE(sc, GTMPSC_U_CHRN(unit, 2), r);
1536 			do {
1537 				if (wdog_interval++ % 32)
1538 					gt_watchdog_service();
1539 				gtmpsc_poll_getc_miss++;
1540 				GTMPSC_CACHE_INVALIDATE(csrp);
1541 				DELAY(50);
1542 				csr = desc_read(csrp);
1543 			} while (csr & SDMA_CSR_RX_OWN);
1544 		} else
1545 		if (wdog_interval++ % 32)
1546 			gt_watchdog_service();
1547 		if (csr & SDMA_CSR_RX_ES)
1548 			PRINTF(("mpsc 0 RX error, rxdesc csr 0x%x\n", csr));
1549 
1550 		nc = desc_read(&vrxp->rxdesc.sdma_cnt);
1551 		nc &= SDMA_RX_CNT_BCNT_MASK;
1552 		if (nc) {
1553 			bcopy(vrxp->rxbuf, sc->gtmpsc_rxbuf, nc);
1554 		} else {
1555 			if ((++ix) >= GTMPSC_NRXDESC)
1556 				ix = 0;
1557 			sc->gtmpsc_poll_rxix = ix;
1558 		}
1559 		csr = SDMA_CSR_RX_L|SDMA_CSR_RX_F|SDMA_CSR_RX_OWN
1560 							|SDMA_CSR_RX_EI;
1561 		desc_write(csrp, csr);
1562 		GTMPSC_CACHE_FLUSH(csrp);
1563 #ifdef KGDB
1564 		if (unit == comkgdbport && gt_reva_gtmpsc_bug)
1565 			GT_WRITE(sc, SDMA_ICAUSE, ~SDMA_INTR_RXBUF(unit));
1566 #endif
1567 	}
1568 	gtmpsc_poll_getc_cnt++;
1569 	nc--;
1570 	c = (int)sc->gtmpsc_rxbuf[cx++];
1571 	if (nc == 0) {
1572 		if ((++ix) >= GTMPSC_NRXDESC)
1573 			ix = 0;
1574 		sc->gtmpsc_poll_rxix = ix;
1575 	}
1576 	sc->gtmpsc_cx = cx;
1577 	sc->gtmpsc_nc = nc;
1578 	gt_watchdog_service();
1579 	return c;
1580 }
1581 
1582 /*
1583  * gtmpsc_common_putn - write a buffer into the hardware
1584  *
1585  *	assumes we are called at ipl >= IPL_SERIAL
1586  */
1587 STATIC void
1588 gtmpsc_common_putn(struct gtmpsc_softc *sc)
1589 
1590 {
1591 	int     unit = sc->gtmpsc_unit;
1592 	int     n;
1593 	int     kick;
1594 	gtmpsc_polltx_t *vtxp;
1595 	unsigned int *csrp;
1596 	unsigned int csr;
1597 	unsigned int ix;
1598 	unsigned int sdcm;
1599 
1600 	kick = 0;
1601 	for (ix = sc->gtmpsc_poll_txix; sc->sc_tbc;) {
1602 		vtxp = &sc->gtmpsc_poll_sdmapage->tx[ix];
1603 		csrp = &vtxp->txdesc.sdma_csr;
1604 		GTMPSC_CACHE_INVALIDATE(csrp);
1605 		csr = desc_read(csrp);
1606 		if ((csr & SDMA_CSR_TX_OWN) != 0)
1607 			break;
1608 		n = sc->sc_tbc;
1609 		if (n > GTMPSC_TXBUFSZ)
1610 			n = GTMPSC_TXBUFSZ;
1611 		bcopy(sc->sc_tba, vtxp->txbuf, n);
1612 		csr = SDMA_CSR_TX_L | SDMA_CSR_TX_F
1613 					| SDMA_CSR_TX_EI | SDMA_CSR_TX_OWN;
1614 		desc_write(&vtxp->txdesc.sdma_cnt,
1615 				(n << SDMA_TX_CNT_BCNT_SHIFT) | n);
1616 		desc_write(csrp, csr);
1617 		GTMPSC_CACHE_FLUSH(csrp);
1618 		sc->sc_tbc -= n;
1619 		sc->sc_tba += n;
1620 		gtmpsc_poll_putn_cnt += n;
1621 		sc->cnt_tx_to_sdma += n;
1622 		kick = 1;
1623 
1624 		if (++ix >= GTMPSC_NTXDESC)
1625 			ix = 0;
1626 	}
1627 	if (kick) {
1628 		sc->gtmpsc_poll_txix = ix;
1629 
1630 		/*
1631 		 * now kick some SDMA
1632 		 */
1633 		sdcm = GT_READ(sc, SDMA_U_SDCM(unit));
1634 
1635 		if ((sdcm & SDMA_SDCM_TXD) == 0) {
1636 			GT_WRITE(sc, SDMA_U_SDCM(unit), SDMA_SDCM_TXD);
1637 		}
1638 	}
1639 }
1640 
1641 /*
1642  * gtmpsc_common_putc - polled console putc
1643  *
1644  *	assumes we are called at ipl >= IPL_SERIAL
1645  */
1646 STATIC void
1647 gtmpsc_common_putc(unsigned int unit, unsigned char c)
1648 {
1649 	struct gtmpsc_softc *sc = gtmpsc_scp[unit];
1650 	gtmpsc_polltx_t *vtxp;
1651 	unsigned int *csrp;
1652 	unsigned int csr;
1653 	unsigned int ix;
1654 	unsigned int nix;
1655 	unsigned int wdog_interval = 0;
1656 
1657 	DPRINTF(("gtmpsc_common_putc(%d, '%c'): cur=%#x, first=%#x", unit, c,
1658 	    GT_READ(sc, SDMA_U_SCTDP(unit)),   /* current */
1659 	    GT_READ(sc, SDMA_U_SFTDP(unit))));   /* first   */
1660 	ix = sc->gtmpsc_poll_txix;
1661 	nix = ix + 1;
1662 	if (nix >= GTMPSC_NTXDESC)
1663 		nix = 0;
1664 	sc->gtmpsc_poll_txix = nix;
1665 	vtxp = &sc->gtmpsc_poll_sdmapage->tx[ix];
1666 	csrp = &vtxp->txdesc.sdma_csr;
1667 
1668 
1669 	for (;;) {
1670 		GTMPSC_CACHE_INVALIDATE(csrp);
1671 		csr = desc_read(csrp);
1672 		if ((csr & SDMA_CSR_TX_OWN) == 0)
1673 			break;
1674 		gtmpsc_poll_putc_miss++;
1675 		DELAY(40);
1676 		DPRINTF(("."));
1677 		if (wdog_interval++ % 32)
1678 			gt_watchdog_service();
1679 	}
1680 	if (csr & SDMA_CSR_TX_ES)
1681 		PRINTF(("mpsc %d TX error, txdesc csr 0x%x\n", unit, csr));
1682 
1683 	gtmpsc_poll_putc_cnt++;
1684 	vtxp->txbuf[0] = c;
1685 	csr = SDMA_CSR_TX_L | SDMA_CSR_TX_F | SDMA_CSR_TX_EI | SDMA_CSR_TX_OWN;
1686 	desc_write(&vtxp->txdesc.sdma_cnt, (1 << SDMA_TX_CNT_BCNT_SHIFT) | 1);
1687 	desc_write(csrp, csr);
1688 	GTMPSC_CACHE_FLUSH(csrp);
1689 
1690 	/*
1691 	 * now kick some SDMA
1692 	 */
1693 	GT_WRITE(sc, SDMA_U_SDCM(unit), SDMA_SDCM_TXD);
1694 	gt_watchdog_service();
1695 }
1696 
1697 
1698 STATIC void
1699 gtmpsc_poll(void *arg)
1700 {
1701 	struct gtmpsc_softc *sc = (struct gtmpsc_softc *)arg;
1702 	int kick;
1703 	char ch;
1704 	int stat;
1705 	static struct timeval   msg_time = {0,0};
1706 	static struct timeval   cur_time;
1707 	static int fifo_full = 0;
1708 
1709 	kick = 0;
1710 	while (gtmpsc_common_pollc(sc->gtmpsc_unit, &ch, &stat)) {
1711 #ifdef DDB
1712 		if (stat)
1713 			break;
1714 #endif
1715 		++sc->cnt_rx_from_sdma;
1716 		if (sc->gtmpsc_rxfifo_navail != 0) {
1717 			sc->gtmpsc_rxfifo[sc->gtmpsc_rxfifo_putix++] = ch;
1718 			if (sc->gtmpsc_rxfifo_putix == GTMPSC_RXFIFOSZ)
1719 				sc->gtmpsc_rxfifo_putix = 0;
1720 			atomic_add(&sc->gtmpsc_rxfifo_navail, -1);
1721 			++sc->cnt_rx_to_fifo;
1722 			fifo_full = 0;
1723 			kick = 1;
1724 		} else {
1725 			if (fifo_full == 0) {
1726 				fifo_full = 1;
1727 				microtime(&cur_time);
1728 				if (cur_time.tv_sec - msg_time.tv_sec >= 5) {
1729 					/* Only do this once in 5 sec */
1730 					msg_time = cur_time;
1731 					printf("mpsc%d: input FIFO full, "
1732 					       "dropping incoming characters\n",
1733 					       sc->gtmpsc_unit);
1734 				}
1735 			}
1736 		}
1737 	}
1738 #ifdef DDB
1739 	if (stat) {
1740 		if (cn_tab == &gtmpsc_consdev) {
1741 			Debugger();
1742 		}
1743 	}
1744 #endif
1745 	if (kick)
1746 		softint_schedule(sc->sc_si);
1747 }
1748 
1749 #ifdef KGDB
1750 /* ARGSUSED */
1751 STATIC int
1752 gtmpsc_kgdb_getc(arg)
1753 	void *arg;
1754 {
1755 
1756 	return (gtmpsc_common_getc(comkgdbport));
1757 }
1758 
1759 /* ARGSUSED */
1760 STATIC void
1761 gtmpsc_kgdb_putc(arg, c)
1762 	void *arg;
1763 	int c;
1764 {
1765 
1766 	return (gtmpsc_common_putc(comkgdbport, c));
1767 }
1768 
1769 STATIC void
1770 gtmpsc_kgdb_poll(void *arg)
1771 {
1772 	struct gtmpsc_softc       *sc = (struct gtmpsc_softc *)arg;
1773 	int                     s;
1774 	char                    c;
1775 	int                     brk;
1776 
1777 	s = splserial();
1778 	if (kgdb_recover == 0) { /* gdb is not currently talking to its agent */
1779 		while (gtmpsc_common_pollc(sc->gtmpsc_unit, &c, &brk)) {
1780 			if (c == CTRL('c'))
1781 				brk = GTMPSC_STAT_BREAK;
1782 			if (brk == GTMPSC_STAT_BREAK)
1783 				break;
1784 		}
1785 		if (brk == GTMPSC_STAT_BREAK) {
1786 			if (kgdb_break_immediate)
1787 				breakpoint();
1788 			else {
1789 				printf("connecting to kgdb\n");
1790 				kgdb_connect(1);
1791 			}
1792 		}
1793 	}
1794 	splx(s);
1795 }
1796 
1797 #endif /* KGDB */
1798 
1799 #if 0
1800 void
1801 gtmpsc_printf(const char *fmt, ...)
1802 {
1803 	struct consdev *ocd;
1804 	int s;
1805 	va_list ap;
1806 
1807 	s = splserial();
1808 	ocd = cn_tab;
1809 	cn_tab = &constab[0];
1810 	va_start(ap, fmt);
1811 	printf(fmt, ap);
1812 	va_end(ap);
1813 	cn_tab = ocd;
1814 	splx(s);
1815 }
1816 #endif
1817 
1818 void
1819 gtmpsc_mem_printf(const char *fmt, ...)
1820 {
1821 	va_list ap;
1822 	static unsigned char *p = gtmpsc_print_buf;
1823 
1824 	if (p >= &gtmpsc_print_buf[GTMPSC_PRINT_BUF_SIZE - 128]) {
1825 		bzero(gtmpsc_print_buf, GTMPSC_PRINT_BUF_SIZE);
1826 		p = gtmpsc_print_buf;
1827 	}
1828 	va_start(ap, fmt);
1829 	p += vsprintf(p, fmt, ap);
1830 	va_end(ap);
1831 }
1832 
1833 void
1834 gtmpsc_shutdownhook(void *arg)
1835 {
1836 	gtmpsc_softc_t *sc = (gtmpsc_softc_t *)arg;
1837 
1838 	gtmpsc_txflush(sc);
1839 }
1840 
1841 void
1842 gtmpsccnhalt(dev_t dev)
1843 {
1844 	unsigned int unit;
1845 	u_int32_t r;
1846 
1847 	for (unit = 0; unit < GTMPSC_NCHAN; unit++) {
1848 		gtmpsc_softc_t *sc = gtmpsc_scp[unit];
1849 		if (sc == NULL)
1850 			continue;
1851 
1852 		/*
1853 		 * flush TX buffers
1854 		 */
1855 		gtmpsc_txflush(sc);
1856 
1857 		/*
1858 		 * stop MPSC unit RX
1859 		 */
1860 		r = GT_READ(sc, GTMPSC_U_CHRN(unit, 2));
1861 		r &= ~GTMPSC_CHR2_EH;
1862 		r |= GTMPSC_CHR2_RXABORT;
1863 		GT_WRITE(sc, GTMPSC_U_CHRN(unit, 2), r);
1864 
1865 		DELAY(GTMPSC_RESET_DELAY);
1866 
1867 		/*
1868 		 * abort SDMA RX for MPSC unit
1869 		 */
1870 		GT_WRITE(sc, SDMA_U_SDCM(unit), SDMA_SDCM_AR);
1871 	}
1872 }
1873 
1874 void
1875 gtmpsc_puts(char *str)
1876 {
1877 	char c;
1878 
1879 	if (str == NULL)
1880 		return;
1881 	while ((c = *str++) != 0)
1882 		gtmpsccnputc(0, c);
1883 }
1884