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