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