SCCS-vsn: sys/vax/mba/hp.c 4.65
-/* hp.c 4.64 83/02/10 */
+/* hp.c 4.65 83/02/10 */
#ifdef HPDEBUG
int hpdebug;
#ifdef HPDEBUG
int hpdebug;
struct buf rhpbuf[NHP];
struct buf bhpbuf[NHP];
struct dkbad hpbad[NHP];
struct buf rhpbuf[NHP];
struct buf bhpbuf[NHP];
struct dkbad hpbad[NHP];
-/* SHOULD CONSOLIDATE ALL THIS STUFF INTO A STRUCTURE */
-char hpinit[NHP];
-char hprecal[NHP];
-char hphdr[NHP];
-daddr_t mlsize[NHP];
+
+struct hpsoftc {
+ u_char sc_hpinit; /* drive initialized */
+ u_char sc_recal; /* recalibrate state */
+ u_char sc_hdr; /* next i/o includes header */
+ u_char sc_doseeks; /* perform explicit seeks */
+ daddr_t sc_mlsize; /* ML11 size */
+} hpsoftc[NHP];
#ifdef INTRLVE
daddr_t dkblock();
#endif
#ifdef INTRLVE
daddr_t dkblock();
#endif
/*ARGSUSED*/
hpattach(mi, slave)
/*ARGSUSED*/
hpattach(mi, slave)
* transfer rates based on device characteristics.
*/
if (type == HPDT_ML11A || type == HPDT_ML11B) {
* transfer rates based on device characteristics.
*/
if (type == HPDT_ML11A || type == HPDT_ML11B) {
+ register struct hpsoftc *sc = &hpsoftc[mi->mi_unit];
+ register int trt;
- sz = hpaddr->hpmr & HPMR_SZ;
+ sc->sc_mlsize = hpaddr->hpmr & HPMR_SZ;
if ((hpaddr->hpmr & HPMR_ARRTYP) == 0)
if ((hpaddr->hpmr & HPMR_ARRTYP) == 0)
- sz >>= 2;
- mlsize[mi->mi_unit] = sz;
if (mi->mi_dk >= 0) {
trt = (hpaddr->hpmr & HPMR_TRT) >> 8;
dk_mspw[mi->mi_dk] = 1.0 / (1<<(20-trt));
if (mi->mi_dk >= 0) {
trt = (hpaddr->hpmr & HPMR_TRT) >> 8;
dk_mspw[mi->mi_dk] = 1.0 / (1<<(20-trt));
goto bad;
st = &hpst[mi->mi_type];
if (ML11) {
goto bad;
st = &hpst[mi->mi_type];
if (ML11) {
+ struct hpsoftc *sc = &hpsoftc[unit];
+
- dkblock(bp)+sz > mlsize[mi->mi_unit])
+ dkblock(bp)+sz > sc->sc_mlsize)
goto bad;
bp->b_cylin = 0;
} else {
goto bad;
bp->b_cylin = 0;
} else {
register struct hpdevice *hpaddr = (struct hpdevice *)mi->mi_drv;
register struct buf *bp = mi->mi_tab.b_actf;
register struct hpst *st = &hpst[mi->mi_type];
register struct hpdevice *hpaddr = (struct hpdevice *)mi->mi_drv;
register struct buf *bp = mi->mi_tab.b_actf;
register struct hpst *st = &hpst[mi->mi_type];
+ struct hpsoftc *sc = &hpsoftc[mi->mi_unit];
daddr_t bn;
int sn, dist;
hpaddr->hpcs1 = 0;
if ((hpaddr->hpcs1&HP_DVA) == 0)
return (MBU_BUSY);
daddr_t bn;
int sn, dist;
hpaddr->hpcs1 = 0;
if ((hpaddr->hpcs1&HP_DVA) == 0)
return (MBU_BUSY);
- if ((hpaddr->hpds & HPDS_VV) == 0 || hpinit[mi->mi_unit] == 0) {
+ if ((hpaddr->hpds & HPDS_VV) == 0 || !sc->sc_hpinit) {
struct buf *bbp = &bhpbuf[mi->mi_unit];
struct buf *bbp = &bhpbuf[mi->mi_unit];
- hpinit[mi->mi_unit] = 1;
hpaddr->hpcs1 = HP_DCLR|HP_GO;
if (mi->mi_mba->mba_drv[0].mbd_as & (1<<mi->mi_drive))
printf("DCLR attn\n");
hpaddr->hpcs1 = HP_DCLR|HP_GO;
if (mi->mi_mba->mba_drv[0].mbd_as & (1<<mi->mi_drive))
printf("DCLR attn\n");
sn = bn%st->nspc;
sn = (sn+st->nsect-hpSDIST)%st->nsect;
if (bp->b_cylin == (hpaddr->hpdc & 0xffff)) {
sn = bn%st->nspc;
sn = (sn+st->nsect-hpSDIST)%st->nsect;
if (bp->b_cylin == (hpaddr->hpdc & 0xffff)) {
return (MBU_DODATA);
dist = ((hpaddr->hpla & 0xffff)>>6) - st->nsect + 1;
if (dist < 0)
return (MBU_DODATA);
dist = ((hpaddr->hpla & 0xffff)>>6) - st->nsect + 1;
if (dist < 0)
return (MBU_DODATA);
} else
hpaddr->hpdc = bp->b_cylin;
return (MBU_DODATA);
} else
hpaddr->hpdc = bp->b_cylin;
hpaddr->hpcs1 = HP_SEEK|HP_GO;
else {
hpaddr->hpda = sn;
hpaddr->hpcs1 = HP_SEEK|HP_GO;
else {
hpaddr->hpda = sn;
register struct hpdevice *hpaddr = (struct hpdevice *)mi->mi_drv;
register struct buf *bp = mi->mi_tab.b_actf;
register struct hpst *st = &hpst[mi->mi_type];
register struct hpdevice *hpaddr = (struct hpdevice *)mi->mi_drv;
register struct buf *bp = mi->mi_tab.b_actf;
register struct hpst *st = &hpst[mi->mi_type];
+ struct hpsoftc *sc = &hpsoftc[mi->mi_unit];
hpaddr->hpdc = bp->b_cylin;
hpaddr->hpda = (tn << 8) + sn;
}
hpaddr->hpdc = bp->b_cylin;
hpaddr->hpda = (tn << 8) + sn;
}
- if (hphdr[mi->mi_unit]) {
if (bp->b_flags & B_READ)
return (HP_RHDR|HP_GO);
else
if (bp->b_flags & B_READ)
return (HP_RHDR|HP_GO);
else
register struct buf *bp = mi->mi_tab.b_actf;
register struct hpst *st = &hpst[mi->mi_type];
register int er1, er2;
register struct buf *bp = mi->mi_tab.b_actf;
register struct hpst *st = &hpst[mi->mi_type];
register int er1, er2;
+ struct hpsoftc *sc = &hpsoftc[mi->mi_unit];
int retry = 0;
if (bp->b_flags&B_BAD) {
int retry = 0;
if (bp->b_flags&B_BAD) {
if (er1&HPER1_WLE) {
printf("hp%d: write locked\n", dkunit(bp));
bp->b_flags |= B_ERROR;
if (er1&HPER1_WLE) {
printf("hp%d: write locked\n", dkunit(bp));
bp->b_flags |= B_ERROR;
- } else if ((er1&0xffff) == HPER1_FER && RP06 &&
- hphdr[mi->mi_unit] == 0) {
+ } else if ((er1&0xffff) == HPER1_FER && RP06 && !sc->sc_hdr) {
if (hpecc(mi, BSE))
return(MBD_RESTARTED);
else
if (hpecc(mi, BSE))
return(MBD_RESTARTED);
else
} else if (++mi->mi_tab.b_errcnt > 27 ||
mbsr & MBSR_HARD ||
er1 & HPER1_HARD ||
} else if (++mi->mi_tab.b_errcnt > 27 ||
mbsr & MBSR_HARD ||
er1 & HPER1_HARD ||
(!ML11 && (er2 & HPER2_HARD))) {
hard:
if (ML11)
(!ML11 && (er2 & HPER2_HARD))) {
hard:
if (ML11)
printf("\n");
bp->b_flags |= B_ERROR;
retry = 0;
printf("\n");
bp->b_flags |= B_ERROR;
retry = 0;
- hprecal[mi->mi_unit] = 0;
} else if ((er2 & HPER2_BSE) && !ML11) {
if (hpecc(mi, BSE))
return(MBD_RESTARTED);
} else if ((er2 & HPER2_BSE) && !ML11) {
if (hpecc(mi, BSE))
return(MBD_RESTARTED);
goto hard;
} else if ((mi->mi_tab.b_errcnt&07) == 4) {
hpaddr->hpcs1 = HP_RECAL|HP_GO;
goto hard;
} else if ((mi->mi_tab.b_errcnt&07) == 4) {
hpaddr->hpcs1 = HP_RECAL|HP_GO;
- hprecal[mi->mi_unit] = 1;
return(MBD_RESTARTED);
}
if (retry)
return(MBD_RESTARTED);
}
if (retry)
- if (hpdebug && hprecal[mi->mi_unit]) {
- printf("recal %d ", hprecal[mi->mi_unit]);
+ if (hpdebug && sc->sc_recal) {
+ printf("recal %d ", sc->sc_recal);
printf("errcnt %d\n", mi->mi_tab.b_errcnt);
printf("mbsr=%b ", mbsr, mbsr_bits);
printf("er1=%b er2=%b\n",
printf("errcnt %d\n", mi->mi_tab.b_errcnt);
printf("mbsr=%b ", mbsr, mbsr_bits);
printf("er1=%b er2=%b\n",
hpaddr->hper2, HPER2_BITS);
}
#endif
hpaddr->hper2, HPER2_BITS);
}
#endif
- switch (hprecal[mi->mi_unit]) {
+ switch (sc->sc_recal) {
case 1:
hpaddr->hpdc = bp->b_cylin;
hpaddr->hpcs1 = HP_SEEK|HP_GO;
case 1:
hpaddr->hpdc = bp->b_cylin;
hpaddr->hpcs1 = HP_SEEK|HP_GO;
- hprecal[mi->mi_unit]++;
return (MBD_RESTARTED);
case 2:
if (mi->mi_tab.b_errcnt < 16 ||
return (MBD_RESTARTED);
case 2:
if (mi->mi_tab.b_errcnt < 16 ||
goto donerecal;
hpaddr->hpof = hp_offset[mi->mi_tab.b_errcnt & 017]|HPOF_FMT22;
hpaddr->hpcs1 = HP_OFFSET|HP_GO;
goto donerecal;
hpaddr->hpof = hp_offset[mi->mi_tab.b_errcnt & 017]|HPOF_FMT22;
hpaddr->hpcs1 = HP_OFFSET|HP_GO;
- hprecal[mi->mi_unit]++;
return (MBD_RESTARTED);
donerecal:
case 3:
return (MBD_RESTARTED);
donerecal:
case 3:
- hprecal[mi->mi_unit] = 0;
- hphdr[mi->mi_unit] = 0;
bp->b_resid = -(mi->mi_mba->mba_bcr) & 0xffff;
if (mi->mi_tab.b_errcnt >= 16) {
/*
bp->b_resid = -(mi->mi_mba->mba_bcr) & 0xffff;
if (mi->mi_tab.b_errcnt >= 16) {
/*
switch (cmd) {
case DKIOCHDR: /* do header read/write */
switch (cmd) {
case DKIOCHDR: /* do header read/write */
- hphdr[minor(dev)>>3] = 1;
+ hpsoftc[minor(dev) >> 3].sc_hdr = 1;