Annotation of 43BSDReno/sys/vaxuba/dmf.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:  *     @(#)dmf.c       7.12 (Berkeley) 4/12/90
                      7:  */
                      8: 
                      9: /*
                     10:  * DMF32 driver
                     11:  *
                     12:  *
                     13:  * TODO:
                     14:  *     test with modem
                     15:  *     load as much as possible into silo
                     16:  *     use auto XON/XOFF
                     17:  *     test reset code
                     18:  */
                     19: #include "dmf.h"
                     20: #if NDMF > 0
                     21: 
                     22: #ifndef NDMF_LP
                     23: #define        NDMF_LP NDMF
                     24: #endif NDMF_LP
                     25: #include "machine/pte.h"
                     26: 
                     27: #include "uba.h"
                     28: #include "param.h"
                     29: #include "conf.h"
                     30: #include "user.h"
                     31: #include "proc.h"
                     32: #include "ioctl.h"
                     33: #include "tty.h"
                     34: #include "map.h"
                     35: #include "buf.h"
                     36: #include "vm.h"
                     37: #include "bkmac.h"
                     38: #include "clist.h"
                     39: #include "file.h"
                     40: #include "uio.h"
                     41: #include "kernel.h"
                     42: #include "syslog.h"
                     43: 
                     44: #include "dmx.h"
                     45: #include "ubareg.h"
                     46: #include "ubavar.h"
                     47: #include "dmxreg.h"
                     48: #include "dmfreg.h"
                     49: #include "dmreg.h"
                     50: 
                     51: extern int dmx_timeout;                /* silo timeout, in ms */
                     52: int    dmfstart();
                     53: 
                     54: /*
                     55:  * The clist space is mapped by one terminal driver onto each UNIBUS.
                     56:  * The identity of the board which allocated resources is recorded,
                     57:  * so the process may be repeated after UNIBUS resets.
                     58:  * The UBACVT macro converts a clist space address for unibus uban
                     59:  * into an i/o space address for the DMA routine.
                     60:  */
                     61: int    dmf_uballoc[NUBA];      /* which dmf (if any) allocated unibus map */
                     62: int    cbase[NUBA];            /* base address of clists in unibus map */
                     63: 
                     64: /*
                     65:  * Autoconfiguration and variables for DMF32
                     66:  */
                     67: int    dmfprobe(), dmfattach(), dmfrint(), dmfxint();
                     68: int    dmflint();
                     69: struct uba_device *dmfinfo[NDMF];
                     70: u_short        dmfstd[] = { 0 };
                     71: struct uba_driver dmfdriver =
                     72:        { dmfprobe, 0, dmfattach, 0, dmfstd, "dmf", dmfinfo };
                     73: 
                     74: struct tty dmf_tty[NDMF*8];
                     75: struct dmx_softc dmf_softc[NDMF];
                     76: #ifndef lint
                     77: int    ndmf = NDMF*8;                  /* used by iostat */
                     78: #endif
                     79: 
                     80: /*
                     81:  * Routine for configuration to set dmf interrupt.
                     82:  */
                     83: /*ARGSUSED*/
                     84: dmfprobe(reg, ctlr)
                     85:        caddr_t reg;
                     86:        struct uba_device *ctlr;
                     87: {
                     88:        register int br, cvec;          /* these are ``value-result'' */
                     89:        register struct dmfdevice *dmfaddr = (struct dmfdevice *)reg;
                     90:        register int i;
                     91:        register unsigned int a;
                     92:        static char *dmfdevs[]=
                     93:                {"parallel","printer","synch","asynch"};
                     94:        unsigned int dmfoptions;
                     95:        static int (*intrv[3])() = { (int (*)())0, (int (*)())0, (int (*)())0 };
                     96: 
                     97: #ifdef lint
                     98:        br = 0; cvec = br; br = cvec;
                     99:        dmfxint(0); dmfrint(0);
                    100:        dmfsrint(); dmfsxint(); dmfdaint(); dmfdbint(); dmflint(0);
                    101: #endif
                    102:        /*
                    103:         * Pick the usual size DMF vector here (don't decrement it here).
                    104:         * grab configuration; note that the DMF32
                    105:         * doesn't seem to put the right bits in this
                    106:         * register until AFTER the interrupt vector is set.
                    107:         */
                    108:        br = 0x15;
                    109:        cvec = (uba_hd[numuba].uh_lastiv - 4*8);
                    110:        dmfaddr->dmfccsr0 = (cvec >> 2);
                    111:        dmfoptions = dmfaddr->dmfccsr0 & DMFC_CONFMASK;
                    112: 
                    113:        /* catch a couple of special cases:  Able vmz/32n and vmz/lp    */
                    114:        if (dmfoptions == DMFC_ASYNC) {
                    115:                /* Async portion only */
                    116: 
                    117:                cvec = (uba_hd[numuba].uh_lastiv -= 8);
                    118:                dmfaddr->dmfccsr0 = (cvec - 2*8) >> 2;
                    119:                intrv[0] = ctlr->ui_intr[4];
                    120:                intrv[1] = ctlr->ui_intr[5];
                    121:                ctlr->ui_intr = intrv;
                    122:        } else if (dmfoptions == DMFC_LP) {
                    123:                /* LP portion only */
                    124: 
                    125:                cvec = (uba_hd[numuba].uh_lastiv -= 8);
                    126:                ctlr->ui_intr = &ctlr->ui_intr[6];
                    127:        } else if (dmfoptions == (DMFC_LP|DMFC_ASYNC)) {
                    128:                /* LP and Async portions only */
                    129: 
                    130:                cvec = (uba_hd[numuba].uh_lastiv -= 2*8);
                    131:                ctlr->ui_intr = &ctlr->ui_intr[4];
                    132:        } else {
                    133:                /* All other configurations get everything */
                    134: 
                    135:                cvec = (uba_hd[numuba].uh_lastiv -= 4*8);
                    136:        }
                    137:        a = (dmfoptions >> 12) & 0xf;
                    138:        printf("dmf%d:", ctlr->ui_unit);
                    139:        for (i = 0; a != 0; ++i, a >>= 1) {
                    140:                if (a & 1)
                    141:                        printf(" %s",dmfdevs[i]);
                    142:        }
                    143:        printf(".\n");
                    144: 
                    145:        if (dmfoptions & DMFC_LP)
                    146:                dmfaddr->dmfl_ctrl = DMFL_RESET;
                    147:        return (sizeof (struct dmfdevice));
                    148: }
                    149: 
                    150: /*
                    151:  * Routine called to attach a dmf.
                    152:  */
                    153: dmfattach(ui)
                    154:        register struct uba_device *ui;
                    155: {
                    156:        register struct dmx_softc *sc;
                    157: 
                    158:        sc = &dmf_softc[ui->ui_unit];
                    159:        sc->dmx_type = 'f';
                    160:        sc->dmx_unit = ui->ui_unit;
                    161:        sc->dmx_unit0 = 0;
                    162:        sc->dmx_ubanum = ui->ui_ubanum;
                    163:        sc->dmx_softCAR = ui->ui_flags & 0xff;
                    164:        sc->dmx_tty = &dmf_tty[ui->ui_unit * 8];
                    165:        sc->dmx_octet =
                    166:            (struct dmx_octet *)&((struct dmfdevice *)ui->ui_addr)->dmfa;
                    167: 
                    168:        cbase[ui->ui_ubanum] = -1;
                    169:        dmf_uballoc[ui->ui_ubanum] = -1;
                    170: #if NDMF_LP > 0
                    171:        dmflattach(ui);
                    172: #endif NDMF_LP
                    173: }
                    174: 
                    175: /*
                    176:  * Open a DMF32 line, mapping the clist onto the uba if this
                    177:  * is the first dmf on this uba.  Turn on this dmf if this is
                    178:  * the first use of it.
                    179:  */
                    180: /*ARGSUSED*/
                    181: dmfopen(dev, flag)
                    182:        dev_t dev;
                    183: {
                    184:        register struct tty *tp;
                    185:        register struct dmx_softc *sc;
                    186:        int unit, dmf;
                    187:        register struct dmfdevice *addr;
                    188:        register struct uba_device *ui;
                    189:        int s;
                    190:        int dmxparam();
                    191: 
                    192:        unit = minor(dev);
                    193:        if (unit & 0200)
                    194:                return (dmflopen(dev,flag));
                    195:        dmf = unit >> 3;
                    196:        if (unit >= NDMF*8 || (ui = dmfinfo[dmf])== 0 || ui->ui_alive == 0)
                    197:                return (ENXIO);
                    198: 
                    199:        tp = &dmf_tty[unit];
                    200:        sc = &dmf_softc[dmf];
                    201:        addr = (struct dmfdevice *)ui->ui_addr;
                    202:        tp->t_addr = (caddr_t)(&addr->dmfa);
                    203:        tp->t_oproc = dmfstart;
                    204:        tp->t_dev = dev;                        /* needed before dmxopen */
                    205:        tp->t_param = dmxparam;
                    206: 
                    207:        /*
                    208:         * While setting up state for this uba,
                    209:         * block uba resets which can clear the state.
                    210:         */
                    211:        s = spl6();
                    212:        if (cbase[ui->ui_ubanum] == -1) {
                    213:                dmf_uballoc[ui->ui_ubanum] = dmf;
                    214:                cbase[ui->ui_ubanum] = UBAI_ADDR(uballoc(ui->ui_ubanum,
                    215:                    (caddr_t)cfree, nclist*sizeof(struct cblock), 0));
                    216:        }
                    217:        splx(s);
                    218: 
                    219:        return (dmxopen(tp, sc, flag));
                    220: }
                    221: 
                    222: /*
                    223:  * Close a DMF32 line.
                    224:  */
                    225: /*ARGSUSED*/
                    226: dmfclose(dev, flag)
                    227:        dev_t dev;
                    228:        int flag;
                    229: {
                    230:        register unit;
                    231: 
                    232:        unit = minor(dev);
                    233:        if (unit & 0200) {
                    234:                dmflclose(dev, flag);
                    235:                return;
                    236:        }
                    237:        return (dmxclose(&dmf_tty[unit]));
                    238: }
                    239: 
                    240: dmfread(dev, uio, flag)
                    241:        dev_t dev;
                    242:        struct uio *uio;
                    243: {
                    244:        register struct tty *tp;
                    245: 
                    246:        if (minor(dev) & 0200)
                    247:                return(ENXIO);
                    248:        tp = &dmf_tty[minor(dev)];
                    249:        return ((*linesw[tp->t_line].l_read)(tp, uio, flag));
                    250: }
                    251: 
                    252: dmfwrite(dev, uio)
                    253:        dev_t dev;
                    254:        struct uio *uio;
                    255: {
                    256:        register struct tty *tp;
                    257: 
                    258:        if (minor(dev) & 0200)
                    259:                return (dmflwrite(dev,uio));
                    260:        tp = &dmf_tty[minor(dev)];
                    261:        return ((*linesw[tp->t_line].l_write)(tp, uio));
                    262: }
                    263: 
                    264: /*
                    265:  * DMF32 receiver interrupt.
                    266:  */
                    267: dmfrint(dmf)
                    268:        int dmf;
                    269: {
                    270:        struct uba_device *ui;
                    271: 
                    272:        ui = dmfinfo[dmf];
                    273:        if (ui == 0 || ui->ui_alive == 0)
                    274:                return;
                    275:        dmxrint(&dmf_softc[dmf]);
                    276: }
                    277: 
                    278: /*
                    279:  * Ioctl for DMF32.
                    280:  */
                    281: dmfioctl(dev, cmd, data, flag)
                    282:        dev_t dev;
                    283:        caddr_t data;
                    284: {
                    285:        int unit = minor(dev);
                    286:  
                    287:        if (unit & 0200)
                    288:                return (ENOTTY);
                    289:        return (dmxioctl(&dmf_tty[unit], cmd, data, flag));
                    290: }
                    291: 
                    292: /*
                    293:  * DMF32 transmitter interrupt.
                    294:  * Restart the idle line.
                    295:  */
                    296: dmfxint(dmf)
                    297:        int dmf;
                    298: {
                    299: 
                    300:        dmxxint(&dmf_softc[dmf]);
                    301: }
                    302: 
                    303: /*
                    304:  * Start (restart) transmission on the given line.
                    305:  */
                    306: dmfstart(tp)
                    307:        struct tty *tp;
                    308: {
                    309: 
                    310:        dmxstart(tp, &dmf_softc[minor(tp->t_dev) >> 3]);
                    311: }
                    312: 
                    313: /*
                    314:  * Stop output on a line, e.g. for ^S/^Q or output flush.
                    315:  */
                    316: dmfstop(tp, flag)
                    317:        struct tty *tp;
                    318: {
                    319: 
                    320:        dmxstop(tp, &dmf_softc[minor(tp->t_dev) >> 3], flag);
                    321: }
                    322: 
                    323: /*
                    324:  * Reset state of driver if UBA reset was necessary.
                    325:  * Reset the csr, lpr, and lcr registers on open lines, and
                    326:  * restart transmitters.
                    327:  */
                    328: dmfreset(uban)
                    329:        int uban;
                    330: {
                    331:        register int dmf;
                    332:        register struct tty *tp;
                    333:        register struct uba_device *ui;
                    334:        register struct dmfdevice *addr;
                    335:        int i;
                    336: 
                    337:        for (dmf = 0; dmf < NDMF; dmf++) {
                    338:                ui = dmfinfo[dmf];
                    339:                if (ui == 0 || ui->ui_alive == 0 || ui->ui_ubanum != uban)
                    340:                        continue;
                    341:                printf(" dmf%d", dmf);
                    342:                if (dmf_uballoc[uban] == dmf) {
                    343:                        int info;
                    344: 
                    345:                        info = uballoc(uban, (caddr_t)cfree,
                    346:                            nclist * sizeof(struct cblock), UBA_CANTWAIT);
                    347:                        if (info)
                    348:                                cbase[uban] = UBAI_ADDR(info);
                    349:                        else {
                    350:                                printf(" [can't get uba map]");
                    351:                                cbase[uban] = -1;
                    352:                        }
                    353:                }
                    354:                addr = (struct dmfdevice *)ui->ui_addr;
                    355:                addr->dmfa.csr = DMF_IE;
                    356:                addr->dmfa.rsp = dmx_timeout;
                    357:                tp = &dmf_tty[dmf * 8];
                    358:                for (i = 0; i < 8; i++, tp++) {
                    359:                        if (tp->t_state & (TS_ISOPEN|TS_WOPEN)) {
                    360:                                dmxparam(tp, &tp->t_termios);
                    361:                                (void) dmxmctl(tp, DMF_ON, DMSET);
                    362:                                tp->t_state &= ~TS_BUSY;
                    363:                                dmfstart(tp);
                    364:                        }
                    365:                }
                    366: #if NDMF_LP > 0
                    367:                dmflint(dmf);
                    368: #endif
                    369:        }
                    370: }
                    371: 
                    372: #if NDMF_LP > 0
                    373: /*
                    374:  * DMF32 line printer driver
                    375:  *
                    376:  * the line printer on dmfx is indicated by a minor device code of 128+x
                    377:  *
                    378:  * the flags field of the config file is interpreted like so:
                    379:  * bits                meaning
                    380:  * ----                -------
                    381:  * 0-7         soft carrier bits for ttys part of dmf32
                    382:  * 8-15                number of cols/line on the line printer
                    383:  *                     if 0, 132 will be used.
                    384:  * 16-23       number of lines/page on the line printer
                    385:  *                     if 0, 66 will be used.
                    386:  * 24          if 1 DO NOT use the auto format mode of the
                    387:  *                     line printer parallel port
                    388:  */
                    389: 
                    390: struct dmfl_softc {
                    391:        u_int   dmfl_state;             /* soft state bits */
                    392:        int     dmfl_info;              /* uba info */
                    393:        u_short dmfl_lines;             /* lines per page (66 def.) */
                    394:        u_short dmfl_cols;              /* cols per line (132 def.) */
                    395:        u_short dmfl_format;            /* fflag for auto form feed */
                    396:        char    dmfl_buf[DMFL_BUFSIZ];
                    397: } dmfl_softc[NDMF];
                    398: 
                    399: /*
                    400:  * convert device number into DMF line printer unit number
                    401:  */
                    402: #define        DMFL_UNIT(d)    (minor(d) & 0xf)        /* up to 16 DMFs */
                    403: 
                    404: #define ASLP 1         /* waiting for interrupt from dmf */
                    405: #define OPEN 2         /* line printer is open */
                    406: #define ERROR 4                /* error while printing, driver
                    407:                         refuses to do anything till closed */
                    408: #define MOREIO 8       /* more data for printer */
                    409: 
                    410: /*
                    411:  * Attach printer portion of dmf.
                    412:  */
                    413: dmflattach(ui)
                    414:        register struct uba_device *ui;
                    415: {
                    416:        register int unit = ui->ui_unit;
                    417:        register int cols = (ui->ui_flags>>8) & 0xff;
                    418:        register int lines = (ui->ui_flags>>16) & 0xff;
                    419:        register struct dmfl_softc *sc;
                    420: 
                    421:        sc = &dmfl_softc[unit];
                    422:        sc->dmfl_cols = cols == 0 ? DMFL_DEFCOLS : cols;
                    423:        sc->dmfl_lines = lines == 0 ? DMFL_DEFLINES : lines;
                    424:        if ((ui->ui_flags >> 24) & 0x1)
                    425:                sc->dmfl_format = (2 << 8);
                    426:        else
                    427:                sc->dmfl_format = (2 << 8) | DMFL_FORMAT;
                    428: }
                    429: 
                    430: /*
                    431:  * dmflopen -- open the line printer port on a dmf32
                    432:  */
                    433: /* ARGSUSED */
                    434: dmflopen(dev, flag)
                    435:        dev_t dev;
                    436:        int flag;
                    437: {
                    438:        register int dmf;
                    439:        register struct dmfl_softc *sc;
                    440:        register struct uba_device *ui;
                    441:        register struct dmfdevice *addr;
                    442: 
                    443:        dmf = DMFL_UNIT(dev);
                    444:        if (dmf >= NDMF || (ui = dmfinfo[dmf]) == 0 || ui->ui_alive == 0)
                    445:                return (ENXIO);
                    446:        sc = &dmfl_softc[dmf];
                    447:        if (sc->dmfl_state & OPEN)
                    448:                return (EBUSY);
                    449:        addr = (struct dmfdevice *)ui->ui_addr;
                    450:        if (addr->dmfl_ctrl & DMFL_OFFLINE) {
                    451: #ifdef notdef
                    452:                log(LOG_WARNING, "dmf%d: line printer offline/jammed\n",
                    453:                        dmf);
                    454: #endif
                    455:                return (EIO);
                    456:        }
                    457:        if ((addr->dmfl_ctrl & DMFL_CONV)) {
                    458:                log(LOG_WARNING, "dmf%d: line printer disconnected\n", dmf);
                    459:                return (EIO);
                    460:        }
                    461: 
                    462:        addr->dmfl_ctrl = 0;
                    463:        sc->dmfl_state |= OPEN;
                    464:        return (0);
                    465: }
                    466: 
                    467: /* ARGSUSED */
                    468: dmflclose(dev, flag)
                    469:        dev_t dev;
                    470:        int flag;
                    471: {
                    472:        register int dmf = DMFL_UNIT(dev);
                    473:        register struct dmfl_softc *sc = &dmfl_softc[dmf];
                    474:        register struct uba_device *ui = dmfinfo[dmf];
                    475: 
                    476:        sc->dmfl_state = 0;
                    477:        if (sc->dmfl_info != 0)
                    478:                ubarelse((int)ui->ui_ubanum, &sc->dmfl_info);
                    479: 
                    480:        ((struct dmfdevice *)ui->ui_addr)->dmfl_ctrl = 0;
                    481: }
                    482: 
                    483: dmflwrite(dev, uio)
                    484:        dev_t dev;
                    485:        struct uio *uio;
                    486: {
                    487:        register int n;
                    488:        register int error;
                    489:        register struct dmfl_softc *sc;
                    490: 
                    491:        sc = &dmfl_softc[DMFL_UNIT(dev)];
                    492:        if (sc->dmfl_state & ERROR)
                    493:                return (EIO);
                    494:        while (n = (unsigned)uio->uio_resid) {
                    495:                if (n > DMFL_BUFSIZ) {
                    496:                        n = DMFL_BUFSIZ;
                    497:                        sc->dmfl_state |= MOREIO;
                    498:                } else
                    499:                        sc->dmfl_state &= ~MOREIO;
                    500:                if (error = uiomove(sc->dmfl_buf, (int)n, uio))
                    501:                        return (error);
                    502:                if (error = dmflout(dev, sc->dmfl_buf, n))
                    503:                        return (error);
                    504:        }
                    505:        return (0);
                    506: }
                    507: 
                    508: 
                    509: /*
                    510:  * dmflout -- start io operation to dmf line printer
                    511:  *             cp is addr of buf of n chars to be sent.
                    512:  *
                    513:  *     -- dmf will be put in formatted output mode, this will
                    514:  *             be selectable from an ioctl if the
                    515:  *             need ever arises.
                    516:  */
                    517: dmflout(dev, cp, n)
                    518:        dev_t dev;
                    519:        char *cp;
                    520:        int n;
                    521: {
                    522:        register struct dmfl_softc *sc;
                    523:        register int dmf;
                    524:        register struct uba_device *ui;
                    525:        register struct dmfdevice *d;
                    526:        int s, error;
                    527: 
                    528:        dmf = DMFL_UNIT(dev);
                    529:        sc = &dmfl_softc[dmf];
                    530:        if (sc->dmfl_state & ERROR)
                    531:                return (EIO);
                    532:        ui = dmfinfo[dmf];
                    533:        /*
                    534:         * allocate unibus resources, will be released when io
                    535:         * operation is done.
                    536:         */
                    537:        if (sc->dmfl_info == 0)
                    538:                sc->dmfl_info = uballoc(ui->ui_ubanum, cp, n, 0);
                    539:        d = (struct dmfdevice *)ui->ui_addr;
                    540:        d->dmfl_ctrl = sc->dmfl_format;         /* indir reg 2 */
                    541:        /* indir reg auto increments on r/w */
                    542:        /* SO DON'T CHANGE THE ORDER OF THIS CODE */
                    543:        d->dmfl_indrct = 0;                     /* prefix chars & num */
                    544:        d->dmfl_indrct = 0;                     /* suffix chars & num */
                    545:        d->dmfl_indrct = sc->dmfl_info;         /* dma lo 16 bits addr */
                    546:        d->dmfl_indrct = -n;                    /* number of chars */
                    547: 
                    548:        d->dmfl_indrct = ((sc->dmfl_info>>16)&3) | DMFL_OPTIONS;
                    549:                                                /* dma hi 2 bits addr */
                    550:        d->dmfl_indrct = sc->dmfl_lines         /* lines per page */
                    551:                | (sc->dmfl_cols<<8);           /* carriage width */
                    552:        sc->dmfl_state |= ASLP;
                    553:        error = 0;
                    554:        s = spltty();
                    555:        d->dmfl_ctrl |= DMFL_PEN | DMFL_IE;
                    556:        while (sc->dmfl_state & ASLP) {
                    557:                if (error = tsleep(sc->dmfl_buf, (PZERO + 8) | PCATCH,
                    558:                    ttyout, 0))
                    559:                        break;
                    560:                while (sc->dmfl_state & ERROR) {
                    561:                        timeout(dmflint, (caddr_t)dmf, 10 * hz);
                    562:                        if (error = tsleep((caddr_t)&sc->dmfl_state,
                    563:                            (PZERO + 8) | PCATCH, ttyout, 0))
                    564:                                goto out;
                    565:                }
                    566:        }
                    567: out:
                    568:        splx(s);
                    569:        return (0);
                    570: }
                    571: 
                    572: /*
                    573:  * dmflint -- handle an interrupt from the line printer part of the dmf32
                    574:  */
                    575: dmflint(dmf)
                    576:        int dmf;
                    577: {
                    578:        register struct uba_device *ui;
                    579:        register struct dmfl_softc *sc;
                    580:        register struct dmfdevice *d;
                    581:        short dmfl_stats;
                    582: 
                    583:        ui = dmfinfo[dmf];
                    584:        sc = &dmfl_softc[dmf];
                    585:        d = (struct dmfdevice *)ui->ui_addr;
                    586: 
                    587:        d->dmfl_ctrl &= ~DMFL_IE;
                    588:        dmfl_stats = d->dmfl_ctrl;
                    589:        if (sc->dmfl_state & ERROR) {
                    590:                if ((dmfl_stats & DMFL_OFFLINE) == 0)
                    591:                        sc->dmfl_state &= ~ERROR;
                    592:                wakeup((caddr_t)&sc->dmfl_state);
                    593:                return;
                    594:        }
                    595:        if (dmfl_stats & DMFL_DMAERR)
                    596:                log(LOG_WARNING, "dmf%d: NXM\n", dmf);
                    597:        if (dmfl_stats & DMFL_OFFLINE) {
                    598:                log(LOG_WARNING, "dmf%d: printer error\n", dmf);
                    599:                sc->dmfl_state |= ERROR;
                    600:        }
                    601: #ifdef notdef
                    602:        if (dmfl_stats & DMFL_PDONE) {
                    603:                printf("bytes= %d\n", d->dmfl_indrct);
                    604:                printf("lines= %d\n", d->dmfl_indrct);
                    605:        }
                    606: #endif
                    607:        sc->dmfl_state &= ~ASLP;
                    608:        wakeup((caddr_t)sc->dmfl_buf);
                    609:        if (sc->dmfl_info && (sc->dmfl_state & MOREIO) == 0)
                    610:                ubarelse(ui->ui_ubanum, &sc->dmfl_info);
                    611: }
                    612: #endif NDMF_LP
                    613: 
                    614: /* stubs for interrupt routines for devices not yet supported */
                    615: 
                    616: dmfsrint()
                    617: {
                    618:        printf("dmfsrint\n");
                    619: }
                    620: 
                    621: dmfsxint()
                    622: {
                    623:        printf("dmfsxint\n");
                    624: }
                    625: 
                    626: dmfdaint()
                    627: {
                    628:        printf("dmfdaint\n");
                    629: }
                    630: 
                    631: dmfdbint()
                    632: {
                    633:        printf("dmfdbint\n");
                    634: }
                    635: #endif NDMF

unix.superglobalmegacorp.com

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