Annotation of 43BSDTahoe/sys/vaxstand/hp.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1982, 1986 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:  *     @(#)hp.c        7.10 (Berkeley) 7/8/88
        !             7:  */
        !             8: 
        !             9: /*
        !            10:  * RP??/RM?? disk driver with ECC handling and bad block forwarding.
        !            11:  * Also supports header io operations and commands to write check
        !            12:  * header and data.
        !            13:  */
        !            14: #include "param.h"
        !            15: #include "inode.h"
        !            16: #include "fs.h"
        !            17: #include "dkbad.h"
        !            18: #include "disklabel.h"
        !            19: 
        !            20: #include "../vax/pte.h"
        !            21: 
        !            22: #include "../vaxmba/hpreg.h"
        !            23: #include "../vaxmba/mbareg.h"
        !            24: 
        !            25: #include "saio.h"
        !            26: #include "savax.h"
        !            27: 
        !            28: #define        RETRIES         27
        !            29: 
        !            30: #define        MASKREG(reg)    ((reg)&0xffff)
        !            31: 
        !            32: #define        MAXBADDESC      126
        !            33: #define        SECTSIZ         512     /* sector size in bytes */
        !            34: #define        HDRSIZ          4       /* number of bytes in sector header */
        !            35: 
        !            36: char   lbuf[SECTSIZ];
        !            37: 
        !            38: #define        RP06(type) ((type) == MBDT_RP06 || (type) == MBDT_RP05 \
        !            39:        || (type) == MBDT_RP04)
        !            40: #define        ML11(type) ((type) == MBDT_ML11A)
        !            41: #define        RM80(type) ((type) == MBDT_RM80)
        !            42: 
        !            43: u_char hp_offset[16] = {
        !            44:        HPOF_P400, HPOF_M400, HPOF_P400, HPOF_M400,
        !            45:        HPOF_P800, HPOF_M800, HPOF_P800, HPOF_M800,
        !            46:        HPOF_P1200, HPOF_M1200, HPOF_P1200, HPOF_M1200,
        !            47:        0, 0, 0, 0,
        !            48: };
        !            49: 
        !            50: #define        MAXUNIT         8
        !            51: struct disklabel hplabel[MAXNMBA][MAXUNIT];
        !            52: #ifndef SMALL
        !            53: struct dkbad hpbad[MAXNMBA][MAXUNIT];
        !            54: int    sectsiz;
        !            55: #endif
        !            56: 
        !            57: struct hp_softc {
        !            58:        char    type;
        !            59:        char    gottype;
        !            60:        char    ssect;                  /* 1 when on track w/skip sector */
        !            61:        char    debug;
        !            62: #      define  HPF_BSEDEBUG    01      /* debugging bad sector forwarding */
        !            63: #      define  HPF_ECCDEBUG    02      /* debugging ecc correction */
        !            64:        int     ecclim;
        !            65:        int     retries;
        !            66: } hp_softc[MAXNMBA][MAXUNIT];
        !            67: 
        !            68: /*
        !            69:  * When awaiting command completion, don't hang on to the status register
        !            70:  * since this ties up some controllers.
        !            71:  */
        !            72: #define        HPWAIT(addr) \
        !            73:        while ((((addr)->hpds)&HPDS_DRY) == 0) \
        !            74:                DELAY(500);
        !            75: 
        !            76: hpopen(io)
        !            77:        register struct iob *io;
        !            78: {
        !            79:        register unit = io->i_unit;
        !            80:        register struct hp_softc *sc;
        !            81:        register struct disklabel *lp;
        !            82:        struct hpdevice *hpaddr;
        !            83:        struct disklabel *dlp;
        !            84:        int error = 0;
        !            85: 
        !            86:        /*
        !            87:         * Accept adaptor number as either controller or adaptor,
        !            88:         * but not both.
        !            89:         */
        !            90:        if (io->i_ctlr) {
        !            91:                if (io->i_adapt == 0)
        !            92:                        io->i_adapt = io->i_ctlr;
        !            93:                else
        !            94:                        return (ECTLR);
        !            95:        }
        !            96:        if ((u_int)io->i_adapt >= MAXNMBA || !mbainit(io->i_adapt))
        !            97:                return (EADAPT);
        !            98:        if ((u_int)unit >= MAXUNIT)
        !            99:                return (EUNIT);
        !           100:        hpaddr = (struct hpdevice *)mbadrv(io->i_adapt, unit);
        !           101:        sc = &hp_softc[io->i_adapt][unit];
        !           102:        lp = &hplabel[io->i_adapt][unit];
        !           103:        if (sc->gottype == 0) {
        !           104:                register int i;
        !           105:                struct iob tio;
        !           106: 
        !           107: #ifndef SMALL
        !           108:                sc->retries = RETRIES;
        !           109:                sc->ecclim = 11;
        !           110:                sc->debug = 0;
        !           111: #endif
        !           112:                hpaddr->hpcs1 = HP_DCLR|HP_GO;          /* init drive */
        !           113:                hpaddr->hpcs1 = HP_PRESET|HP_GO;
        !           114: #ifndef SMALL
        !           115:                if ((hpaddr->hpds & HPDS_DPR) == 0)
        !           116:                        return (ENXIO);
        !           117:                sc->type = hpaddr->hpdt & MBDT_TYPE;
        !           118:                if (sc->type == MBDT_ML11B)
        !           119:                        sc->type = MBDT_ML11A;
        !           120:                if (!ML11(sc->type))
        !           121: #endif
        !           122:                        hpaddr->hpof = HPOF_FMT22;
        !           123:                /*
        !           124:                 * Read in the pack label.
        !           125:                 */
        !           126:                lp->d_nsectors = 32;
        !           127:                lp->d_secpercyl = 20*32;
        !           128:                tio = *io;
        !           129:                tio.i_bn = LABELSECTOR;
        !           130:                tio.i_ma = lbuf;
        !           131:                tio.i_cc = SECTSIZ;
        !           132:                tio.i_flgs |= F_RDDATA;
        !           133:                if (hpstrategy(&tio, READ) != SECTSIZ)
        !           134:                        error = ERDLAB;
        !           135:                dlp = (struct disklabel *)(lbuf + LABELOFFSET);
        !           136:                if (error == 0 && (dlp->d_magic != DISKMAGIC ||
        !           137:                    dlp->d_magic2 != DISKMAGIC))
        !           138:                        error = EUNLAB;
        !           139:                if (error == 0)
        !           140:                        *lp = *dlp;
        !           141:                else
        !           142: #ifdef COMPAT_42
        !           143:                    if (hpmaptype(hpaddr, hpaddr->hpdt & MBDT_TYPE, unit, lp) == 0)
        !           144: #endif
        !           145:                        return (error);
        !           146: 
        !           147: #ifndef SMALL
        !           148:                /*
        !           149:                 * Read in the bad sector table.
        !           150:                 */
        !           151:                tio.i_bn = lp->d_secpercyl * lp->d_ncylinders - lp->d_nsectors;
        !           152:                tio.i_ma = (char *)&hpbad[io->i_adapt][unit];
        !           153:                tio.i_cc = sizeof(struct dkbad);
        !           154:                for (i = 0; i < 5; i++) {
        !           155:                        if (hpstrategy(&tio, READ) == sizeof(struct dkbad))
        !           156:                                break;
        !           157:                        tio.i_bn += 2;
        !           158:                }
        !           159:                if (i == 5) {
        !           160:                        printf("hp: can't read bad sector table\n");
        !           161:                        for (i = 0; i < MAXBADDESC; i++) {
        !           162:                                hpbad[io->i_adapt][unit].bt_bad[i].bt_cyl = -1;
        !           163:                                hpbad[io->i_adapt][unit].bt_bad[i].bt_trksec = -1;
        !           164:                        }
        !           165:                }
        !           166: #endif
        !           167:                sc->gottype = 1;
        !           168:        }
        !           169:        if (io->i_part >= lp->d_npartitions ||
        !           170:            lp->d_partitions[io->i_part].p_size == 0)
        !           171:                return (EPART);
        !           172:        io->i_boff = lp->d_partitions[io->i_part].p_offset;
        !           173:        return (0);
        !           174: }
        !           175: 
        !           176: hpstrategy(io, func)
        !           177:        register struct iob *io;
        !           178: {
        !           179:        register int unit = io->i_unit;
        !           180:        register struct hp_softc *sc;
        !           181:        register struct disklabel *lp;
        !           182:        struct mba_regs *mba;
        !           183:        struct hpdevice *hpaddr;
        !           184:        daddr_t bn, startblock;
        !           185:        int cn, tn, sn, bytecnt, bytesleft, rv;
        !           186:        int er1, er2, hprecal;
        !           187:        char *membase;
        !           188: 
        !           189:        mba = mbamba(io->i_adapt);
        !           190:        hpaddr = (struct hpdevice *)mbadrv(io->i_adapt, unit);
        !           191:        sc = &hp_softc[io->i_adapt][unit];
        !           192:        lp = &hplabel[io->i_adapt][unit];
        !           193: #ifndef SMALL
        !           194:        sectsiz = SECTSIZ;
        !           195:        if ((io->i_flgs & (F_HDR|F_HCHECK)) != 0)
        !           196:                sectsiz += HDRSIZ;
        !           197:        if ((hpaddr->hpds & HPDS_VV) == 0) {
        !           198:                hpaddr->hpcs1 = HP_DCLR|HP_GO;
        !           199:                hpaddr->hpcs1 = HP_PRESET|HP_GO;
        !           200:                if (!ML11(sc->type))
        !           201:                        hpaddr->hpof = HPOF_FMT22;
        !           202:        }
        !           203:        io->i_errcnt = 0;
        !           204:        sc->ssect = 0;
        !           205:        rv = bytecnt = io->i_cc;
        !           206:        membase = io->i_ma;
        !           207:        startblock = io->i_bn;
        !           208:        hprecal = 0;
        !           209: #endif
        !           210: 
        !           211: restart:
        !           212:        bn = io->i_bn;
        !           213:        cn = bn / lp->d_secpercyl;
        !           214:        sn = bn % lp->d_secpercyl;
        !           215:        tn = sn / lp->d_nsectors;
        !           216:        sn = sn % lp->d_nsectors + sc->ssect;
        !           217: 
        !           218:        HPWAIT(hpaddr);
        !           219:        mba->mba_sr = -1;
        !           220:        if (ML11(sc->type))
        !           221:                hpaddr->hpda = bn;
        !           222:        else {
        !           223:                hpaddr->hpdc = cn;
        !           224:                hpaddr->hpda = (tn << 8) + sn;
        !           225:        }
        !           226: #ifdef SMALL
        !           227:        mbastart(io, io->i_unit, func);         /* start transfer */
        !           228:        HPWAIT(hpaddr);
        !           229:        if (hpaddr->hpds & HPDS_ERR) {
        !           230:                printf("hp error: sn [%d-%d) ds=%b er1=%b\n",
        !           231:                    bn, bn + io->i_cc/SECTSIZ, MASKREG(hpaddr->hpds), HPDS_BITS,
        !           232:                    MASKREG(hpaddr->hper1), HPER1_BITS);
        !           233:                return (-1);
        !           234:        }
        !           235:        return (io->i_cc);
        !           236: #else
        !           237:        if (mbastart(io, io->i_unit, func) != 0) {      /* start transfer */
        !           238:                rv = -1;
        !           239:                goto done;
        !           240:        }
        !           241:        HPWAIT(hpaddr);
        !           242:        /*
        !           243:         * Successful data transfer, return.
        !           244:         */
        !           245:        if ((hpaddr->hpds&HPDS_ERR) == 0 && (mba->mba_sr&MBSR_EBITS) == 0)
        !           246:                goto done;
        !           247: 
        !           248:        /*
        !           249:         * Error handling.  Calculate location of error.
        !           250:         */
        !           251:        bytesleft = MASKREG(mba->mba_bcr);
        !           252:        if (bytesleft) 
        !           253:                bytesleft |= 0xffff0000;        /* sxt */
        !           254:        bn = io->i_bn + (io->i_cc + bytesleft) / sectsiz;
        !           255:        er1 = MASKREG(hpaddr->hper1);
        !           256:        er2 = MASKREG(hpaddr->hper2);
        !           257:        if (er1 & (HPER1_DCK|HPER1_ECH))
        !           258:                bn--;   /* Error is in Prev block */
        !           259:        cn = bn/lp->d_secpercyl;
        !           260:        sn = bn%lp->d_secpercyl;
        !           261:        tn = sn/lp->d_nsectors;
        !           262:        sn = sn%lp->d_nsectors;
        !           263:        if (sc->debug & (HPF_ECCDEBUG|HPF_BSEDEBUG)) {
        !           264:                printf("hp error: sn%d (cyl,trk,sec)=(%d,%d,%d) ds=%b\n",
        !           265:                        bn, cn, tn, sn, MASKREG(hpaddr->hpds), HPDS_BITS);
        !           266:                printf("er1=%b er2=%b\n", er1, HPER1_BITS, er2, HPER2_BITS);
        !           267:                printf("bytes left: %d, of 0x%x, da 0x%x\n",-bytesleft,
        !           268:                        hpaddr->hpof, hpaddr->hpda);
        !           269:        }
        !           270:        if (er1 & HPER1_HCRC) {
        !           271:                er1 &= ~(HPER1_HCE|HPER1_FER);
        !           272:                er2 &= ~HPER2_BSE;
        !           273:                if ((io->i_flgs&F_NBSF) == 0 && hpecc(io, BSE) == 0)
        !           274:                        goto success;
        !           275:        }
        !           276:        /*
        !           277:         * Give up early if drive write locked.
        !           278:         */
        !           279:        if (er1&HPER1_WLE) {
        !           280:                printf("hp%d: write locked\n", unit);
        !           281:                rv = -1;
        !           282:                goto done;
        !           283:        }
        !           284:        /*
        !           285:         * Skip sector handling.
        !           286:         */
        !           287:        if (RM80(sc->type) && (er2 & HPER2_SSE)) {
        !           288:                (void) hpecc(io, SSE);
        !           289:                sc->ssect = 1;
        !           290:                goto restart;
        !           291:        }
        !           292:        /*
        !           293:         * Attempt to forward bad sectors on anything but an ML11.
        !           294:         * Interpret format error bit as a bad block on RP06's.
        !           295:         */
        !           296:        if (((er2 & HPER2_BSE) && !ML11(sc->type)) ||
        !           297:            (MASKREG(er1) == HPER1_FER && RP06(sc->type))) {
        !           298:                if (io->i_flgs & F_NBSF) {
        !           299:                        io->i_error = EBSE;
        !           300:                        goto hard;
        !           301:                }
        !           302:                if (hpecc(io, BSE) == 0)
        !           303:                        goto success;
        !           304:                io->i_error = EBSE;
        !           305:                goto hard;
        !           306:        }
        !           307:        /*
        !           308:         * ECC correction?
        !           309:         */
        !           310:        if ((er1 & (HPER1_DCK|HPER1_ECH)) == HPER1_DCK) {
        !           311:                if (hpecc(io, ECC) == 0)
        !           312:                        goto success;
        !           313:                io->i_error = EECC;
        !           314:                goto hard;
        !           315:        } 
        !           316: 
        !           317:        /*
        !           318:         * If a hard error, or maximum retry count
        !           319:         * exceeded, clear controller state and
        !           320:         * pass back error to caller.
        !           321:         */
        !           322:        if (++io->i_errcnt > sc->retries || (er1 & HPER1_HARD) ||
        !           323:            (!ML11(sc->type) && (er2 & HPER2_HARD)) ||
        !           324:            (ML11(sc->type) && (io->i_errcnt >= 16))) {
        !           325:                io->i_error = EHER;
        !           326:                if (mba->mba_sr & (MBSR_WCKUP|MBSR_WCKLWR))
        !           327:                        io->i_error = EWCK;
        !           328: hard:
        !           329:                io->i_errblk = bn + sc->ssect;
        !           330:                if (sc->debug & (HPF_BSEDEBUG|HPF_ECCDEBUG))
        !           331:                    printf(" dc=%d, da=0x%x",MASKREG(hpaddr->hpdc),
        !           332:                          MASKREG(hpaddr->hpda));
        !           333:                else {
        !           334:                    printf("hp error: sn%d (cyl,trk,sec)=(%d,%d,%d) ds=%b \n",
        !           335:                           bn, cn, tn, sn, MASKREG(hpaddr->hpds), HPDS_BITS);
        !           336:                    printf("er1=%b er2=%b", er1, HPER1_BITS, er2, HPER2_BITS);
        !           337:                }
        !           338:                hpaddr->hpcs1 = HP_DCLR|HP_GO;
        !           339:                printf("\n");
        !           340:                rv = -1;
        !           341:                goto done;
        !           342: 
        !           343:        }
        !           344:        /* fall thru to retry */
        !           345:        hpaddr->hpcs1 = HP_DCLR|HP_GO;
        !           346:        HPWAIT(hpaddr);
        !           347: 
        !           348:        /* 
        !           349:         * Every fourth retry recalibrate.
        !           350:         */
        !           351:        if (((io->i_errcnt & 07) == 4) ) {
        !           352:                hpaddr->hpcs1 = HP_RECAL|HP_GO;
        !           353:                HPWAIT(hpaddr);
        !           354:                hpaddr->hpdc = cn;
        !           355:                hpaddr->hpcs1 = HP_SEEK|HP_GO;
        !           356:                HPWAIT(hpaddr);
        !           357:        }
        !           358: 
        !           359:        if (io->i_errcnt >= 16 && (io->i_flgs & F_READ)) {
        !           360:                hpaddr->hpof = hp_offset[io->i_errcnt & 017]|HPOF_FMT22;
        !           361:                hpaddr->hpcs1 = HP_OFFSET|HP_GO;
        !           362:                HPWAIT(hpaddr);
        !           363:        }
        !           364:        if (sc->debug & (HPF_ECCDEBUG|HPF_BSEDEBUG))
        !           365:                printf("restart: bn=%d, cc=%d, ma=0x%x hprecal=%d\n",
        !           366:                  io->i_bn, io->i_cc, io->i_ma, hprecal);
        !           367:        goto restart;
        !           368: 
        !           369: success:
        !           370:        /*
        !           371:         * On successful error recovery, bump
        !           372:         * block number to advance to next portion
        !           373:         * of i/o transfer.
        !           374:         */
        !           375:        bn++;
        !           376:        if ((bn-startblock) * sectsiz < bytecnt) {
        !           377:                io->i_bn = bn;
        !           378:                io->i_ma = membase + (io->i_bn - startblock)*sectsiz;
        !           379:                io->i_cc = bytecnt - (io->i_bn - startblock)*sectsiz;
        !           380:                if (sc->debug & (HPF_ECCDEBUG|HPF_BSEDEBUG))
        !           381:                        printf("restart: bn=%d, cc=%d, ma=0x%x hprecal=%d\n",
        !           382:                          io->i_bn, io->i_cc, io->i_ma, hprecal);
        !           383:                goto restart;
        !           384:        }
        !           385: done:
        !           386:        if (io->i_errcnt >= 16) {
        !           387:                hpaddr->hpcs1 = HP_RTC|HP_GO;
        !           388:                while (hpaddr->hpds & HPDS_PIP)
        !           389:                        ;
        !           390:        }
        !           391:        io->i_bn = startblock;          /*reset i_bn to original */
        !           392:        io->i_cc = bytecnt;             /*reset i_cc to total count xfered*/
        !           393:        io->i_ma = membase;             /*reset i_ma to original */
        !           394:        return (rv);
        !           395: #endif
        !           396: }
        !           397: 
        !           398: #ifndef SMALL
        !           399: hpecc(io, flag)
        !           400:        register struct iob *io;
        !           401:        int flag;
        !           402: {
        !           403:        register int unit = io->i_unit;
        !           404:        register struct mba_regs *mbp;
        !           405:        register struct hpdevice *rp;
        !           406:        register struct hp_softc *sc;
        !           407:        register struct disklabel *lp;
        !           408:        int npf, bn, cn, tn, sn, bcr;
        !           409: 
        !           410:        mbp = mbamba(io->i_adapt);
        !           411:        rp = (struct hpdevice *)mbadrv(io->i_adapt, unit);
        !           412:        sc = &hp_softc[io->i_adapt][unit];
        !           413:        lp = &hplabel[io->i_adapt][unit];
        !           414:        bcr = MASKREG(mbp->mba_bcr);
        !           415:        if (bcr)
        !           416:                bcr |= 0xffff0000;              /* sxt */
        !           417:        npf = (bcr + io->i_cc) / sectsiz;       /* # sectors read */
        !           418:        if (flag == ECC)
        !           419:                npf--;          /* Error is in prev block --ghg */
        !           420:        bn = io->i_bn + npf + sc->ssect;        /* physical block #*/
        !           421:        if (sc->debug & HPF_ECCDEBUG)
        !           422:                printf("bcr=%d npf=%d ssect=%d sectsiz=%d i_cc=%d\n",
        !           423:                        bcr, npf, sc->ssect, sectsiz, io->i_cc);
        !           424:        /*
        !           425:         * ECC correction logic.
        !           426:         */
        !           427:        if (flag == ECC) {
        !           428:                register int i;
        !           429:                caddr_t addr;
        !           430:                int bit, o, mask;
        !           431: 
        !           432:                printf("hp%d: soft ecc sn%d\n", unit, bn);
        !           433:                mask = MASKREG(rp->hpec2);
        !           434:                for (i = mask, bit = 0; i; i >>= 1)
        !           435:                        if (i & 1)
        !           436:                                bit++;
        !           437:                if (bit > sc->ecclim) {
        !           438:                        printf("%d-bit error\n", bit);
        !           439:                        return (1);
        !           440:                }
        !           441:                i = MASKREG(rp->hpec1) - 1;     /* -1 makes 0 origin */
        !           442:                bit = i&07;
        !           443:                o = (i & ~07) >> 3;
        !           444:                rp->hpcs1 = HP_DCLR | HP_GO;
        !           445:                while (o <sectsiz && npf*sectsiz + o < io->i_cc && bit > -11) {
        !           446:                        addr = io->i_ma + (npf*sectsiz) + o;
        !           447:                        /*
        !           448:                         * No data transfer occurs with a write check,
        !           449:                         * so don't correct the resident copy of data.
        !           450:                         */
        !           451:                        if ((io->i_flgs & (F_CHECK|F_HCHECK)) == 0) {
        !           452:                                if (sc->debug & HPF_ECCDEBUG)
        !           453:                                        printf("addr=%x old=%x ", addr,
        !           454:                                                (*addr & 0xff));
        !           455:                                *addr ^= (mask << bit);
        !           456:                                if (sc->debug & HPF_ECCDEBUG)
        !           457:                                        printf("new=%x\n",(*addr & 0xff));
        !           458:                        }
        !           459:                        o++, bit -= 8;
        !           460:                }
        !           461:                return (0);
        !           462:        }
        !           463: 
        !           464:        /*
        !           465:         * Skip sector error.
        !           466:         * Set skip-sector-inhibit and
        !           467:         * read next sector
        !           468:         */
        !           469:        if (flag == SSE) {
        !           470:                rp->hpcs1 = HP_DCLR | HP_GO;
        !           471:                HPWAIT(rp);
        !           472:                rp->hpof |= HPOF_SSEI;
        !           473:                return (0);
        !           474:        }
        !           475: 
        !           476:        /*
        !           477:         * Bad block forwarding.
        !           478:         */
        !           479:         if (flag == BSE) {
        !           480:                int bbn;
        !           481: 
        !           482:                rp->hpcs1 = HP_DCLR | HP_GO;
        !           483:                if (sc->debug & HPF_BSEDEBUG)
        !           484:                        printf("hpecc: BSE @ bn %d\n", bn);
        !           485:                cn = bn / lp->d_secpercyl;
        !           486:                sn = bn % lp->d_secpercyl;
        !           487:                tn = sn / lp->d_nsectors;
        !           488:                sn = sn % lp->d_nsectors;
        !           489:                bcr += sectsiz;
        !           490:                if ((bbn = isbad(&hpbad[io->i_adapt][unit], cn, tn, sn)) < 0)
        !           491:                        return (1);
        !           492:                bbn = lp->d_ncylinders * lp->d_secpercyl - lp->d_nsectors - 1
        !           493:                    - bbn;
        !           494:                cn = bbn / lp->d_secpercyl;
        !           495:                sn = bbn % lp->d_secpercyl;
        !           496:                tn = sn / lp->d_nsectors;
        !           497:                sn = sn % lp->d_nsectors;
        !           498:                io->i_cc = sectsiz;
        !           499:                io->i_ma += npf * sectsiz;
        !           500:                if (sc->debug & HPF_BSEDEBUG)
        !           501:                        printf("revector to cn %d tn %d sn %d\n", cn, tn, sn);
        !           502:                rp->hpof &= ~HPOF_SSEI;
        !           503:                mbp->mba_sr = -1;
        !           504:                rp->hpdc = cn;
        !           505:                rp->hpda = (tn<<8) + sn;
        !           506:                mbastart(io, io->i_unit, io->i_flgs);
        !           507:                io->i_errcnt = 0;
        !           508:                HPWAIT(rp);
        !           509:                return (rp->hpds&HPDS_ERR);
        !           510:        }
        !           511:        printf("hpecc: flag=%d\n", flag);
        !           512:        return (1);
        !           513: }
        !           514: 
        !           515: /*ARGSUSED*/
        !           516: hpioctl(io, cmd, arg)
        !           517:        struct iob *io;
        !           518:        int cmd;
        !           519:        caddr_t arg;
        !           520: {
        !           521:        register unit = io->i_unit;
        !           522:        register struct hp_softc *sc = &hp_softc[io->i_adapt][unit];
        !           523:        register struct disklabel *lp = &hplabel[io->i_adapt][unit];
        !           524:        struct mba_drv *drv = mbadrv(io->i_adapt, unit);
        !           525: 
        !           526:        switch(cmd) {
        !           527: 
        !           528:        case SAIODEBUG:
        !           529:                sc->debug = (int)arg;
        !           530:                break;
        !           531: 
        !           532:        case SAIODEVDATA:
        !           533:                if (drv->mbd_dt&MBDT_TAP)
        !           534:                        return (ECMD);
        !           535:                *(struct disklabel *)arg = *lp;
        !           536:                break;
        !           537: 
        !           538:        case SAIOGBADINFO:
        !           539:                if (drv->mbd_dt&MBDT_TAP)
        !           540:                        return (ECMD);
        !           541:                *(struct dkbad *)arg = hpbad[io->i_adapt][unit];
        !           542:                break;
        !           543: 
        !           544:        case SAIOECCLIM:
        !           545:                sc->ecclim = (int)arg;
        !           546:                break;
        !           547: 
        !           548:        case SAIORETRIES:
        !           549:                sc->retries = (int)arg;
        !           550:                break;
        !           551: 
        !           552:        case SAIOSSI:                   /* skip-sector-inhibit */
        !           553:                if (drv->mbd_dt&MBDT_TAP)
        !           554:                        return (ECMD);
        !           555:                if ((io->i_flgs&F_SSI) == 0) {
        !           556:                        /* make sure this is done once only */
        !           557:                        io->i_flgs |= F_SSI;
        !           558:                        lp->d_nsectors++;
        !           559:                        lp->d_secpercyl += lp->d_ntracks;
        !           560:                }
        !           561:                break;
        !           562: 
        !           563:        case SAIONOSSI:                 /* remove skip-sector-inhibit */
        !           564:                if (io->i_flgs & F_SSI) {
        !           565:                        io->i_flgs &= ~F_SSI;
        !           566:                        drv->mbd_of &= ~HPOF_SSEI;
        !           567:                        lp->d_nsectors--;
        !           568:                        lp->d_secpercyl -= lp->d_ntracks;
        !           569:                }
        !           570:                break;
        !           571: 
        !           572:        case SAIOSSDEV:                 /* drive have skip sector? */
        !           573:                return (RM80(sc->type) ? 0 : ECMD);
        !           574: 
        !           575:        default:
        !           576:                return (ECMD);
        !           577:        }
        !           578:        return (0);
        !           579: }
        !           580: #endif /* !SMALL */

unix.superglobalmegacorp.com

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