1: #
   2: /*
   3:  * RP disk driver
   4:  */
   5: 
   6: #include "../h/param.h"
   7: #include "../h/systm.h"
   8: #include "../h/buf.h"
   9: #include "../h/dir.h"
  10: #include "../h/conf.h"
  11: #include "../h/user.h"
  12: 
  13: struct device {
  14:     int rpds;
  15:     int rper;
  16:     union {
  17:         int w;
  18:         char    c;
  19:     } rpcs;
  20:     int rpwc;
  21:     char    *rpba;
  22:     int rpca;
  23:     int rpda;
  24: };
  25: 
  26: #define RPADDR ((struct device *) 0176710)
  27: #define NRP 8
  28: 
  29: struct {
  30:     daddr_t nblocks;
  31:     int cyloff;
  32: } rp_sizes[] = {
  33:     81000,  0,      /* cyl 0 thru 405 */
  34:     5000,   0,      /* cyl 0 thru 24 */
  35:     2000,   25,     /* cyl 25 thru 34 */
  36:     74000,  35,     /* cyl 35 thru 405 */
  37:     0,  0,
  38:     0,  0,
  39:     0,  0,
  40:     0,  0,
  41: };
  42: 
  43: struct  buf rptab;
  44: struct  buf rrpbuf;
  45: 
  46: #define GO  01
  47: #define RESET   0
  48: #define HSEEK   014
  49: 
  50: #define IENABLE 0100
  51: #define READY   0200
  52: #define RCOM    4
  53: #define WCOM    2
  54: 
  55: #define SUFU    01000
  56: #define SUSU    02000
  57: #define SUSI    04000
  58: #define HNF 010000
  59: 
  60: /*
  61:  * Use av_back to save track+sector,
  62:  * b_resid for cylinder.
  63:  */
  64: 
  65: #define trksec  av_back
  66: #define cylin   b_resid
  67: 
  68: /*
  69:  * Monitoring device number
  70:  */
  71: #define DK_N    2
  72: 
  73: rpstrategy(bp)
  74: register struct buf *bp;
  75: {
  76:     register struct buf *dp;
  77:     register int unit;
  78:     long sz;
  79: 
  80:     unit = minor(bp->b_dev);
  81:     sz = bp->b_bcount;
  82:     sz = (sz+511)>>9;
  83:     if (unit >= (NRP<<3) ||
  84:        bp->b_blkno+sz >= rp_sizes[unit&07].nblocks) {
  85:         bp->b_flags |= B_ERROR;
  86:         iodone(bp);
  87:         return;
  88:     }
  89:     bp->av_forw = NULL;
  90:     unit >>= 3;
  91:     spl5();
  92:     dp = & rptab;
  93:     if (dp->b_actf == NULL)
  94:         dp->b_actf = bp;
  95:     else
  96:         dp->b_actl->av_forw = bp;
  97:     dp->b_actl = bp;
  98:     if (dp->b_active == NULL)
  99:         rpstart();
 100:     spl0();
 101: }
 102: 
 103: rpstart()
 104: {
 105:     register struct buf *bp;
 106:     register int unit;
 107:     int com,cn,tn,sn,dn;
 108:     daddr_t bn;
 109: 
 110: 
 111:     if ((bp = rptab.b_actf) == NULL)
 112:         return;
 113:     rptab.b_active++;
 114:     unit = minor(bp->b_dev);
 115:     dn = unit>>3;
 116:     bn = bp->b_blkno;
 117:     cn = bn/(20*10) + rp_sizes[unit&07].cyloff;
 118:     sn = bn%(20*10);
 119:     tn = sn/10;
 120:     sn = sn%10;
 121:     RPADDR->rpcs.w = (dn<<8);
 122:     RPADDR->rpda = (tn<<8) | sn;
 123:     RPADDR->rpca = cn;
 124:     RPADDR->rpba = bp->b_un.b_addr;
 125:     RPADDR->rpwc = -(bp->b_bcount>>1);
 126:     com = ((bp->b_xmem&3)<<4) | IENABLE | GO;
 127:     if (bp->b_flags & B_READ)
 128:         com |= RCOM; else
 129:         com |= WCOM;
 130: 
 131:     RPADDR->rpcs.w |= com;
 132:     dk_busy |= 1<<DK_N;
 133:     dk_numb[DK_N] += 1;
 134:     unit = bp->b_bcount>>6;
 135:     dk_wds[DK_N] += unit;
 136: }
 137: 
 138: rpintr()
 139: {
 140:     register struct buf *bp;
 141:     register int ctr;
 142: 
 143:     if (rptab.b_active == NULL)
 144:         return;
 145:     dk_busy &= ~(1<<DK_N);
 146:     bp = rptab.b_actf;
 147:     rptab.b_active = NULL;
 148:     if (RPADDR->rpcs.w < 0) {       /* error bit */
 149:         deverror(bp, RPADDR->rper, RPADDR->rpds);
 150:         if(RPADDR->rpds & (SUFU|SUSI|HNF)) {
 151:             RPADDR->rpcs.c = HSEEK|GO;
 152:             ctr = 0;
 153:             while ((RPADDR->rpds&SUSU) && --ctr)
 154:                 ;
 155:         }
 156:         RPADDR->rpcs.w = RESET|GO;
 157:         ctr = 0;
 158:         while ((RPADDR->rpcs.w&READY) == 0 && --ctr)
 159:             ;
 160:         if (++rptab.b_errcnt <= 10) {
 161:             rpstart();
 162:             return;
 163:         }
 164:         bp->b_flags |= B_ERROR;
 165:     }
 166:     rptab.b_errcnt = 0;
 167:     rptab.b_actf = bp->av_forw;
 168:     bp->b_resid = 0;
 169:     iodone(bp);
 170:     rpstart();
 171: }
 172: 
 173: rpread(dev)
 174: {
 175: 
 176:     physio(rpstrategy, &rrpbuf, dev, B_READ);
 177: }
 178: 
 179: rpwrite(dev)
 180: {
 181: 
 182:     physio(rpstrategy, &rrpbuf, dev, B_WRITE);
 183: }

Defined functions

rpintr defined in line 138; never used
rpread defined in line 173; never used
rpstart defined in line 103; used 3 times
rpstrategy defined in line 73; used 2 times
rpwrite defined in line 179; never used

Defined variables

rptab defined in line 43; used 9 times
rrpbuf defined in line 44; used 2 times

Defined struct's

device defined in line 13; never used

Defined macros

DK_N defined in line 71; used 4 times
GO defined in line 46; used 3 times
HNF defined in line 58; used 1 times
HSEEK defined in line 48; used 1 times
IENABLE defined in line 50; used 1 times
NRP defined in line 27; used 1 times
  • in line 83
RCOM defined in line 52; used 1 times
READY defined in line 51; used 1 times
RESET defined in line 47; used 1 times
RPADDR defined in line 26; used 14 times
SUFU defined in line 55; used 1 times
SUSI defined in line 57; used 1 times
SUSU defined in line 56; used 1 times
WCOM defined in line 53; used 1 times
cylin defined in line 66; never used
trksec defined in line 65; never used
Last modified: 1979-01-10
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 850
Valid CSS Valid XHTML 1.0 Strict