change error recovery procedure when starting positioning rather than
authorMike Karels <karels@ucbvax.Berkeley.EDU>
Tue, 15 Oct 1985 10:06:59 +0000 (02:06 -0800)
committerMike Karels <karels@ucbvax.Berkeley.EDU>
Tue, 15 Oct 1985 10:06:59 +0000 (02:06 -0800)
retrying transfer (so attentions from other drives don't confuse us)

SCCS-vsn: sys/vax/mba/hp.c 6.15
SCCS-vsn: sys/vax/mba/mba.c 6.6
SCCS-vsn: sys/vax/mba/mbavar.h 6.3

usr/src/sys/vax/mba/hp.c
usr/src/sys/vax/mba/mba.c
usr/src/sys/vax/mba/mbavar.h

index b54b632..3160ea4 100644 (file)
@@ -3,7 +3,7 @@
  * All rights reserved.  The Berkeley software License Agreement
  * specifies the terms and conditions for redistribution.
  *
  * All rights reserved.  The Berkeley software License Agreement
  * specifies the terms and conditions for redistribution.
  *
- *     @(#)hp.c        6.14 (Berkeley) %G%
+ *     @(#)hp.c        6.15 (Berkeley) %G%
  */
 
 #ifdef HPDEBUG
  */
 
 #ifdef HPDEBUG
@@ -19,10 +19,7 @@ int  hpbdebug;
  * HP disk driver for RP0x+RMxx+ML11
  *
  * TODO:
  * HP disk driver for RP0x+RMxx+ML11
  *
  * TODO:
- *     check RM80 skip sector handling when ECC's occur later
- *     check offset recovery handling
  *     see if DCLR and/or RELEASE set attention status
  *     see if DCLR and/or RELEASE set attention status
- *     print bits of mr && mr2 symbolically
  */
 #include "../machine/pte.h"
 
  */
 #include "../machine/pte.h"
 
@@ -255,7 +252,7 @@ struct      hpsoftc {
        u_char  sc_hdr;         /* next i/o includes header */
        u_char  sc_doseeks;     /* perform explicit seeks */
        daddr_t sc_mlsize;      /* ML11 size */
        u_char  sc_hdr;         /* next i/o includes header */
        u_char  sc_doseeks;     /* perform explicit seeks */
        daddr_t sc_mlsize;      /* ML11 size */
-       int     sc_pgdone;      /* amount sucessfully transfered */
+       int     sc_blkdone;     /* amount sucessfully transfered */
        daddr_t sc_badbn;       /* replacement block number */
 } hpsoftc[NHP];
 
        daddr_t sc_badbn;       /* replacement block number */
 } hpsoftc[NHP];
 
@@ -490,6 +487,19 @@ hpustart(mi)
        hpaddr->hpcs1 = 0;
        if ((hpaddr->hpcs1&HP_DVA) == 0)
                return (MBU_BUSY);
        hpaddr->hpcs1 = 0;
        if ((hpaddr->hpcs1&HP_DVA) == 0)
                return (MBU_BUSY);
+
+       switch (sc->sc_recal) {
+
+       case 1:
+               HPWAIT(mi, hpaddr);
+               hpaddr->hpdc = bp->b_cylin;
+               hpaddr->hpcs1 = HP_SEEK|HP_GO;
+               sc->sc_recal++;
+               return (MBU_STARTED);
+       case 2:
+               break;
+       }
+       sc->sc_recal = 0;
        if ((hpaddr->hpds & HPDS_VV) == 0 || !sc->sc_hpinit) {
                struct buf *bbp = &bhpbuf[mi->mi_unit];
 
        if ((hpaddr->hpds & HPDS_VV) == 0 || !sc->sc_hpinit) {
                struct buf *bbp = &bhpbuf[mi->mi_unit];
 
@@ -513,8 +523,16 @@ hpustart(mi)
                        bp = bbp;
                }
        }
                        bp = bbp;
                }
        }
