Annotation of 41BSD/sys/newdev/rk7.c, revision 1.1.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.