MBA0->HPMBA
[unix-history] / usr / src / sys / vax / mba / hp.c
index 56ea551..516f5c9 100644 (file)
@@ -1,5 +1,7 @@
-/*     hp.c    3.13    %G%     */
+/*     hp.c    3.19    %G%     */
 
 
+#include "../conf/hp.h"
+#if NHP > 0
 /*
  * RP06/RM03/RM05 disk driver
  */
 /*
  * RP06/RM03/RM05 disk driver
  */
@@ -17,9 +19,6 @@
 #include "../h/mtpr.h"
 #include "../h/vm.h"
 
 #include "../h/mtpr.h"
 #include "../h/vm.h"
 
-#define        DK_N    0
-#define        DK_NMAX 1
-
 struct device
 {
        int     hpcs1;          /* control and Status register 1 */
 struct device
 {
        int     hpcs1;          /* control and Status register 1 */
@@ -40,10 +39,6 @@ struct       device
        int     hpec2;          /* Burst error bit pattern */
 };
 
        int     hpec2;          /* Burst error bit pattern */
 };
 
-#define        HPMBA           MBA0
-#define        HPMBANUM        0
-
-#define        NHP     2
 #define        RP      022
 #define        RM      024
 #define        RM5     027
 #define        RP      022
 #define        RM      024
 #define        RM5     027
@@ -52,8 +47,8 @@ struct        device
 #define        NRMSECT 32
 #define        NRMTRAC 5
 
 #define        NRMSECT 32
 #define        NRMTRAC 5
 
-#define        _hpSDIST        3
-#define        _hpRDIST        6
+#define        _hpSDIST        2
+#define        _hpRDIST        3
 
 int    hpSDIST = _hpSDIST;
 int    hpRDIST = _hpRDIST;
 
 int    hpSDIST = _hpSDIST;
 int    hpRDIST = _hpRDIST;
@@ -158,10 +153,19 @@ register struct buf *bp;
        unit = dkunit(bp);
        if (hp_type[unit] == 0) {
                struct device *hpaddr;
        unit = dkunit(bp);
        if (hp_type[unit] == 0) {
                struct device *hpaddr;
+               double mspw;
 
                /* determine device type */
                hpaddr = mbadev(HPMBA, unit);
 
                /* determine device type */
                hpaddr = mbadev(HPMBA, unit);
-               hp_type[unit] = hpaddr->hpdt;
+
+               /* record transfer rate (these are guesstimates secs/word) */
+               switch (hp_type[unit] = hpaddr->hpdt) {
+               case RM:        mspw = .0000019728; break;
+               case RM5:       mspw = .0000020345; break;
+               case RP:        mspw = .0000029592; break;
+               }
+               if (DK_N + unit <= DK_NMAX)
+                       dk_mspw[DK_N+unit] = mspw;
        }
        switch (hp_type[unit]) {
 
        }
        switch (hp_type[unit]) {
 
@@ -209,7 +213,7 @@ register unit;
        daddr_t bn;
        int sn, cn, csn;
 
        daddr_t bn;
        int sn, cn, csn;
 
-       ((struct mba_regs *)MBA0)->mba_cr |= MBAIE;
+       ((struct mba_regs *)HPMBA)->mba_cr |= MBAIE;
        hpaddr = mbadev(HPMBA, 0);
        hpaddr->hpas = 1<<unit;
 
        hpaddr = mbadev(HPMBA, 0);
        hpaddr->hpas = 1<<unit;
 
@@ -270,9 +274,9 @@ search:
                hpaddr->hpcs1 = SEARCH|GO;
        }
        unit += DK_N;
                hpaddr->hpcs1 = SEARCH|GO;
        }
        unit += DK_N;
-       if (unit <= DK_NMAX && DK_N+NHP <= DK_NMAX) {
+       if (unit <= DK_NMAX) {
                dk_busy |= 1<<unit;
                dk_busy |= 1<<unit;
-               dk_numb[unit]++;
+               dk_seek[unit]++;
        }
        return;
 
        }
        return;
 
@@ -337,7 +341,7 @@ loop:
                iodone(bp);
                goto loop;
        }
                iodone(bp);
                goto loop;
        }
-       if(hptab.b_errcnt >= 16 && (bp->b_flags&B_WRITE)) {
+       if(hptab.b_errcnt >= 16 && (bp->b_flags&B_WRITE) == 0) {
                hpaddr->hpof = hp_offset[hptab.b_errcnt & 017] | FMT22;
                HPMBA->mba_cr &= ~MBAIE;
                hpaddr->hpcs1 = OFFSET|GO;
                hpaddr->hpof = hp_offset[hptab.b_errcnt & 017] | FMT22;
                HPMBA->mba_cr &= ~MBAIE;
                hpaddr->hpcs1 = OFFSET|GO;
@@ -350,11 +354,9 @@ loop:
        mbastart(bp, (int *)hpaddr);
 
        unit = dn+DK_N;
        mbastart(bp, (int *)hpaddr);
 
        unit = dn+DK_N;
-       if (NHP+DK_N == DK_NMAX)
-               unit = NHP+DK_N;
        if (unit <= DK_NMAX) {
                dk_busy |= 1<<unit;
        if (unit <= DK_NMAX) {
                dk_busy |= 1<<unit;
-               dk_numb[unit]++;
+               dk_xfer[unit]++;
                dk_wds[unit] += bp->b_bcount>>6;
        }
 }
                dk_wds[unit] += bp->b_bcount>>6;
        }
 }
@@ -369,9 +371,7 @@ hpintr(mbastat, as)
                dp = hptab.b_actf;
                bp = dp->b_actf;
                unit = dkunit(bp);
                dp = hptab.b_actf;
                bp = dp->b_actf;
                unit = dkunit(bp);
-               if (DK_N+NHP == DK_NMAX)
-                       dk_busy &= ~(1<<(DK_N+NHP));
-               else if (DK_N+unit <= DK_NMAX)
+               if (DK_N+unit <= DK_NMAX)
                        dk_busy &= ~(1<<(DK_N+unit));
                hpaddr = mbadev(HPMBA, unit);
                if (hpaddr->hpds & ERR || mbastat & MBAEBITS) {
                        dk_busy &= ~(1<<(DK_N+unit));
                hpaddr = mbadev(HPMBA, unit);
                if (hpaddr->hpds & ERR || mbastat & MBAEBITS) {
@@ -461,11 +461,7 @@ register struct buf *bp;
        if (bcr)
                bcr |= 0xffff0000;              /* sxt */
        npf = btop(bcr + bp->b_bcount) - 1;
        if (bcr)
                bcr |= 0xffff0000;              /* sxt */
        npf = btop(bcr + bp->b_bcount) - 1;
-       printf("bcr %d npf %d\n", bcr, npf);
-       if (bp->b_flags&B_PHYS)
-               reg = 128 + npf;
-       else
-               reg = btop(bp->b_un.b_addr - buffers[0]) + npf;
+       reg = npf;
        o = (int)bp->b_un.b_addr & PGOFSET;
        printf("%D ", bp->b_blkno + npf);
        prdev("ECC", bp->b_dev);
        o = (int)bp->b_un.b_addr & PGOFSET;
        printf("%D ", bp->b_blkno + npf);
        prdev("ECC", bp->b_dev);
@@ -535,3 +531,4 @@ register struct buf *bp;
        rp->hpcs1 = RCOM|GO;
        return (1);
 }
        rp->hpcs1 = RCOM|GO;
        return (1);
 }
+#endif