Annotation of 43BSDReno/sys/vaxuba/dmz.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1985, 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:  *     @(#)dmz.c       7.9 (Berkeley) 4/12/90
        !             7:  */
        !             8: 
        !             9: /*
        !            10:  * DMZ-32 driver
        !            11:  */
        !            12: 
        !            13: #include "dmz.h"
        !            14: #if NDMZ > 0
        !            15: 
        !            16: #include "machine/pte.h"
        !            17: 
        !            18: #include "uba.h"
        !            19: #include "param.h"
        !            20: #include "conf.h"
        !            21: #include "user.h"
        !            22: #include "proc.h"
        !            23: #include "ioctl.h"
        !            24: #include "tty.h"
        !            25: #include "map.h"
        !            26: #include "buf.h"
        !            27: #include "vm.h"
        !            28: #include "bkmac.h"
        !            29: #include "clist.h"
        !            30: #include "file.h"
        !            31: #include "uio.h"
        !            32: #include "kernel.h"
        !            33: #include "syslog.h"
        !            34: 
        !            35: #include "dmx.h"
        !            36: #include "ubareg.h"
        !            37: #include "ubavar.h"
        !            38: #include "dmxreg.h"
        !            39: #include "dmzreg.h"
        !            40: #include "dmreg.h"
        !            41: 
        !            42: extern int dmx_timeout;                /* silo timeout, in ms */
        !            43: int    dmzstart();
        !            44: 
        !            45: /*
        !            46:  * The clist space is mapped by one terminal driver onto each UNIBUS.
        !            47:  * The identity of the board which allocated resources is recorded,
        !            48:  * so the process may be repeated after UNIBUS resets.
        !            49:  * The UBACVT macro converts a clist space address for unibus uban
        !            50:  * into an i/o space address for the DMA routine.
        !            51:  */
        !            52: int    dmz_uballoc[NUBA];      /* which dmz (if any) allocated unibus map */
        !            53: int    cbase[NUBA];            /* base address of clists in unibus map */
        !            54: 
        !            55: /*
        !            56:  * Autoconfiguration and variables for DMZ32
        !            57:  */
        !            58: int dmzprobe(), dmzattach();
        !            59: struct uba_device *dmzinfo[NDMZ];
        !            60: u_short dmzstd[] = { 0 };
        !            61: struct uba_driver dmzdriver = {
        !            62:        dmzprobe, 0, dmzattach, 0, dmzstd, "dmz", dmzinfo
        !            63: };
        !            64: 
        !            65: struct tty dmz_tty[NDMZ*24];
        !            66: struct dmx_softc dmz_softc[3 * NDMZ];
        !            67: #ifndef lint
        !            68: int    ndmz = NDMZ*24;                 /* used by iostat */
        !            69: #endif
        !            70: 
        !            71: dmzprobe(reg)
        !            72:        caddr_t reg;
        !            73: {
        !            74:        register int br, cvec;
        !            75:        register struct dmzdevice *dmz_addr;
        !            76:        register unsigned int a;
        !            77: 
        !            78:        dmz_addr = (struct dmzdevice *)reg;
        !            79: 
        !            80: #ifdef lint
        !            81:        br = 0; cvec = br; br = cvec; dmzxinta(0); dmzxintb(0); dmzxintc(0);
        !            82:        dmzrinta(0); dmzrintb(0); dmzrintc(0);
        !            83: #endif
        !            84: 
        !            85:        br = 0x15;
        !            86: 
        !            87:        a = dmz_addr->dmz_config;
        !            88:        if (((a>>12) & ~DMZ_INTERFACE) != 0) {
        !            89:                printf("        Unknown interface type\n");
        !            90:                return (0);
        !            91:        }
        !            92:        if (((a>>8) & DMZ_NOC_MASK) != 3) {
        !            93:                printf("        Not all octets are available\n");
        !            94:                return (0);
        !            95:        }
        !            96: 
        !            97:        cvec = (uba_hd[numuba].uh_lastiv -= 4 * 6);
        !            98:        dmz_addr->dmz_config = cvec >> 2;
        !            99: 
        !           100:        return (sizeof(struct dmzdevice));
        !           101: }
        !           102: 
        !           103: dmzattach(ui)
        !           104:        register struct uba_device *ui;
        !           105: {
        !           106:        register struct dmx_softc *sc;
        !           107:        register int i;
        !           108: 
        !           109:        sc = &dmz_softc[3 * ui->ui_unit];
        !           110:        for (i = 0; i < 3; i++, sc++) {
        !           111:                sc->dmx_type = 'z';
        !           112:                sc->dmx_unit = ui->ui_unit;
        !           113:                sc->dmx_unit0 = 8 * i;
        !           114:                sc->dmx_ubanum = ui->ui_ubanum;
        !           115:                sc->dmx_softCAR = (ui->ui_flags >> (8 * i)) & 0xff;
        !           116:                sc->dmx_tty = &dmz_tty[((ui->ui_unit * 3) + i) * 8];
        !           117:                sc->dmx_octet = (struct dmx_octet *)
        !           118:                    &((struct dmzdevice *)ui->ui_addr)->dmz_octet[i];
        !           119:        }
        !           120: 
        !           121:        cbase[ui->ui_ubanum] = -1;
        !           122:        dmz_uballoc[ui->ui_ubanum] = -1;
        !           123: }
        !           124: 
        !           125: /*
        !           126:  * Open a DMF32 line, mapping the clist onto the uba if this
        !           127:  * is the first dmf on this uba.  Turn on this dmf if this is
        !           128:  * the first use of it.
        !           129:  */
        !           130: /*ARGSUSED*/
        !           131: dmzopen(dev, flag)
        !           132:        dev_t dev;
        !           133: {
        !           134:        register struct tty *tp;
        !           135:        struct dmx_softc *sc;
        !           136:        int unit, dmz;
        !           137:        struct uba_device *ui;
        !           138:        int s;
        !           139:        int dmxparam();
        !           140: 
        !           141:        unit = minor(dev);
        !           142:        dmz = DMZ(unit);
        !           143:        if (unit >= NDMZ*24 || (ui = dmzinfo[dmz])== 0 || ui->ui_alive == 0)
        !           144:                return (ENXIO);
        !           145: 
        !           146:        tp = &dmz_tty[unit];
        !           147:        sc = &dmz_softc[unit / 8];
        !           148:        tp->t_addr = (caddr_t)sc->dmx_octet;
        !           149:        tp->t_oproc = dmzstart;
        !           150:        tp->t_dev = dev;                        /* needed before dmxopen */
        !           151:        tp->t_param = dmxparam;
        !           152: 
        !           153:        /*
        !           154:         * While setting up state for this uba,
        !           155:         * block uba resets which can clear the state.
        !           156:         */
        !           157:        s = spl6();
        !           158:        if (cbase[ui->ui_ubanum] == -1) {
        !           159:                dmz_uballoc[ui->ui_ubanum] = dmz;
        !           160:                cbase[ui->ui_ubanum] = UBAI_ADDR(uballoc(ui->ui_ubanum,
        !           161:                    (caddr_t)cfree, nclist*sizeof(struct cblock), 0));
        !           162:        }
        !           163:        splx(s);
        !           164: 
        !           165:        return (dmxopen(tp, sc, flag));
        !           166: }
        !           167: 
        !           168: /*
        !           169:  * Close a DMZ32 line.
        !           170:  */
        !           171: /*ARGSUSED*/
        !           172: dmzclose(dev, flag)
        !           173:        dev_t dev;
        !           174:        int flag;
        !           175: {
        !           176: 
        !           177:        return (dmxclose(&dmz_tty[minor(dev)]));
        !           178: }
        !           179: 
        !           180: dmzread(dev, uio, flag)
        !           181:        dev_t dev;
        !           182:        struct uio *uio;
        !           183: {
        !           184:        register struct tty *tp;
        !           185: 
        !           186:        tp = &dmz_tty[minor(dev)];
        !           187:        return ((*linesw[tp->t_line].l_read)(tp, uio, flag));
        !           188: }
        !           189: 
        !           190: dmzwrite(dev, uio)
        !           191:        dev_t dev;
        !           192:        struct uio *uio;
        !           193: {
        !           194:        register struct tty *tp;
        !           195: 
        !           196:        tp = &dmz_tty[minor(dev)];
        !           197:        return ((*linesw[tp->t_line].l_write)(tp, uio));
        !           198: }
        !           199: 
        !           200: /*
        !           201:  * DMZ32 receiver interrupts.
        !           202:  */
        !           203: dmzrinta(dmz)
        !           204:        int dmz;
        !           205: {
        !           206:        struct uba_device *ui;
        !           207: 
        !           208:        ui = dmzinfo[dmz];
        !           209:        if (ui == 0 || ui->ui_alive == 0)
        !           210:                return;
        !           211:        dmxrint(&dmz_softc[3 * dmz + 0]);
        !           212: }
        !           213: 
        !           214: dmzrintb(dmz)
        !           215:        int dmz;
        !           216: {
        !           217:        struct uba_device *ui;
        !           218: 
        !           219:        ui = dmzinfo[dmz];
        !           220:        if (ui == 0 || ui->ui_alive == 0)
        !           221:                return;
        !           222:        dmxrint(&dmz_softc[3 * dmz + 1]);
        !           223: }
        !           224: 
        !           225: dmzrintc(dmz)
        !           226:        int dmz;
        !           227: {
        !           228:        struct uba_device *ui;
        !           229: 
        !           230:        ui = dmzinfo[dmz];
        !           231:        if (ui == 0 || ui->ui_alive == 0)
        !           232:                return;
        !           233:        dmxrint(&dmz_softc[3 * dmz + 2]);
        !           234: }
        !           235: 
        !           236: /*
        !           237:  * Ioctl for DMZ32.
        !           238:  */
        !           239: dmzioctl(dev, cmd, data, flag)
        !           240:        dev_t dev;
        !           241:        caddr_t data;
        !           242: {
        !           243:        int unit = minor(dev);
        !           244:  
        !           245:        return (dmxioctl(&dmz_tty[unit], cmd, data, flag));
        !           246: }
        !           247: 
        !           248: /*
        !           249:  * DMZ32 transmitter interrupts.
        !           250:  */
        !           251: dmzxinta(dmz)
        !           252:        int dmz;
        !           253: {
        !           254: 
        !           255:        dmxxint(&dmz_softc[3 * dmz + 0]);
        !           256: }
        !           257: 
        !           258: dmzxintb(dmz)
        !           259:        int dmz;
        !           260: {
        !           261: 
        !           262:        dmxxint(&dmz_softc[3 * dmz + 1]);
        !           263: }
        !           264: 
        !           265: dmzxintc(dmz)
        !           266:        int dmz;
        !           267: {
        !           268: 
        !           269:        dmxxint(&dmz_softc[3 * dmz + 2]);
        !           270: }
        !           271: 
        !           272: /*
        !           273:  * Start (restart) transmission on the given line.
        !           274:  */
        !           275: dmzstart(tp)
        !           276:        struct tty *tp;
        !           277: {
        !           278: 
        !           279:        dmxstart(tp, &dmz_softc[minor(tp->t_dev) >> 3]);
        !           280: }
        !           281: 
        !           282: /*
        !           283:  * Stop output on a line, e.g. for ^S/^Q or output flush.
        !           284:  */
        !           285: dmzstop(tp, flag)
        !           286:        struct tty *tp;
        !           287: {
        !           288: 
        !           289:        dmxstop(tp, &dmz_softc[minor(tp->t_dev) >> 3], flag);
        !           290: }
        !           291: 
        !           292: /*
        !           293:  * Reset state of driver if UBA reset was necessary.
        !           294:  * Reset the csr, lpr, and lcr registers on open lines, and
        !           295:  * restart transmitters.
        !           296:  */
        !           297: dmzreset(uban)
        !           298:        int uban;
        !           299: {
        !           300:        register int dmz;
        !           301:        register struct tty *tp;
        !           302:        register struct uba_device *ui;
        !           303:        register struct dmzdevice *addr;
        !           304:        int i;
        !           305: 
        !           306:        for (dmz = 0; dmz < NDMZ; dmz++) {
        !           307:                ui = dmzinfo[dmz];
        !           308:                if (ui == 0 || ui->ui_alive == 0 || ui->ui_ubanum != uban)
        !           309:                        continue;
        !           310:                printf("dmz%d ", dmz);
        !           311:                addr = (struct dmzdevice *)ui->ui_addr;
        !           312: 
        !           313:                if (dmz_uballoc[uban] == dmz) {
        !           314:                        int info;
        !           315: 
        !           316:                        info = uballoc(uban, (caddr_t)cfree,
        !           317:                            nclist * sizeof(struct cblock), UBA_CANTWAIT);
        !           318:                        if (info)
        !           319:                                cbase[uban] = UBAI_ADDR(info);
        !           320:                        else {
        !           321:                                printf(" [can't get uba map]");
        !           322:                                cbase[uban] = -1;
        !           323:                        }
        !           324:                }
        !           325: 
        !           326:                for (i = 0; i < 3; i++)
        !           327:                        if (dmz_softc[3 * dmz + i].dmx_flags & DMX_ACTIVE) {
        !           328:                                addr->dmz_octet[i].csr = DMF_IE;
        !           329:                                addr->dmz_octet[i].rsp = dmx_timeout;
        !           330:                        }
        !           331: 
        !           332:                /*
        !           333:                 * If a unit is open or waiting for open to complete,
        !           334:                 * reset it.
        !           335:                 */
        !           336:                tp = &dmz_tty[dmz * 24];
        !           337:                for (i = 0; i < 24; i++, tp++) {
        !           338:                        if (tp->t_state & (TS_ISOPEN | TS_WOPEN)) {
        !           339:                                dmxparam(tp, &tp->t_termios);
        !           340:                                (void) dmxmctl(tp, DMF_ON, DMSET);
        !           341:                                tp->t_state &= ~TS_BUSY;
        !           342:                                dmzstart(tp);
        !           343:                        }
        !           344:                }
        !           345:        }
        !           346: }
        !           347: #endif

unix.superglobalmegacorp.com

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