-       if (mi->mi_tab.b_active || mi->mi_hd->mh_ndrive == 1)
+       if (mi->mi_tab.b_active || mi->mi_hd->mh_ndrive == 1) {
+               if (mi->mi_tab.b_errcnt >= 16 && (bp->b_flags & B_READ)) {
+                       hpaddr->hpof =
+                           hp_offset[mi->mi_tab.b_errcnt & 017]|HPOF_FMT22;
+                       hpaddr->hpcs1 = HP_OFFSET|HP_GO;
+                       HPWAIT(mi, hpaddr);
+                       mbclrattn(mi);
+               }
                return (MBU_DODATA);
                return (MBU_DODATA);
+       }
        if (ML11)
                return (MBU_DODATA);
        if ((hpaddr->hpds & HPDS_DREADY) != HPDS_DREADY)
        if (ML11)
                return (MBU_DODATA);
        if ((hpaddr->hpds & HPDS_DREADY) != HPDS_DREADY)
@@ -551,20 +569,27 @@ hpstart(mi)
        register struct hpst *st = &hpst[mi->mi_type];
        struct hpsoftc *sc = &hpsoftc[mi->mi_unit];
        daddr_t bn;
        register struct hpst *st = &hpst[mi->mi_type];
        struct hpsoftc *sc = &hpsoftc[mi->mi_unit];
        daddr_t bn;
-       int sn, tn;
+       int sn, tn, cn;
 
 
-       if (bp->b_flags & B_BAD)
-               bn = sc->sc_badbn;
-       else
-               bn = bp->b_blkno + sc->sc_pgdone;
        if (ML11)
        if (ML11)
