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

  1. #
  2. /*
  3.  * RF disk driver
  4.  */
  5.  
  6. #include "../h/param.h"
  7. #include "../h/systm.h"
  8. #include "../h/buf.h"
  9. #include "../h/conf.h"
  10. #include "../h/dir.h"
  11. #include "../h/user.h"
  12.  
  13. struct device {
  14.     int    rfcs;
  15.     int    rfwc;
  16.     char    *rfba;
  17.     int    rfda;
  18.     int    rfdae;
  19. };
  20.  
  21. struct    buf    rftab;
  22. struct    buf    rrfbuf;
  23.  
  24. #define    NRFBLK    1024
  25. #define RFADDR ((struct device *)0177460)
  26.  
  27. #define    GO    01
  28. #define    RCOM    04
  29. #define    WCOM    02
  30. #define    CTLCLR    0400
  31. #define    IENABLE    0100
  32.  
  33. /*
  34.  * Monitoring device number
  35.  */
  36. #define    DK_N    0
  37.  
  38. rfstrategy(bp)
  39. register struct buf *bp;
  40. {
  41.     if(bp->b_flags&B_PHYS)
  42.         mapalloc(bp);
  43.     if (bp->b_blkno >= NRFBLK*(minor(bp->b_dev)+1)) {
  44.         bp->b_flags |= B_ERROR;
  45.         iodone(bp);
  46.         return;
  47.     }
  48.     bp->av_forw = 0;
  49.     spl5();
  50.     if (rftab.b_actf == NULL)
  51.         rftab.b_actf = bp;
  52.     else
  53.         rftab.b_actl->av_forw = bp;
  54.     rftab.b_actl = bp;
  55.     if (rftab.b_active == NULL)
  56.         rfstart();
  57.     spl0();
  58. }
  59.  
  60. rfstart()
  61. {
  62.     register struct buf *bp;
  63.     register int com;
  64.  
  65.     if ((bp = rftab.b_actf) == NULL)
  66.         return;
  67.     rftab.b_active++;
  68.     RFADDR->rfda = (int)(bp->b_blkno<<8)&0177777;
  69.     RFADDR->rfdae = (int)(bp->b_blkno>>8)&037;
  70.     RFADDR->rfba = bp->b_un.b_addr;
  71.     RFADDR->rfwc = -(bp->b_bcount>>1);
  72.     com = (bp->b_xmem&3) << 4;
  73.     com |= (bp->b_flags & B_READ) ? RCOM+GO+IENABLE : WCOM+GO+IENABLE;
  74.     RFADDR->rfcs = com;
  75.     dk_busy |= 1<<DK_N;
  76.     dk_numb[DK_N] += 1;
  77.     com = (-bp->b_bcount>>5) & 03777;
  78.     dk_wds[DK_N] += com;
  79. }
  80.  
  81. rfintr()
  82. {
  83.     register struct buf *bp;
  84.  
  85.     if (rftab.b_active == NULL)
  86.         return;
  87.     dk_busy &= ~(1<<DK_N);
  88.     bp = rftab.b_actf;
  89.     rftab.b_active = NULL;
  90.     if (RFADDR->rfcs < 0) {        /* error bit */
  91.         deverror(bp, RFADDR->rfcs, RFADDR->rfdae);
  92.         RFADDR->rfcs = CTLCLR;
  93.         if (++rftab.b_errcnt <= 10) {
  94.             rfstart();
  95.             return;
  96.         }
  97.         bp->b_flags |= B_ERROR;
  98.     }
  99.     rftab.b_errcnt = 0;
  100.     rftab.b_actf = bp->av_forw;
  101.     bp->b_resid = 0;
  102.     iodone(bp);
  103.     rfstart();
  104. }
  105.  
  106. rfread(dev)
  107. {
  108.  
  109.     physio(rfstrategy, &rrfbuf, dev, B_READ);
  110. }
  111.  
  112. rfwrite(dev)
  113. {
  114.  
  115.     physio(rfstrategy, &rrfbuf, dev, B_WRITE);
  116. }
  117.