Annotation of researchv10no/sys/io/dn.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * DN-11 ACU interface
                      3:  *  Minor devices < <128 are standard 801's
                      4:  *  Minor devices >= 128 are Parker shared
                      5:  *  units in which the 1st digit selects a line.
                      6:  *  The only interface difference is that DLO
                      7:  *  can appear some time after the line is selected
                      8:  *  to indicate that the line is busy or out of service.
                      9:  *
                     10:  *  If the system has an accessible DR-11C, allow some of
                     11:  *  its bits to be fiddled.
                     12:  */
                     13: 
                     14: #include "sys/param.h"
                     15: #include "sys/user.h"
                     16: #include "sys/conf.h"
                     17: #include "sys/ubaddr.h"
                     18: 
                     19: struct device {
                     20:        u_short dn_reg[4];
                     21: };
                     22: 
                     23: #define        PWI     0100000
                     24: #define        ACR     040000
                     25: #define        DLO     010000
                     26: #define        DONE    0200
                     27: #define        IENABLE 0100
                     28: #define        DSS     040
                     29: #define        PND     020
                     30: #define        MAINT   010
                     31: #define        MENABLE 04
                     32: #define        DPR     02
                     33: #define        CRQ     01
                     34: 
                     35: #define        DNPRI   (PZERO+5)
                     36: 
                     37: extern int dncnt;
                     38: extern struct ubaddr dnaddr[];
                     39: extern caddr_t dnreg[];
                     40: 
                     41: static int dnindex();
                     42: 
                     43: int    dnopen(), dnclose(), dnwrite();
                     44: struct cdevsw dncdev = cdinit(dnopen, dnclose, nodev, dnwrite, nodev);
                     45: 
                     46: dnopen(dev)
                     47: register dev;
                     48: {
                     49:        register struct device *dp;
                     50:        register unit;
                     51: 
                     52:        dev = minor(dev) & 0177;
                     53:        unit = dev>>2;
                     54:        if (unit > dncnt) {
                     55:                u.u_error = ENXIO;
                     56:                return;
                     57:        }
                     58:        if ((dp = (struct device *)dnreg[unit]) == NULL) {
                     59:                if ((dp = (struct device *)ubaddr(&dnaddr[unit])) == NULL
                     60:                ||  ubbadaddr(dnaddr[unit].ubno, &dp->dn_reg[0], sizeof(short))) {
                     61:                        printf("dn%d absent\n", unit);
                     62:                        u.u_error = ENXIO;
                     63:                        return;
                     64:                }
                     65:                dnreg[unit] = (caddr_t)dp;
                     66:        }
                     67:        if (dp->dn_reg[dev&03]&(PWI|DLO|CRQ)) {
                     68:                u.u_error = ENXIO;
                     69:                return;
                     70:        }
                     71:        dp->dn_reg[0] |= MENABLE;
                     72:        dp->dn_reg[dev&03] = IENABLE|MENABLE|CRQ;
                     73: }
                     74: 
                     75: dnclose(dev)
                     76: {
                     77:        dev = minor(dev) & 0177;
                     78:        ((struct device *)dnreg[dev>>2])->dn_reg[dev&03] = MENABLE;
                     79: }
                     80: 
                     81: dnwrite(dev)
                     82: {
                     83:        register c;
                     84:        register u_short *dp;
                     85:        register first;
                     86:        extern lbolt;
                     87:        int ldlo;
                     88:        register int setspeed = -1;
                     89:        register k;
                     90: 
                     91:        ldlo = 0;
                     92:        if (dev & 0200)
                     93:                ldlo = DLO;
                     94:        dev = minor(dev) & 0177;
                     95:        dp = &((struct device *)dnreg[dev>>2])->dn_reg[dev&03];
                     96:        if (*dp & DLO) {
                     97:                u.u_error = EIO;
                     98:                return;
                     99:        }
                    100:        *dp |= CRQ;
                    101:        first = 0;
                    102:        while ((*dp & (PWI|ACR|DSS|ldlo)) == 0) {
                    103:                spl4();
                    104:                if ((*dp&PND) == 0 || u.u_count == 0 || (c=cpass()) < 0)
                    105:                        sleep((caddr_t)dp, DNPRI);
                    106:                else if (c == '-') {
                    107:                        sleep((caddr_t)&lbolt, DNPRI);
                    108:                        sleep((caddr_t)&lbolt, DNPRI);
                    109:                } else if ((k = dnindex (c, "abcdefghABCDEFGH")) >= 0) {
                    110:                        setspeed = k;
                    111:                } else {
                    112:                        *dp = (c<<8)|IENABLE|MENABLE|DPR|CRQ;
                    113:                        if (first == 0) {
                    114:                                while (first <  800)
                    115:                                        first++;
                    116:                                if (*dp&ldlo) {
                    117:                                        *dp = MENABLE;
                    118:                                        break;
                    119:                                }
                    120:                                ldlo = 0;
                    121:                        }
                    122:                        sleep((caddr_t)dp, DNPRI);
                    123:                }
                    124:                spl0();
                    125:        }
                    126:        if (*dp&(PWI|ACR|ldlo))
                    127:                u.u_error = EIO;
                    128:        else if (setspeed >= 0)
                    129:                drsetbit (setspeed % 8, setspeed / 8);
                    130: }
                    131: 
                    132: /*
                    133:  * interrupt-- "dev" is
                    134:  * system unit number, not minor device
                    135:  */
                    136: dn0int(dev)
                    137: {
                    138:        register u_short *ep;
                    139:        register struct device *dp;
                    140: 
                    141:        dp = (struct device *)dnreg[dev];
                    142:        dp->dn_reg[0] &= ~MENABLE;
                    143:        for (ep = &dp->dn_reg[0]; ep < &dp->dn_reg[4]; ep++)
                    144:                if (*ep&DONE) {
                    145:                        *ep &= ~DONE;
                    146:                        wakeup((caddr_t)ep);
                    147:                }
                    148:        dp->dn_reg[0] |= MENABLE;
                    149: }
                    150: 
                    151: static int
                    152: dnindex (c, s)
                    153:        register char c, *s;
                    154: {
                    155:        register char *p;
                    156: 
                    157:        p = s;
                    158:        while (*p) {
                    159:                if (c == *p)
                    160:                        return p - s;
                    161:                p++;
                    162:        }
                    163:        return -1;
                    164: }

unix.superglobalmegacorp.com

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