1 /* $NetBSD: gtmpsc.c,v 1.31 2008/09/08 23:36:54 gmcgarry 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.31 2008/09/08 23:36:54 gmcgarry Exp $"); 49 50 #include "opt_kgdb.h" 51 52 #include <sys/param.h> 53 #include <sys/conf.h> 54 #include <sys/device.h> 55 #include <sys/kauth.h> 56 #include <sys/proc.h> 57 #include <sys/systm.h> 58 #include <sys/tty.h> 59 #include <sys/callout.h> 60 #include <sys/fcntl.h> 61 #include <sys/intr.h> 62 #ifdef KGDB 63 #include <sys/kernel.h> 64 #include <sys/kgdb.h> 65 #endif 66 67 #include <uvm/uvm_extern.h> 68 69 #include <powerpc/atomic.h> 70 #include <dev/cons.h> 71 #include <sys/bus.h> 72 #include <sys/cpu.h> /* for DELAY */ 73 #include <machine/stdarg.h> 74 #include "gtmpsc.h" 75 76 77 #include <dev/marvell/gtreg.h> 78 #include <dev/marvell/gtvar.h> 79 #include <dev/marvell/gtintrreg.h> 80 #include <dev/marvell/gtmpscreg.h> 81 #include <dev/marvell/gtsdmareg.h> 82 #include <dev/marvell/gtmpscvar.h> 83 #include <dev/marvell/gtbrgreg.h> 84 85 /* 86 * XXX these delays were derived empiracaly 87 */ 88 #define GTMPSC_POLL_DELAY 1 /* 1 usec */ 89 /* 90 * Wait 2 characters time for RESET_DELAY 91 */ 92 #define GTMPSC_RESET_DELAY (2*8*1000000 / GT_MPSC_DEFAULT_BAUD_RATE) 93 94 #define BURSTLEN 128 95 96 /* 97 * stat values for gtmpsc_common_pollc 98 */ 99 #define GTMPSC_STAT_NONE 0 100 #define GTMPSC_STAT_BREAK 1 101 102 103 #define PRINTF(x) gtmpsc_mem_printf x 104 105 #if defined(DEBUG) 106 unsigned int gtmpsc_debug = 0; 107 # define STATIC 108 # define DPRINTF(x) do { if (gtmpsc_debug) gtmpsc_mem_printf x ; } while (0) 109 #else 110 # define STATIC static 111 # define DPRINTF(x) 112 #endif 113 114 #define GTMPSCUNIT_MASK 0x7ffff 115 #define GTMPSCDIALOUT_MASK 0x80000 116 117 #define GTMPSCUNIT(x) (minor(x) & GTMPSCUNIT_MASK) 118 #define GTMPSCDIALOUT(x) (minor(x) & GTMPSCDIALOUT_MASK) 119 120 STATIC void gtmpscinit(struct gtmpsc_softc *); 121 STATIC int gtmpscmatch(struct device *, struct cfdata *, void *); 122 STATIC void gtmpscattach(struct device *, struct device *, void *); 123 STATIC int compute_cdv(unsigned int); 124 STATIC void gtmpsc_loadchannelregs(struct gtmpsc_softc *); 125 STATIC void gtmpscshutdown(struct gtmpsc_softc *); 126 STATIC void gtmpscstart(struct tty *); 127 STATIC int gtmpscparam(struct tty *, struct termios *); 128 STATIC int gtmpsc_probe(void); 129 STATIC int gtmpsc_intr(void *); 130 STATIC void gtmpsc_softintr(void *); 131 132 STATIC void gtmpsc_common_putn(struct gtmpsc_softc *); 133 STATIC void gtmpsc_common_putc(unsigned int, unsigned char); 134 STATIC int gtmpsc_common_getc(unsigned int); 135 STATIC int gtmpsc_common_pollc(unsigned int, char *, int *); 136 STATIC void gtmpsc_poll(void *); 137 #ifdef KGDB 138 STATIC void gtmpsc_kgdb_poll(void *); 139 #endif 140 STATIC void gtmpsc_mem_printf(const char *, ...); 141 142 STATIC void gtmpsc_txdesc_init(gtmpsc_poll_sdma_t *, gtmpsc_poll_sdma_t *); 143 STATIC void gtmpsc_rxdesc_init(gtmpsc_poll_sdma_t *, gtmpsc_poll_sdma_t *); 144 STATIC unsigned int gtmpsc_get_causes(void); 145 STATIC void gtmpsc_hackinit(struct gtmpsc_softc *, bus_space_tag_t, 146 bus_space_handle_t, int); 147 STATIC void gtmpscinit_stop(struct gtmpsc_softc *, int); 148 STATIC void gtmpscinit_start(struct gtmpsc_softc *, int); 149 #if 0 150 void gtmpsc_printf(const char *fmt, ...); 151 #endif 152 void gtmpsc_puts(char *); 153 154 void gtmpsccnprobe(struct consdev *); 155 void gtmpsccninit(struct consdev *); 156 int gtmpsccngetc(dev_t); 157 void gtmpsccnputc(dev_t, int); 158 void gtmpsccnpollc(dev_t, int); 159 void gtmpsccnhalt(dev_t); 160 161 STATIC void gtmpsc_txflush(gtmpsc_softc_t *); 162 STATIC void gtmpsc_iflush(gtmpsc_softc_t *); 163 STATIC void gtmpsc_shutdownhook(void *); 164 165 dev_type_open(gtmpscopen); 166 dev_type_close(gtmpscclose); 167 dev_type_read(gtmpscread); 168 dev_type_write(gtmpscwrite); 169 dev_type_ioctl(gtmpscioctl); 170 dev_type_stop(gtmpscstop); 171 dev_type_tty(gtmpsctty); 172 dev_type_poll(gtmpscpoll); 173 174 const struct cdevsw gtmpsc_cdevsw = { 175 gtmpscopen, gtmpscclose, gtmpscread, gtmpscwrite, gtmpscioctl, 176 gtmpscstop, gtmpsctty, gtmpscpoll, nommap, ttykqfilter, D_TTY 177 }; 178 179 CFATTACH_DECL(gtmpsc, sizeof(struct gtmpsc_softc), 180 gtmpscmatch, gtmpscattach, NULL, NULL); 181 182 extern struct cfdriver gtmpsc_cd; 183 184 static struct consdev gtmpsc_consdev = { 185 0, 186 gtmpsccninit, 187 gtmpsccngetc, 188 gtmpsccnputc, 189 gtmpsccnpollc, 190 NULL, /* cn_bell */ 191 gtmpsccnhalt, 192 NULL, /* cn_flush */ 193 NODEV, 194 CN_NORMAL 195 }; 196 197 STATIC void *gtmpsc_sdma_ih = NULL; 198 199 gtmpsc_softc_t *gtmpsc_scp[GTMPSC_NCHAN] = { 0 }; 200 201 STATIC int gt_reva_gtmpsc_bug; 202 unsigned int sdma_imask; /* soft copy of SDMA IMASK reg */ 203 204 #ifdef KGDB 205 static int gtmpsc_kgdb_addr; 206 static int gtmpsc_kgdb_attached; 207 208 int kgdb_break_immediate /* = 0 */ ; 209 210 STATIC int gtmpsc_kgdb_getc(void *); 211 STATIC void gtmpsc_kgdb_putc(void *, int); 212 #endif /* KGDB */ 213 214 /* 215 * hacks for console initialization 216 * which happens prior to autoconfig "attach" 217 * 218 * XXX Assumes PAGE_SIZE is a constant! 219 */ 220 STATIC unsigned int gtmpsccninit_done = 0; 221 STATIC gtmpsc_softc_t gtmpsc_fake_softc; 222 STATIC unsigned char gtmpsc_earlybuf[PAGE_SIZE] 223 __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(struct device *parent, struct cfdata *self, void *aux) 423 { 424 struct gt_softc *gt = device_private(parent); 425 struct gt_attach_args *ga = aux; 426 427 return GT_MPSCOK(gt, ga, >mpsc_cd); 428 } 429 430 STATIC void 431 gtmpscattach(struct device *parent, struct device *self, void *aux) 432 { 433 struct gt_attach_args *ga = aux; 434 struct gt_softc *gt = device_private(parent); 435 struct gtmpsc_softc *sc = device_private(self); 436 gtmpsc_poll_sdma_t *vmps; 437 gtmpsc_poll_sdma_t *pmps; 438 struct tty *tp; 439 void *kva; 440 int rsegs; 441 int err; 442 int s; 443 int is_console = 0; 444 445 DPRINTF(("mpscattach\n")); 446 447 GT_MPSCFOUND(gt, ga); 448 449 s = splhigh(); 450 451 sc->gtmpsc_memt = ga->ga_memt; 452 sc->gtmpsc_memh = ga->ga_memh; 453 sc->gtmpsc_dmat = ga->ga_dmat; 454 sc->gtmpsc_unit = ga->ga_unit; 455 456 aprint_normal(": SDMA"); 457 err = bus_dmamem_alloc(sc->gtmpsc_dmat, PAGE_SIZE, PAGE_SIZE, PAGE_SIZE, 458 sc->gtmpsc_dma_segs, 1, &rsegs, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW); 459 if (err) { 460 PRINTF(("mpscattach: bus_dmamem_alloc error 0x%x\n", err)); 461 splx(s); 462 return; 463 } 464 #ifndef SDMA_COHERENT 465 err = bus_dmamem_map(sc->gtmpsc_dmat, sc->gtmpsc_dma_segs, 1, PAGE_SIZE, 466 &kva, BUS_DMA_NOWAIT); 467 #else 468 err = bus_dmamem_map(sc->gtmpsc_dmat, sc->gtmpsc_dma_segs, 1, PAGE_SIZE, 469 &kva, BUS_DMA_NOWAIT|BUS_DMA_NOCACHE); 470 #endif 471 if (err) { 472 PRINTF(("mpscattach: bus_dmamem_map error 0x%x\n", err)); 473 splx(s); 474 return; 475 } 476 477 err = bus_dmamap_create(sc->gtmpsc_dmat, PAGE_SIZE, 1, PAGE_SIZE, 478 PAGE_SIZE, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW, &sc->gtmpsc_dma_map); 479 if (err) { 480 PRINTF(("mpscattach: bus_dmamap_create error 0x%x\n", err)); 481 splx(s); 482 return; 483 } 484 485 err = bus_dmamap_load(sc->gtmpsc_dmat, sc->gtmpsc_dma_map, kva, 486 PAGE_SIZE, NULL, 0); 487 if (err) { 488 PRINTF(("mpscattach: bus_dmamap_load error 0x%x\n", err)); 489 splx(s); 490 return; 491 } 492 memset(kva, 0, PAGE_SIZE); /* paranoid/superfluous */ 493 494 vmps = (gtmpsc_poll_sdma_t *)kva; /* KVA */ 495 pmps = (gtmpsc_poll_sdma_t *)sc->gtmpsc_dma_map->dm_segs[0].ds_addr; /* PA */ 496 #if defined(DEBUG) 497 printf(" at %p/%p", vmps, pmps); 498 #endif 499 gtmpsc_txdesc_init(vmps, pmps); 500 gtmpsc_rxdesc_init(vmps, pmps); 501 sc->gtmpsc_poll_sdmapage = vmps; 502 503 if (gtmpsc_scp[sc->gtmpsc_unit] != NULL) 504 gtmpsc_txflush(gtmpsc_scp[sc->gtmpsc_unit]); 505 506 sc->gtmpsc_tty = tp = ttymalloc(); 507 tp->t_oproc = gtmpscstart; 508 tp->t_param = gtmpscparam; 509 tty_attach(tp); 510 511 if (gtmpsc_sdma_ih == NULL) { 512 gtmpsc_sdma_ih = intr_establish(IRQ_SDMA, IST_LEVEL, IPL_SERIAL, 513 gtmpsc_intr, &sc); 514 if (gtmpsc_sdma_ih == NULL) 515 panic("mpscattach: cannot intr_establish IRQ_SDMA"); 516 } 517 518 sc->sc_si = softint_establish(SOFTINT_SERIAL, gtmpsc_softintr, sc); 519 if (sc->sc_si == NULL) 520 panic("mpscattach: cannot softint_establish IPL_SOFTSERIAL"); 521 522 shutdownhook_establish(gtmpsc_shutdownhook, sc); 523 524 gtmpsc_scp[sc->gtmpsc_unit] = sc; 525 gtmpscinit(sc); 526 527 if (cn_tab == >mpsc_consdev && 528 cn_tab->cn_dev == makedev(0, sc->gtmpsc_unit)) { 529 cn_tab->cn_dev = makedev(cdevsw_lookup_major(>mpsc_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(>mpsc_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(>mpsc_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(>mpsc_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(>mpsc_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(>mpsc_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(>mpsc_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(>mpsc_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(>mpsc_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(>mpsc_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(>mpsc_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(>mpsc_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(>mpsc_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(>mpsc_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(>mpsc_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 bzero(sc, 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(>mpsc_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(>mpsc_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 = >mpsc_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 = >mpsc_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 bcopy(vrxp->rxbuf, sc->gtmpsc_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 bcopy(vrxp->rxbuf, sc->gtmpsc_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 bcopy(sc->sc_tba, vtxp->txbuf, 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 == >mpsc_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(arg) 1743 void *arg; 1744 { 1745 1746 return (gtmpsc_common_getc(comkgdbport)); 1747 } 1748 1749 /* ARGSUSED */ 1750 STATIC void 1751 gtmpsc_kgdb_putc(arg, c) 1752 void *arg; 1753 int c; 1754 { 1755 1756 return (gtmpsc_common_putc(comkgdbport, c)); 1757 } 1758 1759 STATIC void 1760 gtmpsc_kgdb_poll(void *arg) 1761 { 1762 struct gtmpsc_softc *sc = (struct gtmpsc_softc *)arg; 1763 int s; 1764 char c; 1765 int brk; 1766 1767 s = splserial(); 1768 if (kgdb_recover == 0) { /* gdb is not currently talking to its agent */ 1769 while (gtmpsc_common_pollc(sc->gtmpsc_unit, &c, &brk)) { 1770 if (c == CTRL('c')) 1771 brk = GTMPSC_STAT_BREAK; 1772 if (brk == GTMPSC_STAT_BREAK) 1773 break; 1774 } 1775 if (brk == GTMPSC_STAT_BREAK) { 1776 if (kgdb_break_immediate) 1777 breakpoint(); 1778 else { 1779 printf("connecting to kgdb\n"); 1780 kgdb_connect(1); 1781 } 1782 } 1783 } 1784 splx(s); 1785 } 1786 1787 #endif /* KGDB */ 1788 1789 #if 0 1790 void 1791 gtmpsc_printf(const char *fmt, ...) 1792 { 1793 struct consdev *ocd; 1794 int s; 1795 va_list ap; 1796 1797 s = splserial(); 1798 ocd = cn_tab; 1799 cn_tab = &constab[0]; 1800 va_start(ap, fmt); 1801 printf(fmt, ap); 1802 va_end(ap); 1803 cn_tab = ocd; 1804 splx(s); 1805 } 1806 #endif 1807 1808 void 1809 gtmpsc_mem_printf(const char *fmt, ...) 1810 { 1811 va_list ap; 1812 static unsigned char *p = gtmpsc_print_buf; 1813 1814 if (p >= >mpsc_print_buf[GTMPSC_PRINT_BUF_SIZE - 128]) { 1815 bzero(gtmpsc_print_buf, GTMPSC_PRINT_BUF_SIZE); 1816 p = gtmpsc_print_buf; 1817 } 1818 va_start(ap, fmt); 1819 p += vsprintf(p, fmt, ap); 1820 va_end(ap); 1821 } 1822 1823 void 1824 gtmpsc_shutdownhook(void *arg) 1825 { 1826 gtmpsc_softc_t *sc = (gtmpsc_softc_t *)arg; 1827 1828 gtmpsc_txflush(sc); 1829 } 1830 1831 void 1832 gtmpsccnhalt(dev_t dev) 1833 { 1834 unsigned int unit; 1835 u_int32_t r; 1836 1837 for (unit = 0; unit < GTMPSC_NCHAN; unit++) { 1838 gtmpsc_softc_t *sc = gtmpsc_scp[unit]; 1839 if (sc == NULL) 1840 continue; 1841 1842 /* 1843 * flush TX buffers 1844 */ 1845 gtmpsc_txflush(sc); 1846 1847 /* 1848 * stop MPSC unit RX 1849 */ 1850 r = GT_READ(sc, GTMPSC_U_CHRN(unit, 2)); 1851 r &= ~GTMPSC_CHR2_EH; 1852 r |= GTMPSC_CHR2_RXABORT; 1853 GT_WRITE(sc, GTMPSC_U_CHRN(unit, 2), r); 1854 1855 DELAY(GTMPSC_RESET_DELAY); 1856 1857 /* 1858 * abort SDMA RX for MPSC unit 1859 */ 1860 GT_WRITE(sc, SDMA_U_SDCM(unit), SDMA_SDCM_AR); 1861 } 1862 } 1863 1864 void 1865 gtmpsc_puts(char *str) 1866 { 1867 char c; 1868 1869 if (str == NULL) 1870 return; 1871 while ((c = *str++) != 0) 1872 gtmpsccnputc(0, c); 1873 } 1874