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); }
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); }