void dartrint(struct dartsoftc *sc, int port) { struct tty *tp; unsigned char data, sr; struct dart_info *dart; bus_addr_t ptaddr; dart = &sc->sc_dart[port]; ptaddr = port ? DART_B_BASE : DART_A_BASE; tp = dart->tty; /* read status reg */ while ((sr = dart_read(sc, ptaddr + DART_SRA)) & RXRDY) { /* read data and reset receiver */ data = dart_read(sc, ptaddr + DART_RBA); if ((tp->t_state & (TS_ISOPEN|TS_WOPEN)) == 0 && CONS_PORT != port) { return; } if (sr & RBRK) { /* clear break state */ dart_write(sc, ptaddr + DART_CRA, BRKINTRESET); DELAY_CR; dart_write(sc, ptaddr + DART_CRA, ERRRESET); #if defined(DDB) if (db_console != 0 && port == CONS_PORT) Debugger(); #endif } else { if (sr & (FRERR|PERR|ROVRN)) { /* errors */ if (sr & ROVRN) printf("dart0: receiver overrun port %c\n", 'A' + port); if (sr & FRERR) printf("dart0: framing error port %c\n", 'A' + port); if (sr & PERR) printf("dart0: parity error port %c\n", 'A' + port); /* clear error state */ dart_write(sc, ptaddr + DART_CRA, ERRRESET); } else { /* no errors */ (*linesw[tp->t_line].l_rint)(data,tp); #if 0 { if (tp->t_ispeed == B134) /* CS6 */ data &= 077; else if (tp->t_flags & CS8) ; else data &= 0177; /* CS7 */ ttyinput(data, tp); } #endif } } } }
static int snpwrite(struct dev_write_args *ap) { cdev_t dev = ap->a_head.a_dev; struct uio *uio = ap->a_uio; struct snoop *snp; struct tty *tp; int error, i, len; unsigned char c[SNP_INPUT_BUF]; lwkt_gettoken(&tty_token); snp = dev->si_drv1; tp = snp->snp_tty; if (tp == NULL) { lwkt_reltoken(&tty_token); return (EIO); } if ((tp->t_sc == snp) && (tp->t_state & TS_SNOOP) && tp->t_line == snooplinedisc) goto tty_input; kprintf("Snoop: attempt to write to bad tty.\n"); lwkt_reltoken(&tty_token); return (EIO); tty_input: if (!(tp->t_state & TS_ISOPEN)) { lwkt_reltoken(&tty_token); return (EIO); } while (uio->uio_resid > 0) { len = (int)szmin(uio->uio_resid, SNP_INPUT_BUF); if ((error = uiomove(c, (size_t)len, uio)) != 0) { lwkt_reltoken(&tty_token); return (error); } for (i=0; i < len; i++) { if (ttyinput(c[i], tp)) { lwkt_reltoken(&tty_token); return (EIO); } } } lwkt_reltoken(&tty_token); return (0); }
static void rcvISR(int irq, InterruptContext *icp) { int dev; struct tty *tp; struct device *addr; int c; /* set process priority, re-enable interrupts */ spl4(); enableInt(); /* process received character */ dev = (irq - 1) / 2; tp = &terminal[dev]; addr = (struct device *) tp->t_addr; c = addr->rcvData; if (c == '^') { showProcTable(NULL); return; } ttyinput(c, tp); }
static void com_interrupt( void *_dev ) { phantom_device_t * dev = _dev; int unit = dev->seq_number; int addr = dev->iobase; com_port_t *cp = dev->drv_private; (void) unit; SHOW_FLOW( 9, "com port %d interrupt", unit ); //register struct tty *tp = &com_tty[unit]; //static char comoverrun = 0; //char c, line, intr_id; char intr_id; //int modem_stat; int line_stat; while (! ((intr_id=(inb(INTR_ID(addr))&MASKi)) & 1)) { switch (intr_id) { case MODi: /* modem change */ //int ms = inb(MODEM_STAT(addr)); //commodem_intr(unit, ms)); break; case TRAi: hal_sem_release( &(cp->wsem) ); //comtimer_state[unit] = 0; //tp->t_state &= ~(TS_BUSY|TS_FLUSH); //tt_write_wakeup(tp); //(void) comstart(tp); break; case RECi: case CTIi: /* Character timeout indication */ hal_sem_release( &(cp->rsem) ); break; case LINi: line_stat = inb(LINE_STAT(addr)); (void) line_stat; #if 0 if ((line_stat & iPE) && ((tp->t_flags&(EVENP|ODDP)) == EVENP || (tp->t_flags&(EVENP|ODDP)) == ODDP)) { /* parity error */; } else if (line&iOR && !comoverrun) { printf("com%d: overrun\n", unit); comoverrun = 1; } else if (line_stat & (iFE | iBRKINTR)) { /* framing error or break */ ttyinput(tp->t_breakc, tp); } #endif break; } } }