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

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