X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/f86df66c1575304c08a6fd0716bcfdba12f5d593..4a404244ad5a6e8679d302ed44ecc61cac172725:/usr/src/sys/vax/mba/ht.c diff --git a/usr/src/sys/vax/mba/ht.c b/usr/src/sys/vax/mba/ht.c index 147ac62d20..7cd25baecc 100644 --- a/usr/src/sys/vax/mba/ht.c +++ b/usr/src/sys/vax/mba/ht.c @@ -1,9 +1,16 @@ -/* ht.c 3.4 %G% */ +/* ht.c 4.22 82/05/12 */ +#include "tu.h" +#if NHT > 0 /* - * TJU16 tape driver + * TM03/TU?? tape driver + * + * TODO: + * cleanup messages on errors + * test ioctl's + * see how many rewind interrups we get if we kick when not at BOT + * fixup rle error on block tape code */ - #include "../h/param.h" #include "../h/systm.h" #include "../h/buf.h" @@ -12,339 +19,577 @@ #include "../h/file.h" #include "../h/user.h" #include "../h/map.h" -#include "../h/mba.h" +#include "../h/pte.h" +#include "../h/mbareg.h" +#include "../h/mbavar.h" +#include "../h/mtio.h" +#include "../h/ioctl.h" +#include "../h/cmap.h" +#include "../h/cpu.h" + +#include "../h/htreg.h" + +struct buf rhtbuf[NHT]; +struct buf chtbuf[NHT]; + +short httypes[] = + { MBDT_TM03, MBDT_TE16, MBDT_TU45, MBDT_TU77, 0 }; +struct mba_device *htinfo[NHT]; +int htattach(), htslave(), htustart(), htndtint(), htdtint(); +struct mba_driver htdriver = + { htattach, htslave, htustart, 0, htdtint, htndtint, + httypes, "ht", "tu", htinfo }; + +#define MASKREG(r) ((r) & 0xffff) + +/* bits in minor device */ +#define TUUNIT(dev) (minor(dev)&03) +#define H_NOREWIND 04 +#define H_1600BPI 08 + +#define HTUNIT(dev) (tutoht[TUUNIT(dev)]) + +#define INF (daddr_t)1000000L /* a block number that wont exist */ + +struct tu_softc { + char sc_openf; + char sc_flags; + daddr_t sc_blkno; + daddr_t sc_nxrec; + u_short sc_erreg; + u_short sc_dsreg; + short sc_resid; + short sc_dens; + struct mba_device *sc_mi; + int sc_slave; +} tu_softc[NTU]; +short tutoht[NTU]; + +/* + * Bits for sc_flags. + */ +#define H_WRITTEN 1 /* last operation was a write */ +#define H_ERASED 2 /* last write retry was an erase gap */ +#define H_REWIND 4 /* last unit start was a rewind */ -struct device +char hter_bits[] = HTER_BITS; +char htds_bits[] = HTDS_BITS; + +/*ARGSUSED*/ +htattach(mi) + struct mba_device *mi; { - int htcs1; - int htds; - int hter; - int htmr; - int htas; - int htfc; - int htdt; - int htck; - int htsn; - int httc; -}; - -struct buf httab; -struct buf rhtbuf; -struct buf chtbuf; - -#define NUNIT 1 -#define BUNIT 2 -#define INF 1000000 - -char h_openf[NUNIT]; -daddr_t h_blkno[NUNIT]; -char h_flags[NUNIT]; -daddr_t h_nxrec[NUNIT]; - -#define HTADDR ((struct device *)(MBA1 + MBA_ERB)) - -#define GO 01 -#define WCOM 060 -#define RCOM 070 -#define NOP 0 -#define WEOF 026 -#define SFORW 030 -#define SREV 032 -#define ERASE 024 -#define REW 06 -#define DCLR 010 -#define P800 01700 /* 800 + pdp11 mode */ -#define P1600 02300 /* 1600 + pdp11 mode */ -#define IENABLE 0100 -#define RDY 0200 -#define TM 04 -#define DRY 0200 -#define EOT 02000 -#define CS 02000 -#define COR 0100000 -#define PES 040 -#define WRL 04000 -#define MOL 010000 -#define ERR 040000 -#define FCE 01000 -#define TRE 040000 -#define HARD 064023 /* UNS|OPI|NEF|FMT|RMR|ILR|ILF */ - -#define SIO 1 -#define SSFOR 2 -#define SSREV 3 -#define SRETRY 4 -#define SCOM 5 -#define SOK 6 - -#define H_WRITTEN 1 -htopen(dev, flag) +} + +htslave(mi, ms) + struct mba_device *mi; + struct mba_slave *ms; { - register unit, ds; + register struct tu_softc *sc = &tu_softc[ms->ms_unit]; + register struct htdevice *htaddr = (struct htdevice *)mi->mi_drv; + + htaddr->httc = ms->ms_slave; + if (htaddr->htdt & HTDT_SPR) { + sc->sc_mi = mi; + sc->sc_slave = ms->ms_slave; + tutoht[ms->ms_unit] = mi->mi_unit; + return (1); + } else + return (0); +} - httab.b_flags |= B_TAPE; - unit = minor(dev) & 03; - if (unit >= NUNIT || h_openf[unit]) { +htopen(dev, flag) + dev_t dev; + int flag; +{ + register int tuunit; + register struct mba_device *mi; + register struct tu_softc *sc; + int olddens, dens; + + tuunit = TUUNIT(dev); + if (tuunit >= NTU || (sc = &tu_softc[tuunit])->sc_openf || + (mi = htinfo[HTUNIT(dev)]) == 0 || mi->mi_alive == 0) { u.u_error = ENXIO; return; } - h_blkno[unit] = 0; - h_nxrec[unit] = INF; - h_flags[unit] = 0; - ds = hcommand(dev, NOP); - if ((ds&MOL)==0 || (flag && (ds&WRL))) - u.u_error = ENXIO; - if (u.u_error==0) - h_openf[unit]++; + olddens = sc->sc_dens; + dens = sc->sc_dens = + ((minor(dev)&H_1600BPI)?HTTC_1600BPI:HTTC_800BPI)| + HTTC_PDP11|sc->sc_slave; + htcommand(dev, HT_SENSE, 1); + sc->sc_dens = olddens; + if ((sc->sc_dsreg & HTDS_MOL) == 0) { + uprintf("tu%d: not online\n", tuunit); + u.u_error = EIO; + return; + } + if ((flag&FWRITE) && (sc->sc_dsreg&HTDS_WRL)) { + uprintf("tu%d: no write ring\n", tuunit); + u.u_error = EIO; + return; + } + if ((sc->sc_dsreg & HTDS_BOT) == 0 && (flag&FWRITE) && + dens != sc->sc_dens) { + uprintf("tu%d: can't change density in mid-tape\n", tuunit); + u.u_error = EIO; + return; + } + sc->sc_openf = 1; + sc->sc_blkno = (daddr_t)0; + sc->sc_nxrec = INF; + sc->sc_flags = 0; + sc->sc_dens = dens; } htclose(dev, flag) + register dev_t dev; + register flag; { - register int unit; + register struct tu_softc *sc = &tu_softc[TUUNIT(dev)]; - unit = minor(dev) & 03; - if (flag == FWRITE || ((flag&FWRITE) && (h_flags[unit]&H_WRITTEN))) { - (void) hcommand(dev, WEOF); - (void) hcommand(dev, WEOF); - (void) hcommand(dev, SREV); + if (flag == FWRITE || ((flag&FWRITE) && (sc->sc_flags&H_WRITTEN))) { + htcommand(dev, HT_WEOF, 1); + htcommand(dev, HT_WEOF, 1); + htcommand(dev, HT_SREV, 1); } - if((minor(dev)&4) == 0) /* no 4 -> rewind */ - (void) hcommand(dev, REW); - h_openf[unit] = 0; + if ((minor(dev)&H_NOREWIND) == 0) + htcommand(dev, HT_REW, 0); + sc->sc_openf = 0; } -hcommand(dev, com) +htcommand(dev, com, count) + dev_t dev; + int com, count; { register struct buf *bp; + register int s; - bp = &chtbuf; - (void) spl5(); - while(bp->b_flags&B_BUSY) { + bp = &chtbuf[HTUNIT(dev)]; + s = spl5(); + while (bp->b_flags&B_BUSY) { + if(bp->b_repcnt == 0 && (bp->b_flags&B_DONE)) + break; bp->b_flags |= B_WANTED; sleep((caddr_t)bp, PRIBIO); } - (void) spl0(); + bp->b_flags = B_BUSY|B_READ; + splx(s); bp->b_dev = dev; - bp->b_resid = com; + bp->b_command = com; + bp->b_repcnt = count; bp->b_blkno = 0; - bp->b_flags = B_BUSY|B_READ; htstrategy(bp); + if (count == 0) + return; iowait(bp); - if(bp->b_flags&B_WANTED) + if (bp->b_flags&B_WANTED) wakeup((caddr_t)bp); - bp->b_flags = 0; - return(bp->b_resid); + bp->b_flags &= B_ERROR; } htstrategy(bp) -register struct buf *bp; + register struct buf *bp; { - register daddr_t *p; + register struct mba_device *mi = htinfo[HTUNIT(bp->b_dev)]; + register struct buf *dp; + register int s; + + bp->av_forw = NULL; + dp = &mi->mi_tab; + s = spl5(); + if (dp->b_actf == NULL) + dp->b_actf = bp; + else + dp->b_actl->av_forw = bp; + dp->b_actl = bp; + if (dp->b_active == 0) + mbustart(mi); + splx(s); +} - if(bp != &chtbuf) { - p = &h_nxrec[minor(bp->b_dev)&03]; - if(dbtofsb(bp->b_blkno) > *p) { +htustart(mi) + register struct mba_device *mi; +{ + register struct htdevice *htaddr = + (struct htdevice *)mi->mi_drv; + register struct buf *bp = mi->mi_tab.b_actf; + register struct tu_softc *sc = &tu_softc[TUUNIT(bp->b_dev)]; + daddr_t blkno; + + htaddr->httc = sc->sc_dens; + if (bp == &chtbuf[HTUNIT(bp->b_dev)] && bp->b_command == HT_SENSE) { + htaddr->htcs1 = HT_SENSE|HT_GO; + mbclrattn(mi); + } + sc->sc_dsreg = htaddr->htds; + sc->sc_erreg = htaddr->hter; + sc->sc_resid = htaddr->htfc; + sc->sc_flags &= ~(H_WRITTEN|H_REWIND); + if ((htaddr->htdt & HTDT_SPR) == 0 || (htaddr->htds & HTDS_MOL) == 0) + if (sc->sc_openf > 0) + sc->sc_openf = -1; + if (sc->sc_openf < 0) { + bp->b_flags |= B_ERROR; + return (MBU_NEXT); + } + if (bp != &chtbuf[HTUNIT(bp->b_dev)]) { + if (dbtofsb(bp->b_blkno) > sc->sc_nxrec) { bp->b_flags |= B_ERROR; bp->b_error = ENXIO; - iodone(bp); - return; + return (MBU_NEXT); } - if(dbtofsb(bp->b_blkno) == *p && bp->b_flags&B_READ) { + if (dbtofsb(bp->b_blkno) == sc->sc_nxrec && + bp->b_flags&B_READ) { bp->b_resid = bp->b_bcount; clrbuf(bp); - iodone(bp); - return; + return (MBU_NEXT); } - if ((bp->b_flags&B_READ)==0) { - *p = dbtofsb(bp->b_blkno) + 1; - h_flags[minor(bp->b_dev)&03] |= H_WRITTEN; + if ((bp->b_flags&B_READ)==0) + sc->sc_nxrec = dbtofsb(bp->b_blkno) + 1; + } else { + if (bp->b_command == HT_SENSE) + return (MBU_NEXT); + if (bp->b_command == HT_REW) + sc->sc_flags |= H_REWIND; + else + htaddr->htfc = -bp->b_bcount; + htaddr->htcs1 = bp->b_command|HT_GO; + return (MBU_STARTED); + } + if ((blkno = sc->sc_blkno) == dbtofsb(bp->b_blkno)) { + htaddr->htfc = -bp->b_bcount; + if ((bp->b_flags&B_READ) == 0) { + if (mi->mi_tab.b_errcnt) { + if ((sc->sc_flags & H_ERASED) == 0) { + sc->sc_flags |= H_ERASED; + htaddr->htcs1 = HT_ERASE | HT_GO; + return (MBU_STARTED); + } + sc->sc_flags &= ~H_ERASED; + } + if (htaddr->htds & HTDS_EOT) { + bp->b_resid = bp->b_bcount; + bp->b_flags |= B_ERROR; + return (MBU_NEXT); + } } + return (MBU_DODATA); } - bp->av_forw = NULL; - (void) spl5(); - if (httab.b_actf == NULL) - httab.b_actf = bp; - else - httab.b_actl->av_forw = bp; - httab.b_actl = bp; - if (httab.b_active==0) - htstart(); - (void) spl0(); + if (blkno < dbtofsb(bp->b_blkno)) { + htaddr->htfc = blkno - dbtofsb(bp->b_blkno); + htaddr->htcs1 = HT_SFORW|HT_GO; + } else { + htaddr->htfc = dbtofsb(bp->b_blkno) - blkno; + htaddr->htcs1 = HT_SREV|HT_GO; + } + return (MBU_STARTED); } -htstart() +htdtint(mi, mbsr) + register struct mba_device *mi; + int mbsr; { - register struct buf *bp; - register unit, den; - daddr_t blkno; + register struct htdevice *htaddr = (struct htdevice *)mi->mi_drv; + register struct buf *bp = mi->mi_tab.b_actf; + register struct tu_softc *sc; + int ds, er, mbs; + + sc = &tu_softc[TUUNIT(bp->b_dev)]; + ds = sc->sc_dsreg = MASKREG(htaddr->htds); + er = sc->sc_erreg = MASKREG(htaddr->hter); + sc->sc_resid = MASKREG(htaddr->htfc); + mbs = mbsr; + sc->sc_blkno++; + if((bp->b_flags & B_READ) == 0) + sc->sc_flags |= H_WRITTEN; + if ((ds&(HTDS_ERR|HTDS_MOL)) != HTDS_MOL || mbs & MBSR_EBITS) { + htaddr->htcs1 = HT_DCLR|HT_GO; + mbclrattn(mi); + if (bp == &rhtbuf[HTUNIT(bp->b_dev)]) { + er &= ~HTER_FCE; + mbs &= ~(MBSR_DTABT|MBSR_MBEXC); + } + if (bp->b_flags & B_READ && ds & HTDS_PES) + er &= ~(HTER_CSITM|HTER_CORCRC); + if (er&HTER_HARD || mbs&MBSR_EBITS || (ds&HTDS_MOL) == 0 || + er && ++mi->mi_tab.b_errcnt >= 7) { + if ((ds & HTDS_MOL) == 0 && sc->sc_openf > 0) + sc->sc_openf = -1; + if ((er&HTER_HARD) == HTER_FCE && + (mbs&MBSR_EBITS) == (MBSR_DTABT|MBSR_MBEXC) && + (ds&HTDS_MOL)) + goto noprint; + printf("tu%d: hard error bn%d mbsr=%b er=%b ds=%b\n", + TUUNIT(bp->b_dev), bp->b_blkno, + mbsr, mbsr_bits, + sc->sc_erreg, hter_bits, + sc->sc_dsreg, htds_bits); +noprint: + bp->b_flags |= B_ERROR; + return (MBD_DONE); + } + if (er) + return (MBD_RETRY); + } + bp->b_resid = 0; + if (bp->b_flags & B_READ) + if (ds&HTDS_TM) { /* must be a read, right? */ + bp->b_resid = bp->b_bcount; + sc->sc_nxrec = dbtofsb(bp->b_blkno); + } else if(bp->b_bcount > MASKREG(htaddr->htfc)) + bp->b_resid = bp->b_bcount - MASKREG(htaddr->htfc); + return (MBD_DONE); +} - loop: - if ((bp = httab.b_actf) == NULL) - return; - unit = minor(bp->b_dev); - den = P800 | (unit&03); - if(unit >= 8) - den = P1600 | (unit&03); - if((HTADDR->httc&03777) != den) - HTADDR->httc = den; - unit &= 03; - blkno = h_blkno[unit]; - if (bp == &chtbuf) { - if (bp->b_resid==NOP) { - bp->b_resid = HTADDR->htds & 0xffff; - goto next; +htndtint(mi) + register struct mba_device *mi; +{ + register struct htdevice *htaddr = (struct htdevice *)mi->mi_drv; + register struct buf *bp = mi->mi_tab.b_actf; + register struct tu_softc *sc; + int er, ds, fc; + + ds = MASKREG(htaddr->htds); + er = MASKREG(htaddr->hter); + fc = MASKREG(htaddr->htfc); + if (er) { + htaddr->htcs1 = HT_DCLR|HT_GO; + mbclrattn(mi); + } + if (bp == 0) + return (MBN_SKIP); + sc = &tu_softc[TUUNIT(bp->b_dev)]; + sc->sc_dsreg = ds; + sc->sc_erreg = er; + sc->sc_resid = fc; + if (bp == &chtbuf[HTUNIT(bp->b_dev)]) { + switch (bp->b_command) { + case HT_REWOFFL: + /* offline is on purpose; don't do anything special */ + ds |= HTDS_MOL; + break; + case HT_SREV: + /* if backspace file hit bot, its not an error */ + if (er == (HTER_NEF|HTER_FCE) && ds&HTDS_BOT && + bp->b_repcnt == INF) + er &= ~HTER_NEF; + break; } - httab.b_active = SCOM; - HTADDR->htfc = 0; - HTADDR->htcs1 = bp->b_resid|GO; - return; + er &= ~HTER_FCE; + if (er == 0) + ds &= ~HTDS_ERR; } - if (h_openf[unit] < 0 || dbtofsb(bp->b_blkno) > h_nxrec[unit]) - goto abort; - if (blkno == dbtofsb(bp->b_blkno)) { - httab.b_active = SIO; - HTADDR->htfc = -bp->b_bcount; - mbastart(bp, (int *)HTADDR); - } else { - if (blkno < dbtofsb(bp->b_blkno)) { - httab.b_active = SSFOR; - HTADDR->htfc = blkno - dbtofsb(bp->b_blkno); - HTADDR->htcs1 = SFORW|GO; + if ((ds & (HTDS_ERR|HTDS_MOL)) != HTDS_MOL) { + if ((ds & HTDS_MOL) == 0 && sc->sc_openf > 0) + sc->sc_openf = -1; + printf("tu%d: hard error bn%d er=%b ds=%b\n", + TUUNIT(bp->b_dev), bp->b_blkno, + sc->sc_erreg, hter_bits, sc->sc_dsreg, htds_bits); + bp->b_flags |= B_ERROR; + return (MBN_DONE); + } + if (bp == &chtbuf[HTUNIT(bp->b_dev)]) { + if (sc->sc_flags & H_REWIND) + return (ds & HTDS_BOT ? MBN_DONE : MBN_RETRY); + bp->b_resid = -sc->sc_resid; + return (MBN_DONE); + } + if (ds & HTDS_TM) + if (sc->sc_blkno > dbtofsb(bp->b_blkno)) { + sc->sc_nxrec = dbtofsb(bp->b_blkno) - fc; + sc->sc_blkno = sc->sc_nxrec; } else { - httab.b_active = SSREV; - HTADDR->htfc = dbtofsb(bp->b_blkno) - blkno; - HTADDR->htcs1 = SREV|GO; + sc->sc_blkno = dbtofsb(bp->b_blkno) + fc; + sc->sc_nxrec = sc->sc_blkno - 1; } - } - return; + else + sc->sc_blkno = dbtofsb(bp->b_blkno); + return (MBN_RETRY); +} - abort: - bp->b_flags |= B_ERROR; +htread(dev) + dev_t dev; +{ - next: - httab.b_actf = bp->av_forw; - iodone(bp); - goto loop; + htphys(dev); + if (u.u_error) + return; + physio(htstrategy, &rhtbuf[HTUNIT(dev)], dev, B_READ, minphys); } -/*ARGSUSED*/ -htintr(mbastat, as) +htwrite(dev) { - register struct buf *bp; - register int unit, state; - int err; - if ((bp = httab.b_actf)==NULL) + htphys(dev); + if (u.u_error) return; - unit = minor(bp->b_dev) & 03; - state = httab.b_active; - httab.b_active = 0; - if (HTADDR->htds&(ERR|EOT|TM) || mbastat & MBAEBITS) { - err = HTADDR->hter & 0xffff; - if ((mbastat & MBAEBITS) || (err&HARD)) - state = 0; - if (bp == &rhtbuf) - err &= ~FCE; - if ((bp->b_flags&B_READ) && (HTADDR->htds&PES)) - err &= ~(CS|COR); - if(HTADDR->htds&EOT || (HTADDR->htds&MOL)==0) { - if(h_openf[unit]) - h_openf[unit] = -1; - } - else if(HTADDR->htds&TM) { - HTADDR->htfc = 0; - h_nxrec[unit] = dbtofsb(bp->b_blkno); - state = SOK; + physio(htstrategy, &rhtbuf[HTUNIT(dev)], dev, B_WRITE, minphys); +} + +htphys(dev) + dev_t dev; +{ + register int htunit; + register struct tu_softc *sc; + register struct mba_device *mi; + daddr_t a; + + htunit = HTUNIT(dev); + if (htunit >= NHT || (mi = htinfo[htunit]) == 0 || mi->mi_alive == 0) { + u.u_error = ENXIO; + return; + } + a = u.u_offset >> 9; + sc = &tu_softc[TUUNIT(dev)]; + sc->sc_blkno = dbtofsb(a); + sc->sc_nxrec = dbtofsb(a)+1; +} + +/*ARGSUSED*/ +htioctl(dev, cmd, addr, flag) + dev_t dev; + int cmd; + caddr_t addr; + int flag; +{ + register struct tu_softc *sc = &tu_softc[TUUNIT(dev)]; + register struct buf *bp = &chtbuf[HTUNIT(dev)]; + register callcount; + int fcount; + struct mtop mtop; + struct mtget mtget; + /* we depend of the values and order of the MT codes here */ + static htops[] = + {HT_WEOF,HT_SFORW,HT_SREV,HT_SFORW,HT_SREV,HT_REW,HT_REWOFFL,HT_SENSE}; + + switch (cmd) { + case MTIOCTOP: /* tape operation */ + if (copyin((caddr_t)addr, (caddr_t)&mtop, sizeof(mtop))) { + u.u_error = EFAULT; + return; } - else if(state && err == 0) - state = SOK; - if(httab.b_errcnt > 4) - deverror(bp, HTADDR->hter, mbastat); - ((struct mba_regs *)MBA1)->mba_cr &= ~MBAIE; - HTADDR->htcs1 = DCLR|GO; - ((struct mba_regs *)MBA1)->mba_cr |= MBAIE; - if (state==SIO && ++httab.b_errcnt < 10) { - httab.b_active = SRETRY; - h_blkno[unit]++; - HTADDR->htfc = -1; - HTADDR->htcs1 = SREV|GO; + switch(mtop.mt_op) { + case MTWEOF: + callcount = mtop.mt_count; + fcount = 1; + break; + case MTFSF: case MTBSF: + callcount = mtop.mt_count; + fcount = INF; + break; + case MTFSR: case MTBSR: + callcount = 1; + fcount = mtop.mt_count; + break; + case MTREW: case MTOFFL: + callcount = 1; + fcount = 1; + break; + default: + u.u_error = ENXIO; return; } - if (state!=SOK) { - bp->b_flags |= B_ERROR; - state = SIO; + if (callcount <= 0 || fcount <= 0) { + u.u_error = ENXIO; + return; } - } else if (HTADDR->htcs1 < 0) { /* SC */ - if(HTADDR->htds & ERR) { - ((struct mba_regs *)MBA1)->mba_cr &= ~MBAIE; - HTADDR->htcs1 = DCLR|GO; - ((struct mba_regs *)MBA1)->mba_cr |= MBAIE; + while (--callcount >= 0) { + htcommand(dev, htops[mtop.mt_op], fcount); + if ((mtop.mt_op == MTFSR || mtop.mt_op == MTBSR) && + bp->b_resid) { + u.u_error = EIO; + break; + } + if ((bp->b_flags&B_ERROR) || sc->sc_dsreg&HTDS_BOT) + break; } + geterror(bp); + return; + case MTIOCGET: + mtget.mt_dsreg = sc->sc_dsreg; + mtget.mt_erreg = sc->sc_erreg; + mtget.mt_resid = sc->sc_resid; + mtget.mt_type = MT_ISHT; + if (copyout((caddr_t)&mtget, addr, sizeof(mtget))) + u.u_error = EFAULT; + return; + default: + u.u_error = ENXIO; } - switch(state) { - case SIO: - case SOK: - h_blkno[unit]++; - - case SCOM: - httab.b_errcnt = 0; - httab.b_actf = bp->av_forw; - bp->b_resid = - (HTADDR->htfc & 0xffff); - if (bp->b_flags & B_READ) - bp->b_resid += bp->b_bcount; - iodone(bp); - break; - - case SRETRY: - if((bp->b_flags&B_READ)==0) { - httab.b_active = SSFOR; - HTADDR->htcs1 = ERASE|GO; - return; - } +} - case SSFOR: - case SSREV: -#define blk dbtofsb(bp->b_blkno) - if(HTADDR->htds & TM) { - if(state == SSREV) { - h_nxrec[unit] = blk - (HTADDR->htfc&0xffff); - h_blkno[unit] = h_nxrec[unit]; - } else { - h_nxrec[unit] = blk + (HTADDR->htfc&0xffff) - 1; - h_blkno[unit] = blk + (HTADDR->htfc & 0xffff); - } - } else - h_blkno[unit] = blk; - break; +#define DBSIZE 20 - default: - return; +htdump() +{ + register struct mba_device *mi; + register struct mba_regs *mp; + register struct htdevice *htaddr; + int blk, num; + int start; + + start = 0; + num = maxfree; +#define phys(a,b) ((b)((int)(a)&0x7fffffff)) + if (htinfo[0] == 0) + return (ENXIO); + mi = phys(htinfo[0], struct mba_device *); + mp = phys(mi->mi_hd, struct mba_hd *)->mh_physmba; + mp->mba_cr = MBCR_IE; + htaddr = (struct htdevice *)&mp->mba_drv[mi->mi_drive]; + htaddr->httc = HTTC_PDP11|HTTC_1600BPI; + htaddr->htcs1 = HT_DCLR|HT_GO; + while (num > 0) { + blk = num > DBSIZE ? DBSIZE : num; + htdwrite(start, blk, htaddr, mp); + start += blk; + num -= blk; } - htstart(); + hteof(htaddr); + hteof(htaddr); + htwait(htaddr); + if (htaddr->htds&HTDS_ERR) + return (EIO); + htaddr->htcs1 = HT_REW|HT_GO; + return (0); } -htread(dev) +htdwrite(dbuf, num, htaddr, mp) + register dbuf, num; + register struct htdevice *htaddr; + struct mba_regs *mp; { - htphys(dev); - physio(htstrategy, &rhtbuf, dev, B_READ, minphys); + register struct pte *io; + register int i; + + htwait(htaddr); + io = mp->mba_map; + for (i = 0; i < num; i++) + *(int *)io++ = dbuf++ | PG_V; + htaddr->htfc = -(num*NBPG); + mp->mba_sr = -1; + mp->mba_bcr = -(num*NBPG); + mp->mba_var = 0; + htaddr->htcs1 = HT_WCOM|HT_GO; } -htwrite(dev) +htwait(htaddr) + struct htdevice *htaddr; { - htphys(dev); - physio(htstrategy, &rhtbuf, dev, B_WRITE, minphys); + register s; + + do + s = htaddr->htds; + while ((s & HTDS_DRY) == 0); } -htphys(dev) +hteof(htaddr) + struct htdevice *htaddr; { - register unit; - daddr_t a; - unit = minor(dev) & 03; - if(unit < NUNIT) { - a = u.u_offset >> 9; - h_blkno[unit] = dbtofsb(a); - h_nxrec[unit] = dbtofsb(a)+1; - } + htwait(htaddr); + htaddr->htcs1 = HT_WEOF|HT_GO; } +#endif