X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/0f4556f12c8f75078501c9d1338ae7648a97f975..95f51977ddc18faa2e212f30c00a39540b39f325:/usr/src/sys/vaxuba/rk.c diff --git a/usr/src/sys/vaxuba/rk.c b/usr/src/sys/vaxuba/rk.c index 45c258c8c8..e5d2b13af3 100644 --- a/usr/src/sys/vaxuba/rk.c +++ b/usr/src/sys/vaxuba/rk.c @@ -1,4 +1,10 @@ -/* rk.c 6.2 83/10/11 */ +/* + * Copyright (c) 1982, 1986 Regents of the University of California. + * All rights reserved. The Berkeley software License Agreement + * specifies the terms and conditions for redistribution. + * + * @(#)rk.c 7.1 (Berkeley) 6/5/86 + */ #include "rk.h" #if NHK > 0 @@ -20,24 +26,25 @@ int rkbdebug; */ #include "../machine/pte.h" -#include "../h/param.h" -#include "../h/systm.h" -#include "../h/buf.h" -#include "../h/conf.h" -#include "../h/dir.h" -#include "../h/user.h" -#include "../h/map.h" -#include "../h/vm.h" -#include "../h/dk.h" -#include "../h/cmap.h" -#include "../h/dkbad.h" -#include "../h/uio.h" -#include "../h/kernel.h" +#include "param.h" +#include "systm.h" +#include "buf.h" +#include "conf.h" +#include "dir.h" +#include "user.h" +#include "map.h" +#include "vm.h" +#include "dk.h" +#include "cmap.h" +#include "dkbad.h" +#include "uio.h" +#include "kernel.h" +#include "syslog.h" #include "../vax/cpu.h" -#include "../vaxuba/ubareg.h" -#include "../vaxuba/ubavar.h" -#include "../vaxuba/rkreg.h" +#include "ubareg.h" +#include "ubavar.h" +#include "rkreg.h" struct rk_softc { int sc_softas; @@ -46,18 +53,20 @@ struct rk_softc { int sc_recal; } rk_softc[NHK]; +#define rkunit(dev) (minor(dev) >> 3) + /* THIS SHOULD BE READ OFF THE PACK, PER DRIVE */ struct size { daddr_t nblocks; int cyloff; -} rk7_sizes[8] ={ +} rk7_sizes[8] = { 15884, 0, /* A=cyl 0 thru 240 */ 10032, 241, /* B=cyl 241 thru 392 */ 53790, 0, /* C=cyl 0 thru 814 */ + 15884, 393, /* D=cyl 393 thru 633 */ 0, 0, - 0, 0, - 0, 0, - 27786, 393, /* G=cyl 393 thru 813 */ + 11792, 634, /* F=cyl 634 thru 814 */ + 27786, 393, /* G=cyl 393 thru 814, should be 27698 */ 0, 0, }, rk6_sizes[8] ={ 15884, 0, /* A=cyl 0 thru 240 */ @@ -106,10 +115,6 @@ struct buf rrkbuf[NRK]; #define b_cylin b_resid -#ifdef INTRLVE -daddr_t dkblock(); -#endif - int rkwstart, rkwatch(); rkprobe(reg) @@ -169,7 +174,7 @@ rkattach(ui) rkopen(dev) dev_t dev; { - register int unit = minor(dev) >> 3; + register int unit = rkunit(dev); register struct uba_device *ui; if (unit >= NRK || (ui = rkdinfo[unit]) == 0 || ui->ui_alive == 0) @@ -189,16 +194,26 @@ rkstrategy(bp) int s; sz = (bp->b_bcount+511) >> 9; - unit = dkunit(bp); - if (unit >= NRK) + unit = rkunit(bp->b_dev); + if (unit >= NRK) { + bp->b_error = ENXIO; goto bad; + } ui = rkdinfo[unit]; - if (ui == 0 || ui->ui_alive == 0) + if (ui == 0 || ui->ui_alive == 0) { + bp->b_error = ENXIO; goto bad; + } st = &rkst[ui->ui_type]; if (bp->b_blkno < 0 || - (bn = dkblock(bp))+sz > st->sizes[xunit].nblocks) + (bn = bp->b_blkno)+sz > st->sizes[xunit].nblocks) { + if (bp->b_blkno == st->sizes[xunit].nblocks) { + bp->b_resid = bp->b_bcount; + goto done; + } + bp->b_error = EINVAL; goto bad; + } bp->b_cylin = bn/st->nspc + st->sizes[xunit].cyloff; s = spl5(); dp = &rkutab[ui->ui_unit]; @@ -214,6 +229,7 @@ rkstrategy(bp) bad: bp->b_flags |= B_ERROR; +done: iodone(bp); return; } @@ -308,8 +324,8 @@ loop: goto loop; } um->um_tab.b_active++; - ui = rkdinfo[dkunit(bp)]; - bn = dkblock(bp); + ui = rkdinfo[rkunit(bp->b_dev)]; + bn = bp->b_blkno; st = &rkst[ui->ui_type]; sn = bn%st->nspc; tn = sn/st->nsect; @@ -329,7 +345,7 @@ retry: goto retry; } if ((rkaddr->rkds&RKDS_DREADY) != RKDS_DREADY) { - printf("rk%d: not ready", dkunit(bp)); + printf("rk%d: not ready", rkunit(bp->b_dev)); if ((rkaddr->rkds&RKDS_DREADY) != RKDS_DREADY) { printf("\n"); rkaddr->rkcs1 = rktypes[ui->ui_type]|RK_DCLR|RK_GO; @@ -386,7 +402,7 @@ rkintr(rk11) um->um_tab.b_active = 1; dp = um->um_tab.b_actf; bp = dp->b_actf; - ui = rkdinfo[dkunit(bp)]; + ui = rkdinfo[rkunit(bp->b_dev)]; dk_busy &= ~(1 << ui->ui_dk); if (bp->b_flags&B_BAD) if (rkecc(ui, CONT)) @@ -404,7 +420,8 @@ rkintr(rk11) } #endif if (er & RKER_WLE) { - printf("rk%d: write locked\n", dkunit(bp)); + printf("rk%d: write locked\n", + rkunit(bp->b_dev)); bp->b_flags |= B_ERROR; } else if (++um->um_tab.b_errcnt > 28 || ds&RKDS_HARD || er&RKER_HARD || cs2&RKCS2_HARD) { @@ -518,7 +535,7 @@ rkread(dev, uio) dev_t dev; struct uio *uio; { - register int unit = minor(dev) >> 3; + register int unit = rkunit(dev); if (unit >= NRK) return (ENXIO); @@ -529,7 +546,7 @@ rkwrite(dev, uio) dev_t dev; struct uio *uio; { - register int unit = minor(dev) >> 3; + register int unit = rkunit(dev); if (unit >= NRK) return (ENXIO); @@ -551,10 +568,10 @@ rkecc(ui, flag) if (flag == CONT) npf = bp->b_error; else - npf = btop((rk->rkwc * sizeof(short)) + bp->b_bcount); + npf = btodb(bp->b_bcount + (rk->rkwc * sizeof(short)) + 511); reg = btop(um->um_ubinfo&0x3ffff) + npf; o = (int)bp->b_un.b_addr & PGOFSET; - bn = dkblock(bp); + bn = bp->b_blkno; st = &rkst[ui->ui_type]; cn = bp->b_cylin; sn = bn%st->nspc + npf; @@ -571,14 +588,14 @@ rkecc(ui, flag) npf--; reg--; - printf("rk%d%c: soft ecc sn%d\n", dkunit(bp), + log(LOG_WARNING, "rk%d%c: soft ecc sn%d\n", rkunit(bp->b_dev), 'a'+(minor(bp->b_dev)&07), bp->b_blkno + npf); mask = rk->rkec2; i = rk->rkec1 - 1; /* -1 makes 0 origin */ bit = i&07; i = (i&~07)>>3; byte = i + o; - while (i < 512 && (int)ptob(npf)+i < bp->b_bcount && bit > -11) { + while (i < 512 && (int)dbtob(npf)+i < bp->b_bcount && bit > -11) { addr = ptob(ubp->uba_map[reg+btop(byte)].pg_pfnum)+ (byte & PGOFSET); putmemc(addr, getmemc(addr)^(mask<b_flags &= ~B_BAD; - rk->rkwc = -((bp->b_bcount - (int)ptob(npf)) / sizeof (short)); - if (rk->rkwc == 0) + if ((int)dbtob(npf) >= bp->b_bcount) return (0); + rk->rkwc = -((bp->b_bcount - (int)dbtob(npf)) / sizeof (short)); break; } rk->rkcs1 = RK_CCLR; @@ -720,7 +737,7 @@ rkdump(dev) register short *rp; struct rkst *st; - unit = minor(dev) >> 3; + unit = rkunit(dev); if (unit >= NRK) return (ENXIO); #define phys(cast, addr) ((cast)((int)addr & 0x7fffffff)) @@ -742,8 +759,10 @@ rkdump(dev) } st = &rkst[ui->ui_type]; sizes = phys(struct size *, st->sizes); - if (dumplo < 0 || dumplo + num >= sizes[minor(dev)&07].nblocks) + if (dumplo < 0) return (EINVAL); + if (dumplo + num >= sizes[minor(dev)&07].nblocks) + num = sizes[minor(dev)&07].nblocks - dumplo; while (num > 0) { register struct pte *io; register int i; @@ -778,7 +797,7 @@ rkdump(dev) rksize(dev) dev_t dev; { - int unit = minor(dev) >> 3; + int unit = rkunit(dev); struct uba_device *ui; struct rkst *st;