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

unix.superglobalmegacorp.com

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