home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / sys / dev / rk.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-02-03  |  2.1 KB  |  136 lines

  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. }
  136.