Annotation of 3BSD/sys/stand/up.c, revision 1.1.1.1

1.1       root        1: #include "../h/param.h"
                      2: #include "../h/inode.h"
                      3: #include "../h/pte.h"
                      4: #include "../h/uba.h"
                      5: #include "saio.h"
                      6: 
                      7: #define        EMULEX
                      8: #ifdef EMULEX
                      9: #define DELAY(N)       { register int d; d = N; while (--d > 0); }
                     10: #else
                     11: #define        DELAY(N)
                     12: #endif
                     13: 
                     14: struct upregs {
                     15:        short   upcs1;  /* Control and Status register 1 */
                     16:        short   upwc;   /* Word count register */
                     17:        short   upba;   /* UNIBUS address register */
                     18:        short   upda;   /* Desired address register */
                     19:        short   upcs2;  /* Control and Status register 2*/
                     20:        short   upds;   /* Drive Status */
                     21:        short   uper1;  /* Error register 1 */
                     22:        short   upas;   /* Attention Summary */
                     23:        short   upla;   /* Look ahead */
                     24:        short   updb;   /* Data buffer */
                     25:        short   upmr;   /* Maintenance register */
                     26:        short   updt;   /* Drive type */
                     27:        short   upsn;   /* Serial number */
                     28:        short   upof;   /* Offset register */
                     29:        short   upca;   /* Desired Cylinder address register*/
                     30:        short   upcc;   /* Current Cylinder */
                     31:        short   uper2;  /* Error register 2 */
                     32:        short   uper3;  /* Error register 3 */
                     33:        short   uppos;  /* Burst error bit position */
                     34:        short   uppat;  /* Burst error bit pattern */
                     35:        short   upbae;  /* 11/70 bus extension */
                     36: };
                     37: 
                     38: #define        UPADDR ((struct upregs *)(PHYSUMEM + 0776700 - UNIBASE))
                     39: char   up_openf;
                     40: 
                     41: /* Drive Commands */
                     42: #define        GO      01
                     43: #define        PRESET  020
                     44: #define        RECAL   06
                     45: #define        RCLR    010
                     46: #define        OFFSET  014
                     47: #define        RCOM    070
                     48: #define        WCOM    060
                     49: 
                     50: #define        IENABLE 0100
                     51: #define        READY   0200            /* upds - drive ready */
                     52: #define        PIP     020000          /* upds - Positioning Operation in Progress */
                     53: #define        ERR     040000          /* upcs1 - composite error */
                     54: #define        DRY     0200            /* upcs1 - drive ready */
                     55: 
                     56: #define        DTE     010000          /* uper1 - Drive Timing Error   */
                     57: #define        OPI     020000          /* uper1 - Operation Incomplete */
                     58: #define        DU      040000          /* uper1 - Drive Unsafe */
                     59: 
                     60: /* Error Correction Code errors */
                     61: #define        DCK     0100000         /* uper1 - Data Check error */
                     62: #define        ECH     0100            /* uper1 - ECC hard error */
                     63: 
                     64: #define        CLR     040             /* upcs2 - Controller Clear */
                     65: 
                     66: #define        FMT22   010000          /* upof - 16 bit /word format */
                     67: 
                     68: struct devsize {
                     69:        daddr_t cyloff;
                     70: } up_sizes[] = {
                     71:        0, 27, 68, -1, -1, -1, -1, 82
                     72: };
                     73: 
                     74: upopen(io)
                     75: register struct iob *io;
                     76: {
                     77: 
                     78:        if (up_sizes[io->i_boff].cyloff == -1 ||
                     79:            io->i_boff < 0 || io->i_boff > 7)
                     80:                _stop("up bad unit");
                     81:        io->i_boff = up_sizes[io->i_boff].cyloff * 32 * 19;
                     82: }
                     83: 
                     84: upstrategy(io, func)
                     85: register struct iob *io;
                     86: {
                     87:        int unit, nspc, ns, cn, tn, sn;
                     88:        daddr_t bn;
                     89:        int info;
                     90:        register short *rp;
                     91:        int occ = io->i_cc;
                     92: 
                     93:        unit = io->i_unit;
                     94:        bn = io->i_bn;
                     95:        nspc = 32 * 19;
                     96:        ns = 32;
                     97:        cn = bn/nspc;
                     98:        sn = bn%nspc;
                     99:        tn = sn/ns;
                    100:        sn = sn%ns;
                    101:        if (!up_openf) {
                    102:                up_openf++;
                    103:                UPADDR->upcs2 = CLR;
                    104:                DELAY(500);
                    105:                UPADDR->upcs1 = RCLR|GO;
                    106:                DELAY(500);
                    107:                UPADDR->upcs1 = PRESET|GO;
                    108:                DELAY(500);
                    109:                UPADDR->upof = FMT22;
                    110:                DELAY(500);
                    111:                while ((UPADDR->upcs1 & DRY) == 0)
                    112:                        DELAY(500);
                    113:        }
                    114:        UPADDR->upcs2 = unit;
                    115:        DELAY(500);
                    116:        info = ubasetup(io, 1);
                    117:        rp = (short *) &UPADDR->upda;
                    118:        UPADDR->upca = cn;
                    119:        *rp = (tn << 8) + sn;
                    120:        *--rp = info;
                    121:        *--rp = -io->i_cc / sizeof (short);
                    122:        if (func == READ) {
                    123:                *--rp = GO|RCOM;
                    124:        } else {
                    125:                *--rp = GO|WCOM;
                    126:        }
                    127:        DELAY(500);
                    128:        do {
                    129:                DELAY(200);
                    130:        } while ((UPADDR->upcs1 & DRY) == 0);
                    131:        DELAY(200);
                    132:        if (UPADDR->upcs1&ERR) {
                    133:                printf("disk error: cyl=%d track=%d sect=%d cs1=%X, er1=%X\n",
                    134:                    cn, tn, sn,
                    135:                    UPADDR->upcs1, UPADDR->uper1);
                    136:                return (-1);
                    137:        }
                    138:        if (io->i_cc != occ)
                    139:        printf("returned %d\n", io->i_cc);
                    140:        ubafree(info);
                    141:        return (io->i_cc);
                    142: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.