-               hpaddr->hpda = bn;
+               hpaddr->hpda = bp->b_blkno + sc->sc_blkdone;
        else {
        else {
-               sn = bn%st->nspc;
-               tn = sn/st->nsect;
+               if (bp->b_flags & B_BAD) {
+                       bn = sc->sc_badbn;
+                       cn = bn / st->nspc;
+               } else {
+                       bn = bp->b_blkno;
+                       cn = bp->b_cylin;
+               }
+               sn = bn % st->nspc;
+               if ((bp->b_flags & B_BAD) == 0)
+                       sn += sc->sc_blkdone;
+               tn = sn / st->nsect;
                sn %= st->nsect;
                sn %= st->nsect;
-               hpaddr->hpdc = bp->b_cylin;
+               cn += tn / st->ntrak;
+               tn %= st->ntrak;
                hpaddr->hpda = (tn << 8) + sn;
                hpaddr->hpda = (tn << 8) + sn;
+               hpaddr->hpdc = cn;
        }
        if (sc->sc_hdr) {
                if (bp->b_flags & B_READ)
        }
        if (sc->sc_hdr) {
                if (bp->b_flags & B_READ)
@@ -596,15 +621,14 @@ hpdtint(mi, mbsr)
                if (hpdebug) {
                        int dc = hpaddr->hpdc, da = hpaddr->hpda;
 
                if (hpdebug) {
                        int dc = hpaddr->hpdc, da = hpaddr->hpda;
 
-                       printf("hperr: bp %x cyl %d blk %d pgdone %d as %o ",
-                               bp, bp->b_cylin, bp->b_blkno, sc->sc_pgdone,
-                               hpaddr->hpas&0xff);
-                       printf("dc %x da %x\n",MASKREG(dc), MASKREG(da));
-                       printf("errcnt %d ", mi->mi_tab.b_errcnt);
-                       printf("mbsr=%b ", mbsr, mbsr_bits);
-                       printf("er1=%b er2=%b\n", MASKREG(er1), HPER1_BITS,
-                           MASKREG(er2), HPER2_BITS);
-                       DELAY(1000000);
+                       log(LOG_DEBUG,
+                   "hperr: bp %x cyl %d blk %d blkdone %d as %o dc %x da %x\n",
+                               bp, bp->b_cylin, bp->b_blkno, sc->sc_blkdone,
+                               hpaddr->hpas&0xff, MASKREG(dc), MASKREG(da));
+                       log(LOG_DEBUG, "errcnt %d mbsr=%b er1=%b er2=%b\n",
+                               mi->mi_tab.b_errcnt, mbsr, mbsr_bits,
+                               MASKREG(er1), HPER1_BITS,
+                               MASKREG(er2), HPER2_BITS);
                }
 #endif
                if (er1 & HPER1_HCRC) {
                }
 #endif
                if (er1 & HPER1_HCRC) {
@@ -629,7 +653,7 @@ hpdtint(mi, mbsr)
                                return (MBD_RESTARTED);
                        goto hard;
                } else if ((er1 & (HPER1_DCK | HPER1_ECH)) == HPER1_DCK &&
                                return (MBD_RESTARTED);
                        goto hard;
                } else if ((er1 & (HPER1_DCK | HPER1_ECH)) == HPER1_DCK &&
-                   mi->mi_tab.b_errcnt > 7) {
+                   mi->mi_tab.b_errcnt >= 3) {
                        if (hpecc(mi, ECC))
                                return (MBD_RESTARTED);
                        /* else done */
                        if (hpecc(mi, ECC))
                                return (MBD_RESTARTED);
                        /* else done */
@@ -660,10 +684,6 @@ hard:
                        printf("er1=%b er2=%b",
                            MASKREG(hpaddr->hper1), HPER1_BITS,
                            MASKREG(hpaddr->hper2), HPER2_BITS);
                        printf("er1=%b er2=%b",
                            MASKREG(hpaddr->hper1), HPER1_BITS,
                            MASKREG(hpaddr->hper2), HPER2_BITS);
-                       if (hpaddr->hpmr)
-                               printf(" mr=%o", MASKREG(hpaddr->hpmr));
-                       if (hpaddr->hpmr2)
-                               printf(" mr2=%o", MASKREG(hpaddr->hpmr2));
                        if (sc->sc_hdr)
                                printf(" (hdr i/o)");
                        printf("\n");
                        if (sc->sc_hdr)
                                printf(" (hdr i/o)");
                        printf("\n");
@@ -675,43 +695,22 @@ hard:
                if ((mi->mi_tab.b_errcnt & 07) == 4) {
                        hpaddr->hpcs1 = HP_RECAL|HP_GO;
                        sc->sc_recal = 1;
                if ((mi->mi_tab.b_errcnt & 07) == 4) {
                        hpaddr->hpcs1 = HP_RECAL|HP_GO;
                        sc->sc_recal = 1;
-                       return (MBD_RESTARTED);
+                       return (MBD_REPOSITION);
                }
        }
 #ifdef HPDEBUG
        else
                if (hpdebug && sc->sc_recal) {
                }
        }
 #ifdef HPDEBUG
        else
                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",
+                       log(LOG_DEBUG,
+                           "recal %d errcnt %d mbsr=%b er1=%b er2=%b\n",
+                           sc->sc_recal, mi->mi_tab.b_errcnt, mbsr, mbsr_bits,
                            hpaddr->hper1, HPER1_BITS,
                            hpaddr->hper2, HPER2_BITS);
                }
 #endif
        HPWAIT(mi, hpaddr);
                            hpaddr->hper1, HPER1_BITS,
                            hpaddr->hper2, HPER2_BITS);
                }
 #endif
        HPWAIT(mi, hpaddr);
