X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/26e15512da08867bed92a4caac9edb74daa9bb13..de59ccc2375aad4c9f0ff41f3291584ead755f15:/usr/src/sys/vax/uba/up.c diff --git a/usr/src/sys/vax/uba/up.c b/usr/src/sys/vax/uba/up.c index 43e801f432..44e1bdbeb2 100644 --- a/usr/src/sys/vax/uba/up.c +++ b/usr/src/sys/vax/uba/up.c @@ -1,4 +1,4 @@ -/* up.c 4.37 81/04/09 */ +/* up.c 4.53 82/05/27 */ #include "up.h" #if NSC > 0 @@ -42,13 +42,22 @@ struct size daddr_t nblocks; int cyloff; } up_sizes[8] = { +#ifdef ERNIE + 49324, 0, /* A=cyl 0 thru 26 */ +#else 15884, 0, /* A=cyl 0 thru 26 */ +#endif 33440, 27, /* B=cyl 27 thru 81 */ 495520, 0, /* C=cyl 0 thru 814 */ 15884, 562, /* D=cyl 562 thru 588 */ 55936, 589, /* E=cyl 589 thru 680 */ - 81472, 681, /* F=cyl 681 thru 814 */ - 153824, 562, /* G=cyl 562 thru 814 */ +#ifndef NOBADSECT + 81376, 681, /* F=cyl 681 thru 814 */ + 153728, 562, /* G=cyl 562 thru 814 */ +#else + 81472, 681, + 153824, 562, +#endif 291346, 82, /* H=cyl 82 thru 561 */ }, fj_sizes[8] = { 15884, 0, /* A=cyl 0 thru 49 */ @@ -58,11 +67,28 @@ struct size 0, 0, 0, 0, 0, 0, - 213760, 155, /* H=cyl 155 thru 822 */ +#ifndef NOBADSECT + 213664, 155, /* H=cyl 155 thru 822 */ +#else + 213760, 155, +#endif +}, upam_sizes[8] = { + 15884, 0, /* A=cyl 0 thru 31 */ + 33440, 32, /* B=cyl 32 thru 97 */ + 524288, 0, /* C=cyl 0 thru 1023 */ + 27786, 668, + 27786, 723, + 125440, 778, + 181760, 668, /* G=cyl 668 thru 1022 */ + 291346, 98, /* H=cyl 98 thru 667 */ }; /* END OF STUFF WHICH SHOULD BE READ IN PER DISK */ -#define _upSDIST 2 /* 1.0 msec */ +/* + * On a 780 upSDIST could be 2, but + * in the interest of 750's... + */ +#define _upSDIST 3 /* 1.5 msec */ #define _upRDIST 4 /* 2.0 msec */ int upSDIST = _upSDIST; @@ -71,7 +97,8 @@ int upRDIST = _upRDIST; int upprobe(), upslave(), upattach(), updgo(), upintr(); struct uba_ctlr *upminfo[NSC]; struct uba_device *updinfo[NUP]; -struct uba_device *upip[NSC][4]; +#define UPIPUNITS 8 +struct uba_device *upip[NSC][UPIPUNITS]; /* fuji w/fixed head gives n,n+4 */ u_short upstd[] = { 0776700, 0774400, 0776300, 0 }; struct uba_driver scdriver = @@ -88,6 +115,7 @@ struct upst { 32, 19, 32*19, 823, up_sizes, /* 9300/cdc */ /* 9300 actually has 815 cylinders... */ 32, 10, 32*10, 823, fj_sizes, /* fujitsu 160m */ + 32, 16, 32*16, 1024, upam_sizes, /* ampex capricorn */ }; u_char up_offset[16] = { @@ -132,6 +160,7 @@ upslave(ui, reg) upaddr->upcs1 = 0; /* conservative */ upaddr->upcs2 = ui->ui_slave; + upaddr->upcs1 = UP_NOP|UP_GO; if (upaddr->upcs2&UPCS2_NED) { upaddr->upcs1 = UP_DCLR|UP_GO; return (0); @@ -156,8 +185,10 @@ upattach(ui) upaddr->upcs1 = 0; upaddr->upcs2 = ui->ui_slave; upaddr->uphr = UPHR_MAXTRAK; - if (upaddr->uphr == 10) + if (upaddr->uphr == 9) ui->ui_type = 1; /* fujitsu hack */ + else if (upaddr->uphr == 15) + ui->ui_type = 2; /* ampex hack */ upaddr->upcs2 = UPCS2_CLR; /* upaddr->uphr = UPHR_MAXCYL; @@ -434,6 +465,7 @@ updgo(um) { register struct updevice *upaddr = (struct updevice *)um->um_addr; + um->um_tab.b_active = 2; /* should now be 2 */ upaddr->upba = um->um_ubinfo; upaddr->upcs1 = um->um_cmd|((um->um_ubinfo>>8)&0x300); } @@ -460,11 +492,12 @@ upintr(sc21) * interrupt for attention status on seeking drives. * Just service them. */ - if (um->um_tab.b_active == 0) { + if (um->um_tab.b_active != 2 && !sc->sc_recal) { if (upaddr->upcs1 & UP_TRE) upaddr->upcs1 = UP_TRE; goto doattn; } + um->um_tab.b_active = 1; /* * Get device and block structures, and a pointer * to the uba_device for the drive. Select the drive. @@ -606,7 +639,7 @@ doattn: unit--; /* was 1 origin */ as &= ~(1<upas = 1<um_tab.b_active++; /* Either complete or continuing... */ if (up->upwc == 0) return (0); /* @@ -739,6 +771,7 @@ upecc(ui) up->upba = ubaddr; cmd = (ubaddr >> 8) & 0x300; cmd |= UP_IE|UP_GO|UP_RCOM; + um->um_tab.b_active = 2; /* continuing transfer ... */ up->upcs1 = cmd; #endif return (1); @@ -764,6 +797,7 @@ upreset(uban) um->um_tab.b_active = 0; um->um_tab.b_actf = um->um_tab.b_actl = 0; up_softc[sc21].sc_recal = 0; + up_softc[sc21].sc_wticks = 0; if (um->um_ubinfo) { printf("<%d>", (um->um_ubinfo>>28)&0xf); ubadone(um); @@ -830,6 +864,7 @@ updump(dev) register struct uba_device *ui; register short *rp; struct upst *st; + register int retry; unit = minor(dev) >> 3; if (unit >= NUP) @@ -841,20 +876,22 @@ updump(dev) uba = phys(struct uba_hd *, ui->ui_hd)->uh_physuba; ubainit(uba); upaddr = (struct updevice *)ui->ui_physaddr; - DELAY(2000000); + DELAY(5000000); num = maxfree; - start = 0; upaddr->upcs2 = unit; DELAY(100); - if ((upaddr->upcs1&UP_DVA) == 0) - return (EFAULT); - if ((upaddr->upds & UPDS_VV) == 0) { - upaddr->upcs1 = UP_DCLR|UP_GO; - upaddr->upcs1 = UP_PRESET|UP_GO; - upaddr->upof = UPOF_FMT22; - } + upaddr->upcs1 = UP_DCLR|UP_GO; + upaddr->upcs1 = UP_PRESET|UP_GO; + upaddr->upof = UPOF_FMT22; + retry = 0; + do { + DELAY(25); + if (++retry > 527) + break; + } while ((upaddr->upds & UP_RDY) == 0); if ((upaddr->upds & UPDS_DREADY) != UPDS_DREADY) return (EFAULT); + start = 0; st = &upst[ui->ui_type]; sizes = phys(struct size *, st->sizes); if (dumplo < 0 || dumplo + num >= sizes[minor(dev)&07].nblocks) @@ -881,9 +918,20 @@ updump(dev) *--rp = 0; *--rp = -blk*NBPG / sizeof (short); *--rp = UP_GO|UP_WCOM; + retry = 0; do { DELAY(25); + if (++retry > 527) + break; } while ((upaddr->upcs1 & UP_RDY) == 0); + if ((upaddr->upds & UPDS_DREADY) != UPDS_DREADY) { + printf("up%d: not ready", unit); + if ((upaddr->upds & UPDS_DREADY) != UPDS_DREADY) { + printf("\n"); + return (EIO); + } + printf(" (flakey)\n"); + } if (upaddr->upds&UPDS_ERR) return (EIO); start += blk*NBPG;