Annotation of 43BSDTahoe/sys/vaxstand/rk.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1982, 1986, 1988 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  *
                      6:  *     @(#)rk.c        7.7 (Berkeley) 7/9/88
                      7:  */
                      8: 
                      9: /*
                     10:  * RK611/RK07
                     11:  */
                     12: #include "param.h"
                     13: #include "inode.h"
                     14: #include "fs.h"
                     15: #include "disklabel.h"
                     16: 
                     17: #include "../vax/pte.h"
                     18: 
                     19: #include "../vaxuba/ubareg.h"
                     20: #include "../vaxuba/rkreg.h"
                     21: 
                     22: #include "saio.h"
                     23: #include "savax.h"
                     24: 
                     25: #define        SECTSIZ         512             /* sector size in bytes */
                     26: 
                     27: #define        MAXCTLR         1               /* all addresses must be specified */
                     28: #define        MAXUNIT         8
                     29: u_short        rkstd[MAXCTLR] = { 0777440 };
                     30: struct disklabel rklabel[MAXNUBA][MAXCTLR][MAXUNIT];
                     31: char   lbuf[SECTSIZ];
                     32: 
                     33: rkopen(io)
                     34:        register struct iob *io;
                     35: {
                     36:        register struct rkdevice *rkaddr;
                     37:        register struct disklabel *lp;
                     38:        struct iob tio;
                     39: 
                     40:        if ((u_int)io->i_adapt >= nuba)
                     41:                return (EADAPT);
                     42:        if ((u_int)io->i_ctlr >= MAXCTLR)
                     43:                return (ECTLR);
                     44:        if ((u_int)io->i_unit >= MAXUNIT)
                     45:                return (EUNIT);
                     46:        rkaddr = (struct rkdevice *)ubamem(io->i_adapt, rkstd[io->i_ctlr]);
                     47:        if (badaddr((char *)rkaddr, sizeof(short)))
                     48:                return (ENXIO);
                     49:        rkaddr->rkcs2 = RKCS2_SCLR;
                     50:        rkwait(rkaddr);
                     51:        /*
                     52:         * Read in the pack label.
                     53:         */
                     54:        lp = &rklabel[io->i_adapt][io->i_ctlr][io->i_unit];
                     55:        lp->d_nsectors = NRKSECT;
                     56:        lp->d_secpercyl = NRKTRK*NRKSECT;
                     57:        tio = *io;
                     58:        tio.i_bn = LABELSECTOR;
                     59:        tio.i_ma = lbuf;
                     60:        tio.i_cc = SECTSIZ;
                     61:        tio.i_flgs |= F_RDDATA;
                     62:        if (rkstrategy(&tio, READ) != SECTSIZ)
                     63:                return (ERDLAB);
                     64:        *lp = *(struct disklabel *)(lbuf + LABELOFFSET);
                     65:        if (lp->d_magic != DISKMAGIC || lp->d_magic2 != DISKMAGIC)
                     66: #ifdef COMPAT_42
                     67:        {
                     68:                printf("rk%d: unlabeled\n", io->i_unit);
                     69:                rkmaptype(io, lp);
                     70:        }
                     71: #else
                     72:                return (EUNLAB);
                     73: #endif
                     74:        if ((u_int)io->i_part >= lp->d_npartitions ||
                     75:            (io->i_boff = lp->d_partitions[io->i_part].p_offset) == -1)
                     76:                return (EPART);
                     77:        return (0);
                     78: }
                     79: 
                     80: #ifdef COMPAT_42
                     81: u_long rk_off[] = { 0, 241, 0, -1, -1, -1, 393, -1 };
                     82: 
                     83: rkmaptype(io, lp)
                     84:        struct iob *io;
                     85:        register struct disklabel *lp;
                     86: {
                     87:        register struct partition *pp;
                     88:        register u_long *off = rk_off;
                     89:        register int i;
                     90: 
                     91:        lp->d_npartitions = 8;
                     92:        pp = lp->d_partitions;
                     93:        for (i = 0; i < 8; i++, pp++)
                     94:                pp->p_offset = *off++;
                     95: }
                     96: #endif
                     97: 
                     98: rkstrategy(io, func)
                     99:        register struct iob *io;
                    100: {
                    101:        register struct rkdevice *rkaddr;
                    102:        register daddr_t bn;
                    103:        int com, ubinfo, errcnt = 0;
                    104:        short cn, sn, tn;
                    105: 
                    106:        rkaddr = (struct rkdevice *)ubamem(io->i_adapt, rkstd[io->i_ctlr]);
                    107: retry:
                    108:        ubinfo = ubasetup(io, 1);
                    109:        bn = io->i_bn;
                    110:        cn = bn / (NRKSECT*NRKTRK);
                    111:        sn = bn % NRKSECT;
                    112:        tn = (bn / NRKSECT) % NRKTRK;
                    113:        rkaddr->rkcs2 = io->i_unit;
                    114:        rkaddr->rkcs1 = RK_CDT|RK_PACK|RK_GO;
                    115:        rkwait(rkaddr);
                    116:        rkaddr->rkcs1 = RK_CDT|RK_DCLR|RK_GO;
                    117:        rkwait(rkaddr);
                    118:        rkaddr->rkda = sn | (tn << 8);
                    119:        rkaddr->rkcyl = cn;
                    120:        rkaddr->rkba = ubinfo;
                    121:        rkaddr->rkwc = -(io->i_cc >> 1);
                    122:        com = RK_CDT|((ubinfo>>8)&0x300)|RK_GO;
                    123:        if (func == READ)
                    124:                com |= RK_READ;
                    125:        else
                    126:                com |= RK_WRITE;
                    127:        rkaddr->rkcs1 = com;
                    128:        rkwait(rkaddr);
                    129:        while ((rkaddr->rkds & RKDS_SVAL) == 0)
                    130:                ;
                    131:        ubafree(io, ubinfo);
                    132:        if (rkaddr->rkcs1 & RK_CERR) {
                    133:                printf("rk error: (cyl,trk,sec)=(%d,%d,%d) cs2=%b er=%b\n",
                    134:                    cn, tn, sn, rkaddr->rkcs2, RKCS2_BITS,
                    135:                    rkaddr->rker, RKER_BITS);
                    136:                rkaddr->rkcs1 = RK_CDT|RK_DCLR|RK_GO;
                    137:                rkwait(rkaddr);
                    138:                if (errcnt++ == 10) {
                    139:                        printf("rk: unrecovered error\n");
                    140:                        return (-1);
                    141:                }
                    142:                goto retry;
                    143:        }
                    144:        if (errcnt)
                    145:                printf("rk: recovered by retry\n");
                    146:        return (io->i_cc);
                    147: }
                    148: 
                    149: rkwait(rkaddr)
                    150:        register struct rkdevice *rkaddr;
                    151: {
                    152:        while ((rkaddr->rkcs1 & RK_CRDY) == 0);
                    153: }

unix.superglobalmegacorp.com

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