-       switch (sc->sc_recal) {
-
-       case 1:
-               hpaddr->hpdc = bp->b_cylin;
-               hpaddr->hpcs1 = HP_SEEK|HP_GO;
-               sc->sc_recal++;
-               return (MBD_RESTARTED);
-       case 2:
-               retry = 1;
-               break;
-       }
-       sc->sc_recal = 0;
-       if (retry) {
-               if (mi->mi_tab.b_errcnt >= 16 && (bp->b_flags & B_READ)) {
-                       hpaddr->hpof =
-                           hp_offset[mi->mi_tab.b_errcnt & 017]|HPOF_FMT22;
-                       hpaddr->hpcs1 = HP_OFFSET|HP_GO;
-                       HPWAIT(mi, hpaddr);
-                       mbclrattn(mi);
-               }
+       if (retry)
                return (MBD_RETRY);
                return (MBD_RETRY);
-       }
        if (mi->mi_tab.b_errcnt >= 16) {
                /*
                 * This is fast and occurs rarely; we don't
        if (mi->mi_tab.b_errcnt >= 16) {
                /*
                 * This is fast and occurs rarely; we don't
@@ -721,10 +720,17 @@ hard:
                HPWAIT(mi, hpaddr);
                mbclrattn(mi);
        }
                HPWAIT(mi, hpaddr);
                mbclrattn(mi);
        }
+       if (mi->mi_tab.b_errcnt)
+               log(LOG_INFO, "hp%d%c: %d retries %sing sn%d\n",
+                   hpunit(bp->b_dev), 'a'+(minor(bp->b_dev)&07),
+                   mi->mi_tab.b_errcnt,
+                   (bp->b_flags & B_READ) ? "read" : "writ",
+                   (bp->b_flags & B_BAD) ?
+                   sc->sc_badbn : bp->b_blkno + sc->sc_blkdone);
        if ((bp->b_flags & B_BAD) && hpecc(mi, CONT))
                return (MBD_RESTARTED);
        sc->sc_hdr = 0;
        if ((bp->b_flags & B_BAD) && hpecc(mi, CONT))
                return (MBD_RESTARTED);
        sc->sc_hdr = 0;
-       sc->sc_pgdone = 0;
+       sc->sc_blkdone = 0;
        bp->b_resid = MASKREG(-mi->mi_mba->mba_bcr);
        if (!ML11) {
                hpaddr->hpof = HPOF_FMT22;
        bp->b_resid = MASKREG(-mi->mi_mba->mba_bcr);
        if (!ML11) {
                hpaddr->hpof = HPOF_FMT22;
@@ -864,7 +870,7 @@ hpecc(mi, flag)
                        sn++;
 #ifdef HPBDEBUG
                if (hpbdebug)
                        sn++;
 #ifdef HPBDEBUG
                if (hpbdebug)
-               printf("hpecc, BSE: bn %d cn %d tn %d sn %d\n", bn, cn, tn, sn);
+               log(LOG_DEBUG, "hpecc, BSE: bn %d cn %d tn %d sn %d\n", bn, cn, tn, sn);
 #endif
                if (bp->b_flags & B_BAD)
                        return (0);
 #endif
                if (bp->b_flags & B_BAD)
                        return (0);
@@ -883,14 +889,14 @@ hpecc(mi, flag)
                mbp->mba_bcr = -(min(512, bp->b_bcount - (int)ptob(npf)));
 #ifdef HPBDEBUG
                if (hpbdebug)
                mbp->mba_bcr = -(min(512, bp->b_bcount - (int)ptob(npf)));
 #ifdef HPBDEBUG
                if (hpbdebug)
-               printf("revector to cn %d tn %d sn %d\n", cn, tn, sn);
+               log(LOG_DEBUG, "revector to cn %d tn %d sn %d\n", cn, tn, sn);
 #endif
                break;
 
        case CONT:
 #ifdef HPBDEBUG
                if (hpbdebug)
 #endif
                break;
 
        case CONT:
 #ifdef HPBDEBUG
                if (hpbdebug)
-               printf("hpecc, CONT: bn %d cn %d tn %d sn %d\n", bn,cn,tn,sn);
+               log(LOG_DEBUG, "hpecc, CONT: bn %d cn %d tn %d sn %d\n", bn,cn,tn,sn);
 #endif
                bp->b_flags &= ~B_BAD;
                if ((int)ptob(npf) >= bp->b_bcount)
 #endif
                bp->b_flags &= ~B_BAD;
                if ((int)ptob(npf) >= bp->b_bcount)
@@ -907,7 +913,7 @@ hpecc(mi, flag)
        mbp->mba_var = (int)ptob(npf) + o;
        rp->hpcs1 = bp->b_flags&B_READ ? HP_RCOM|HP_GO : HP_WCOM|HP_GO;
        mi->mi_tab.b_errcnt = 0;        /* error has been corrected */
        mbp->mba_var = (int)ptob(npf) + o;
        rp->hpcs1 = bp->b_flags&B_READ ? HP_RCOM|HP_GO : HP_WCOM|HP_GO;
        mi->mi_tab.b_errcnt = 0;        /* error has been corrected */
-       sc->sc_pgdone = npf;
+       sc->sc_blkdone = npf;
        return (1);
 }
 
        return (1);
 }
 
