Home | History | Annotate | Line # | Download | only in marvell
gtmpsc.c revision 1.37
      1 /*	$NetBSD: gtmpsc.c,v 1.37 2009/05/12 14:30:25 cegger 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.37 2009/05/12 14:30:25 cegger 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(device_t, cfdata_t, void *);
    122 STATIC void gtmpscattach(device_t, device_t, 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     __aligned(PAGE_SIZE);
    224 STATIC unsigned char gtmpsc_fake_dmapage[PAGE_SIZE]
    225     __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(device_t parent, cfdata_t 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(device_t parent, device_t 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_dev(&sc->gtmpsc_dev, "console\n");
    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 			aprint_error_dev(&sc->gtmpsc_dev, "(kgdb): cannot share with console\n");
    555 			return;
    556 		}
    557 
    558 		sc->gtmpsc_flags |= GTMPSCF_KGDB;
    559 		printf("%s: kgdb\n", device_xname(&sc->gtmpsc_dev));
    560 		gtmpsc_txflush(gtmpsc_scp[0]);
    561 		kgdb_attach(gtmpsc_kgdb_getc, gtmpsc_kgdb_putc, NULL);
    562 		kgdb_dev = 123; /* unneeded, only to satisfy some tests */
    563 		gtmpsc_kgdb_attached = 1;
    564 		SDMA_IMASK_ENABLE(sc, SDMA_INTR_RXBUF(sc->gtmpsc_unit));
    565 		kgdb_connect(1);
    566 	}
    567 #endif /* KGDB */
    568 }
    569 
    570 STATIC void
    571 gtmpscshutdown(struct gtmpsc_softc *sc)
    572 {
    573 	struct tty *tp;
    574 	int     s;
    575 
    576 #ifdef KGDB
    577 	if (sc->gtmpsc_flags & GTMPSCF_KGDB != 0)
    578 		return;
    579 #endif
    580 	tp = sc->gtmpsc_tty;
    581 	s = splserial();
    582 	/* Fake carrier off */
    583 	(void) (*tp->t_linesw->l_modem)(tp, 0);
    584 	SDMA_IMASK_DISABLE(sc, SDMA_INTR_RXBUF(sc->gtmpsc_unit));
    585 	splx(s);
    586 }
    587 
    588 int
    589 gtmpscopen(dev_t dev, int flag, int mode, struct lwp *l)
    590 {
    591 	struct gtmpsc_softc *sc;
    592 	int unit = GTMPSCUNIT(dev);
    593 	struct tty *tp;
    594 	int s;
    595 	int s2;
    596 	int error;
    597 
    598 	sc = device_lookup_private(&gtmpsc_cd, unit);
    599 	if (!sc)
    600 		return ENXIO;
    601 #ifdef KGDB
    602 	/*
    603 	 * If this is the kgdb port, no other use is permitted.
    604 	 */
    605 	if (sc->gtmpsc_flags & GTMPSCF_KGDB != 0)
    606 		return (EBUSY);
    607 #endif
    608 	tp = sc->gtmpsc_tty;
    609 	if (kauth_authorize_device_tty(l->l_cred, KAUTH_DEVICE_TTY_OPEN, tp))
    610 		return (EBUSY);
    611 
    612 	s = spltty();
    613 
    614 	if (!(tp->t_state & TS_ISOPEN)) {
    615 		struct termios t;
    616 
    617 		tp->t_dev = dev;
    618 		s2 = splserial();
    619 		SDMA_IMASK_ENABLE(sc, SDMA_INTR_RXBUF(unit));
    620 		splx(s2);
    621 		t.c_ispeed = 0;
    622 #if 0
    623 		t.c_ospeed = TTYDEF_SPEED;
    624 #else
    625 		t.c_ospeed = GT_MPSC_DEFAULT_BAUD_RATE;
    626 #endif
    627 		t.c_cflag = TTYDEF_CFLAG;
    628 		/* Make sure gtmpscparam() will do something. */
    629 		tp->t_ospeed = 0;
    630 		(void) gtmpscparam(tp, &t);
    631 		tp->t_iflag = TTYDEF_IFLAG;
    632 		tp->t_oflag = TTYDEF_OFLAG;
    633 		tp->t_lflag = TTYDEF_LFLAG;
    634 		ttychars(tp);
    635 		ttsetwater(tp);
    636 		s2 = splserial();
    637 		/* Clear the input ring */
    638 		sc->gtmpsc_rxfifo_putix = 0;
    639 		sc->gtmpsc_rxfifo_getix = 0;
    640 		sc->gtmpsc_rxfifo_navail = GTMPSC_RXFIFOSZ;
    641 		gtmpsc_iflush(sc);
    642 		splx(s2);
    643 	}
    644 	splx(s);
    645 	error = ttyopen(tp, GTMPSCDIALOUT(dev), ISSET(flag, O_NONBLOCK));
    646 	if (error)
    647 		goto bad;
    648 
    649 	error = (*tp->t_linesw->l_open)(dev, tp);
    650 	if (error)
    651 		goto bad;
    652 
    653 	return (0);
    654 
    655 bad:
    656 	if (!ISSET(tp->t_state, TS_ISOPEN) && tp->t_wopen == 0) {
    657 		/*
    658 		 * We failed to open the device, and nobody else had it opened.
    659 		 * Clean up the state as appropriate.
    660 		 */
    661 		gtmpscshutdown(sc);
    662 	}
    663 
    664 	return (error);
    665 }
    666 
    667 int
    668 gtmpscclose(dev_t dev, int flag, int mode, struct lwp *l)
    669 {
    670 	int unit = GTMPSCUNIT(dev);
    671 	struct gtmpsc_softc *sc = device_lookup_private(&gtmpsc_cd, unit);
    672 	struct tty *tp = sc->gtmpsc_tty;
    673 	int s;
    674 
    675 	s = splserial();
    676 	if (!ISSET(tp->t_state, TS_ISOPEN)) {
    677 		splx(s);
    678 		return (0);
    679 	}
    680 
    681 	(*tp->t_linesw->l_close)(tp, flag);
    682 	ttyclose(tp);
    683 	if (!ISSET(tp->t_state, TS_ISOPEN) && tp->t_wopen == 0) {
    684 		/*
    685 		 * Although we got a last close, the device may still be in
    686 		 * use; e.g. if this was the dialout node, and there are still
    687 		 * processes waiting for carrier on the non-dialout node.
    688 		 */
    689 		gtmpscshutdown(sc);
    690 	}
    691 
    692 	splx(s);
    693 	return (0);
    694 }
    695 
    696 int
    697 gtmpscread(dev_t dev, struct uio *uio, int flag)
    698 {
    699 	struct gtmpsc_softc *sc = device_lookup_private(&gtmpsc_cd, GTMPSCUNIT(dev));
    700 	struct tty *tp = sc->gtmpsc_tty;
    701 
    702 	return (*tp->t_linesw->l_read)(tp, uio, flag);
    703 }
    704 
    705 int
    706 gtmpscwrite(dev_t dev, struct uio *uio, int flag)
    707 {
    708 	struct gtmpsc_softc *sc = device_lookup_private(&gtmpsc_cd, GTMPSCUNIT(dev));
    709 	struct tty *tp = sc->gtmpsc_tty;
    710 
    711 	return (*tp->t_linesw->l_write)(tp, uio, flag);
    712 }
    713 
    714 int
    715 gtmpscpoll(dev_t dev, int events, struct lwp *l)
    716 {
    717 	struct gtmpsc_softc *sc = device_lookup_private(&gtmpsc_cd, GTMPSCUNIT(dev));
    718 	struct tty *tp = sc->gtmpsc_tty;
    719 
    720 	return ((*tp->t_linesw->l_poll)(tp, events, l));
    721 }
    722 
    723 int
    724 gtmpscioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l)
    725 {
    726 	struct gtmpsc_softc *sc = device_lookup_private(&gtmpsc_cd, GTMPSCUNIT(dev));
    727 	struct tty *tp = sc->gtmpsc_tty;
    728 	int error;
    729 
    730 	if ((error = (*tp->t_linesw->l_ioctl)(tp, cmd, data, flag, l)) >= 0)
    731 		return error;
    732 	if ((error = ttioctl(tp, cmd, data, flag, l)) >= 0)
    733 		return error;
    734 	return ENOTTY;
    735 }
    736 
    737 struct tty *
    738 gtmpsctty(dev_t dev)
    739 {
    740 	struct gtmpsc_softc *sc = device_lookup_private(&gtmpsc_cd, GTMPSCUNIT(dev));
    741 
    742 	return sc->gtmpsc_tty;
    743 }
    744 
    745 void
    746 gtmpscstop(struct tty *tp, int flag)
    747 {
    748 }
    749 
    750 STATIC void
    751 gtmpscstart(struct tty *tp)
    752 {
    753 	struct gtmpsc_softc *sc;
    754 	unsigned char *tba;
    755 	unsigned int unit;
    756 	int s, s2, tbc;
    757 
    758 	unit = GTMPSCUNIT(tp->t_dev);
    759 	sc = device_lookup_private(&gtmpsc_cd, unit);
    760 	if (sc == NULL)
    761 		return;
    762 
    763 	s = spltty();
    764 	if (tp->t_state & (TS_TIMEOUT | TS_BUSY | TS_TTSTOP))
    765 		goto out;
    766 	if (sc->sc_tx_stopped)
    767 		goto out;
    768 	if (!ttypull(tp))
    769 		goto out;
    770 
    771 	/* Grab the first contiguous region of buffer space. */
    772 	tba = tp->t_outq.c_cf;
    773 	tbc = ndqb(&tp->t_outq, 0);
    774 
    775 	s2 = splserial();
    776 
    777 	sc->sc_tba = tba;
    778 	sc->sc_tbc = tbc;
    779 	sc->cnt_tx_from_ldisc += tbc;
    780 	SDMA_IMASK_ENABLE(sc, SDMA_INTR_TXBUF(unit));
    781 	tp->t_state |= TS_BUSY;
    782 	sc->sc_tx_busy = 1;
    783 	gtmpsc_common_putn(sc);
    784 
    785 	splx(s2);
    786 out:
    787 	splx(s);
    788 }
    789 
    790 STATIC int
    791 gtmpscparam(struct tty *tp, struct termios *t)
    792 {
    793 	struct gtmpsc_softc *sc = device_lookup_private(&gtmpsc_cd, GTMPSCUNIT(tp->t_dev));
    794 	int ospeed = compute_cdv(t->c_ospeed);
    795 	int s;
    796 
    797 	/* Check requested parameters. */
    798 	if (ospeed < 0)
    799 		return (EINVAL);
    800 	if (t->c_ispeed && t->c_ispeed != t->c_ospeed)
    801 		return (EINVAL);
    802 
    803 	/*
    804 	 * If there were no changes, don't do anything.  This avoids dropping
    805 	 * input and improves performance when all we did was frob things like
    806 	 * VMIN and VTIME.
    807 	 */
    808 	if (tp->t_ospeed == t->c_ospeed &&
    809 	    tp->t_cflag == t->c_cflag)
    810 		return (0);
    811 
    812 	s = splserial();
    813 
    814 	sc->gtmpsc_brg_bcr = BRG_BCR_EN | GT_MPSC_CLOCK_SOURCE | ospeed;
    815 	sc->gtmpsc_chr3 = GTMPSC_MAXIDLE(t->c_ospeed);
    816 
    817 	/* And copy to tty. */
    818 	tp->t_ispeed = 0;
    819 	tp->t_ospeed = t->c_ospeed;
    820 	tp->t_cflag = t->c_cflag;
    821 
    822 	if (!sc->sc_heldchange) {
    823 		if (sc->sc_tx_busy) {
    824 			sc->sc_heldtbc = sc->sc_tbc;
    825 			sc->sc_tbc = 0;
    826 			sc->sc_heldchange = 1;
    827 		} else
    828 			gtmpsc_loadchannelregs(sc);
    829 	}
    830 
    831 	splx(s);
    832 
    833 	/* Fake carrier on */
    834 	(void) (*tp->t_linesw->l_modem)(tp, 1);
    835 
    836 	return 0;
    837 }
    838 
    839 STATIC int
    840 gtmpsc_probe(void)
    841 {
    842 	return 1;		/* XXX */
    843 }
    844 
    845 STATIC unsigned int
    846 gtmpsc_get_causes(void)
    847 {
    848 	int                     i;
    849 	struct gtmpsc_softc       *sc;
    850 	unsigned int            cause = 0;
    851 	static unsigned int     bits[4] = {
    852 				SDMA_INTR_RXBUF(0),
    853 				SDMA_INTR_TXBUF(0),
    854 				SDMA_INTR_RXBUF(1),
    855 				SDMA_INTR_TXBUF(1),
    856 	};
    857 	sdma_desc_t             *desc_addr[4];
    858 	static unsigned int     fake_once = SDMA_INTR_RXBUF(0)
    859 						| SDMA_INTR_RXBUF(1);
    860 
    861 	desc_addr[0] = 0;
    862 	desc_addr[1] = 0;
    863 	desc_addr[2] = 0;
    864 	desc_addr[3] = 0;
    865 	sc = device_lookup_private(&gtmpsc_cd, 0);
    866 	if (sc != 0) {
    867 	    if (sdma_imask & SDMA_INTR_RXBUF(0)) {
    868 		desc_addr[0] =
    869 		    &sc->gtmpsc_poll_sdmapage->rx[sc->gtmpsc_poll_rxix].rxdesc;
    870 		    GTMPSC_CACHE_INVALIDATE(desc_addr[0]);
    871 		    __asm volatile ("dcbt 0,%0" :: "r"(desc_addr[0]));
    872 	    }
    873 	    if (sdma_imask & SDMA_INTR_TXBUF(0)) {
    874 		desc_addr[1] =
    875 		    &sc->gtmpsc_poll_sdmapage->tx[sc->gtmpsc_poll_txix].txdesc;
    876 		    GTMPSC_CACHE_INVALIDATE(desc_addr[1]);
    877 		    __asm volatile ("dcbt 0,%0" :: "r"(desc_addr[1]));
    878 	    }
    879 	}
    880 	sc = device_lookup_private(&gtmpsc_cd, 1);
    881 	if (sc != 0) {
    882 	    if (sdma_imask & SDMA_INTR_RXBUF(1)) {
    883 		desc_addr[2] =
    884 		    &sc->gtmpsc_poll_sdmapage->rx[sc->gtmpsc_poll_rxix].rxdesc;
    885 		    GTMPSC_CACHE_INVALIDATE(desc_addr[2]);
    886 		    __asm volatile ("dcbt 0,%0" :: "r"(desc_addr[2]));
    887 	    }
    888 	    if (sdma_imask & SDMA_INTR_TXBUF(1)) {
    889 		desc_addr[3] =
    890 		    &sc->gtmpsc_poll_sdmapage->tx[sc->gtmpsc_poll_txix].txdesc;
    891 		    GTMPSC_CACHE_INVALIDATE(desc_addr[3]);
    892 		    __asm volatile ("dcbt 0,%0" :: "r"(desc_addr[3]));
    893 	    }
    894 	}
    895 
    896 	for (i = 0; i < 4; ++i)
    897 		if ((sdma_imask & bits[i]) && desc_addr[i] != 0 &&
    898 			    (desc_addr[i]->sdma_csr & SDMA_CSR_TX_OWN) == 0)
    899 			cause |= bits[i];
    900 	if (fake_once & sdma_imask) {
    901 		cause |= fake_once & sdma_imask;
    902 	/*	fake_once &= ~(cause & fake_once); */
    903 	}
    904 	return cause;
    905 }
    906 
    907 STATIC int
    908 gtmpsc_intr(void *arg)
    909 {
    910 	struct gtmpsc_softc       *sc;
    911 	unsigned int            unit;
    912 	int                     spurious = 1;
    913 	unsigned int            r;
    914 	unsigned int            cause=0;
    915 
    916 	if (gt_reva_gtmpsc_bug)
    917 		cause = gtmpsc_get_causes();
    918 
    919 #ifdef KGDB
    920 	if (kgdb_break_immediate) {
    921 		unit = comkgdbport;
    922 		sc = device_lookup_private(&gtmpsc_cd, unit);
    923 		if (sc == 0 || (sc->gtmpsc_flags & GTMPSCF_KGDB) == 0)
    924 			goto skip_kgdb;
    925 		if (gt_reva_gtmpsc_bug)
    926 			r = cause & sdma_imask;
    927 		else {
    928 			r = GT_READ(sc, SDMA_ICAUSE);
    929 			r &= GT_READ(sc, SDMA_IMASK);
    930 		}
    931 		r &= SDMA_INTR_RXBUF(unit);
    932 		if (r == 0)
    933 			goto skip_kgdb;
    934 		GT_WRITE(sc, SDMA_ICAUSE, ~r);
    935 		spurious = 0;
    936 		gtmpsc_kgdb_poll(sc);
    937 	}
    938 skip_kgdb:
    939 #endif
    940 	for (unit = 0; unit < GTMPSC_NCHAN; ++unit) {
    941 		sc = device_lookup_private(&gtmpsc_cd, unit);
    942 		if (sc == NULL)
    943 			continue;
    944 		if (gt_reva_gtmpsc_bug)
    945 			r = cause & sdma_imask;
    946 		else {
    947 			r = GT_READ(sc, SDMA_ICAUSE);
    948 			r &= GT_READ(sc, SDMA_IMASK);
    949 		}
    950 		r &= SDMA_U_INTR_MASK(unit);
    951 		if (r == 0)
    952 			continue;
    953 		GT_WRITE(sc, SDMA_ICAUSE, ~r);
    954 		spurious = 0;
    955 		if (r & SDMA_INTR_RXBUF(unit)) {
    956 #ifdef KGDB
    957 			if (sc->gtmpsc_flags & GTMPSCF_KGDB)
    958 				gtmpsc_kgdb_poll(sc);
    959 			else
    960 #endif
    961 				gtmpsc_poll(sc);
    962 		}
    963 		if (r & SDMA_INTR_TXBUF(unit)) {
    964 			/*
    965 			 * If we've delayed a parameter change, do it now,
    966 			 * and restart output.
    967 			 */
    968 			if (sc->sc_heldchange) {
    969 				gtmpsc_loadchannelregs(sc);
    970 				sc->sc_heldchange = 0;
    971 				sc->sc_tbc = sc->sc_heldtbc;
    972 				sc->sc_heldtbc = 0;
    973 			}
    974 
    975 			/* Output the next chunk of the contiguous buffer,
    976 								if any. */
    977 			if (sc->sc_tbc > 0)
    978 				gtmpsc_common_putn(sc);
    979 			if (sc->sc_tbc == 0 && sc->sc_tx_busy) {
    980 				sc->sc_tx_busy = 0;
    981 				sc->sc_tx_done = 1;
    982 				softint_schedule(sc->sc_si);
    983 				SDMA_IMASK_DISABLE(sc, SDMA_INTR_TXBUF(unit));
    984 			}
    985 		}
    986 	}
    987 	return 1;
    988 	/* return !spurious; */
    989 }
    990 
    991 STATIC void
    992 gtmpsc_softintr(void *arg)
    993 {
    994 	struct gtmpsc_softc	*sc = arg;
    995 	struct tty              *tp;
    996 	int                     (*rint)(int, struct tty *);
    997 	int                     jobs;
    998 	int                     s;
    999 
   1000 	tp = sc->gtmpsc_tty;
   1001 	rint = tp->t_linesw->l_rint;
   1002 	do {
   1003 		jobs = 0;
   1004 		if (sc->gtmpsc_rxfifo_navail < GTMPSC_RXFIFOSZ) {
   1005 			s = spltty();
   1006 			rint(sc->gtmpsc_rxfifo[sc->gtmpsc_rxfifo_getix++],
   1007 								tp);
   1008 			if (sc->gtmpsc_rxfifo_getix >= GTMPSC_RXFIFOSZ)
   1009 				sc->gtmpsc_rxfifo_getix = 0;
   1010 			++sc->cnt_rx_from_fifo;
   1011 			/* atomic_add() returns the previous value */
   1012 			jobs += atomic_add(&sc->gtmpsc_rxfifo_navail, 1) + 1
   1013 								< GTMPSC_RXFIFOSZ;
   1014 			splx(s);
   1015 		}
   1016 		if (sc->sc_tx_done) {
   1017 			++jobs;
   1018 			sc->sc_tx_done = 0;
   1019 			s = spltty();
   1020 			tp->t_state &= ~TS_BUSY;
   1021 			if ((tp->t_state & TS_FLUSH) != 0)
   1022 			    tp->t_state &= ~TS_FLUSH;
   1023 			else
   1024 			    ndflush(&tp->t_outq, (int)(sc->sc_tba - tp->t_outq.c_cf));
   1025 			(*tp->t_linesw->l_start)(tp);
   1026 			splx(s);
   1027 		}
   1028 	} while (jobs);
   1029 }
   1030 
   1031 /*
   1032  * Console support functions
   1033  */
   1034 void
   1035 gtmpsccnprobe(struct consdev *cd)
   1036 {
   1037 	int maj;
   1038 /* {extern void return_to_dink(int); return_to_dink(gtbase);} */
   1039 
   1040 	if (!gtmpsc_probe())
   1041 		return;
   1042 
   1043 	maj = cdevsw_lookup_major(&gtmpsc_cdevsw);
   1044 	cd->cn_dev = makedev(maj, 0);
   1045 	cd->cn_pri = CN_INTERNAL;
   1046 }
   1047 
   1048 /*
   1049  * gtmpsc_hackinit - hacks required to supprt GTMPSC console
   1050  */
   1051 STATIC void
   1052 gtmpsc_hackinit(struct gtmpsc_softc *sc, bus_space_tag_t memt,
   1053 	bus_space_handle_t memh, int unit)
   1054 {
   1055 	gtmpsc_poll_sdma_t *vmps;
   1056 	gtmpsc_poll_sdma_t *pmps;
   1057 
   1058 	DPRINTF(("hackinit\n"));
   1059 
   1060 	memset(sc, 0, sizeof(struct gtmpsc_softc));
   1061 	sc->gtmpsc_memt = memt;
   1062 	sc->gtmpsc_memh = memh;
   1063 	sc->gtmpsc_unit = unit;
   1064 	gtmpsc_scp[sc->gtmpsc_unit] = sc;
   1065 
   1066 	vmps = (gtmpsc_poll_sdma_t *)gtmpsc_fake_dmapage;	/* KVA */
   1067 	pmps = (gtmpsc_poll_sdma_t *)gtmpsc_fake_dmapage;	/* PA */
   1068 
   1069 	gtmpsc_txdesc_init(vmps, pmps);
   1070 	gtmpsc_rxdesc_init(vmps, pmps);
   1071 
   1072 	sc->gtmpsc_poll_sdmapage = vmps;
   1073 }
   1074 
   1075 /*
   1076  * gtmpsc_txflush - wait for output to drain
   1077  */
   1078 STATIC void
   1079 gtmpsc_txflush(gtmpsc_softc_t *sc)
   1080 {
   1081 	unsigned int csr;
   1082 	unsigned int *csrp;
   1083 	gtmpsc_polltx_t *vtxp;
   1084 	int limit = 4000000;	/* 4 seconds */
   1085 	int ix;
   1086 
   1087 	ix = sc->gtmpsc_poll_txix - 1;
   1088 	if (ix < 0)
   1089 		ix = GTMPSC_NTXDESC - 1;
   1090 
   1091 	vtxp = &sc->gtmpsc_poll_sdmapage->tx[ix];
   1092 	csrp = &vtxp->txdesc.sdma_csr;
   1093 	while (limit > 0) {
   1094 		GTMPSC_CACHE_INVALIDATE(csrp);
   1095 		csr = desc_read(csrp);
   1096 		if ((csr & SDMA_CSR_TX_OWN) == 0)
   1097 			break;
   1098 		DELAY(GTMPSC_POLL_DELAY);
   1099 		limit -= GTMPSC_POLL_DELAY;
   1100 	}
   1101 }
   1102 
   1103 STATIC void
   1104 gtmpsc_iflush(gtmpsc_softc_t *sc)
   1105 {
   1106 	int     timo;
   1107 	char    c;
   1108 	int     stat;
   1109 
   1110 	for (timo = 50000; timo; timo--)
   1111 		if (gtmpsc_common_pollc(sc->gtmpsc_unit, &c, &stat) == 0)
   1112 			return;
   1113 #ifdef DIAGNOSTIC
   1114 	printf("%s: gtmpsc_iflush timeout %02x\n", device_xname(&sc->gtmpsc_dev), c);
   1115 #endif
   1116 }
   1117 
   1118 STATIC void
   1119 gtmpscinit_stop(struct gtmpsc_softc *sc, int once)
   1120 {
   1121 	unsigned int r;
   1122 	unsigned int unit = sc->gtmpsc_unit;
   1123 
   1124 	/*
   1125 	 * XXX HACK FIXME
   1126 	 * PMON output has not been flushed.  give him a chance
   1127 	 */
   1128 #if 1
   1129 	if (! once)
   1130 		DELAY(100000);	/* XXX */
   1131 #endif
   1132 
   1133 	DPRINTF(("gtmpscinit_stop: unit 0x%x\n", unit));
   1134 	if (unit >= GTMPSC_NCHAN) {
   1135 		PRINTF(("mpscinit: undefined unit %d\n", sc->gtmpsc_unit));
   1136 		return;
   1137 	}
   1138 
   1139 	sc->gtmpsc_chr2 = 0;      /* Default value of CHR2 */
   1140 
   1141 	/*
   1142 	 * stop GTMPSC unit
   1143 	 */
   1144 	r = sc->gtmpsc_chr2 | GTMPSC_CHR2_RXABORT|GTMPSC_CHR2_TXABORT;
   1145 	GT_WRITE(sc, GTMPSC_U_CHRN(unit, 2), r);
   1146 
   1147 	DELAY(GTMPSC_RESET_DELAY);
   1148 
   1149 	/*
   1150 	 * abort SDMA TX, RX for GTMPSC unit
   1151 	 */
   1152 	GT_WRITE(sc, SDMA_U_SDCM(unit), SDMA_SDCM_AR|SDMA_SDCM_AT);
   1153 
   1154 	if (once == 0) {
   1155 		/*
   1156 		 * Determine if this is the buggy GT-64260A case.
   1157 		 * If this is, then most of GTMPSC and SDMA registers
   1158 		 * are unreadable.
   1159 		 * (They always yield -1).
   1160 		 */
   1161 		GT_WRITE(sc, SDMA_IMASK, 0);
   1162 		r = GT_READ(sc, SDMA_IMASK);
   1163 		gt_reva_gtmpsc_bug = r == ~0;
   1164 		sdma_imask = 0;
   1165 	}
   1166 
   1167 	/*
   1168 	 * If Rx is disabled, we don't need to wait around for
   1169 	 * abort completion.
   1170 	 */
   1171 	if ((GT_READ(sc, GTMPSC_U_MMCR_LO(unit)) & GTMPSC_MMCR_LO_ER) == 0)
   1172 		return;
   1173 
   1174 	/*
   1175 	 * poll for GTMPSC RX abort completion
   1176 	 */
   1177 	if (gt_reva_gtmpsc_bug) {
   1178 		/* Sync up with the device first */
   1179 		r = GT_READ(sc, GTMPSC_U_CHRN(unit, 2));
   1180 		DELAY(GTMPSC_RESET_DELAY);
   1181 	} else
   1182 		for (;;) {
   1183 			r = GT_READ(sc, GTMPSC_U_CHRN(unit, 2));
   1184 			if (! (r & GTMPSC_CHR2_RXABORT))
   1185 				break;
   1186 		}
   1187 
   1188 	/*
   1189 	 * poll for SDMA RX abort completion
   1190 	 */
   1191 	for (;;) {
   1192 		r = GT_READ(sc, SDMA_U_SDCM(unit));
   1193 		if (! (r & (SDMA_SDCM_AR|SDMA_SDCM_AT)))
   1194 			break;
   1195 		DELAY(50);
   1196 	}
   1197 
   1198 }
   1199 
   1200 STATIC void
   1201 gtmpscinit_start(struct gtmpsc_softc *sc, int once)
   1202 {
   1203 	unsigned int r;
   1204 	unsigned int unit = sc->gtmpsc_unit;
   1205 
   1206 	/*
   1207 	 * initialize softc's "current" transfer indicies & counts
   1208 	 */
   1209 	sc->gtmpsc_cx = 0;
   1210 	sc->gtmpsc_nc = 0;
   1211 	sc->gtmpsc_poll_txix = 0;
   1212 	sc->gtmpsc_poll_rxix = 0;
   1213 
   1214 	/*
   1215 	 * initialize softc's RX softintr FIFO
   1216 	 */
   1217 	sc->gtmpsc_rxfifo_putix = 0;
   1218 	sc->gtmpsc_rxfifo_getix = 0;
   1219 	sc->gtmpsc_rxfifo_navail = GTMPSC_RXFIFOSZ;
   1220 	memset(&sc->gtmpsc_rxfifo[0], 0, GTMPSC_RXFIFOSZ);
   1221 
   1222 	/*
   1223 	 * set SDMA unit port TX descriptor pointers
   1224 	 * "next" pointer of last descriptor is start of ring
   1225 	 */
   1226 	r = desc_read(
   1227 	    &sc->gtmpsc_poll_sdmapage->tx[GTMPSC_NTXDESC-1].txdesc.sdma_next);
   1228 	GT_WRITE(sc, SDMA_U_SCTDP(unit), r);   /* current */
   1229 	(void)GT_READ(sc, SDMA_U_SCTDP(unit));
   1230 	GT_WRITE(sc, SDMA_U_SFTDP(unit), r);   /* first   */
   1231 	(void)GT_READ(sc, SDMA_U_SFTDP(unit));
   1232 	/*
   1233 	 * set SDMA unit port RX descriptor pointer
   1234 	 * "next" pointer of last descriptor is start of ring
   1235 	 */
   1236 	r = desc_read(
   1237 	    &sc->gtmpsc_poll_sdmapage->rx[GTMPSC_NRXDESC-1].rxdesc.sdma_next);
   1238 	GT_WRITE(sc, SDMA_U_SCRDP(unit), r);   /* current */
   1239 
   1240 	/*
   1241 	 * initialize SDMA unit Configuration Register
   1242 	 */
   1243 	r = SDMA_SDC_BSZ_8x64|SDMA_SDC_SFM|SDMA_SDC_RFT;
   1244 	GT_WRITE(sc, SDMA_U_SDC(unit), r);
   1245 
   1246 	/*
   1247 	 * enable SDMA receive
   1248 	 */
   1249 	GT_WRITE(sc, SDMA_U_SDCM(unit), SDMA_SDCM_ERD);
   1250 
   1251 	if (once == 0) {
   1252 		/*
   1253 		 * GTMPSC Routing:
   1254 		 *	MR0 --> Serial Port 0
   1255 		 *	MR1 --> Serial Port 1
   1256 		 */
   1257 		GT_WRITE(sc, GTMPSC_MRR, GTMPSC_MRR_RES);
   1258 
   1259 		/*
   1260 		 * RX and TX Clock Routing:
   1261 		 *      CRR0 --> BRG0
   1262 		 *      CRR1 --> BRG1
   1263 		 */
   1264 		r = GTMPSC_CRR_BRG0 | (GTMPSC_CRR_BRG1 << GTMPSC_CRR1_SHIFT);
   1265 		GT_WRITE(sc, GTMPSC_RCRR, r);
   1266 		GT_WRITE(sc, GTMPSC_TCRR, r);
   1267 	}
   1268 	sc->gtmpsc_brg_bcr = BRG_BCR_EN | GT_MPSC_CLOCK_SOURCE |
   1269 	    compute_cdv(GT_MPSC_DEFAULT_BAUD_RATE);
   1270 	sc->gtmpsc_chr3 = GTMPSC_MAXIDLE(GT_MPSC_DEFAULT_BAUD_RATE);
   1271 	gtmpsc_loadchannelregs(sc);
   1272 
   1273 	/*
   1274 	 * set MPSC Protocol configuration register for GTMPSC unit
   1275 	 */
   1276 	GT_WRITE(sc, GTMPSC_U_MPCR(unit), GTMPSC_MPCR_CL_8);
   1277 
   1278 	/*
   1279 	 * set MPSC LO and HI port config registers for GTMPSC unit
   1280  	 */
   1281 	r = GTMPSC_MMCR_LO_MODE_UART
   1282 	   |GTMPSC_MMCR_LO_ET
   1283 	   |GTMPSC_MMCR_LO_ER
   1284 	   |GTMPSC_MMCR_LO_NLM;
   1285 	GT_WRITE(sc, GTMPSC_U_MMCR_LO(unit), r);
   1286 
   1287 	r =
   1288 	    GTMPSC_MMCR_HI_TCDV_DEFAULT
   1289 	   |GTMPSC_MMCR_HI_RDW
   1290 	   |GTMPSC_MMCR_HI_RCDV_DEFAULT;
   1291 	GT_WRITE(sc, GTMPSC_U_MMCR_HI(unit), r);
   1292 
   1293 	/*
   1294 	 * tell MPSC receive the Enter Hunt
   1295 	 */
   1296 	r = sc->gtmpsc_chr2 | GTMPSC_CHR2_EH;
   1297 	GT_WRITE(sc, GTMPSC_U_CHRN(unit, 2), r);
   1298 
   1299 	/*
   1300 	 * clear any pending SDMA interrupts for this unit
   1301 	 */
   1302 	r = GT_READ(sc, SDMA_ICAUSE);
   1303 	r &= ~SDMA_U_INTR_MASK(unit);
   1304 	GT_WRITE(sc, SDMA_ICAUSE, r);	/* ??? */
   1305 
   1306 	DPRINTF(("gtmpscinit: OK\n"));
   1307 }
   1308 
   1309 /*
   1310  * gtmpscinit - prepare MPSC for operation
   1311  *
   1312  *	assumes we are called at ipl >= IPL_SERIAL
   1313  */
   1314 STATIC void
   1315 gtmpscinit(struct gtmpsc_softc *sc)
   1316 {
   1317 	static int once = 0;
   1318 
   1319 	gtmpscinit_stop(sc, once);
   1320 	gtmpscinit_start(sc, once);
   1321 	once = 1;
   1322 }
   1323 
   1324 /*
   1325  * gtmpsccninit - initialize the driver and the mpsc device
   1326  */
   1327 void
   1328 gtmpsccninit(struct consdev *cd)
   1329 {
   1330 }
   1331 
   1332 int
   1333 gtmpsccngetc(dev_t dev)
   1334 {
   1335 	unsigned int unit = 0;
   1336 	int c;
   1337 
   1338 	unit = GTMPSCUNIT(dev);
   1339 	if (major(dev) != 0) {
   1340 		struct gtmpsc_softc *sc = device_lookup_private(&gtmpsc_cd, unit);
   1341 		if (sc == NULL)
   1342 			return 0;
   1343 		unit = sc->gtmpsc_unit;
   1344 	}
   1345 	if (unit >= GTMPSC_NCHAN)
   1346 		return 0;
   1347 	c = gtmpsc_common_getc(unit);
   1348 
   1349 	return c;
   1350 }
   1351 
   1352 void
   1353 gtmpsccnputc(dev_t dev, int c)
   1354 {
   1355 	unsigned int unit = 0;
   1356 	char ch = c;
   1357 	static int ix = 0;
   1358 
   1359 	if (gtmpsccninit_done == 0) {
   1360 		if ((minor(dev) == 0) && (ix < sizeof(gtmpsc_earlybuf)))
   1361 			gtmpsc_earlybuf[ix++] = (unsigned char)c;
   1362 		return;
   1363 	}
   1364 
   1365 	unit = GTMPSCUNIT(dev);
   1366 	if (major(dev) != 0) {
   1367 		struct gtmpsc_softc *sc = device_lookup_private(&gtmpsc_cd, unit);
   1368 		if (sc == NULL)
   1369 			return;
   1370 		unit = sc->gtmpsc_unit;
   1371 	}
   1372 
   1373 	if (unit >= GTMPSC_NCHAN)
   1374 		return;
   1375 
   1376 	gtmpsc_common_putc(unit, ch);
   1377 }
   1378 
   1379 void
   1380 gtmpsccnpollc(dev_t dev, int on)
   1381 {
   1382 }
   1383 
   1384 int
   1385 gtmpsccnattach(bus_space_tag_t memt, bus_space_handle_t memh, int unit,
   1386 	int speed, tcflag_t tcflag)
   1387 {
   1388 	struct gtmpsc_softc *sc = &gtmpsc_fake_softc;
   1389 	unsigned char *cp;
   1390 	unsigned char c;
   1391 	unsigned int i;
   1392 
   1393 	if (gtmpsccninit_done)
   1394 		return 0;
   1395 
   1396 	DPRINTF(("gtmpsccnattach\n"));
   1397 	gtmpsc_hackinit(sc, memt, memh, unit);
   1398 	DPRINTF(("gtmpscinit\n"));
   1399 	gtmpscinit(sc);
   1400 	gtmpsccninit_done = 1;
   1401 	cp = gtmpsc_earlybuf;
   1402 	strcpy(gtmpsc_earlybuf, "\r\nMPSC Lives!\r\n");
   1403 	for (i=0; i < sizeof(gtmpsc_earlybuf); i++) {
   1404 		c = *cp++;
   1405 		if (c == 0)
   1406 			break;
   1407 		gtmpsc_common_putc(unit, c);
   1408 	}
   1409 	DPRINTF(("switching cn_tab\n"));
   1410 	gtmpsc_consdev.cn_dev = makedev(0, unit);
   1411 	cn_tab = &gtmpsc_consdev;
   1412 	DPRINTF(("switched cn_tab!\n"));
   1413 	return 0;
   1414 }
   1415 
   1416 /*
   1417  * gtmpsc_common_pollc - non-blocking console read
   1418  *
   1419  *	if there is an RX char, return it in *cp
   1420  *	set *statp if Break detected
   1421  *
   1422  *	assumes we are called at ipl >= IPL_SERIAL
   1423  *
   1424  * return 1 if there is RX data
   1425  * otherwise return 0
   1426  */
   1427 STATIC int
   1428 gtmpsc_common_pollc(unsigned int unit, char *cp, int *statp)
   1429 {
   1430 	struct gtmpsc_softc *sc = gtmpsc_scp[unit];
   1431 	gtmpsc_pollrx_t *vrxp;
   1432 	unsigned int ix;
   1433 	unsigned int cx;
   1434 	unsigned int nc;
   1435 
   1436 	*statp = GTMPSC_STAT_NONE;
   1437 	ix = sc->gtmpsc_poll_rxix;
   1438 	nc = sc->gtmpsc_nc;
   1439 	cx = sc->gtmpsc_cx;
   1440 	if (nc == 0) {
   1441 		unsigned int *csrp;
   1442 		unsigned int csr;
   1443 
   1444 		vrxp = &sc->gtmpsc_poll_sdmapage->rx[ix];
   1445 		csrp = &vrxp->rxdesc.sdma_csr;
   1446 		cx = 0;
   1447 
   1448 		GTMPSC_CACHE_INVALIDATE(csrp);
   1449 		csr = desc_read(csrp);
   1450 		if (csr & SDMA_CSR_RX_OWN)
   1451 			return 0;
   1452 		if (csr & SDMA_CSR_RX_BR)
   1453 			*statp = GTMPSC_STAT_BREAK;
   1454 		if (csr & SDMA_CSR_RX_ES)
   1455 			PRINTF(("mpsc 0 RX error, rxdesc csr 0x%x\n", csr));
   1456 
   1457 		nc = desc_read(&vrxp->rxdesc.sdma_cnt);
   1458 		nc &= SDMA_RX_CNT_BCNT_MASK;
   1459 		csr = SDMA_CSR_RX_L|SDMA_CSR_RX_F|SDMA_CSR_RX_OWN
   1460 							      |SDMA_CSR_RX_EI;
   1461 		if (nc == 0) {
   1462 			if ((++ix) >= GTMPSC_NRXDESC)
   1463 				ix = 0;
   1464 			sc->gtmpsc_poll_rxix = ix;
   1465 			desc_write(csrp, csr);
   1466 			GTMPSC_CACHE_FLUSH(csrp);
   1467 			return 0;
   1468 		}
   1469 		memcpy(sc->gtmpsc_rxbuf, vrxp->rxbuf, nc);
   1470 		desc_write(csrp, csr);
   1471 		GTMPSC_CACHE_FLUSH(csrp);
   1472 	}
   1473 	gtmpsc_poll_pollc_cnt++;
   1474 	nc--;
   1475 	*cp = sc->gtmpsc_rxbuf[cx++];
   1476 	if (nc == 0) {
   1477 		if ((++ix) >= GTMPSC_NRXDESC)
   1478 			ix = 0;
   1479 		sc->gtmpsc_poll_rxix = ix;
   1480 	}
   1481 	sc->gtmpsc_cx = cx;
   1482 	sc->gtmpsc_nc = nc;
   1483 	return 1;
   1484 }
   1485 
   1486 /*
   1487  * gtmpsc_common_getc - polled console read
   1488  *
   1489  *	We copy data from the DMA buffers into a buffer in the softc
   1490  *	to reduce descriptor ownership turnaround time
   1491  *	MPSC can crater if it wraps descriptor rings,
   1492  *	which is asynchronous and throttled only by line speed.
   1493  *
   1494  *	This code assumes the buffer PA==KVA
   1495  *	and assumes we are called at ipl >= IPL_SERIAL
   1496  */
   1497 STATIC int
   1498 gtmpsc_common_getc(unsigned int unit)
   1499 {
   1500 	struct gtmpsc_softc *sc = gtmpsc_scp[unit];
   1501 	gtmpsc_pollrx_t *vrxp;
   1502 	unsigned int ix;
   1503 	unsigned int cx;
   1504 	unsigned int nc;
   1505 	unsigned int wdog_interval;
   1506 	int c;
   1507 
   1508 	ix = sc->gtmpsc_poll_rxix;
   1509 	nc = sc->gtmpsc_nc;
   1510 	cx = sc->gtmpsc_cx;
   1511 	wdog_interval = 0;
   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, GTMPSC_U_CHRN(unit, 2), r);
   1526 			do {
   1527 				if (wdog_interval++ % 32)
   1528 					gt_watchdog_service();
   1529 				gtmpsc_poll_getc_miss++;
   1530 				GTMPSC_CACHE_INVALIDATE(csrp);
   1531 				DELAY(50);
   1532 				csr = desc_read(csrp);
   1533 			} while (csr & SDMA_CSR_RX_OWN);
   1534 		} else
   1535 		if (wdog_interval++ % 32)
   1536 			gt_watchdog_service();
   1537 		if (csr & SDMA_CSR_RX_ES)
   1538 			PRINTF(("mpsc 0 RX error, rxdesc csr 0x%x\n", csr));
   1539 
   1540 		nc = desc_read(&vrxp->rxdesc.sdma_cnt);
   1541 		nc &= SDMA_RX_CNT_BCNT_MASK;
   1542 		if (nc) {
   1543 			memcpy(sc->gtmpsc_rxbuf, vrxp->rxbuf, nc);
   1544 		} else {
   1545 			if ((++ix) >= GTMPSC_NRXDESC)
   1546 				ix = 0;
   1547 			sc->gtmpsc_poll_rxix = ix;
   1548 		}
   1549 		csr = SDMA_CSR_RX_L|SDMA_CSR_RX_F|SDMA_CSR_RX_OWN
   1550 							|SDMA_CSR_RX_EI;
   1551 		desc_write(csrp, csr);
   1552 		GTMPSC_CACHE_FLUSH(csrp);
   1553 #ifdef KGDB
   1554 		if (unit == comkgdbport && gt_reva_gtmpsc_bug)
   1555 			GT_WRITE(sc, SDMA_ICAUSE, ~SDMA_INTR_RXBUF(unit));
   1556 #endif
   1557 	}
   1558 	gtmpsc_poll_getc_cnt++;
   1559 	nc--;
   1560 	c = (int)sc->gtmpsc_rxbuf[cx++];
   1561 	if (nc == 0) {
   1562 		if ((++ix) >= GTMPSC_NRXDESC)
   1563 			ix = 0;
   1564 		sc->gtmpsc_poll_rxix = ix;
   1565 	}
   1566 	sc->gtmpsc_cx = cx;
   1567 	sc->gtmpsc_nc = nc;
   1568 	gt_watchdog_service();
   1569 	return c;
   1570 }
   1571 
   1572 /*
   1573  * gtmpsc_common_putn - write a buffer into the hardware
   1574  *
   1575  *	assumes we are called at ipl >= IPL_SERIAL
   1576  */
   1577 STATIC void
   1578 gtmpsc_common_putn(struct gtmpsc_softc *sc)
   1579 
   1580 {
   1581 	int     unit = sc->gtmpsc_unit;
   1582 	int     n;
   1583 	int     kick;
   1584 	gtmpsc_polltx_t *vtxp;
   1585 	unsigned int *csrp;
   1586 	unsigned int csr;
   1587 	unsigned int ix;
   1588 	unsigned int sdcm;
   1589 
   1590 	kick = 0;
   1591 	for (ix = sc->gtmpsc_poll_txix; sc->sc_tbc;) {
   1592 		vtxp = &sc->gtmpsc_poll_sdmapage->tx[ix];
   1593 		csrp = &vtxp->txdesc.sdma_csr;
   1594 		GTMPSC_CACHE_INVALIDATE(csrp);
   1595 		csr = desc_read(csrp);
   1596 		if ((csr & SDMA_CSR_TX_OWN) != 0)
   1597 			break;
   1598 		n = sc->sc_tbc;
   1599 		if (n > GTMPSC_TXBUFSZ)
   1600 			n = GTMPSC_TXBUFSZ;
   1601 		memcpy(vtxp->txbuf, sc->sc_tba, n);
   1602 		csr = SDMA_CSR_TX_L | SDMA_CSR_TX_F
   1603 					| SDMA_CSR_TX_EI | SDMA_CSR_TX_OWN;
   1604 		desc_write(&vtxp->txdesc.sdma_cnt,
   1605 				(n << SDMA_TX_CNT_BCNT_SHIFT) | n);
   1606 		desc_write(csrp, csr);
   1607 		GTMPSC_CACHE_FLUSH(csrp);
   1608 		sc->sc_tbc -= n;
   1609 		sc->sc_tba += n;
   1610 		gtmpsc_poll_putn_cnt += n;
   1611 		sc->cnt_tx_to_sdma += n;
   1612 		kick = 1;
   1613 
   1614 		if (++ix >= GTMPSC_NTXDESC)
   1615 			ix = 0;
   1616 	}
   1617 	if (kick) {
   1618 		sc->gtmpsc_poll_txix = ix;
   1619 
   1620 		/*
   1621 		 * now kick some SDMA
   1622 		 */
   1623 		sdcm = GT_READ(sc, SDMA_U_SDCM(unit));
   1624 
   1625 		if ((sdcm & SDMA_SDCM_TXD) == 0) {
   1626 			GT_WRITE(sc, SDMA_U_SDCM(unit), SDMA_SDCM_TXD);
   1627 		}
   1628 	}
   1629 }
   1630 
   1631 /*
   1632  * gtmpsc_common_putc - polled console putc
   1633  *
   1634  *	assumes we are called at ipl >= IPL_SERIAL
   1635  */
   1636 STATIC void
   1637 gtmpsc_common_putc(unsigned int unit, unsigned char c)
   1638 {
   1639 	struct gtmpsc_softc *sc = gtmpsc_scp[unit];
   1640 	gtmpsc_polltx_t *vtxp;
   1641 	unsigned int *csrp;
   1642 	unsigned int csr;
   1643 	unsigned int ix;
   1644 	unsigned int nix;
   1645 	unsigned int wdog_interval = 0;
   1646 
   1647 	DPRINTF(("gtmpsc_common_putc(%d, '%c'): cur=%#x, first=%#x", unit, c,
   1648 	    GT_READ(sc, SDMA_U_SCTDP(unit)),   /* current */
   1649 	    GT_READ(sc, SDMA_U_SFTDP(unit))));   /* first   */
   1650 	ix = sc->gtmpsc_poll_txix;
   1651 	nix = ix + 1;
   1652 	if (nix >= GTMPSC_NTXDESC)
   1653 		nix = 0;
   1654 	sc->gtmpsc_poll_txix = nix;
   1655 	vtxp = &sc->gtmpsc_poll_sdmapage->tx[ix];
   1656 	csrp = &vtxp->txdesc.sdma_csr;
   1657 
   1658 
   1659 	for (;;) {
   1660 		GTMPSC_CACHE_INVALIDATE(csrp);
   1661 		csr = desc_read(csrp);
   1662 		if ((csr & SDMA_CSR_TX_OWN) == 0)
   1663 			break;
   1664 		gtmpsc_poll_putc_miss++;
   1665 		DELAY(40);
   1666 		DPRINTF(("."));
   1667 		if (wdog_interval++ % 32)
   1668 			gt_watchdog_service();
   1669 	}
   1670 	if (csr & SDMA_CSR_TX_ES)
   1671 		PRINTF(("mpsc %d TX error, txdesc csr 0x%x\n", unit, csr));
   1672 
   1673 	gtmpsc_poll_putc_cnt++;
   1674 	vtxp->txbuf[0] = c;
   1675 	csr = SDMA_CSR_TX_L | SDMA_CSR_TX_F | SDMA_CSR_TX_EI | SDMA_CSR_TX_OWN;
   1676 	desc_write(&vtxp->txdesc.sdma_cnt, (1 << SDMA_TX_CNT_BCNT_SHIFT) | 1);
   1677 	desc_write(csrp, csr);
   1678 	GTMPSC_CACHE_FLUSH(csrp);
   1679 
   1680 	/*
   1681 	 * now kick some SDMA
   1682 	 */
   1683 	GT_WRITE(sc, SDMA_U_SDCM(unit), SDMA_SDCM_TXD);
   1684 	gt_watchdog_service();
   1685 }
   1686 
   1687 
   1688 STATIC void
   1689 gtmpsc_poll(void *arg)
   1690 {
   1691 	struct gtmpsc_softc *sc = (struct gtmpsc_softc *)arg;
   1692 	int kick;
   1693 	char ch;
   1694 	int stat;
   1695 	static struct timeval   msg_time = {0,0};
   1696 	static struct timeval   cur_time;
   1697 	static int fifo_full = 0;
   1698 
   1699 	kick = 0;
   1700 	while (gtmpsc_common_pollc(sc->gtmpsc_unit, &ch, &stat)) {
   1701 #ifdef DDB
   1702 		if (stat)
   1703 			break;
   1704 #endif
   1705 		++sc->cnt_rx_from_sdma;
   1706 		if (sc->gtmpsc_rxfifo_navail != 0) {
   1707 			sc->gtmpsc_rxfifo[sc->gtmpsc_rxfifo_putix++] = ch;
   1708 			if (sc->gtmpsc_rxfifo_putix == GTMPSC_RXFIFOSZ)
   1709 				sc->gtmpsc_rxfifo_putix = 0;
   1710 			atomic_add(&sc->gtmpsc_rxfifo_navail, -1);
   1711 			++sc->cnt_rx_to_fifo;
   1712 			fifo_full = 0;
   1713 			kick = 1;
   1714 		} else {
   1715 			if (fifo_full == 0) {
   1716 				fifo_full = 1;
   1717 				microtime(&cur_time);
   1718 				if (cur_time.tv_sec - msg_time.tv_sec >= 5) {
   1719 					/* Only do this once in 5 sec */
   1720 					msg_time = cur_time;
   1721 					printf("mpsc%d: input FIFO full, "
   1722 					       "dropping incoming characters\n",
   1723 					       sc->gtmpsc_unit);
   1724 				}
   1725 			}
   1726 		}
   1727 	}
   1728 #ifdef DDB
   1729 	if (stat) {
   1730 		if (cn_tab == &gtmpsc_consdev) {
   1731 			Debugger();
   1732 		}
   1733 	}
   1734 #endif
   1735 	if (kick)
   1736 		softint_schedule(sc->sc_si);
   1737 }
   1738 
   1739 #ifdef KGDB
   1740 /* ARGSUSED */
   1741 STATIC int
   1742 gtmpsc_kgdb_getc(void *arg)
   1743 {
   1744 
   1745 	return (gtmpsc_common_getc(comkgdbport));
   1746 }
   1747 
   1748 /* ARGSUSED */
   1749 STATIC void
   1750 gtmpsc_kgdb_putc(void *arg, int c)
   1751 {
   1752 
   1753 	return (gtmpsc_common_putc(comkgdbport, c));
   1754 }
   1755 
   1756 STATIC void
   1757 gtmpsc_kgdb_poll(void *arg)
   1758 {
   1759 	struct gtmpsc_softc       *sc = (struct gtmpsc_softc *)arg;
   1760 	int                     s;
   1761 	char                    c;
   1762 	int                     brk;
   1763 
   1764 	s = splserial();
   1765 	if (kgdb_recover == 0) { /* gdb is not currently talking to its agent */
   1766 		while (gtmpsc_common_pollc(sc->gtmpsc_unit, &c, &brk)) {
   1767 			if (c == CTRL('c'))
   1768 				brk = GTMPSC_STAT_BREAK;
   1769 			if (brk == GTMPSC_STAT_BREAK)
   1770 				break;
   1771 		}
   1772 		if (brk == GTMPSC_STAT_BREAK) {
   1773 			if (kgdb_break_immediate)
   1774 				breakpoint();
   1775 			else {
   1776 				printf("connecting to kgdb\n");
   1777 				kgdb_connect(1);
   1778 			}
   1779 		}
   1780 	}
   1781 	splx(s);
   1782 }
   1783 
   1784 #endif /* KGDB */
   1785 
   1786 #if 0
   1787 void
   1788 gtmpsc_printf(const char *fmt, ...)
   1789 {
   1790 	struct consdev *ocd;
   1791 	int s;
   1792 	va_list ap;
   1793 
   1794 	s = splserial();
   1795 	ocd = cn_tab;
   1796 	cn_tab = &constab[0];
   1797 	va_start(ap, fmt);
   1798 	printf(fmt, ap);
   1799 	va_end(ap);
   1800 	cn_tab = ocd;
   1801 	splx(s);
   1802 }
   1803 #endif
   1804 
   1805 void
   1806 gtmpsc_mem_printf(const char *fmt, ...)
   1807 {
   1808 	va_list ap;
   1809 	static unsigned char *p = gtmpsc_print_buf;
   1810 
   1811 	if (p >= &gtmpsc_print_buf[GTMPSC_PRINT_BUF_SIZE - 128]) {
   1812 		memset(gtmpsc_print_buf, 0, GTMPSC_PRINT_BUF_SIZE);
   1813 		p = gtmpsc_print_buf;
   1814 	}
   1815 	va_start(ap, fmt);
   1816 	p += vsprintf(p, fmt, ap);
   1817 	va_end(ap);
   1818 }
   1819 
   1820 void
   1821 gtmpsc_shutdownhook(void *arg)
   1822 {
   1823 	gtmpsc_softc_t *sc = (gtmpsc_softc_t *)arg;
   1824 
   1825 	gtmpsc_txflush(sc);
   1826 }
   1827 
   1828 void
   1829 gtmpsccnhalt(dev_t dev)
   1830 {
   1831 	unsigned int unit;
   1832 	u_int32_t r;
   1833 
   1834 	for (unit = 0; unit < GTMPSC_NCHAN; unit++) {
   1835 		gtmpsc_softc_t *sc = gtmpsc_scp[unit];
   1836 		if (sc == NULL)
   1837 			continue;
   1838 
   1839 		/*
   1840 		 * flush TX buffers
   1841 		 */
   1842 		gtmpsc_txflush(sc);
   1843 
   1844 		/*
   1845 		 * stop MPSC unit RX
   1846 		 */
   1847 		r = GT_READ(sc, GTMPSC_U_CHRN(unit, 2));
   1848 		r &= ~GTMPSC_CHR2_EH;
   1849 		r |= GTMPSC_CHR2_RXABORT;
   1850 		GT_WRITE(sc, GTMPSC_U_CHRN(unit, 2), r);
   1851 
   1852 		DELAY(GTMPSC_RESET_DELAY);
   1853 
   1854 		/*
   1855 		 * abort SDMA RX for MPSC unit
   1856 		 */
   1857 		GT_WRITE(sc, SDMA_U_SDCM(unit), SDMA_SDCM_AR);
   1858 	}
   1859 }
   1860 
   1861 void
   1862 gtmpsc_puts(char *str)
   1863 {
   1864 	char c;
   1865 
   1866 	if (str == NULL)
   1867 		return;
   1868 	while ((c = *str++) != 0)
   1869 		gtmpsccnputc(0, c);
   1870 }
   1871