home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V6 / usr / sys / dmr / rk.c < prev    next >
Encoding:
C/C++ Source or Header  |  1975-07-18  |  1.8 KB  |  133 lines

  1. #
  2. /*
  3.  */
  4.  
  5. /*
  6.  * RK disk driver
  7.  */
  8.  
  9. #include "../param.h"
  10. #include "../buf.h"
  11. #include "../conf.h"
  12. #include "../user.h"
  13.  
  14. #define    RKADDR    0177400
  15. #define    NRK    4
  16. #define    NRKBLK    4872
  17.  
  18. #define    RESET    0
  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. struct {
  28.     int rkds;
  29.     int rker;
  30.     int rkcs;
  31.     int rkwc;
  32.     int rkba;
  33.     int rkda;
  34. };
  35.  
  36. struct    devtab    rktab;
  37. struct    buf    rrkbuf;
  38.  
  39. rkstrategy(abp)
  40. struct buf *abp;
  41. {
  42.     register struct buf *bp;
  43.     register *qc, *ql;
  44.     int d;
  45.  
  46.     bp = abp;
  47.     if(bp->b_flags&B_PHYS)
  48.         mapalloc(bp);
  49.     d = bp->b_dev.d_minor-7;
  50.     if(d <= 0)
  51.         d = 1;
  52.     if (bp->b_blkno >= NRKBLK*d) {
  53.         bp->b_flags =| B_ERROR;
  54.         iodone(bp);
  55.         return;
  56.     }
  57.     bp->av_forw = 0;
  58.     spl5();
  59.     if (rktab.d_actf==0)
  60.         rktab.d_actf = bp;
  61.     else
  62.         rktab.d_actl->av_forw = bp;
  63.     rktab.d_actl = bp;
  64.     if (rktab.d_active==0)
  65.         rkstart();
  66.     spl0();
  67. }
  68.  
  69. rkaddr(bp)
  70. struct buf *bp;
  71. {
  72.     register struct buf *p;
  73.     register int b;
  74.     int d, m;
  75.  
  76.     p = bp;
  77.     b = p->b_blkno;
  78.     m = p->b_dev.d_minor - 7;
  79.     if(m <= 0)
  80.         d = p->b_dev.d_minor;
  81.     else {
  82.         d = lrem(b, m);
  83.         b = ldiv(b, m);
  84.     }
  85.     return(d<<13 | (b/12)<<4 | b%12);
  86. }
  87.  
  88. rkstart()
  89. {
  90.     register struct buf *bp;
  91.  
  92.     if ((bp = rktab.d_actf) == 0)
  93.         return;
  94.     rktab.d_active++;
  95.     devstart(bp, &RKADDR->rkda, rkaddr(bp), 0);
  96. }
  97.  
  98. rkintr()
  99. {
  100.     register struct buf *bp;
  101.  
  102.     if (rktab.d_active == 0)
  103.         return;
  104.     bp = rktab.d_actf;
  105.     rktab.d_active = 0;
  106.     if (RKADDR->rkcs < 0) {        /* error bit */
  107.         deverror(bp, RKADDR->rker, RKADDR->rkds);
  108.         RKADDR->rkcs = RESET|GO;
  109.         while((RKADDR->rkcs&CTLRDY) == 0) ;
  110.         if (++rktab.d_errcnt <= 10) {
  111.             rkstart();
  112.             return;
  113.         }
  114.         bp->b_flags =| B_ERROR;
  115.     }
  116.     rktab.d_errcnt = 0;
  117.     rktab.d_actf = bp->av_forw;
  118.     iodone(bp);
  119.     rkstart();
  120. }
  121.  
  122. rkread(dev)
  123. {
  124.  
  125.     physio(rkstrategy, &rrkbuf, dev, B_READ);
  126. }
  127.  
  128. rkwrite(dev)
  129. {
  130.  
  131.     physio(rkstrategy, &rrkbuf, dev, B_WRITE);
  132. }
  133.