Annotation of 43BSD/sys/vaxuba/dz.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1982, 1986 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  *
                      6:  *     @(#)dz.c        7.1 (Berkeley) 6/5/86
                      7:  */
                      8: 
                      9: #include "dz.h"
                     10: #if NDZ > 0
                     11: /*
                     12:  *  DZ-11/DZ-32 Driver
                     13:  *
                     14:  * This driver mimics dh.c; see it for explanation of common code.
                     15:  */
                     16: #include "bk.h"
                     17: 
                     18: #include "../machine/pte.h"
                     19: 
                     20: #include "param.h"
                     21: #include "systm.h"
                     22: #include "ioctl.h"
                     23: #include "tty.h"
                     24: #include "dir.h"
                     25: #include "user.h"
                     26: #include "proc.h"
                     27: #include "map.h"
                     28: #include "buf.h"
                     29: #include "vm.h"
                     30: #include "conf.h"
                     31: #include "bkmac.h"
                     32: #include "file.h"
                     33: #include "uio.h"
                     34: #include "kernel.h"
                     35: #include "syslog.h"
                     36: 
                     37: #include "pdma.h"
                     38: #include "ubavar.h"
                     39: #include "dzreg.h"
                     40: 
                     41: /*
                     42:  * Driver information for auto-configuration stuff.
                     43:  */
                     44: int    dzprobe(), dzattach(), dzrint();
                     45: struct uba_device *dzinfo[NDZ];
                     46: u_short        dzstd[] = { 0 };
                     47: struct uba_driver dzdriver =
                     48:        { dzprobe, 0, dzattach, 0, dzstd, "dz", dzinfo };
                     49: 
                     50: #define        NDZLINE         (NDZ*8)
                     51: #define        FASTTIMER       (hz/30)         /* rate to drain silos, when in use */
                     52: 
                     53: int    dzstart(), dzxint(), dzdma();
                     54: int    ttrstrt();
                     55: struct tty dz_tty[NDZLINE];
                     56: int    dz_cnt = { NDZLINE };
                     57: int    dzact;
                     58: int    dzsilos;                        /* mask of dz's with silo in use */
                     59: int    dzchars[NDZ];                   /* recent input count */
                     60: int    dzrate[NDZ];                    /* smoothed input count */
                     61: int    dztimerintvl;                   /* time interval for dztimer */
                     62: int    dzhighrate = 100;               /* silo on if dzchars > dzhighrate */
                     63: int    dzlowrate = 75;                 /* silo off if dzrate < dzlowrate */
                     64: 
                     65: #define dzwait(x)      while (((x)->dzlcs & DZ_ACK) == 0)
                     66: 
                     67: /*
                     68:  * Software copy of dzbrk since it isn't readable
                     69:  */
                     70: char   dz_brk[NDZ];
                     71: char   dzsoftCAR[NDZ];
                     72: char   dz_lnen[NDZ];   /* saved line enable bits for DZ32 */
                     73: 
                     74: /*
                     75:  * The dz11 doesn't interrupt on carrier transitions, so
                     76:  * we have to use a timer to watch it.
                     77:  */
                     78: char   dz_timer;               /* timer started? */
                     79: 
                     80: /*
                     81:  * Pdma structures for fast output code
                     82:  */
                     83: struct pdma dzpdma[NDZLINE];
                     84: 
                     85: char   dz_speeds[] =
                     86:        { 0,020,021,022,023,024,0,025,026,027,030,032,034,036,037,0 };
                     87:  
                     88: #ifndef        PORTSELECTOR
                     89: #define        ISPEED  B9600
                     90: #define        IFLAGS  (EVENP|ODDP|ECHO)
                     91: #else
                     92: #define        ISPEED  B4800
                     93: #define        IFLAGS  (EVENP|ODDP)
                     94: #endif
                     95: 
                     96: dzprobe(reg)
                     97:        caddr_t reg;
                     98: {
                     99:        register int br, cvec;
                    100:        register struct dzdevice *dzaddr = (struct dzdevice *)reg;
                    101: 
                    102: #ifdef lint
                    103:        br = 0; cvec = br; br = cvec;
                    104:        dzrint(0); dzxint((struct tty *)0);
                    105: #endif
                    106:        dzaddr->dzcsr = DZ_TIE|DZ_MSE|DZ_32;
                    107:        if (dzaddr->dzcsr & DZ_32)
                    108:                dzaddr->dzlnen = 1;
                    109:        else
                    110:                dzaddr->dztcr = 1;              /* enable any line */
                    111:        DELAY(100000);
                    112:        dzaddr->dzcsr = DZ_CLR|DZ_32;           /* reset everything */
                    113:        if (cvec && cvec != 0x200)
                    114:                cvec -= 4;
                    115:        return (sizeof (struct dzdevice));
                    116: }
                    117: 
                    118: dzattach(ui)
                    119:        register struct uba_device *ui;
                    120: {
                    121:        register struct pdma *pdp = &dzpdma[ui->ui_unit*8];
                    122:        register struct tty *tp = &dz_tty[ui->ui_unit*8];
                    123:        register int cntr;
                    124:        extern dzscan();
                    125: 
                    126:        for (cntr = 0; cntr < 8; cntr++) {
                    127:                pdp->p_addr = (struct dzdevice *)ui->ui_addr;
                    128:                pdp->p_arg = (int)tp;
                    129:                pdp->p_fcn = dzxint;
                    130:                pdp++, tp++;
                    131:        }
                    132:        dzsoftCAR[ui->ui_unit] = ui->ui_flags;
                    133:        if (dz_timer == 0) {
                    134:                dz_timer++;
                    135:                timeout(dzscan, (caddr_t)0, hz);
                    136:                dztimerintvl = FASTTIMER;
                    137:        }
                    138: }
                    139: 
                    140: /*ARGSUSED*/
                    141: dzopen(dev, flag)
                    142:        dev_t dev;
                    143: {
                    144:        register struct tty *tp;
                    145:        register int unit;
                    146:  
                    147:        unit = minor(dev);
                    148:        if (unit >= dz_cnt || dzpdma[unit].p_addr == 0)
                    149:                return (ENXIO);
                    150:        tp = &dz_tty[unit];
                    151:        tp->t_addr = (caddr_t)&dzpdma[unit];
                    152:        tp->t_oproc = dzstart;
                    153:        if ((tp->t_state & TS_ISOPEN) == 0) {
                    154:                ttychars(tp);
                    155: #ifndef PORTSELECTOR
                    156:                if (tp->t_ispeed == 0) {
                    157: #else
                    158:                        tp->t_state |= TS_HUPCLS;
                    159: #endif PORTSELECTOR
                    160:                        tp->t_ispeed = ISPEED;
                    161:                        tp->t_ospeed = ISPEED;
                    162:                        tp->t_flags = IFLAGS;
                    163: #ifndef PORTSELECTOR
                    164:                }
                    165: #endif PORTSELECTOR
                    166:                dzparam(unit);
                    167:        } else if (tp->t_state&TS_XCLUDE && u.u_uid != 0)
                    168:                return (EBUSY);
                    169:        (void) dzmctl(dev, DZ_ON, DMSET);
                    170:        (void) spl5();
                    171:        while ((tp->t_state & TS_CARR_ON) == 0) {
                    172:                tp->t_state |= TS_WOPEN;
                    173:                sleep((caddr_t)&tp->t_rawq, TTIPRI);
                    174:        }
                    175:        (void) spl0();
                    176:        return ((*linesw[tp->t_line].l_open)(dev, tp));
                    177: }
                    178:  
                    179: /*ARGSUSED*/
                    180: dzclose(dev, flag)
                    181:        dev_t dev;
                    182: {
                    183:        register struct tty *tp;
                    184:        register int unit;
                    185:        register struct dzdevice *dzaddr;
                    186:        int dz;
                    187:  
                    188:        unit = minor(dev);
                    189:        dz = unit >> 3;
                    190:        tp = &dz_tty[unit];
                    191:        (*linesw[tp->t_line].l_close)(tp);
                    192:        dzaddr = dzpdma[unit].p_addr;
                    193:        if (dzaddr->dzcsr&DZ_32)
                    194:                (void) dzmctl(dev, DZ_BRK, DMBIC);
                    195:        else
                    196:                dzaddr->dzbrk = (dz_brk[dz] &= ~(1 << (unit&07)));
                    197:        if ((tp->t_state&(TS_HUPCLS|TS_WOPEN)) || (tp->t_state&TS_ISOPEN) == 0)
                    198:                (void) dzmctl(dev, DZ_OFF, DMSET);
                    199:        ttyclose(tp);
                    200: }
                    201:  
                    202: dzread(dev, uio)
                    203:        dev_t dev;
                    204:        struct uio *uio;
                    205: {
                    206:        register struct tty *tp;
                    207:  
                    208:        tp = &dz_tty[minor(dev)];
                    209:        return ((*linesw[tp->t_line].l_read)(tp, uio));
                    210: }
                    211:  
                    212: dzwrite(dev, uio)
                    213:        dev_t dev;
                    214:        struct uio *uio;
                    215: {
                    216:        register struct tty *tp;
                    217:  
                    218:        tp = &dz_tty[minor(dev)];
                    219:        return ((*linesw[tp->t_line].l_write)(tp, uio));
                    220: }
                    221:  
                    222: /*ARGSUSED*/
                    223: dzrint(dz)
                    224:        int dz;
                    225: {
                    226:        register struct tty *tp;
                    227:        register int c;
                    228:        register struct dzdevice *dzaddr;
                    229:        register struct tty *tp0;
                    230:        register int unit;
                    231:        int overrun = 0;
                    232:  
                    233:        if ((dzact & (1<<dz)) == 0)
                    234:                return;
                    235:        unit = dz * 8;
                    236:        dzaddr = dzpdma[unit].p_addr;
                    237:        tp0 = &dz_tty[unit];
                    238:        dzaddr->dzcsr &= ~(DZ_RIE|DZ_MIE);      /* the manual says this song */
                    239:        dzaddr->dzcsr |= DZ_RIE|DZ_MIE;         /*   and dance is necessary */
                    240:        while (dzaddr->dzcsr & DZ_MSC) {        /* DZ32 modem change interrupt */
                    241:                c = dzaddr->dzmtsr;
                    242:                tp = tp0 + (c&7);
                    243:                if (tp >= &dz_tty[dz_cnt])
                    244:                        break;
                    245:                dzaddr->dzlcs = c&7;    /* get status of modem lines */
                    246:                dzwait(dzaddr);         /* wait for them */
                    247:                if (c & DZ_CD)          /* carrier status change? */
                    248:                if (dzaddr->dzlcs & DZ_CD) {    /* carrier up? */
                    249:                        /* carrier present */
                    250:                        (void)(*linesw[tp->t_line].l_modem)(tp, 1);
                    251:                } else if ((*linesw[tp->t_line].l_modem)(tp, 0) == 0)
                    252:                        dzaddr->dzlcs = DZ_ACK|(c&7);
                    253:        }
                    254:        while ((c = dzaddr->dzrbuf) < 0) {      /* char present */
                    255:                dzchars[dz]++;
                    256:                tp = tp0 + ((c>>8)&07);
                    257:                if (tp >= &dz_tty[dz_cnt])
                    258:                        continue;
                    259:                if ((tp->t_state & TS_ISOPEN) == 0) {
                    260:                        wakeup((caddr_t)&tp->t_rawq);
                    261: #ifdef PORTSELECTOR
                    262:                        if ((tp->t_state&TS_WOPEN) == 0)
                    263: #endif
                    264:                                continue;
                    265:                }
                    266:                if (c&DZ_FE)
                    267:                        if (tp->t_flags & RAW)
                    268:                                c = 0;
                    269:                        else
                    270:                                c = tp->t_intrc;
                    271:                if (c&DZ_DO && overrun == 0) {
                    272:                        log(LOG_WARNING, "dz%d,%d: silo overflow\n", dz, (c>>8)&7);
                    273:                        overrun = 1;
                    274:                }
                    275:                if (c&DZ_PE)    
                    276:                        if (((tp->t_flags & (EVENP|ODDP)) == EVENP)
                    277:                          || ((tp->t_flags & (EVENP|ODDP)) == ODDP))
                    278:                                continue;
                    279: #if NBK > 0
                    280:                if (tp->t_line == NETLDISC) {
                    281:                        c &= 0177;
                    282:                        BKINPUT(c, tp);
                    283:                } else
                    284: #endif
                    285:                        (*linesw[tp->t_line].l_rint)(c, tp);
                    286:        }
                    287: }
                    288:  
                    289: /*ARGSUSED*/
                    290: dzioctl(dev, cmd, data, flag)
                    291:        dev_t dev;
                    292:        caddr_t data;
                    293: {
                    294:        register struct tty *tp;
                    295:        register int unit = minor(dev);
                    296:        register int dz = unit >> 3;
                    297:        register struct dzdevice *dzaddr;
                    298:        int error;
                    299:  
                    300:        tp = &dz_tty[unit];
                    301:        error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag);
                    302:        if (error >= 0)
                    303:                return (error);
                    304:        error = ttioctl(tp, cmd, data, flag);
                    305:        if (error >= 0) {
                    306:                if (cmd == TIOCSETP || cmd == TIOCSETN || cmd == TIOCLBIS ||
                    307:                    cmd == TIOCLBIC || cmd == TIOCLSET)
                    308:                        dzparam(unit);
                    309:                return (error);
                    310:        }
                    311:        switch (cmd) {
                    312: 
                    313:        case TIOCSBRK:
                    314:                dzaddr = ((struct pdma *)(tp->t_addr))->p_addr;
                    315:                if (dzaddr->dzcsr&DZ_32)
                    316:                        (void) dzmctl(dev, DZ_BRK, DMBIS);
                    317:                else
                    318:                        dzaddr->dzbrk = (dz_brk[dz] |= 1 << (unit&07));
                    319:                break;
                    320: 
                    321:        case TIOCCBRK:
                    322:                dzaddr = ((struct pdma *)(tp->t_addr))->p_addr;
                    323:                if (dzaddr->dzcsr&DZ_32)
                    324:                        (void) dzmctl(dev, DZ_BRK, DMBIC);
                    325:                else
                    326:                        dzaddr->dzbrk = (dz_brk[dz] &= ~(1 << (unit&07)));
                    327:                break;
                    328: 
                    329:        case TIOCSDTR:
                    330:                (void) dzmctl(dev, DZ_DTR|DZ_RTS, DMBIS);
                    331:                break;
                    332: 
                    333:        case TIOCCDTR:
                    334:                (void) dzmctl(dev, DZ_DTR|DZ_RTS, DMBIC);
                    335:                break;
                    336: 
                    337:        case TIOCMSET:
                    338:                (void) dzmctl(dev, dmtodz(*(int *)data), DMSET);
                    339:                break;
                    340: 
                    341:        case TIOCMBIS:
                    342:                (void) dzmctl(dev, dmtodz(*(int *)data), DMBIS);
                    343:                break;
                    344: 
                    345:        case TIOCMBIC:
                    346:                (void) dzmctl(dev, dmtodz(*(int *)data), DMBIC);
                    347:                break;
                    348: 
                    349:        case TIOCMGET:
                    350:                *(int *)data = dztodm(dzmctl(dev, 0, DMGET));
                    351:                break;
                    352: 
                    353:        default:
                    354:                return (ENOTTY);
                    355:        }
                    356:        return (0);
                    357: }
                    358: 
                    359: dmtodz(bits)
                    360:        register int bits;
                    361: {
                    362:        register int b;
                    363: 
                    364:        b = (bits >>1) & 0370;
                    365:        if (bits & DML_ST) b |= DZ_ST;
                    366:        if (bits & DML_RTS) b |= DZ_RTS;
                    367:        if (bits & DML_DTR) b |= DZ_DTR;
                    368:        if (bits & DML_LE) b |= DZ_LE;
                    369:        return(b);
                    370: }
                    371: 
                    372: dztodm(bits)
                    373:        register int bits;
                    374: {
                    375:        register int b;
                    376: 
                    377:        b = (bits << 1) & 0360;
                    378:        if (bits & DZ_DSR) b |= DML_DSR;
                    379:        if (bits & DZ_DTR) b |= DML_DTR;
                    380:        if (bits & DZ_ST) b |= DML_ST;
                    381:        if (bits & DZ_RTS) b |= DML_RTS;
                    382:        return(b);
                    383: }
                    384:  
                    385: dzparam(unit)
                    386:        register int unit;
                    387: {
                    388:        register struct tty *tp;
                    389:        register struct dzdevice *dzaddr;
                    390:        register int lpr;
                    391:  
                    392:        tp = &dz_tty[unit];
                    393:        dzaddr = dzpdma[unit].p_addr;
                    394:        if (dzsilos & (1 << (unit >> 3)))
                    395:                dzaddr->dzcsr = DZ_IEN | DZ_SAE;
                    396:        else
                    397:                dzaddr->dzcsr = DZ_IEN;
                    398:        dzact |= (1<<(unit>>3));
                    399:        if (tp->t_ispeed == 0) {
                    400:                (void) dzmctl(unit, DZ_OFF, DMSET);     /* hang up line */
                    401:                return;
                    402:        }
                    403:        lpr = (dz_speeds[tp->t_ispeed]<<8) | (unit & 07);
                    404:        if (tp->t_flags & (RAW|LITOUT|PASS8))
                    405:                lpr |= BITS8;
                    406:        else
                    407:                lpr |= (BITS7|PENABLE);
                    408:        if ((tp->t_flags & EVENP) == 0)
                    409:                lpr |= OPAR;
                    410:        if (tp->t_ispeed == B110)
                    411:                lpr |= TWOSB;
                    412:        dzaddr->dzlpr = lpr;
                    413: }
                    414:  
                    415: dzxint(tp)
                    416:        register struct tty *tp;
                    417: {
                    418:        register struct pdma *dp;
                    419:        register dz, unit;
                    420:  
                    421:        dp = (struct pdma *)tp->t_addr;
                    422:        tp->t_state &= ~TS_BUSY;
                    423:        if (tp->t_state & TS_FLUSH)
                    424:                tp->t_state &= ~TS_FLUSH;
                    425:        else {
                    426:                ndflush(&tp->t_outq, dp->p_mem-tp->t_outq.c_cf);
                    427:                dp->p_end = dp->p_mem = tp->t_outq.c_cf;
                    428:        }
                    429:        if (tp->t_line)
                    430:                (*linesw[tp->t_line].l_start)(tp);
                    431:        else
                    432:                dzstart(tp);
                    433:        dz = minor(tp->t_dev) >> 3;
                    434:        unit = minor(tp->t_dev) & 7;
                    435:        if (tp->t_outq.c_cc == 0 || (tp->t_state&TS_BUSY)==0)
                    436:                if (dp->p_addr->dzcsr & DZ_32)
                    437:                        dp->p_addr->dzlnen = (dz_lnen[dz] &= ~(1<<unit));
                    438:                else
                    439:                        dp->p_addr->dztcr &= ~(1<<unit);
                    440: }
                    441: 
                    442: dzstart(tp)
                    443:        register struct tty *tp;
                    444: {
                    445:        register struct pdma *dp;
                    446:        register struct dzdevice *dzaddr;
                    447:        register int cc;
                    448:        int s, dz, unit;
                    449:  
                    450:        dp = (struct pdma *)tp->t_addr;
                    451:        dzaddr = dp->p_addr;
                    452:        s = spl5();
                    453:        if (tp->t_state & (TS_TIMEOUT|TS_BUSY|TS_TTSTOP))
                    454:                goto out;
                    455:        if (tp->t_outq.c_cc <= TTLOWAT(tp)) {
                    456:                if (tp->t_state&TS_ASLEEP) {
                    457:                        tp->t_state &= ~TS_ASLEEP;
                    458:                        wakeup((caddr_t)&tp->t_outq);
                    459:                }
                    460:                if (tp->t_wsel) {
                    461:                        selwakeup(tp->t_wsel, tp->t_state & TS_WCOLL);
                    462:                        tp->t_wsel = 0;
                    463:                        tp->t_state &= ~TS_WCOLL;
                    464:                }
                    465:        }
                    466:        if (tp->t_outq.c_cc == 0)
                    467:                goto out;
                    468:        if (tp->t_flags & (RAW|LITOUT))
                    469:                cc = ndqb(&tp->t_outq, 0);
                    470:        else {
                    471:                cc = ndqb(&tp->t_outq, 0200);
                    472:                if (cc == 0) {
                    473:                        cc = getc(&tp->t_outq);
                    474:                        timeout(ttrstrt, (caddr_t)tp, (cc&0x7f) + 6);
                    475:                        tp->t_state |= TS_TIMEOUT;
                    476:                        goto out;
                    477:                }
                    478:        }
                    479:        tp->t_state |= TS_BUSY;
                    480:        dp->p_end = dp->p_mem = tp->t_outq.c_cf;
                    481:        dp->p_end += cc;
                    482:        dz = minor(tp->t_dev) >> 3;
                    483:        unit = minor(tp->t_dev) & 7;
                    484:        if (dzaddr->dzcsr & DZ_32)
                    485:                dzaddr->dzlnen = (dz_lnen[dz] |= (1<<unit));
                    486:        else
                    487:                dzaddr->dztcr |= (1<<unit);
                    488: out:
                    489:        splx(s);
                    490: }
                    491:  
                    492: /*
                    493:  * Stop output on a line.
                    494:  */
                    495: /*ARGSUSED*/
                    496: dzstop(tp, flag)
                    497:        register struct tty *tp;
                    498: {
                    499:        register struct pdma *dp;
                    500:        register int s;
                    501: 
                    502:        dp = (struct pdma *)tp->t_addr;
                    503:        s = spl5();
                    504:        if (tp->t_state & TS_BUSY) {
                    505:                dp->p_end = dp->p_mem;
                    506:                if ((tp->t_state&TS_TTSTOP)==0)
                    507:                        tp->t_state |= TS_FLUSH;
                    508:        }
                    509:        splx(s);
                    510: }
                    511:  
                    512: dzmctl(dev, bits, how)
                    513:        dev_t dev;
                    514:        int bits, how;
                    515: {
                    516:        register struct dzdevice *dzaddr;
                    517:        register int unit, mbits;
                    518:        int b, s;
                    519: 
                    520:        unit = minor(dev);
                    521:        b = 1<<(unit&7);
                    522:        dzaddr = dzpdma[unit].p_addr;
                    523:        s = spl5();
                    524:        if (dzaddr->dzcsr & DZ_32) {
                    525:                dzwait(dzaddr)
                    526:                DELAY(100);             /* IS 100 TOO MUCH? */
                    527:                dzaddr->dzlcs = unit&7;
                    528:                DELAY(100);
                    529:                dzwait(dzaddr)
                    530:                DELAY(100);
                    531:                mbits = dzaddr->dzlcs;
                    532:                mbits &= 0177770;
                    533:        } else {
                    534:                mbits = (dzaddr->dzdtr & b) ? DZ_DTR : 0;
                    535:                mbits |= (dzaddr->dzmsr & b) ? DZ_CD : 0;
                    536:                mbits |= (dzaddr->dztbuf & b) ? DZ_RI : 0;
                    537:        }
                    538:        switch (how) {
                    539:        case DMSET:
                    540:                mbits = bits;
                    541:                break;
                    542: 
                    543:        case DMBIS:
                    544:                mbits |= bits;
                    545:                break;
                    546: 
                    547:        case DMBIC:
                    548:                mbits &= ~bits;
                    549:                break;
                    550: 
                    551:        case DMGET:
                    552:                (void) splx(s);
                    553:                return(mbits);
                    554:        }
                    555:        if (dzaddr->dzcsr & DZ_32) {
                    556:                mbits |= DZ_ACK|(unit&7);
                    557:                dzaddr->dzlcs = mbits;
                    558:        } else {
                    559:                if (mbits & DZ_DTR)
                    560:                        dzaddr->dzdtr |= b;
                    561:                else
                    562:                        dzaddr->dzdtr &= ~b;
                    563:        }
                    564:        (void) splx(s);
                    565:        return(mbits);
                    566: }
                    567:  
                    568: int dztransitions, dzfasttimers;               /*DEBUG*/
                    569: dzscan()
                    570: {
                    571:        register i;
                    572:        register struct dzdevice *dzaddr;
                    573:        register bit;
                    574:        register struct tty *tp;
                    575:        register car;
                    576:        int olddzsilos = dzsilos;
                    577:        int dztimer();
                    578:  
                    579:        for (i = 0; i < dz_cnt ; i++) {
                    580:                dzaddr = dzpdma[i].p_addr;
                    581:                if (dzaddr == 0)
                    582:                        continue;
                    583:                tp = &dz_tty[i];
                    584:                bit = 1<<(i&07);
                    585:                car = 0;
                    586:                if (dzsoftCAR[i>>3]&bit)
                    587:                        car = 1;
                    588:                else if (dzaddr->dzcsr & DZ_32) {
                    589:                        dzaddr->dzlcs = i&07;
                    590:                        dzwait(dzaddr);
                    591:                        car = dzaddr->dzlcs & DZ_CD;
                    592:                } else
                    593:                        car = dzaddr->dzmsr&bit;
                    594:                if (car) {
                    595:                        /* carrier present */
                    596:                        if ((tp->t_state & TS_CARR_ON) == 0)
                    597:                                (void)(*linesw[tp->t_line].l_modem)(tp, 1);
                    598:                } else if ((tp->t_state&TS_CARR_ON) &&
                    599:                    (*linesw[tp->t_line].l_modem)(tp, 0) == 0)
                    600:                        dzaddr->dzdtr &= ~bit;
                    601:        }
                    602:        for (i = 0; i < NDZ; i++) {
                    603:                ave(dzrate[i], dzchars[i], 8);
                    604:                if (dzchars[i] > dzhighrate && ((dzsilos & (1 << i)) == 0)) {
                    605:                        dzpdma[i << 3].p_addr->dzcsr = DZ_IEN | DZ_SAE;
                    606:                        dzsilos |= (1 << i);
                    607:                        dztransitions++;                /*DEBUG*/
                    608:                } else if ((dzsilos & (1 << i)) && (dzrate[i] < dzlowrate)) {
                    609:                        dzpdma[i << 3].p_addr->dzcsr = DZ_IEN;
                    610:                        dzsilos &= ~(1 << i);
                    611:                }
                    612:                dzchars[i] = 0;
                    613:        }
                    614:        if (dzsilos && !olddzsilos)
                    615:                timeout(dztimer, (caddr_t)0, dztimerintvl);
                    616:        timeout(dzscan, (caddr_t)0, hz);
                    617: }
                    618: 
                    619: dztimer()
                    620: {
                    621:        register int dz;
                    622:        register int s;
                    623: 
                    624:        if (dzsilos == 0)
                    625:                return;
                    626:        s = spl5();
                    627:        dzfasttimers++;         /*DEBUG*/
                    628:        for (dz = 0; dz < NDZ; dz++)
                    629:                if (dzsilos & (1 << dz))
                    630:                    dzrint(dz);
                    631:        splx(s);
                    632:        timeout(dztimer, (caddr_t) 0, dztimerintvl);
                    633: }
                    634: 
                    635: /*
                    636:  * Reset state of driver if UBA reset was necessary.
                    637:  * Reset parameters and restart transmission on open lines.
                    638:  */
                    639: dzreset(uban)
                    640:        int uban;
                    641: {
                    642:        register int unit;
                    643:        register struct tty *tp;
                    644:        register struct uba_device *ui;
                    645: 
                    646:        for (unit = 0; unit < NDZLINE; unit++) {
                    647:                ui = dzinfo[unit >> 3];
                    648:                if (ui == 0 || ui->ui_ubanum != uban || ui->ui_alive == 0)
                    649:                        continue;
                    650:                if (unit%8 == 0)
                    651:                        printf(" dz%d", unit>>3);
                    652:                tp = &dz_tty[unit];
                    653:                if (tp->t_state & (TS_ISOPEN|TS_WOPEN)) {
                    654:                        dzparam(unit);
                    655:                        (void) dzmctl(unit, DZ_ON, DMSET);
                    656:                        tp->t_state &= ~TS_BUSY;
                    657:                        dzstart(tp);
                    658:                }
                    659:        }
                    660: }
                    661: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.