home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Distributions / ucb / 2.9-derivatives / 2.9-pro350 / stand / libsa / ra.c < prev    next >
Encoding:
C/C++ Source or Header  |  1985-02-26  |  2.1 KB  |  109 lines

  1. /*
  2.  * RA standalone disk driver
  3.  */
  4. #include <sys/param.h>
  5. #include <sys/inode.h>
  6. #include "saio.h"
  7.  
  8. /*
  9.  * Parameters for the communications area
  10.  */
  11. #define    NRSPL2    0
  12. #define    NCMDL2    0
  13. #define    NRSP    (1<<NRSPL2)
  14. #define    NCMD    (1<<NCMDL2)
  15. #include <sys/rareg.h>
  16.  
  17. #define    RAADDR    ((struct radevice *) 0172150)
  18.  
  19. struct ra {
  20.     struct raca    ra_ca;
  21.     struct ms    ra_rsp;
  22.     struct ms    ra_cmd;
  23. } ra;
  24.  
  25.  
  26. struct ms *racmd();
  27.  
  28. raopen(io)
  29.     register struct iob *io;
  30. {
  31.     register struct ms *mp;
  32.     int i;
  33.  
  34.     RAADDR->raip = 0;
  35.     while ((RAADDR->rasa & RA_STEP1) == 0)
  36.         ;
  37.     RAADDR->rasa = RA_ERR;
  38.     while ((RAADDR->rasa & RA_STEP2) == 0)
  39.         ;
  40.     RAADDR->rasa = (short)&ra.ra_ca.ca_ringbase;
  41.     while ((RAADDR->rasa & RA_STEP3) == 0)
  42.         ;
  43.     RAADDR->rasa = segflag;
  44.     while ((RAADDR->rasa & RA_STEP4) == 0)
  45.         ;
  46.     RAADDR->rasa = RA_GO;
  47.     ra.ra_ca.ca_rspdsc[0].low = &ra.ra_rsp.ms_cmdref;
  48.     ra.ra_ca.ca_rspdsc[0].high = segflag;
  49.     ra.ra_ca.ca_cmddsc[0].low = &ra.ra_cmd.ms_cmdref;
  50.     ra.ra_ca.ca_cmddsc[0].high = segflag;
  51.     ra.ra_cmd.ms_cntflgs = 0;
  52.     if (racmd(M_OP_STCON) == 0) {
  53.         _stop("ra: open error, STCON");
  54.         return;
  55.     }
  56.     ra.ra_cmd.ms_unit = io->i_unit&7;
  57.     if (racmd(M_OP_ONLIN) == 0) {
  58.         _stop("ra: open error, ONLIN");
  59.     }
  60. }
  61.  
  62. struct ms *
  63. racmd(op)
  64.     int op;
  65. {
  66.     struct ms *mp;
  67.     int i;
  68.  
  69.     ra.ra_cmd.ms_opcode = op;
  70.     ra.ra_rsp.ms_header.ra_msglen = sizeof (struct ms);
  71.     ra.ra_cmd.ms_header.ra_msglen = sizeof (struct ms);
  72.     ra.ra_ca.ca_rspdsc[0].high |= RA_OWN|RA_INT;
  73.     ra.ra_ca.ca_cmddsc[0].high |= RA_OWN|RA_INT;
  74.     i = RAADDR->raip;
  75.     for (;;) {
  76.         if (ra.ra_ca.ca_cmdint)
  77.             ra.ra_ca.ca_cmdint = 0;
  78.         if (ra.ra_ca.ca_rspint)
  79.             break;
  80.     }
  81.     ra.ra_ca.ca_rspint = 0;
  82.     mp = &ra.ra_rsp;
  83.     if ((mp->ms_opcode&0377) != (op|M_OP_END) ||
  84.         (mp->ms_status&M_ST_MASK) != M_ST_SUCC)
  85.         {
  86.         printf("op = %o\n",mp->ms_opcode);
  87.         return(0);
  88.         }
  89.     return(mp);
  90. }
  91.  
  92. rastrategy(io, func)
  93.     register struct iob *io;
  94. {
  95.     register struct ms *mp;
  96.  
  97.     mp = &ra.ra_cmd;
  98.     mp->ms_lbn = SWAPW(io->i_bn);
  99.     mp->ms_unit = io->i_unit&7;
  100.     mp->ms_bytecnt = SWAPW(io->i_cc);
  101.     mp->ms_buffer.low = io->i_ma;
  102.     mp->ms_buffer.high = segflag;
  103.     if ((mp = racmd(func == READ ? M_OP_READ : M_OP_WRITE)) == 0) {
  104.         printf("ra: I/O error\n");
  105.         return(-1);
  106.     }
  107.     return(io->i_cc);
  108. }
  109.