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

1.1       root        1: /*     up.c    4.1     11/9/80 */
                      2: 
                      3: #define        OLDUCODE
                      4: 
                      5: #include "../h/param.h"
                      6: #include "../h/inode.h"
                      7: #include "../h/pte.h"
                      8: #include "../h/uba.h"
                      9: #include "saio.h"
                     10: 
                     11: #define        EMULEX
                     12: #ifdef EMULEX
                     13: #define DELAY(N)       { register int d; d = N; while (--d > 0); }
                     14: #else
                     15: #define        DELAY(N)
                     16: #endif
                     17: 
                     18: struct upregs {
                     19:        short   upcs1;  /* Control and Status register 1 */
                     20:        short   upwc;   /* Word count register */
                     21:        short   upba;   /* UNIBUS address register */
                     22:        short   upda;   /* Desired address register */
                     23:        short   upcs2;  /* Control and Status register 2*/
                     24:        short   upds;   /* Drive Status */
                     25:        short   uper1;  /* Error register 1 */
                     26:        short   upas;   /* Attention Summary */
                     27:        short   upla;   /* Look ahead */
                     28:        short   updb;   /* Data buffer */
                     29:        short   upmr;   /* Maintenance register */
                     30:        short   updt;   /* Drive type */
                     31:        short   upsn;   /* Serial number */
                     32:        short   upof;   /* Offset register */
                     33:        short   upca;   /* Desired Cylinder address register*/
                     34:        short   upcc;   /* Current Cylinder */
                     35:        short   uper2;  /* Error register 2 */
                     36:        short   uper3;  /* Error register 3 */
                     37:        short   uppos;  /* Burst error bit position */
                     38:        short   uppat;  /* Burst error bit pattern */
                     39:        short   upbae;  /* 11/70 bus extension */
                     40: };
                     41: 
                     42: #ifdef OLDUCODE
                     43: #define        SDELAY  500
                     44: #else
                     45: #define        SDELAY  25
                     46: #endif
                     47: int    sdelay = SDELAY;
                     48: int    idelay = 500;
                     49: 
                     50: #define        UPADDR ((struct upregs *)(PHYSUMEM + 0776700 - UNIBASE))
                     51: 
                     52: /* Drive commands, placed in upcs1 */
                     53: #define        GO      01              /* Go bit, set in all commands */
                     54: #define        PRESET  020             /* Preset drive at init or after errors */
                     55: #define        OFFSET  014             /* Offset heads to try to recover error */
                     56: #define        RTC     016             /* Return to center-line after OFFSET */
                     57: #define        SEARCH  030             /* Search for cylinder+sector */
                     58: #define        SEEK    04              /* Seek to cylinder */
                     59: #define        RECAL   06              /* Recalibrate, needed after seek error */
                     60: #define        DCLR    010             /* Drive clear, after error */
                     61: #define        WCOM    060             /* Write */
                     62: #define        RCOM    070             /* Read */
                     63: 
                     64: /* Other bits of upcs1 */
                     65: #define        IE      0100            /* Controller wide interrupt enable */
                     66: #define        TRE     040000          /* Transfer error */
                     67: #define        RDY     0200            /* Transfer terminated */
                     68: 
                     69: /* Drive status bits of upds */
                     70: #define        PIP     020000          /* Positioning in progress */
                     71: #define        ERR     040000          /* Error has occurred, DCLR necessary */
                     72: #define        VV      0100            /* Volume is valid, set by PRESET */
                     73: #define        DPR     0400            /* Drive has been preset */
                     74: #define        MOL     010000          /* Drive is online, heads loaded, etc */
                     75: #define        DRY     0200            /* Drive ready */
                     76: 
                     77: /* Bits of upcs2 */
                     78: #define        CLR     040             /* Controller clear */
                     79: /* Bits of uper1 */
                     80: #define        DCK     0100000         /* Ecc error occurred */
                     81: #define        ECH     0100            /* Ecc error was unrecoverable */
                     82: #define        WLE     04000           /* Attempt to write read-only drive */
                     83: 
                     84: /* Bits of upof; the offset bits above are also in this register */
                     85: #define        FMT22   010000          /* 16 bits/word, must be always set */
                     86: 
                     87: struct devsize {
                     88:        daddr_t cyloff;
                     89: } up_sizes[] = {
                     90:        0, 27, 68, -1, -1, -1, -1, 82
                     91: };
                     92: 
                     93: upopen(io)
                     94: register struct iob *io;
                     95: {
                     96: 
                     97:        if (up_sizes[io->i_boff].cyloff == -1 ||
                     98:            io->i_boff < 0 || io->i_boff > 7)
                     99:                _stop("up bad unit");
                    100:        io->i_boff = up_sizes[io->i_boff].cyloff * 32 * 19;
                    101: }
                    102: 
                    103: upstrategy(io, func)
                    104: register struct iob *io;
                    105: {
                    106:        int unit, nspc, ns, cn, tn, sn;
                    107:        daddr_t bn;
                    108:        int info;
                    109:        register short *rp;
                    110:        int occ = io->i_cc;
                    111:        register struct upregs *upaddr = UPADDR;
                    112: 
                    113:        unit = io->i_unit;
                    114:        bn = io->i_bn;
                    115:        nspc = 32 * 19;
                    116:        ns = 32;
                    117:        cn = bn/nspc;
                    118:        sn = bn%nspc;
                    119:        tn = sn/ns;
                    120:        sn = sn%ns;
                    121:        upaddr->upcs2 = unit;
                    122:        DELAY(sdelay);
                    123:        if ((upaddr->upds & VV) == 0) {
                    124:                upaddr->upcs1 = DCLR|GO;
                    125:                DELAY(idelay);
                    126:                upaddr->upcs1 = PRESET|GO;
                    127:                DELAY(idelay);
                    128:                upaddr->upof = FMT22;
                    129:        }
                    130:        if ((upaddr->upds & (DPR|MOL)) != (DPR|MOL)) {
                    131:                printf("after fmt22 upds %o\n", upaddr->upds);
                    132:                _stop("up !DPR || !MOL");
                    133:        }
                    134:        info = ubasetup(io, 1);
                    135:        rp = (short *) &upaddr->upda;
                    136:        upaddr->upca = cn;
                    137:        *rp = (tn << 8) + sn;
                    138:        *--rp = info;
                    139:        *--rp = -io->i_cc / sizeof (short);
                    140:        if (func == READ)
                    141:                *--rp = GO|RCOM;
                    142:        else
                    143:                *--rp = GO|WCOM;
                    144:        DELAY(sdelay);
                    145:        do {
                    146:                DELAY(25);
                    147:        } while ((upaddr->upcs1 & RDY) == 0);
                    148:        DELAY(200);
                    149:        if (upaddr->upcs1&ERR) {
                    150:                printf("disk error: cyl=%d track=%d sect=%d cs1=%X, er1=%X\n",
                    151:                    cn, tn, sn,
                    152:                    upaddr->upcs1, upaddr->uper1);
                    153:                return (-1);
                    154:        }
                    155:        if (io->i_cc != occ)
                    156:                printf("returned %d\n", io->i_cc);
                    157:        ubafree(info);
                    158:        return (io->i_cc);
                    159: }

unix.superglobalmegacorp.com

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