Annotation of 3BSD/sys/dev/rk.c, revision 1.1.1.1

1.1       root        1: /*     rk.c    2.2     1/23/80 */
                      2: 
                      3: /*
                      4:  * RK disk driver
                      5:  */
                      6: 
                      7: #include "../h/param.h"
                      8: #include "../h/systm.h"
                      9: #include "../h/buf.h"
                     10: #include "../h/conf.h"
                     11: #include "../h/dir.h"
                     12: #include "../h/user.h"
                     13: #include "../h/uba.h"
                     14: 
                     15: #define        RKADDR  ((struct rk_regs *)( UBA0_DEV + 0177400))
                     16: #define        NRK     4
                     17: #define        NRKBLK  4872
                     18: 
                     19: #define        RESET   0
                     20: #define        WCOM    2
                     21: #define        RCOM    4
                     22: #define        GO      01
                     23: #define        DRESET  014
                     24: #define        IENABLE 0100
                     25: #define        DRY     0200
                     26: #define        ARDY    0100
                     27: #define        WLO     020000
                     28: #define        CTLRDY  0200
                     29: 
                     30: /*
                     31:  * Monitoring device bit
                     32:  */
                     33: #define        DK_N    1
                     34: 
                     35: struct rk_regs
                     36: {
                     37:        short   rkds;
                     38:        short   rker;
                     39:        short   rkcs;
                     40:        short   rkwc;
                     41:        unsigned short  rkba;
                     42:        short   rkda;
                     43: };
                     44: 
                     45: struct buf     rktab;
                     46: struct buf     rrkbuf;
                     47: 
                     48: int rk_ubinfo;
                     49: 
                     50: rkstrategy(bp)
                     51: register struct buf *bp;
                     52: {
                     53: 
                     54:        if (bp->b_blkno >= NRKBLK) {
                     55:                bp->b_flags |= B_ERROR;
                     56:                iodone(bp);
                     57:                return;
                     58:        }
                     59:        bp->av_forw = (struct buf *)NULL;
                     60:        VOID spl5();
                     61:        if(rktab.b_actf == NULL)
                     62:                rktab.b_actf = bp;
                     63:        else
                     64:                rktab.b_actl->av_forw = bp;
                     65:        rktab.b_actl = bp;
                     66:        if(rktab.b_active == NULL)
                     67:                rkstart();
                     68:        VOID spl0();
                     69: }
                     70: 
                     71: rkstart()
                     72: {
                     73:        register struct buf *bp;
                     74:        register com;
                     75:        daddr_t bn;
                     76:        int dn, cn, sn;
                     77: 
                     78:        if ((bp = rktab.b_actf) == NULL)
                     79:                return;
                     80:        rktab.b_active++;
                     81:        rk_ubinfo = ubasetup( bp, 1 );
                     82:        bn = bp->b_blkno;
                     83:        dn = minor(bp->b_dev);
                     84:        cn = bn/12;
                     85:        sn = bn%12;
                     86:        RKADDR->rkda = (dn<<13) | (cn<<4) | sn;
                     87:        RKADDR->rkba = rk_ubinfo;
                     88:        RKADDR->rkwc = -(bp->b_bcount>>1);
                     89:        com = ((rk_ubinfo & 0x30000) >> 8 ) | IENABLE | GO;
                     90:        if(bp->b_flags & B_READ)
                     91:                com |= RCOM; else
                     92:                com |= WCOM;
                     93:        RKADDR->rkcs = com;
                     94: /*
                     95:        dk_busy |= 1<<DK_N;
                     96:        dk_numb[DK_N] += 1;
                     97:        com = bp->b_bcount>>6;
                     98:        dk_wds[DK_N] += com;
                     99: */
                    100: }
                    101: 
                    102: rkintr()
                    103: {
                    104:        register struct buf *bp;
                    105: 
                    106:        if (rktab.b_active == NULL)
                    107:                return;
                    108:        dk_busy &= ~(1<<DK_N);
                    109:        bp = rktab.b_actf;
                    110:        rktab.b_active = NULL;
                    111:        if (RKADDR->rkcs < 0) {         /* error bit */
                    112:                deverror(bp, RKADDR->rker, RKADDR->rkds);
                    113:                RKADDR->rkcs = RESET|GO;
                    114:                while((RKADDR->rkcs&CTLRDY) == 0)
                    115:                        ;
                    116:                if (++rktab.b_errcnt <= 10) {
                    117:                        ubafree(rk_ubinfo);
                    118:                        rkstart();
                    119:                        return;
                    120:                }
                    121:                bp->b_flags |= B_ERROR;
                    122:        }
                    123:        rktab.b_errcnt = 0;
                    124:        rktab.b_actf = bp->av_forw;
                    125:        bp->b_resid = 0;
                    126:        ubafree(rk_ubinfo);
                    127:        iodone(bp);
                    128:        rkstart();
                    129: }
                    130: 
                    131: rkread(dev)
                    132: dev_t dev;
                    133: {
                    134: 
                    135:        physio(rkstrategy, &rrkbuf, dev, B_READ, minphys);
                    136: }
                    137: 
                    138: rkwrite(dev)
                    139: dev_t dev;
                    140: {
                    141: 
                    142:        physio(rkstrategy, &rrkbuf, dev, B_WRITE, minphys);
                    143: }

unix.superglobalmegacorp.com

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