Annotation of 43BSDReno/sys/vaxuba/ct.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:  *     @(#)ct.c        7.5 (Berkeley) 4/3/90
                      7:  */
                      8: 
                      9: #include "ct.h"
                     10: #if NCT > 0
                     11: /*
                     12:  * GP DR11C driver used for C/A/T or Autologic APS micro-5
                     13:  */
                     14: #include "machine/pte.h"
                     15: 
                     16: #include "param.h"
                     17: #include "systm.h"
                     18: #include "ioctl.h"
                     19: #include "tty.h"
                     20: #include "map.h"
                     21: #include "buf.h"
                     22: #include "conf.h"
                     23: #include "user.h"
                     24: #include "kernel.h"
                     25: 
                     26: #include "ubareg.h"
                     27: #include "ubavar.h"
                     28: 
                     29: #define        PCAT    (PZERO+9)
                     30: #define        CATHIWAT        100
                     31: #define        CATLOWAT        30
                     32: 
                     33: #define        REQUEST_B       0x8000
                     34: #define REQUEST_A      0x80
                     35: #define        INT_ENB_A       0x40
                     36: #define        INT_ENB_B       0x20
                     37: #define        CSR1            0x2
                     38: #define        CSR0            0x1
                     39: 
                     40: struct ct_softc {
                     41:        int     sc_state;
                     42:        struct  clist sc_oq;
                     43: } ct_softc[NCT];
                     44: 
                     45: #define        CT_OPEN         0x1
                     46: #define        CT_RUNNING      0x2
                     47: 
                     48: struct ctdevice {
                     49:        u_short ctcsr;
                     50:        u_short ctobuf;
                     51:        u_short ctibuf;
                     52: };
                     53: 
                     54: int    ctprobe(), ctattach(), ctintr();
                     55: struct uba_device *ctdinfo[NCT];
                     56: u_short        ctstd[] = { 0167770, 0 };
                     57: struct uba_driver ctdriver = 
                     58:     { ctprobe, 0, ctattach, 0, ctstd, "ct", ctdinfo };
                     59: 
                     60: #define        CTUNIT(dev)     (minor(dev))
                     61: 
                     62: int    ct_init = 0;    /* set to CSR1 for testing loopback on controller */
                     63: 
                     64: ctprobe(reg)
                     65:        caddr_t reg;
                     66: {
                     67:        register int br, cvec;          /* value-result */
                     68:        register struct ctdevice *ctaddr = (struct ctdevice *)reg;
                     69: 
                     70: #ifdef lint
                     71:        br = 0; cvec = br; br = cvec;
                     72:        ctintr(0);
                     73: #endif
                     74:        /*
                     75:         * There is no way to make a DR11c interrupt without some
                     76:         * external support. We can't always trust that the typesetter
                     77:         * will be online and ready so we've made other provisions.
                     78:         * This probe assumes setting the B Int Enb will generate
                     79:         * an interrupt. To do this, we set CSR0 and loop this back
                     80:         * to REQUEST_B in the second plug on the controller.
                     81:         * Then, we reset the vector to be that for the "real" device.
                     82:         */
                     83:        ctaddr->ctcsr = INT_ENB_B | CSR0; /* Assume hardware loopback! */
                     84:        DELAY(1000);
                     85:        ctaddr->ctcsr = ct_init; /* should be CSR1 for loopback testing */
                     86:        if (cvec & 04) {
                     87:                printf("ct: resetting vector %o to %o\n", cvec, cvec&0773);
                     88:                cvec &= 0773;
                     89:        }
                     90:        return (sizeof (struct ctdevice));
                     91: }
                     92: 
                     93: /*ARGSUSED*/
                     94: ctattach(ui)
                     95:        struct uba_device *ui;
                     96: {
                     97: }
                     98: 
                     99: ctopen(dev)
                    100:        dev_t dev;
                    101: {
                    102:        register struct ct_softc *sc;
                    103:        register struct uba_device *ui;
                    104:        register struct ctdevice *ctaddr;
                    105: 
                    106:        if (CTUNIT(dev) >= NCT || (ui = ctdinfo[CTUNIT(dev)]) == 0 ||
                    107:            ui->ui_alive == 0)
                    108:                return (ENODEV);
                    109:        if ((sc = &ct_softc[CTUNIT(dev)])->sc_state&CT_OPEN)
                    110:                return (EBUSY);
                    111:        sc->sc_state = CT_OPEN;
                    112:        ctaddr = (struct ctdevice *)ui->ui_addr;
                    113:        ctaddr->ctcsr |= INT_ENB_A;
                    114:        return (0);
                    115: }
                    116: 
                    117: ctclose(dev)
                    118:        dev_t dev;
                    119: {
                    120:        ct_softc[CTUNIT(dev)].sc_state = 0;
                    121:        ctintr(dev);
                    122:        return (0);
                    123: }
                    124: 
                    125: ctwrite(dev, uio)
                    126:        dev_t dev;
                    127:        struct uio *uio;
                    128: {
                    129:        register struct ct_softc *sc = &ct_softc[CTUNIT(dev)];
                    130:        register int c;
                    131:        int s, error;
                    132: 
                    133:        while ((c = uwritec(uio)) >= 0) {
                    134:                s = spl5();
                    135:                while (sc->sc_oq.c_cc > CATHIWAT)
                    136:                        if (error = tsleep((caddr_t)&sc->sc_oq, PCAT | PCATCH,
                    137:                            devout, 0))
                    138:                                goto out;
                    139:                while (putc(c, &sc->sc_oq) < 0)
                    140:                        if (error = tsleep((caddr_t)&lbolt, PCAT | PCATCH,
                    141:                            ttybuf, 0))
                    142:                                goto out;
                    143:                if ( ! (sc->sc_state & CT_RUNNING) )
                    144:                        ctintr(dev);
                    145:                splx(s);
                    146:        }
                    147:        return (0);
                    148: out:
                    149:        splx(s);
                    150:        return (error);
                    151: }
                    152: 
                    153: /*
                    154:  * The C/A/T is usually wired to accept data on the .5us DATA_AVAIL strobe.
                    155:  * If you use this with a C/A/T you can remove the lines with "APSu5" below.
                    156:  * This is way out of spec for the Autologic APS micro-5 which requires
                    157:  * at least a 40 microsec strobe. We therefore use CSR1 output as the
                    158:  * "strobe". It is set after data is loaded and reset only in the
                    159:  * interrupt routine. Therefore, the "strobe" is high for adequate time.
                    160:  * The constant "ctdelay" determines the "low" time for the strobe
                    161:  * and may have to be larger on a 780. "2" gives about 10us on a 750.
                    162:  */
                    163: int    ctdelay = 2;    /* here so it's visible & changeable */
                    164: 
                    165: ctintr(dev)
                    166:        dev_t dev;
                    167: {
                    168:        register int c;
                    169:        register struct ct_softc *sc = &ct_softc[CTUNIT(dev)];
                    170:        register struct ctdevice *ctaddr =
                    171:            (struct ctdevice *)ctdinfo[CTUNIT(dev)]->ui_addr;
                    172: 
                    173:        if ((ctaddr->ctcsr&(INT_ENB_B|REQUEST_B)) == (INT_ENB_B|REQUEST_B)) {
                    174:                ctaddr->ctcsr &= ~(CSR0 | INT_ENB_B);   /* set in ctprobe */
                    175:        }
                    176:        if ((ctaddr->ctcsr&(INT_ENB_A|REQUEST_A)) == (INT_ENB_A|REQUEST_A)) {
                    177:                if ((c = getc(&sc->sc_oq)) >= 0) {
                    178:                        ctaddr->ctcsr &= ~CSR1; /* APSu5 - drop strobe */
                    179:                        ctaddr->ctobuf = c;
                    180:                        DELAY(ctdelay);         /* APSu5 - pause a bit */
                    181:                        ctaddr->ctcsr |= CSR1;  /* APSu5 - raise strobe */
                    182:                        sc->sc_state |= CT_RUNNING;
                    183:                        if (sc->sc_oq.c_cc==0 || sc->sc_oq.c_cc==CATLOWAT)
                    184:                                wakeup((caddr_t)&sc->sc_oq);
                    185:                } else if (sc->sc_state == 0) {
                    186:                                ctaddr->ctcsr = 0;
                    187:                } else
                    188:                        sc->sc_state &= ~CT_RUNNING;
                    189:        }
                    190: }
                    191: #endif

unix.superglobalmegacorp.com

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