index 8765853..17cfe62 100644 (file)
@@ -3,7 +3,7 @@
  * All rights reserved.  The Berkeley software License Agreement
  * specifies the terms and conditions for redistribution.
  *
  * All rights reserved.  The Berkeley software License Agreement
  * specifies the terms and conditions for redistribution.
  *
- *     @(#)mba.c       6.5 (Berkeley) %G%
+ *     @(#)mba.c       6.6 (Berkeley) %G%
  */
 
 #include "mba.h"
  */
 
 #include "mba.h"
@@ -55,20 +55,6 @@ loop:
        bp = mi->mi_tab.b_actf;
        if (bp == NULL)
                return;
        bp = mi->mi_tab.b_actf;
        if (bp == NULL)
                return;
-       /*
-        * Make sure the drive is still there before starting it up.
-        */
-       if ((mi->mi_drv->mbd_dt & MBDT_TYPE) == 0) {
-               printf("%s%d: nonexistent\n", mi->mi_driver->md_dname,
-                   mbunit(bp->b_dev));
-               mi->mi_alive = 0;
-               mi->mi_tab.b_actf = bp->av_forw;
-               mi->mi_tab.b_active = 0;
-               mi->mi_tab.b_errcnt = 0;
-               bp->b_flags |= B_ERROR;
-               iodone(bp);
-               goto loop;
-       }
        /*
         * Let the drivers unit start routine have at it
         * and then process the request further, per its instructions.
        /*
         * Let the drivers unit start routine have at it
         * and then process the request further, per its instructions.
@@ -289,7 +275,16 @@ mbintr(mbanum)
                                mbustart(mi);
                        break;
 
                                mbustart(mi);
                        break;
 
-               case MBD_RESTARTED:     /* driver restarted op (ecc, e.g.)
+               case MBD_REPOSITION:    /* driver started repositioning */
+                       /*
+                        * Drive is repositioning, not doing data transfer.
+                        * Free controller, but don't have to restart drive.
+                        */
+                       mhp->mh_active = 0;
+                       mhp->mh_actf = mi->mi_forw;
+                       break;
+
+               case MBD_RESTARTED:     /* driver restarted op (ecc, e.g.) */
                        /*
                         * Note that mhp->mh_active is still on.
                         */
                        /*
                         * Note that mhp->mh_active is still on.
                         */
index 72b881e..7e6a4d5 100644 (file)
@@ -3,7 +3,7 @@
  * All rights reserved.  The Berkeley software License Agreement
  * specifies the terms and conditions for redistribution.
  *
  * All rights reserved.  The Berkeley software License Agreement
  * specifies the terms and conditions for redistribution.
  *
- *     @(#)mbavar.h    6.2 (Berkeley) %G%
+ *     @(#)mbavar.h    6.3 (Berkeley) %G%
  */
 
 /*
  */
 
 /*
@@ -114,6 +114,7 @@ struct mba_driver {
 #define        MBD_DONE        0               /* data transfer complete */
 #define        MBD_RETRY       1               /* error occurred, please retry */
 #define        MBD_RESTARTED   2               /* driver restarted i/o itself */
 #define        MBD_DONE        0               /* data transfer complete */
 #define        MBD_RETRY       1               /* error occurred, please retry */
 #define        MBD_RESTARTED   2               /* driver restarted i/o itself */
+#define        MBD_REPOSITION  3               /* driver started unit, not transfer */
 
 /*
  * Possible return values from non-data-transfer interrupt handling routines
 
 /*
  * Possible return values from non-data-transfer interrupt handling routines