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

Defined functions

rkintr defined in line 96; used 2 times
rkread defined in line 123; used 2 times
rkstart defined in line 68; used 3 times
rkstrategy defined in line 45; used 4 times
rkwrite defined in line 130; used 2 times

Defined variables

rktab defined in line 42; used 13 times
rrkbuf defined in line 43; used 2 times

Defined struct's

device defined in line 32; never used

Defined macros

ARDY defined in line 23; never used
CTLRDY defined in line 25; used 1 times
DK_N defined in line 30; used 4 times
DRESET defined in line 20; never used
DRY defined in line 22; never used
GO defined in line 19; used 2 times
IENABLE defined in line 21; used 1 times
  • in line 85
NRK defined in line 13; never used
NRKBLK defined in line 14; used 1 times
  • in line 51
RCOM defined in line 18; used 1 times
  • in line 87
RESET defined in line 16; used 1 times
RKADDR defined in line 12; used 9 times
WCOM defined in line 17; used 1 times
  • in line 88
WLO defined in line 24; never used
Last modified: 1979-01-10
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 909
Valid CSS Valid XHTML 1.0 Strict