BSD 4 release
[unix-history] / usr / src / sys / stand / up.c
index bf760d7..99b49fd 100644 (file)
@@ -1,3 +1,7 @@
+/*     up.c    4.1     11/9/80 */
+
+#define        OLDUCODE
+
 #include "../h/param.h"
 #include "../h/inode.h"
 #include "../h/pte.h"
 #include "../h/param.h"
 #include "../h/inode.h"
 #include "../h/pte.h"
@@ -35,35 +39,50 @@ struct upregs {
        short   upbae;  /* 11/70 bus extension */
 };
 
        short   upbae;  /* 11/70 bus extension */
 };
 
-#define        UPADDR ((struct upregs *)(PHYSUMEM + 0776700 - UNIBASE))
-char   up_openf;
+#ifdef OLDUCODE
+#define        SDELAY  500
+#else
+#define        SDELAY  25
+#endif
+int    sdelay = SDELAY;
+int    idelay = 500;
 
 
-/* Drive Commands */
-#define        GO      01
-#define        PRESET  020
-#define        RECAL   06
-#define        RCLR    010
-#define        OFFSET  014
-#define        RCOM    070
-#define        WCOM    060
+#define        UPADDR ((struct upregs *)(PHYSUMEM + 0776700 - UNIBASE))
 
 
-#define        IENABLE 0100
-#define        READY   0200            /* upds - drive ready */
-#define        PIP     020000          /* upds - Positioning Operation in Progress */
-#define        ERR     040000          /* upcs1 - composite error */
-#define        DRY     0200            /* upcs1 - drive ready */
+/* Drive commands, placed in upcs1 */
+#define        GO      01              /* Go bit, set in all commands */
+#define        PRESET  020             /* Preset drive at init or after errors */
+#define        OFFSET  014             /* Offset heads to try to recover error */
+#define        RTC     016             /* Return to center-line after OFFSET */
+#define        SEARCH  030             /* Search for cylinder+sector */
+#define        SEEK    04              /* Seek to cylinder */
+#define        RECAL   06              /* Recalibrate, needed after seek error */
+#define        DCLR    010             /* Drive clear, after error */
+#define        WCOM    060             /* Write */
+#define        RCOM    070             /* Read */
 
 
-#define        DTE     010000          /* uper1 - Drive Timing Error   */
-#define        OPI     020000          /* uper1 - Operation Incomplete */
-#define        DU      040000          /* uper1 - Drive Unsafe */
+/* Other bits of upcs1 */
+#define        IE      0100            /* Controller wide interrupt enable */
+#define        TRE     040000          /* Transfer error */
+#define        RDY     0200            /* Transfer terminated */
 
 
-/* Error Correction Code errors */
-#define        DCK     0100000         /* uper1 - Data Check error */
-#define        ECH     0100            /* uper1 - ECC hard error */
+/* Drive status bits of upds */
+#define        PIP     020000          /* Positioning in progress */
+#define        ERR     040000          /* Error has occurred, DCLR necessary */
+#define        VV      0100            /* Volume is valid, set by PRESET */
+#define        DPR     0400            /* Drive has been preset */
+#define        MOL     010000          /* Drive is online, heads loaded, etc */
+#define        DRY     0200            /* Drive ready */
 
 
-#define        CLR     040             /* upcs2 - Controller Clear */
+/* Bits of upcs2 */
+#define        CLR     040             /* Controller clear */
+/* Bits of uper1 */
+#define        DCK     0100000         /* Ecc error occurred */
+#define        ECH     0100            /* Ecc error was unrecoverable */
+#define        WLE     04000           /* Attempt to write read-only drive */
 
 
-#define        FMT22   010000          /* upof - 16 bit /word format */
+/* Bits of upof; the offset bits above are also in this register */
+#define        FMT22   010000          /* 16 bits/word, must be always set */
 
 struct devsize {
        daddr_t cyloff;
 
 struct devsize {
        daddr_t cyloff;
@@ -89,6 +108,7 @@ register struct iob *io;
        int info;
        register short *rp;
        int occ = io->i_cc;
        int info;
        register short *rp;
        int occ = io->i_cc;
+       register struct upregs *upaddr = UPADDR;
 
        unit = io->i_unit;
        bn = io->i_bn;
 
        unit = io->i_unit;
        bn = io->i_bn;
@@ -98,45 +118,42 @@ register struct iob *io;
        sn = bn%nspc;
        tn = sn/ns;
        sn = sn%ns;
        sn = bn%nspc;
        tn = sn/ns;
        sn = sn%ns;
-       if (!up_openf) {
-               up_openf++;
-               UPADDR->upcs2 = CLR;
-               DELAY(500);
-               UPADDR->upcs1 = RCLR|GO;
-               DELAY(500);
-               UPADDR->upcs1 = PRESET|GO;
-               DELAY(500);
-               UPADDR->upof = FMT22;
-               DELAY(500);
-               while ((UPADDR->upcs1 & DRY) == 0)
-                       DELAY(500);
+       upaddr->upcs2 = unit;
+       DELAY(sdelay);
+       if ((upaddr->upds & VV) == 0) {
+               upaddr->upcs1 = DCLR|GO;
+               DELAY(idelay);
+               upaddr->upcs1 = PRESET|GO;
+               DELAY(idelay);
+               upaddr->upof = FMT22;
+       }
+       if ((upaddr->upds & (DPR|MOL)) != (DPR|MOL)) {
+               printf("after fmt22 upds %o\n", upaddr->upds);
+               _stop("up !DPR || !MOL");
        }
        }
-       UPADDR->upcs2 = unit;
-       DELAY(500);
        info = ubasetup(io, 1);
        info = ubasetup(io, 1);
-       rp = (short *) &UPADDR->upda;
-       UPADDR->upca = cn;
+       rp = (short *) &upaddr->upda;
+       upaddr->upca = cn;
        *rp = (tn << 8) + sn;
        *--rp = info;
        *--rp = -io->i_cc / sizeof (short);
        *rp = (tn << 8) + sn;
        *--rp = info;
        *--rp = -io->i_cc / sizeof (short);
-       if (func == READ) {
+       if (func == READ)
                *--rp = GO|RCOM;
                *--rp = GO|RCOM;
-       } else {
+       else
                *--rp = GO|WCOM;
                *--rp = GO|WCOM;
-       }
-       DELAY(500);
+       DELAY(sdelay);
        do {
        do {
-               DELAY(200);
-       } while ((UPADDR->upcs1 & DRY) == 0);
+               DELAY(25);
+       } while ((upaddr->upcs1 & RDY) == 0);
        DELAY(200);
        DELAY(200);
-       if (UPADDR->upcs1&ERR) {
+       if (upaddr->upcs1&ERR) {
                printf("disk error: cyl=%d track=%d sect=%d cs1=%X, er1=%X\n",
                    cn, tn, sn,
                printf("disk error: cyl=%d track=%d sect=%d cs1=%X, er1=%X\n",
                    cn, tn, sn,
-                   UPADDR->upcs1, UPADDR->uper1);
+                   upaddr->upcs1, upaddr->uper1);
                return (-1);
        }
        if (io->i_cc != occ)
                return (-1);
        }
        if (io->i_cc != occ)
-       printf("returned %d\n", io->i_cc);
+               printf("returned %d\n", io->i_cc);
        ubafree(info);
        return (io->i_cc);
 }
        ubafree(info);
        return (io->i_cc);
 }