home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / standalone / hp.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-02-03  |  2.4 KB  |  125 lines

  1. /*
  2.  * RP04/RP06 disk driver
  3.  */
  4.  
  5. #include <sys/param.h>
  6. #include <sys/inode.h>
  7. #include "saio.h"
  8.  
  9. struct    device
  10. {
  11.     union {
  12.         int    w;
  13.         char    c[2];
  14.     } hpcs1;        /* Control and Status register 1 */
  15.     int    hpwc;        /* Word count register */
  16.     caddr_t    hpba;        /* UNIBUS address register */
  17.     int    hpda;        /* Desired address register */
  18.     union {
  19.         int    w;
  20.         char    c[2];
  21.     } hpcs2;        /* Control and Status register 2*/
  22.     int    hpds;        /* Drive Status */
  23.     int    hper1;        /* Error register 1 */
  24.     int    hpas;        /* Attention Summary */
  25.     int    hpla;        /* Look ahead */
  26.     int    hpdb;        /* Data buffer */
  27.     int    hpmr;        /* Maintenance register */
  28.     int    hpdt;        /* Drive type */
  29.     int    hpsn;        /* Serial number */
  30.     int    hpof;        /* Offset register */
  31.     int    hpdc;        /* Desired Cylinder address register*/
  32.     int    hpcc;        /* Current Cylinder */
  33.     int    hper2;        /* Error register 2 */
  34.     int    hper3;        /* Error register 3 */
  35.     int    hpec1;        /* Burst error bit position */
  36.     int    hpec2;        /* Burst error bit pattern */
  37.     int    hpbae;        /* 11/70 bus extension */
  38.     int    hpcs3;
  39. };
  40.  
  41. #define    HPADDR    ((struct device *)0176700)
  42. #define    NSECT    22
  43. #define    NTRAC    19
  44. #define    SDIST    2
  45. #define    RDIST    6
  46.  
  47. #define    P400    020
  48. #define    M400    0220
  49. #define    P800    040
  50. #define    M800    0240
  51. #define    P1200    060
  52. #define    M1200    0260
  53.  
  54. #define    GO    01
  55. #define    PRESET    020
  56. #define    RTC    016
  57. #define    OFFSET    014
  58. #define    SEARCH    030
  59. #define    RECAL    06
  60. #define DCLR    010
  61. #define    WCOM    060
  62. #define    RCOM    070
  63.  
  64. #define    IE    0100
  65. #define    PIP    020000
  66. #define    DRY    0200
  67. #define    ERR    040000
  68. #define    TRE    040000
  69. #define    DCK    0100000
  70. #define    WLE    04000
  71. #define    ECH    0100
  72. #define VV    0100
  73. #define FMT22    010000
  74.  
  75. hpstrategy(io, func)
  76. register struct iob *io;
  77. {
  78.     register unit;
  79.     register i;
  80.     daddr_t bn;
  81.     int sn, cn, tn;
  82.  
  83.     if (((unit = io->i_unit) & 04) == 0)
  84.         bn = io->i_bn;
  85.     else {
  86.         unit &= 03;
  87.         bn = io->i_bn;
  88.         bn -= io->i_boff;
  89.         i = unit + 1;
  90.         unit = bn%i;
  91.         bn /= i;
  92.         bn += io->i_boff;
  93.     }
  94.  
  95.     HPADDR->hpcs2.w = unit;
  96.  
  97.     if((HPADDR->hpds & VV) == 0) {
  98.         HPADDR->hpcs1.c[0] = PRESET|GO;
  99.         HPADDR->hpof = FMT22;
  100.     }
  101.     cn = bn/(NSECT*NTRAC);
  102.     sn = bn%(NSECT*NTRAC);
  103.     tn = sn/NSECT;
  104.     sn = sn%NSECT;
  105.  
  106.     HPADDR->hpdc = cn;
  107.     HPADDR->hpda = (tn << 8) + sn;
  108.     HPADDR->hpba = io->i_ma;
  109.     HPADDR->hpwc = -(io->i_cc>>1);
  110.     unit = (segflag << 8) | GO;
  111.     if (func == READ)
  112.         unit |= RCOM;
  113.     else if (func == WRITE)
  114.         unit |= WCOM;
  115.     HPADDR->hpcs1.w = unit;
  116.     while ((HPADDR->hpcs1.w&DRY) == 0)
  117.             ;
  118.     if (HPADDR->hpcs1.w & TRE) {
  119.         printf("disk error: cyl=%d track=%d sect=%d cs2=%o, er1=%o\n",
  120.             cn, tn, sn, HPADDR->hpcs2, HPADDR->hper1);
  121.         return(-1);
  122.     }
  123.     return(io->i_cc);
  124. }
  125.