almost working versions
[unix-history] / usr / src / sys / vax / uba / rk.c
index 5146e5b..2a98e83 100644 (file)
@@ -1,12 +1,12 @@
-/*     rk.c    4.    %G%     */
+/*     rk.c    4.11    %G%     */
 
 #include "rk.h"
 
 #include "rk.h"
-#if NRK11 > 0
-
-int    rkflags;
-int    rkerrs;
+#if NHK > 0
+int    rkflags,rkerrs;         /* GROT */
 /*
  * RK11/RK07 disk driver
 /*
  * RK11/RK07 disk driver
+ *
+ * This driver mimics up.c; see it for an explanation of common code.
  */
 #define        DELAY(i)                { register int j; j = i; while (--j > 0); }
 #include "../h/param.h"
  */
 #define        DELAY(i)                { register int j; j = i; while (--j > 0); }
 #include "../h/param.h"
@@ -30,7 +30,7 @@ struct        rk_softc {
        int     sc_ndrive;
        int     sc_wticks;
        int     sc_recal;
        int     sc_ndrive;
        int     sc_wticks;
        int     sc_recal;
-} rk_softc[NRK11];
+} rk_softc[NHK];
 
 /* THIS SHOULD BE READ OFF THE PACK, PER DRIVE */
 struct size
 
 /* THIS SHOULD BE READ OFF THE PACK, PER DRIVE */
 struct size
