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 } } } }
int dartintr(void *arg) { struct dartsoftc *sc = arg; unsigned char isr, imr; int port; /* read interrupt status register and mask with imr */ isr = dart_read(sc, DART_ISR); imr = sc->sc_sv_reg->sv_imr; if ((isr & imr) == 0) { /* * We got an interrupt on a disabled condition (such as TX * ready change on a disabled port). This should not happen, * but we have to claim the interrupt anyway. */ #if defined(DIAGNOSTIC) && !defined(MULTIPROCESSOR) printf("%s: spurious interrupt, isr %x imr %x\n", sc->sc_dev.dv_xname, isr, imr); #endif return (1); } isr &= imr; if (isr & IIPCHG) { unsigned int ip, ipcr; ip = dart_read(sc, DART_IP); ipcr = dart_read(sc, DART_IPCR); dartmodemtrans(sc, ip, ipcr); return (1); } if (isr & (IRXRDYA | ITXRDYA)) port = 0; #ifdef DIAGNOSTIC else if ((isr & (IRXRDYB | ITXRDYB)) == 0) { printf("%s: spurious interrupt, isr %x\n", sc->sc_dev.dv_xname, isr); return (1); /* claim it anyway */ } #endif else port = 1; if (isr & (IRXRDYA | IRXRDYB)) dartrint(sc, port); if (isr & (ITXRDYA | ITXRDYB)) dartxint(sc, port); if (isr & (port == A_PORT ? IBRKA : IBRKB)) dart_write(sc, port == A_PORT ? DART_CRA : DART_CRB, BRKINTRESET); return (1); }
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 == A_PORT ? DART_A_BASE : DART_B_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 && (sc->sc_console == 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 && sc->sc_console && port == CONS_PORT) Debugger(); #endif } else { if (sr & (FRERR | PERR | ROVRN)) { /* errors */ if (sr & ROVRN) log(LOG_WARNING, "%s port %c: " "receiver overrun\n", sc->sc_dev.dv_xname, 'A' + port); if (sr & FRERR) log(LOG_WARNING, "%s port %c: " "framing error\n", sc->sc_dev.dv_xname, 'A' + port); if (sr & PERR) log(LOG_WARNING, "%s port %c: " "parity error\n", sc->sc_dev.dv_xname, 'A' + port); /* clear error state */ dart_write(sc, ptaddr + DART_CRA, ERRRESET); } else { /* no errors */ (*linesw[tp->t_line].l_rint)(data,tp); } } } }
int dartintr(void *arg) { struct dartsoftc *sc = arg; unsigned char isr, imr; int port; /* read interrupt status register and mask with imr */ isr = dart_read(sc, DART_ISR); imr = sc->sc_sv_reg.sv_imr; if ((isr & imr) == 0) { /* * We got an interrupt on a disabled condition (such as TX * ready change on a disabled port). This should not happen, * but we have to claim the interrupt anyway. */ #ifdef DIAGNOSTIC printf("dartintr: spurious interrupt, isr %x imr %x\n", isr, imr); #endif return (1); } isr &= imr; if (isr & IIPCHG) { unsigned int ip, ipcr; ip = dart_read(sc, DART_IP); ipcr = dart_read(sc, DART_IPCR); dartmodemtrans(sc, ip, ipcr); return (1); } if (isr & (IRXRDYA | ITXRDYA)) port = 0; else if (isr & (IRXRDYB | ITXRDYB)) port = 1; else { printf("dartintr: spurious interrupt, isr 0x%08x\n", isr); return (1); /* claim it anyway */ } if (isr & (IRXRDYA | IRXRDYB)) { dartrint(sc, port); } if (isr & (ITXRDYA | ITXRDYB)) { dartxint(sc, port); } if ((port == A_PORT && (isr & IBRKA)) || (port == B_PORT && (isr & IBRKB))) { dart_write(sc, port ? DART_CRB : DART_CRA, BRKINTRESET); } return (1); }
void dartstart(struct tty *tp) { struct dartsoftc *sc; dev_t dev; int s; u_int port, chip; int c, tries; bus_addr_t ptaddr; if ((tp->t_state & TS_ISOPEN) == 0) return; dev = tp->t_dev; chip = DART_CHIP(dev); port = DART_PORT(dev); sc = (struct dartsoftc *)dart_cd.cd_devs[chip]; ptaddr = port == A_PORT ? DART_A_BASE : DART_B_BASE; s = spltty(); if (tp->t_state & (TS_TIMEOUT | TS_BUSY | TS_TTSTOP)) goto bail; ttwakeupwr(tp); if (tp->t_outq.c_cc == 0) goto bail; tp->t_state |= TS_BUSY; while (tp->t_outq.c_cc != 0) { /* load transmitter until it is full */ for (tries = 10000; tries != 0; tries --) if (dart_read(sc, ptaddr + DART_SRA) & TXRDY) break; if (tries == 0) { timeout_add(&tp->t_rstrt_to, 1); tp->t_state |= TS_TIMEOUT; break; } else { c = getc(&tp->t_outq); dart_write(sc, ptaddr + DART_TBA, c & 0xff); sc->sc_sv_reg->sv_imr |= port == A_PORT ? ITXRDYA : ITXRDYB; dart_write(sc, DART_IMR, sc->sc_sv_reg->sv_imr); } } tp->t_state &= ~TS_BUSY; bail: splx(s); }
void dartstart(struct tty *tp) { struct dartsoftc *sc; dev_t dev; int s; int port, tries; int c; bus_addr_t ptaddr; dev = tp->t_dev; port = DART_PORT(dev); if (dart_cd.cd_ndevs == 0 || port >= NDARTPORTS) return; if ((tp->t_state & TS_ISOPEN) == 0) return; sc = (struct dartsoftc *)dart_cd.cd_devs[0]; ptaddr = port ? DART_B_BASE : DART_A_BASE; s = spltty(); if (tp->t_state & (TS_TIMEOUT | TS_BUSY | TS_TTSTOP)) goto bail; if (tp->t_outq.c_cc <= tp->t_lowat) { if (tp->t_state & TS_ASLEEP) { tp->t_state &= ~TS_ASLEEP; wakeup((caddr_t)&tp->t_outq); } selwakeup(&tp->t_wsel); if (tp->t_outq.c_cc == 0) goto bail; } tp->t_state |= TS_BUSY; while (tp->t_outq.c_cc != 0) { /* load transmitter until it is full */ for (tries = 10000; tries != 0; tries --) if (dart_read(sc, ptaddr + DART_SRA) & TXRDY) break; if (tries == 0) { timeout_add(&tp->t_rstrt_to, 1); tp->t_state |= TS_TIMEOUT; break; } else { c = getc(&tp->t_outq); dart_write(sc, ptaddr + DART_TBA, c & 0xff); if (port == A_PORT) sc->sc_sv_reg.sv_imr |= ITXRDYA; else sc->sc_sv_reg.sv_imr |= ITXRDYB; dart_write(sc, DART_IMR, sc->sc_sv_reg.sv_imr); } } tp->t_state &= ~TS_BUSY; bail: splx(s); }