consolidate random data structures
[unix-history] / usr / src / sys / vax / mba / hp.c
index 7c55e11..83c57d3 100644 (file)
@@ -1,4 +1,4 @@
-/*     hp.c    4.63    83/02/05        */
+/*     hp.c    4.65    83/02/10        */
 
 #ifdef HPDEBUG
 int    hpdebug;
 
 #ifdef HPDEBUG
 int    hpdebug;
@@ -51,11 +51,7 @@ struct       size {
        0,      0,
        0,      0,
        0,      0,
        0,      0,
        0,      0,
        0,      0,
-#ifndef NOBADSECT
        291280, 118,            /* G=cyl 118 thru 814 */
        291280, 118,            /* G=cyl 118 thru 814 */
-#else
-       291346, 118,
-#endif
        0,      0,
 }, rm3_sizes[8] = {
        15884,  0,              /* A=cyl 0 thru 99 */
        0,      0,
 }, rm3_sizes[8] = {
        15884,  0,              /* A=cyl 0 thru 99 */
@@ -64,11 +60,7 @@ struct       size {
        0,      0,
        0,      0,
        0,      0,
        0,      0,
        0,      0,
        0,      0,
-#ifndef NOBADSECT
        81984,  310,            /* G=cyl 310 thru 822 */
        81984,  310,            /* G=cyl 310 thru 822 */
-#else
-       82080,  310,
-#endif
        0,      0,
 }, rm5_sizes[8] = {
        15884,  0,              /* A=cyl 0 thru 26 */
        0,      0,
 }, rm5_sizes[8] = {
        15884,  0,              /* A=cyl 0 thru 26 */
@@ -76,13 +68,8 @@ struct       size {
        500384, 0,              /* C=cyl 0 thru 822 */
        15884,  562,            /* D=cyl 562 thru 588 */
        55936,  589,            /* E=cyl 589 thru 680 */
        500384, 0,              /* C=cyl 0 thru 822 */
        15884,  562,            /* D=cyl 562 thru 588 */
        55936,  589,            /* E=cyl 589 thru 680 */
-#ifndef NOBADSECT
        86240,  681,            /* F=cyl 681 thru 822 */
        158592, 562,            /* G=cyl 562 thru 822 */
        86240,  681,            /* F=cyl 681 thru 822 */
        158592, 562,            /* G=cyl 562 thru 822 */
-#else
-       86336,  681,
-       158688, 562,
-#endif
        291346, 82,             /* H=cyl 82 thru 561 */
 }, rm80_sizes[8] = {
        15884,  0,              /* A=cyl 0 thru 36 */
        291346, 82,             /* H=cyl 82 thru 561 */
 }, rm80_sizes[8] = {
        15884,  0,              /* A=cyl 0 thru 36 */
@@ -103,13 +90,13 @@ struct     size {
        479850, 330,            /* G=cyl 330 thru 629 */
        448000, 50,             /* H=cyl 50 thru 329 */
 }, si9775_sizes[8] = {
        479850, 330,            /* G=cyl 330 thru 629 */
        448000, 50,             /* H=cyl 50 thru 329 */
 }, si9775_sizes[8] = {
-       16640,    0,            /* A=cyl   0 thru  12 */
-       34560,   13,            /* B=cyl  13 thru  39 */
-       1079040,  0,            /* C=cyl   0 thru 842 - whole disk */
-       0,        0,            /* D unused */
-       0,        0,            /* E unused */
-       0,        0,            /* F unused */
-       513280,  40,            /* G=cyl  40 thru 440 */
+       16640,    0,            /* A=cyl 0 thru 12 */
+       34560,   13,            /* B=cyl 13 thru 39 */
+       1079040,  0,            /* C=cyl 0 thru 842 */
+       0,        0,
+       0,        0,
+       0,        0,
+       513280,  40,            /* G=cyl 40 thru 440 */
        513280, 441,            /* H=cyl 441 thru 841 */
 }, si9730_sizes[8] = {
        15884,  0,              /* A=cyl 0 thru 49 */
        513280, 441,            /* H=cyl 441 thru 841 */
 }, si9730_sizes[8] = {
        15884,  0,              /* A=cyl 0 thru 49 */
@@ -119,11 +106,7 @@ struct     size {
        0,      0,
        0,      0,
        0,      0,
        0,      0,
        0,      0,
        0,      0,
-#ifndef NOBADSECT
        213664, 155,            /* H=cyl 155 thru 822 */
        213664, 155,            /* H=cyl 155 thru 822 */
-#else
-       213760, 155,
-#endif
 }, hpam_sizes[8] = {
        15884,  0,              /* A=cyl 0 thru 31 */
        33440,  32,             /* B=cyl 32 thru 97 */
 }, hpam_sizes[8] = {
        15884,  0,              /* A=cyl 0 thru 31 */
        33440,  32,             /* B=cyl 32 thru 97 */
@@ -233,15 +216,16 @@ u_char    hp_offset[16] = {
 };
 
 struct buf     rhpbuf[NHP];
 };
 
 struct buf     rhpbuf[NHP];
-#ifndef NOBADSECT
 struct buf     bhpbuf[NHP];
 struct dkbad   hpbad[NHP];
 struct buf     bhpbuf[NHP];
 struct dkbad   hpbad[NHP];
-#endif
-/* SHOULD CONSOLIDATE ALL THIS STUFF INTO A STRUCTURE */
-char   hpinit[NHP];
-char   hprecal[NHP];
-char   hphdr[NHP];
-daddr_t        mlsize[NHP];
+
+struct hpsoftc {
+       u_char  sc_hpinit;      /* drive initialized */
+       u_char  sc_recal;       /* recalibrate state */
+       u_char  sc_hdr;         /* next i/o includes header */
+       u_char  sc_doseeks;     /* perform explicit seeks */
+       daddr_t sc_mlsize;      /* ML11 size */
+} hpsoftc[NHP];
 
 #define        b_cylin b_resid
  
 
 #define        b_cylin b_resid
  
@@ -253,8 +237,6 @@ daddr_t     mlsize[NHP];
 #ifdef INTRLVE
 daddr_t dkblock();
 #endif
 #ifdef INTRLVE
 daddr_t dkblock();
 #endif
-int    hpseek;
 
 /*ARGSUSED*/
 hpattach(mi, slave)
 
 /*ARGSUSED*/
 hpattach(mi, slave)
@@ -363,12 +345,12 @@ done:
         * transfer rates based on device characteristics.
         */
        if (type == HPDT_ML11A || type == HPDT_ML11B) {
         * transfer rates based on device characteristics.
         */
        if (type == HPDT_ML11A || type == HPDT_ML11B) {
-               register int trt, sz;
+               register struct hpsoftc *sc = &hpsoftc[mi->mi_unit];
+               register int trt;
 
 
-               sz = hpaddr->hpmr & HPMR_SZ;
+               sc->sc_mlsize = hpaddr->hpmr & HPMR_SZ;
                if ((hpaddr->hpmr & HPMR_ARRTYP) == 0)
                if ((hpaddr->hpmr & HPMR_ARRTYP) == 0)
-                       sz >>= 2;
-               mlsize[mi->mi_unit] = sz;
+                       sc->sc_mlsize >>= 2;
                if (mi->mi_dk >= 0) {
                        trt = (hpaddr->hpmr & HPMR_TRT) >> 8;
                        dk_mspw[mi->mi_dk] = 1.0 / (1<<(20-trt));
                if (mi->mi_dk >= 0) {
                        trt = (hpaddr->hpmr & HPMR_TRT) >> 8;
                        dk_mspw[mi->mi_dk] = 1.0 / (1<<(20-trt));
@@ -409,8 +391,10 @@ hpstrategy(bp)
                goto bad;
        st = &hpst[mi->mi_type];
        if (ML11) {
                goto bad;
        st = &hpst[mi->mi_type];
        if (ML11) {
+               struct hpsoftc *sc = &hpsoftc[unit];
+
                if (bp->b_blkno < 0 ||
                if (bp->b_blkno < 0 ||
-                   dkblock(bp)+sz > mlsize[mi->mi_unit])
+                   dkblock(bp)+sz > sc->sc_mlsize)
                        goto bad;
                bp->b_cylin = 0;
        } else {
                        goto bad;
                bp->b_cylin = 0;
        } else {
@@ -438,18 +422,17 @@ hpustart(mi)
        register struct hpdevice *hpaddr = (struct hpdevice *)mi->mi_drv;
        register struct buf *bp = mi->mi_tab.b_actf;
        register struct hpst *st = &hpst[mi->mi_type];
        register struct hpdevice *hpaddr = (struct hpdevice *)mi->mi_drv;
        register struct buf *bp = mi->mi_tab.b_actf;
        register struct hpst *st = &hpst[mi->mi_type];
+       struct hpsoftc *sc = &hpsoftc[mi->mi_unit];
        daddr_t bn;
        int sn, dist;
 
        hpaddr->hpcs1 = 0;
        if ((hpaddr->hpcs1&HP_DVA) == 0)
                return (MBU_BUSY);
        daddr_t bn;
        int sn, dist;
 
        hpaddr->hpcs1 = 0;
        if ((hpaddr->hpcs1&HP_DVA) == 0)
                return (MBU_BUSY);
-       if ((hpaddr->hpds & HPDS_VV) == 0 || hpinit[mi->mi_unit] == 0) {
-#ifndef NOBADSECT
+       if ((hpaddr->hpds & HPDS_VV) == 0 || !sc->sc_hpinit) {
                struct buf *bbp = &bhpbuf[mi->mi_unit];
                struct buf *bbp = &bhpbuf[mi->mi_unit];
-#endif
 
 
-               hpinit[mi->mi_unit] = 1;
+               sc->sc_hpinit = 1;
                hpaddr->hpcs1 = HP_DCLR|HP_GO;
                if (mi->mi_mba->mba_drv[0].mbd_as & (1<<mi->mi_drive))
                        printf("DCLR attn\n");
                hpaddr->hpcs1 = HP_DCLR|HP_GO;
                if (mi->mi_mba->mba_drv[0].mbd_as & (1<<mi->mi_drive))
                        printf("DCLR attn\n");
@@ -457,7 +440,6 @@ hpustart(mi)
                if (!ML11)
                        hpaddr->hpof = HPOF_FMT22;
                mbclrattn(mi);
                if (!ML11)
                        hpaddr->hpof = HPOF_FMT22;
                mbclrattn(mi);
-#ifndef NOBADSECT
                if (!ML11) {
                        bbp->b_flags = B_READ|B_BUSY;
                        bbp->b_dev = bp->b_dev;
                if (!ML11) {
                        bbp->b_flags = B_READ|B_BUSY;
                        bbp->b_dev = bp->b_dev;
@@ -469,7 +451,6 @@ hpustart(mi)
                        bbp->av_forw = bp;
                        bp = bbp;
                }
                        bbp->av_forw = bp;
                        bp = bbp;
                }
-#endif
        }
        if (mi->mi_tab.b_active || mi->mi_hd->mh_ndrive == 1)
                return (MBU_DODATA);
        }
        if (mi->mi_tab.b_active || mi->mi_hd->mh_ndrive == 1)
                return (MBU_DODATA);
@@ -481,7 +462,7 @@ hpustart(mi)
        sn = bn%st->nspc;
        sn = (sn+st->nsect-hpSDIST)%st->nsect;
        if (bp->b_cylin == (hpaddr->hpdc & 0xffff)) {
        sn = bn%st->nspc;
        sn = (sn+st->nsect-hpSDIST)%st->nsect;
        if (bp->b_cylin == (hpaddr->hpdc & 0xffff)) {
-               if (hpseek)
+               if (sc->sc_seek)
                        return (MBU_DODATA);
                dist = ((hpaddr->hpla & 0xffff)>>6) - st->nsect + 1;
                if (dist < 0)
                        return (MBU_DODATA);
                dist = ((hpaddr->hpla & 0xffff)>>6) - st->nsect + 1;
                if (dist < 0)
@@ -490,7 +471,7 @@ hpustart(mi)
                        return (MBU_DODATA);
        } else
                hpaddr->hpdc = bp->b_cylin;
                        return (MBU_DODATA);
        } else
                hpaddr->hpdc = bp->b_cylin;
-       if (hpseek)
+       if (sc->sc_seek)
                hpaddr->hpcs1 = HP_SEEK|HP_GO;
        else {
                hpaddr->hpda = sn;
                hpaddr->hpcs1 = HP_SEEK|HP_GO;
        else {
                hpaddr->hpda = sn;
@@ -505,6 +486,7 @@ hpstart(mi)
        register struct hpdevice *hpaddr = (struct hpdevice *)mi->mi_drv;
        register struct buf *bp = mi->mi_tab.b_actf;
        register struct hpst *st = &hpst[mi->mi_type];
        register struct hpdevice *hpaddr = (struct hpdevice *)mi->mi_drv;
        register struct buf *bp = mi->mi_tab.b_actf;
        register struct hpst *st = &hpst[mi->mi_type];
+       struct hpsoftc *sc = &hpsoftc[mi->mi_unit];
        daddr_t bn;
        int sn, tn;
 
        daddr_t bn;
        int sn, tn;
 
@@ -518,7 +500,7 @@ hpstart(mi)
                hpaddr->hpdc = bp->b_cylin;
                hpaddr->hpda = (tn << 8) + sn;
        }
                hpaddr->hpdc = bp->b_cylin;
                hpaddr->hpda = (tn << 8) + sn;
        }
-       if (hphdr[mi->mi_unit]) {
+       if (sc->sc_hdr) {
                if (bp->b_flags & B_READ)
                        return (HP_RHDR|HP_GO);
                else
                if (bp->b_flags & B_READ)
                        return (HP_RHDR|HP_GO);
                else
@@ -535,14 +517,13 @@ hpdtint(mi, mbsr)
        register struct buf *bp = mi->mi_tab.b_actf;
        register struct hpst *st = &hpst[mi->mi_type];
        register int er1, er2;
        register struct buf *bp = mi->mi_tab.b_actf;
        register struct hpst *st = &hpst[mi->mi_type];
        register int er1, er2;
+       struct hpsoftc *sc = &hpsoftc[mi->mi_unit];
        int retry = 0;
 
        int retry = 0;
 
-#ifndef NOBADSECT
        if (bp->b_flags&B_BAD) {
                if (hpecc(mi, CONT))
                        return(MBD_RESTARTED);
        }
        if (bp->b_flags&B_BAD) {
                if (hpecc(mi, CONT))
                        return(MBD_RESTARTED);
        }
-#endif
        if (hpaddr->hpds&HPDS_ERR || mbsr&MBSR_EBITS) {
 #ifdef HPDEBUG
                if (hpdebug) {
        if (hpaddr->hpds&HPDS_ERR || mbsr&MBSR_EBITS) {
 #ifdef HPDEBUG
                if (hpdebug) {
@@ -569,18 +550,15 @@ hpdtint(mi, mbsr)
                if (er1&HPER1_WLE) {
                        printf("hp%d: write locked\n", dkunit(bp));
                        bp->b_flags |= B_ERROR;
                if (er1&HPER1_WLE) {
                        printf("hp%d: write locked\n", dkunit(bp));
                        bp->b_flags |= B_ERROR;
-               } else if ((er1&0xffff) == HPER1_FER && RP06 &&
-                   hphdr[mi->mi_unit] == 0) {
-#ifndef NOBADSECT
+               } else if ((er1&0xffff) == HPER1_FER && RP06 && !sc->sc_hdr) {
                        if (hpecc(mi, BSE))
                                return(MBD_RESTARTED);
                        else
                        if (hpecc(mi, BSE))
                                return(MBD_RESTARTED);
                        else
-#endif
                                goto hard;
                } else if (++mi->mi_tab.b_errcnt > 27 ||
                    mbsr & MBSR_HARD ||
                    er1 & HPER1_HARD ||
                                goto hard;
                } else if (++mi->mi_tab.b_errcnt > 27 ||
                    mbsr & MBSR_HARD ||
                    er1 & HPER1_HARD ||
-                   hphdr[mi->mi_unit] ||
+                   sc->sc_hdr ||
                    (!ML11 && (er2 & HPER2_HARD))) {
 hard:
                        if (ML11)
                    (!ML11 && (er2 & HPER2_HARD))) {
 hard:
                        if (ML11)
@@ -602,13 +580,11 @@ hard:
                        printf("\n");
                        bp->b_flags |= B_ERROR;
                        retry = 0;
                        printf("\n");
                        bp->b_flags |= B_ERROR;
                        retry = 0;
-                       hprecal[mi->mi_unit] = 0;
+                       sc->sc_recal = 0;
                } else if ((er2 & HPER2_BSE) && !ML11) {
                } else if ((er2 & HPER2_BSE) && !ML11) {
-#ifndef NOBADSECT
                        if (hpecc(mi, BSE))
                                return(MBD_RESTARTED);
                        else
                        if (hpecc(mi, BSE))
                                return(MBD_RESTARTED);
                        else
-#endif
                                goto hard;
                } else if (RM80 && er2&HPER2_SSE) {
                        (void) hpecc(mi, SSE);
                                goto hard;
                } else if (RM80 && er2&HPER2_SSE) {
                        (void) hpecc(mi, SSE);
@@ -625,7 +601,7 @@ hard:
                                goto hard;
                } else if ((mi->mi_tab.b_errcnt&07) == 4) {
                        hpaddr->hpcs1 = HP_RECAL|HP_GO;
                                goto hard;
                } else if ((mi->mi_tab.b_errcnt&07) == 4) {
                        hpaddr->hpcs1 = HP_RECAL|HP_GO;
-                       hprecal[mi->mi_unit] = 1;
+                       sc->sc_recal = 1;
                        return(MBD_RESTARTED);
                }
                if (retry)
                        return(MBD_RESTARTED);
                }
                if (retry)
@@ -633,8 +609,8 @@ hard:
        }
 #ifdef HPDEBUG
        else
        }
 #ifdef HPDEBUG
        else
-               if (hpdebug && hprecal[mi->mi_unit]) {
-                       printf("recal %d ", hprecal[mi->mi_unit]);
+               if (hpdebug && sc->sc_recal) {
+                       printf("recal %d ", sc->sc_recal);
                        printf("errcnt %d\n", mi->mi_tab.b_errcnt);
                        printf("mbsr=%b ", mbsr, mbsr_bits);
                        printf("er1=%b er2=%b\n",
                        printf("errcnt %d\n", mi->mi_tab.b_errcnt);
                        printf("mbsr=%b ", mbsr, mbsr_bits);
                        printf("er1=%b er2=%b\n",
@@ -642,12 +618,12 @@ hard:
                            hpaddr->hper2, HPER2_BITS);
                }
 #endif
                            hpaddr->hper2, HPER2_BITS);
                }
 #endif
-       switch (hprecal[mi->mi_unit]) {
+       switch (sc->sc_recal) {
 
        case 1:
                hpaddr->hpdc = bp->b_cylin;
                hpaddr->hpcs1 = HP_SEEK|HP_GO;
 
        case 1:
                hpaddr->hpdc = bp->b_cylin;
                hpaddr->hpcs1 = HP_SEEK|HP_GO;
-               hprecal[mi->mi_unit]++;
+               sc->sc_recal++;
                return (MBD_RESTARTED);
        case 2:
                if (mi->mi_tab.b_errcnt < 16 ||
                return (MBD_RESTARTED);
        case 2:
                if (mi->mi_tab.b_errcnt < 16 ||
@@ -655,14 +631,14 @@ hard:
                        goto donerecal;
                hpaddr->hpof = hp_offset[mi->mi_tab.b_errcnt & 017]|HPOF_FMT22;
                hpaddr->hpcs1 = HP_OFFSET|HP_GO;
                        goto donerecal;
                hpaddr->hpof = hp_offset[mi->mi_tab.b_errcnt & 017]|HPOF_FMT22;
                hpaddr->hpcs1 = HP_OFFSET|HP_GO;
-               hprecal[mi->mi_unit]++;
+               sc->sc_recal++;
                return (MBD_RESTARTED);
        donerecal:
        case 3:
                return (MBD_RESTARTED);
        donerecal:
        case 3:
-               hprecal[mi->mi_unit] = 0;
+               sc->sc_recal = 0;
                return (MBD_RETRY);
        }
                return (MBD_RETRY);
        }
-       hphdr[mi->mi_unit] = 0;
+       sc->sc_hdr = 0;
        bp->b_resid = -(mi->mi_mba->mba_bcr) & 0xffff;
        if (mi->mi_tab.b_errcnt >= 16) {
                /*
        bp->b_resid = -(mi->mi_mba->mba_bcr) & 0xffff;
        if (mi->mi_tab.b_errcnt >= 16) {
                /*
@@ -714,7 +690,7 @@ hpioctl(dev, cmd, data, flag)
        switch (cmd) {
 
        case DKIOCHDR:  /* do header read/write */
        switch (cmd) {
 
        case DKIOCHDR:  /* do header read/write */
-               hphdr[minor(dev)>>3] = 1;
+               hpsoftc[minor(dev) >> 3].sc_hdr = 1;
                return (0);
 
        default:
                return (0);
 
        default:
@@ -737,11 +713,9 @@ hpecc(mi, flag)
        bcr = mbp->mba_bcr & 0xffff;
        if (bcr)
                bcr |= 0xffff0000;              /* sxt */
        bcr = mbp->mba_bcr & 0xffff;
        if (bcr)
                bcr |= 0xffff0000;              /* sxt */
-#ifndef NOBADSECT
        if (flag == CONT)
                npf = bp->b_error;
        else
        if (flag == CONT)
                npf = bp->b_error;
        else
-#endif
                npf = btop(bcr + bp->b_bcount);
        o = (int)bp->b_un.b_addr & PGOFSET;
        bn = dkblock(bp);
                npf = btop(bcr + bp->b_bcount);
        o = (int)bp->b_un.b_addr & PGOFSET;
        bn = dkblock(bp);
@@ -752,8 +726,7 @@ hpecc(mi, flag)
        cn += tn/st->ntrak;
        tn %= st->ntrak;
        switch (flag) {
        cn += tn/st->ntrak;
        tn %= st->ntrak;
        switch (flag) {
-       case ECC:
-               {
+       case ECC: {
                register int i;
                caddr_t addr;
                struct pte mpte;
                register int i;
                caddr_t addr;
                struct pte mpte;
@@ -786,7 +759,6 @@ hpecc(mi, flag)
                mbp->mba_bcr = -(bp->b_bcount - (int)ptob(npf));
                break;
 
                mbp->mba_bcr = -(bp->b_bcount - (int)ptob(npf));
                break;
 
-#ifndef NOBADSECT
        case BSE:
 #ifdef HPBDEBUG
                if (hpbdebug)
        case BSE:
 #ifdef HPBDEBUG
                if (hpbdebug)
@@ -819,7 +791,6 @@ hpecc(mi, flag)
                if ((mbp->mba_bcr & 0xffff) == 0)
                        return(0);
                break;
                if ((mbp->mba_bcr & 0xffff) == 0)
                        return(0);
                break;
-#endif
        }
        rp->hpcs1 = HP_DCLR|HP_GO;
        if (rp->hpof&HPOF_SSEI)
        }
        rp->hpcs1 = HP_DCLR|HP_GO;
        if (rp->hpof&HPOF_SSEI)