Annotation of 3BSD/sys/dev/rk7.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * RK7 disk driver
        !             3:  */
        !             4: 
        !             5: #include "../h/param.h"
        !             6: #include "../h/systm.h"
        !             7: #include "../h/buf.h"
        !             8: #include "../h/conf.h"
        !             9: #include "../h/dir.h"
        !            10: #include "../h/user.h"
        !            11: #include "../h/uba.h"
        !            12: 
        !            13: #define        RK7ADDR ((struct rk7_regs *)( UBA0_DEV + 0177440))
        !            14: #define ERR_CNT 10
        !            15: #define        NRK7    8
        !            16: #define        NRK7BLK 53790
        !            17: #define FORMAT_22 0
        !            18: #define        RESET   0102000
        !            19: #define        WCOM    022
        !            20: #define        RCOM    020
        !            21: #define RK07   02000
        !            22: #define        GO      01
        !            23: #define RELEASE        010
        !            24: #define        IENABLE 0000100
        !            25: #define        CTLRDY  0200
        !            26: #define        PACKAK  000003  /* Pack Acknowledge */
        !            27: 
        !            28: 
        !            29: struct rk7_regs
        !            30: {
        !            31:        short rk7cs1;
        !            32:        short rk7wc;
        !            33:        unsigned short rk7ba;
        !            34:        short rk7da;
        !            35:        short rk7cs2;
        !            36:        short rk7ds;
        !            37:        short   rk7er;
        !            38:        short rk7asof;
        !            39:        short rk7dc;
        !            40:        short rk7null;
        !            41:        short rk7db;
        !            42:        short rk7mr1;
        !            43:        short rk7ecps;
        !            44:        short rk7ecpt;
        !            45:        short rk7mr2;
        !            46:        short rk7mr3;
        !            47: };
        !            48: 
        !            49: struct buf     rk7tab;
        !            50: struct buf     rrk7buf;
        !            51: 
        !            52: int rk7_ubinfo;
        !            53: 
        !            54: rk7strategy(bp)
        !            55: register struct buf *bp;
        !            56: {
        !            57: 
        !            58:        if (bp->b_blkno >= NRK7BLK) {
        !            59:                bp->b_flags |= B_ERROR;
        !            60:                iodone(bp);
        !            61:                return;
        !            62:        }
        !            63:        bp->av_forw = (struct buf *)NULL;
        !            64:        spl5();
        !            65:        if(rk7tab.b_actf == NULL)
        !            66:                rk7tab.b_actf = bp;
        !            67:        else
        !            68:                rk7tab.b_actl->av_forw = bp;
        !            69:        rk7tab.b_actl = bp;
        !            70:        if(rk7tab.b_active == NULL)
        !            71:                rk7start();
        !            72:        spl0();
        !            73: }
        !            74: 
        !            75: rk7start()
        !            76: {
        !            77:        register struct buf *bp;
        !            78:        register short com;
        !            79:        daddr_t bn;
        !            80:        short dn, cn, sn, tn;
        !            81: 
        !            82:        if ((bp = rk7tab.b_actf) == NULL)
        !            83:                return;
        !            84:        rk7tab.b_active++;
        !            85:        rk7_ubinfo = ubasetup( bp, 1 );
        !            86:        bn = bp->b_blkno;
        !            87:        dn = minor(bp->b_dev);
        !            88:        cn = bn/66;
        !            89:        sn = bn%22;
        !            90:        tn = (bn / 22) % 3;
        !            91: /*
        !            92: printf("in start bn = %d dn = %d cn = %d sn = %d tn = %d\n",bn,dn,cn,sn,tn);
        !            93: */
        !            94:        RK7ADDR -> rk7cs2 = dn;
        !            95:        RK7ADDR -> rk7cs1 = PACKAK | RK07;
        !            96:        while(RK7ADDR->rk7cs1 & 01);
        !            97: 
        !            98:        RK7ADDR -> rk7da = sn | (tn << 8);
        !            99:        RK7ADDR -> rk7dc = cn;
        !           100:        RK7ADDR->rk7ba = rk7_ubinfo;
        !           101:        RK7ADDR->rk7wc = -(bp->b_bcount>>1);
        !           102: 
        !           103:        com = ((rk7_ubinfo & 0x30000) >> 8 ) | IENABLE | RK07 | GO | ( FORMAT_22<< 12);
        !           104:        if(bp->b_flags & B_READ)
        !           105:                com |= RCOM; else
        !           106:                com |= WCOM;
        !           107:        RK7ADDR->rk7cs1 = com;
        !           108: /*
        !           109: printf("cs1 in start = %d(bit15) %o(remainder)\n",(RK7ADDR->rk7cs1>>15)&01,RK7ADDR->rk7cs1 & 077777);
        !           110: */
        !           111: }
        !           112: 
        !           113: rk7intr()
        !           114: {
        !           115:        register struct buf *bp;
        !           116: 
        !           117: 
        !           118: /*
        !           119: printf("in intr->rk7ds = %d(bit 15) %o(remainder)",(RK7ADDR->rk7ds>>15)&01,RK7ADDR->rk7ds & 077777);
        !           120: printf("cs1 = %d(bit 15) %o(remainder)\n",(RK7ADDR->rk7cs1>>15)&01,RK7ADDR->rk7cs1 & 077777);
        !           121: */
        !           122:        if (rk7tab.b_active == NULL)
        !           123:                return;
        !           124:        bp = rk7tab.b_actf;
        !           125:        rk7tab.b_active = NULL;
        !           126:        while(RK7ADDR->rk7ds >= 0);
        !           127: /*
        !           128:        printf("rk7ds = %o(bit 15)  %o\n",(RK7ADDR -> rk7ds >> 15) & 01,RK7ADDR -> rk7ds & 077777);
        !           129: printf("after ready wait, cs1 = %d (bit 15) %o (remainder)\n",(RK7ADDR->rk7cs1>>15)&01,RK7ADDR->rk7cs1&077777);
        !           130: */
        !           131: 
        !           132:        if (RK7ADDR->rk7cs1 < 0) {              /* error bit */
        !           133:                deverror(bp, RK7ADDR->rk7er, RK7ADDR->rk7cs2);
        !           134:                printf("err reg = %o octal\n",RK7ADDR->rk7er);
        !           135:                RK7ADDR->rk7cs1 = RESET|GO;
        !           136:                while((RK7ADDR->rk7cs1&CTLRDY) == 0)
        !           137:                        ;
        !           138:                if (++rk7tab.b_errcnt <= ERR_CNT) {
        !           139:                        ubafree(rk7_ubinfo);
        !           140:                        rk7start();
        !           141:                        return;
        !           142:                }
        !           143:                bp->b_flags |= B_ERROR;
        !           144:        }
        !           145:        rk7tab.b_errcnt = 0;
        !           146:        rk7tab.b_actf = bp->av_forw;
        !           147:        bp->b_resid = 0;
        !           148:        ubafree(rk7_ubinfo);
        !           149:        iodone(bp);
        !           150:        RK7ADDR->rk7cs2 |= RELEASE;
        !           151:        RK7ADDR->rk7cs1 = GO;
        !           152:        rk7start();
        !           153: }
        !           154: 
        !           155: rk7read(dev)
        !           156: dev_t dev;
        !           157: {
        !           158: 
        !           159:        physio(rk7strategy, &rrk7buf, dev, B_READ, minphys);
        !           160: }
        !           161: 
        !           162: rk7write(dev)
        !           163: dev_t dev;
        !           164: {
        !           165: 
        !           166:        physio(rk7strategy, &rrk7buf, dev, B_WRITE, minphys);
        !           167: }

unix.superglobalmegacorp.com

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