Annotation of researchv8dc/sys/dev/dn.c, revision 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 "dn.h"
        !            15: #if NDN > 0
        !            16: #include "dr.h"
        !            17: #include "../h/param.h"
        !            18: #include "../h/dir.h"
        !            19: #include "../h/user.h"
        !            20: #include "../h/conf.h"
        !            21: #include "../h/inode.h"
        !            22: #include "../h/file.h"
        !            23: #include "../h/systm.h"
        !            24: #include "../h/pte.h"
        !            25: #include "../h/buf.h"
        !            26: #include "../h/ubareg.h"
        !            27: #include "../h/ubavar.h"
        !            28: 
        !            29: struct device {
        !            30:        u_short dn_reg[4];
        !            31: };
        !            32: 
        !            33: #define        PWI     0100000
        !            34: #define        ACR     040000
        !            35: #define        DLO     010000
        !            36: #define        DONE    0200
        !            37: #define        IENABLE 0100
        !            38: #define        DSS     040
        !            39: #define        PND     020
        !            40: #define        MAINT   010
        !            41: #define        MENABLE 04
        !            42: #define        DPR     02
        !            43: #define        CRQ     01
        !            44: 
        !            45: #define        DNPRI   (PZERO+5)
        !            46: 
        !            47: int    dnattach(), dnprobe();
        !            48: struct uba_device *dninfo[NDN];
        !            49: u_short        dnstd[] = { 0 };
        !            50: struct uba_driver dndriver =
        !            51:        { dnprobe, 0, dnattach, 0, dnstd, "dn", dninfo };
        !            52: 
        !            53: dnprobe(reg)
        !            54: caddr_t reg;
        !            55: {
        !            56:        register int br, cvec;
        !            57:        register struct device *dnaddr = (struct device *)reg;
        !            58: 
        !            59:        dnaddr->dn_reg[0] = MENABLE|IENABLE|MAINT;
        !            60:        dnaddr->dn_reg[0] |= CRQ;
        !            61:        dnaddr->dn_reg[0] |= 1<<8;      /* digit 0 loop to PND */
        !            62:        DELAY(10000);
        !            63:        dnaddr->dn_reg[0] = MENABLE;
        !            64:        return(1);
        !            65: }
        !            66: 
        !            67: dnattach()
        !            68: {
        !            69: }
        !            70: 
        !            71: dnopen(dev)
        !            72: register dev;
        !            73: {
        !            74:        register struct device *dp;
        !            75:        register unit;
        !            76: 
        !            77:        dev = minor(dev) & 0177;
        !            78:        unit = dev>>2;
        !            79:        dp = (struct device *)dninfo[unit]->ui_addr;
        !            80:        if (unit >= NDN ||
        !            81:           dninfo[unit]->ui_alive == 0 ||
        !            82:           dp->dn_reg[dev&03]&(PWI|DLO|CRQ))
        !            83:                u.u_error = ENXIO;
        !            84:        else {
        !            85:                dp->dn_reg[0] |= MENABLE;
        !            86:                dp->dn_reg[dev&03] = IENABLE|MENABLE|CRQ;
        !            87:        }
        !            88: }
        !            89: 
        !            90: dnclose(dev)
        !            91: {
        !            92:        dev = minor(dev) & 0177;
        !            93:        ((struct device *)dninfo[dev>>2]->ui_addr)->dn_reg[dev&03] = MENABLE;
        !            94: }
        !            95: 
        !            96: dnwrite(dev)
        !            97: {
        !            98:        register c;
        !            99:        register u_short *dp;
        !           100:        register first;
        !           101:        extern lbolt;
        !           102:        int ldlo;
        !           103:        register int setspeed = -1;
        !           104:        register k;
        !           105: 
        !           106:        ldlo = 0;
        !           107:        if (dev & 0200)
        !           108:                ldlo = DLO;
        !           109:        dev = minor(dev) & 0177;
        !           110:        dp = & ((struct device *)dninfo[dev>>2]->ui_addr)->dn_reg[dev&03];
        !           111:        if (*dp & DLO) {
        !           112:                u.u_error = EIO;
        !           113:                return;
        !           114:        }
        !           115:        *dp |= CRQ;
        !           116:        first = 0;
        !           117:        while ((*dp & (PWI|ACR|DSS|ldlo)) == 0) {
        !           118:                spl4();
        !           119:                if ((*dp&PND) == 0 || u.u_count == 0 || (c=cpass()) < 0)
        !           120:                        sleep((caddr_t)dp, DNPRI);
        !           121:                else if (c == '-') {
        !           122:                        sleep((caddr_t)&lbolt, DNPRI);
        !           123:                        sleep((caddr_t)&lbolt, DNPRI);
        !           124: #if NDR > 0
        !           125:                } else if ((k = dnindex (c, "abcdefghABCDEFGH")) >= 0) {
        !           126:                        setspeed = k;
        !           127: #endif
        !           128:                } else {
        !           129:                        *dp = (c<<8)|IENABLE|MENABLE|DPR|CRQ;
        !           130:                        if (first == 0) {
        !           131:                                while (first <  800)
        !           132:                                        first++;
        !           133:                                if (*dp&ldlo) {
        !           134:                                        *dp = MENABLE;
        !           135:                                        break;
        !           136:                                }
        !           137:                                ldlo = 0;
        !           138:                        }
        !           139:                        sleep((caddr_t)dp, DNPRI);
        !           140:                }
        !           141:                spl0();
        !           142:        }
        !           143:        if (*dp&(PWI|ACR|ldlo))
        !           144:                u.u_error = EIO;
        !           145:        else if (setspeed >= 0)
        !           146:                drsetbit (setspeed % 8, setspeed >= 8);
        !           147: }
        !           148: 
        !           149: /*
        !           150:  * interrupt-- "dev" applies to
        !           151:  * system unit number, not minor device
        !           152:  */
        !           153: dnint(dev)
        !           154: {
        !           155:        register u_short *ep;
        !           156:        register struct device *dp;
        !           157: 
        !           158:        dp = (struct device *)dninfo[dev]->ui_addr;
        !           159:        dp->dn_reg[0] &= ~MENABLE;
        !           160:        for (ep = &dp->dn_reg[0]; ep < &dp->dn_reg[4]; ep++)
        !           161:                if (*ep&DONE) {
        !           162:                        *ep &= ~DONE;
        !           163:                        wakeup((caddr_t)ep);
        !           164:                }
        !           165:        dp->dn_reg[0] |= MENABLE;
        !           166: }
        !           167: 
        !           168: static int
        !           169: dnindex (c, s)
        !           170:        register char c, *s;
        !           171: {
        !           172:        register char *p;
        !           173: 
        !           174:        p = s;
        !           175:        while (*p) {
        !           176:                if (c == *p)
        !           177:                        return p - s;
        !           178:                p++;
        !           179:        }
        !           180:        return -1;
        !           181: }
        !           182: #endif

unix.superglobalmegacorp.com

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