@@ -39,8 +39,8 @@ struct        size
        int     cyloff;
 } rk7_sizes[] ={
        15884,  0,              /* A=cyl 0 thru 240 */
        int     cyloff;
 } rk7_sizes[] ={
        15884,  0,              /* A=cyl 0 thru 240 */
-       10032,  146,            /* B=cyl 241 thru 392 */
-       53790,  246,            /* C=cyl 0 thru 814 */
+       10032,  241,            /* B=cyl 241 thru 392 */
+       53790,  0,              /* C=cyl 0 thru 814 */
        0,      0,
        0,      0,
        0,      0,
        0,      0,
        0,      0,
        0,      0,
@@ -50,15 +50,15 @@ struct      size
 /* END OF STUFF WHICH SHOULD BE READ IN PER DISK */
 
 int    rkprobe(), rkslave(), rkattach(), rkdgo(), rkintr();
 /* END OF STUFF WHICH SHOULD BE READ IN PER DISK */
 
 int    rkprobe(), rkslave(), rkattach(), rkdgo(), rkintr();
-struct uba_minfo *rkminfo[NRK11];
-struct uba_dinfo *rkdinfo[NRK07];
-struct uba_dinfo *rkip[NRK11][4];
+struct uba_minfo *rkminfo[NHK];
+struct uba_dinfo *rkdinfo[NRK];
+struct uba_dinfo *rkip[NHK][4];
 
 u_short        rkstd[] = { 0777440, 0 };
 struct uba_driver hkdriver =
 
 u_short        rkstd[] = { 0777440, 0 };
 struct uba_driver hkdriver =
 { rkprobe, rkslave, rkattach, rkdgo, rkstd, "rk", rkdinfo, "hk", rkminfo };
-struct buf rkutab[NRK07];
-short  rkcyl[NRK07];
{ rkprobe, rkslave, rkattach, rkdgo, rkstd, "rk", rkdinfo, "hk", rkminfo, 1 };
+struct buf rkutab[NRK];
+short  rkcyl[NRK];
 
 struct rkst {
        short   nsect;
 
 struct rkst {
        short   nsect;
@@ -73,7 +73,7 @@ struct        rkst {
 u_char         rk_offset[16] =
   { P400,M400,P400,M400,P800,M800,P800,M800,P1200,M1200,P1200,M1200,0,0,0,0 };
 
 u_char         rk_offset[16] =
   { P400,M400,P400,M400,P800,M800,P800,M800,P1200,M1200,P1200,M1200,0,0,0,0 };
 
-struct buf rrkbuf[NRK07];
+struct buf rrkbuf[NRK];
 
 #define        b_cylin b_resid
 
 
 #define        b_cylin b_resid
 
@@ -105,6 +105,9 @@ rkslave(ui, reg)
 
        rkaddr->rkcs1 = RK_CDT;
        rkaddr->rkcs2 = ui->ui_slave;
 
        rkaddr->rkcs1 = RK_CDT;
        rkaddr->rkcs2 = ui->ui_slave;
+       rkwait(rkaddr);
+/* SHOULD TRY THIS BY PULLING A PLUG */
+/* A DELAY OR SOMETHING MAY BE NEEDED */
        if (rkaddr->rkcs2&RK_NED) {
                rkaddr->rkcs1 = RK_CDT|RK_CCLR;
                return (0);
        if (rkaddr->rkcs2&RK_NED) {
                rkaddr->rkcs1 = RK_CDT|RK_CCLR;
                return (0);
@@ -139,7 +142,7 @@ rkstrategy(bp)
 
        sz = (bp->b_bcount+511) >> 9;
        unit = dkunit(bp);
 
        sz = (bp->b_bcount+511) >> 9;
        unit = dkunit(bp);
-       if (unit >= NRK07)
+       if (unit >= NRK)
                goto bad;
        ui = rkdinfo[unit];
        if (ui == 0 || ui->ui_alive == 0)
                goto bad;
        ui = rkdinfo[unit];
        if (ui == 0 || ui->ui_alive == 0)
@@ -312,21 +315,26 @@ hkintr(rk11)
                        u_short er = rkaddr->rker;
                        if (sc->sc_recal)
                                printf("recal CERR\n");
                        u_short er = rkaddr->rker;
                        if (sc->sc_recal)
                                printf("recal CERR\n");
-                       rkerrs++;
-                       if (rkflags&1)
-                       printf("%d ds %o cs2 %o er %o\n", um->um_tab.b_errcnt,
-                           ds, cs2, er);
+                       rkerrs++;                               /* GROT */
+                       if (rkflags&1)                          /* GROT */
+                       printf("%d ds %o cs2 %o er %o\n",       /* GROT */
+                           um->um_tab.b_errcnt, ds, cs2, er);  /* GROT */
                        if (er & RK_WLE)        
                                printf("rk%d is write locked\n", dkunit(bp));
                        if (er & RK_WLE)        
                                printf("rk%d is write locked\n", dkunit(bp));
+/* THIS DOESN'T SEEM TO HAPPEN */
+/* OR WAS SOMETHING BROKEN WHEN WE TRIED */
+/* SPINNING A DRIVE DOWN ? */
                        if (ds & RKDS_HARD)
                                printf("rk%d is down\n", dkunit(bp));
                        if (++um->um_tab.b_errcnt > 28 ||
                        if (ds & RKDS_HARD)
                                printf("rk%d is down\n", dkunit(bp));
                        if (++um->um_tab.b_errcnt > 28 ||
-                           ds&RKDS_HARD || er&RKER_HARD || cs2&RKCS2_HARD)
+                           ds&RKDS_HARD || er&RKER_HARD || cs2&RKCS2_HARD) {
                                bp->b_flags |= B_ERROR;
                                bp->b_flags |= B_ERROR;
-                       else
+                               harderr(bp);
+                               printf("rk%d cs2 %b ds %b er %b\n",
+                                   dkunit(bp), cs2, RKCS2_BITS, ds, 
+                                   RKDS_BITS, er, RKER_BITS);
+                       } else
                                um->um_tab.b_active = 0;
                                um->um_tab.b_active = 0;
-                       if (um->um_tab.b_errcnt > 27)
-                               deverror(bp, cs2, (ds<<8)|er);
                        if (cs2&RK_MDS) {
                                rkaddr->rkcs2 = RK_SCLR;
                                goto retry;
                        if (cs2&RK_MDS) {
                                rkaddr->rkcs2 = RK_SCLR;
                                goto retry;
@@ -396,7 +404,7 @@ rkread(dev)
 {
        register int unit = minor(dev) >> 3;
 
 {
        register int unit = minor(dev) >> 3;
 
-       if (unit >= NRK07)
+       if (unit >= NRK)
                u.u_error = ENXIO;
        else
                physio(rkstrategy, &rrkbuf[unit], dev, B_READ, minphys);
                u.u_error = ENXIO;
        else
                physio(rkstrategy, &rrkbuf[unit], dev, B_READ, minphys);
@@ -407,7 +415,7 @@ rkwrite(dev)
 {
        register int unit = minor(dev) >> 3;
 
 {
        register int unit = minor(dev) >> 3;
 
-       if (unit >= NRK07)
+       if (unit >= NRK)
                u.u_error = ENXIO;
        else
                physio(rkstrategy, &rrkbuf[unit], dev, B_WRITE, minphys);
                u.u_error = ENXIO;
        else
                physio(rkstrategy, &rrkbuf[unit], dev, B_WRITE, minphys);
@@ -438,6 +446,7 @@ rkecc(ui)
        }
        ubp->uba_dpr[(um->um_ubinfo>>28)&0x0f] |= UBA_BNE;
        i = rk->rkec1 - 1;              /* -1 makes 0 origin */
        }
        ubp->uba_dpr[(um->um_ubinfo>>28)&0x0f] |= UBA_BNE;
        i = rk->rkec1 - 1;              /* -1 makes 0 origin */
+       printf("mask %x pos %x\n", mask, i+1);
        bit = i&07;
        i = (i&~07)>>3;
        byte = i + o;
        bit = i&07;
        i = (i&~07)>>3;
        byte = i + o;
@@ -452,6 +461,9 @@ rkecc(ui)
        um->um_tab.b_active++;  /* Either complete or continuing... */
        if (rk->rkwc == 0)
                return (0);
        um->um_tab.b_active++;  /* Either complete or continuing... */
        if (rk->rkwc == 0)
                return (0);
+#ifdef notdef
+       rk->rkcs1 |= RK_GO;
+#else
        rk->rkcs1 = RK_CDT|RK_CCLR;
        rk->rkcs2 = ui->ui_slave;
        rk->rkcs1 = RK_CDT|RK_DCLR|RK_GO;
        rk->rkcs1 = RK_CDT|RK_CCLR;
        rk->rkcs2 = ui->ui_slave;
        rk->rkcs1 = RK_CDT|RK_DCLR|RK_GO;
@@ -471,14 +483,10 @@ rkecc(ui)
        cmd = (ubaddr >> 8) & 0x300;
        cmd |= RK_CDT|RK_IE|RK_GO|RK_READ;
        rk->rkcs1 = cmd;
        cmd = (ubaddr >> 8) & 0x300;
        cmd |= RK_CDT|RK_IE|RK_GO|RK_READ;
        rk->rkcs1 = cmd;
+#endif
        return (1);
 }
 
        return (1);
 }
 
-/*
- * Reset driver after UBA init.
- * Cancel software state of all pending transfers
- * and restart all units and the controller.
- */
 rkreset(uban)
 {
        register struct uba_minfo *um;
 rkreset(uban)
 {
        register struct uba_minfo *um;
@@ -486,7 +494,7 @@ rkreset(uban)
        register rk11, unit;
        int any = 0;
 
        register rk11, unit;
        int any = 0;
 
-       for (rk11 = 0; rk11 < NRK11; rk11++) {
+       for (rk11 = 0; rk11 < NHK; rk11++) {
                if ((um = rkminfo[rk11]) == 0 || um->um_ubanum != uban ||
                    um->um_alive == 0)
                        continue;
                if ((um = rkminfo[rk11]) == 0 || um->um_ubanum != uban ||
                    um->um_alive == 0)
                        continue;
@@ -501,9 +509,7 @@ rkreset(uban)
                        printf("<%d>", (um->um_ubinfo>>28)&0xf);
                        ubadone(um);
                }
                        printf("<%d>", (um->um_ubinfo>>28)&0xf);
                        ubadone(um);
                }
-               ((struct rkdevice *)(um->um_addr))->rkcs1 = RK_CDT|RK_CCLR;
-               rkwait((struct rkdevice *)(um->um_addr));
-               for (unit = 0; unit < NRK11; unit++) {
+               for (unit = 0; unit < NHK; unit++) {
                        if ((ui = rkdinfo[unit]) == 0)
                                continue;
                        if (ui->ui_alive == 0)
                        if ((ui = rkdinfo[unit]) == 0)
                                continue;
                        if (ui->ui_alive == 0)
@@ -515,12 +521,6 @@ rkreset(uban)
        }
 }
 
        }
 }
 
-/*
- * Wake up every second and if an interrupt is pending
- * but nothing has happened increment a counter.
- * If nothing happens for 20 seconds, reset the controller
- * and begin anew.
- */
 rkwatch()
 {
        register struct uba_minfo *um;
 rkwatch()
 {
        register struct uba_minfo *um;
@@ -528,15 +528,15 @@ rkwatch()
        register struct rk_softc *sc;
 
        timeout(rkwatch, (caddr_t)0, HZ);
        register struct rk_softc *sc;
 
        timeout(rkwatch, (caddr_t)0, HZ);
-       for (rk11 = 0; rk11 < NRK11; rk11++) {
+       for (rk11 = 0; rk11 < NHK; rk11++) {
                um = rkminfo[rk11];
                if (um == 0 || um->um_alive == 0)
                        continue;
                sc = &rk_softc[rk11];
                if (um->um_tab.b_active == 0) {
                um = rkminfo[rk11];
                if (um == 0 || um->um_alive == 0)
                        continue;
                sc = &rk_softc[rk11];
                if (um->um_tab.b_active == 0) {
-                       for (unit = 0; unit < NRK07; unit++)
-                               if (rkdinfo[unit]->ui_mi == um &&
-                                   rkutab[unit].b_active)
+                       for (unit = 0; unit < NRK; unit++)
+                               if (rkutab[unit].b_active &&
+                                   rkdinfo[unit]->ui_mi == um)
                                        goto active;
                        sc->sc_wticks = 0;
                        continue;
                                        goto active;
                        sc->sc_wticks = 0;
                        continue;
@@ -545,10 +545,8 @@ active:
                sc->sc_wticks++;
                if (sc->sc_wticks >= 20) {
                        sc->sc_wticks = 0;
                sc->sc_wticks++;
                if (sc->sc_wticks >= 20) {
                        sc->sc_wticks = 0;
-                       printf("LOST INTERRUPT RESET");
-                       /* SHOULD JUST RESET ONE CTLR, NOT ALL ON UBA */
-                       rkreset(um->um_ubanum);
-                       printf("\n");
+                       printf("LOST rkintr ");
+                       ubareset(um->um_ubanum);
                }
        }
 }
                }
        }
 }
@@ -568,7 +566,7 @@ rkdump(dev)
        struct rkst *st;
 
        unit = minor(dev) >> 3;
        struct rkst *st;
 
        unit = minor(dev) >> 3;
-       if (unit >= NRK07) {
+       if (unit >= NRK) {
                printf("bad unit\n");
                return (-1);
        }
                printf("bad unit\n");
                return (-1);
        }