|
|
1.1 ! root 1: /* hp.c 4.6 81/05/10 */ ! 2: ! 3: /* ! 4: * RP??/RM?? disk driver ! 5: */ ! 6: ! 7: #include "../h/param.h" ! 8: #include "../h/inode.h" ! 9: #include "../h/hpreg.h" ! 10: #include "../h/pte.h" ! 11: #include "../h/mbareg.h" ! 12: #include "saio.h" ! 13: #include "savax.h" ! 14: ! 15: #define MASKREG(reg) ((reg)&0xffff) ! 16: ! 17: char hp_type[MAXNMBA*8] = { 0 }; ! 18: ! 19: /* THIS SHOULD BE READ IN OFF THE PACK, PER DRIVE */ ! 20: short hp6_off[8] = { 0, 38, 0, -1, -1, -1, 118, -1 }; ! 21: short rm3_off[8] = { 0, 100, 0, -1, -1, -1, 310, -1 }; ! 22: short rm5_off[8] = { 0, 27, 0, 562, 589, 681, 562, 82 }; ! 23: short rm80_off[8] = { 0, 37, 0, -1, -1, -1, 115, 305 }; ! 24: short hp7_off[8] = { 0, 10, 0, 330, 340, 500, 330, 50 }; ! 25: /* END SHOULD BE READ IN */ ! 26: ! 27: short hptypes[] = ! 28: { MBDT_RM03, MBDT_RM05, MBDT_RP06, MBDT_RM80, MBDT_RP05, MBDT_RP07, 0 }; ! 29: ! 30: struct hpst { ! 31: short nsect; ! 32: short ntrak; ! 33: short nspc; ! 34: short ncyl; ! 35: short *off; ! 36: } hpst[] = { ! 37: 32, 5, 32*5, 823, rm3_off, /* RM03 */ ! 38: 32, 19, 32*19, 823, rm5_off, /* RM05 */ ! 39: 22, 19, 22*19, 815, hp6_off, /* RP06 */ ! 40: 31, 14, 31*14, 559, rm80_off, /* RM80 */ ! 41: 22, 19, 22*19, 411, hp6_off, /* RP06 */ ! 42: 50, 32, 50*32, 630, hp7_off, /* RP07 */ ! 43: }; ! 44: ! 45: hpopen(io) ! 46: register struct iob *io; ! 47: { ! 48: register unit = io->i_unit; ! 49: struct hpdevice *hpaddr = (struct hpdevice *)mbadrv(unit); ! 50: register struct hpst *st; ! 51: ! 52: mbainit(UNITTOMBA(io->i_unit)); ! 53: if (hp_type[unit] == 0) { ! 54: register type = hpaddr->hpdt & MBDT_TYPE; ! 55: register int i; ! 56: ! 57: for (i = 0; hptypes[i]; i++) ! 58: if (hptypes[i] == type) ! 59: goto found; ! 60: _stop("unknown drive type"); ! 61: found: ! 62: hp_type[unit] = i; ! 63: } ! 64: st = &hpst[hp_type[unit]]; ! 65: if (io->i_boff < 0 || io->i_boff > 7 || ! 66: st->off[io->i_boff]== -1) ! 67: _stop("hp bad minor"); ! 68: io->i_boff = st->off[io->i_boff] * st->nspc; ! 69: } ! 70: ! 71: hpstrategy(io, func) ! 72: register struct iob *io; ! 73: { ! 74: int unit = io->i_unit; ! 75: daddr_t bn = io->i_bn; ! 76: struct hpdevice *hpaddr = (struct hpdevice *)mbadrv(unit); ! 77: struct hpst *st = &hpst[hp_type[unit]]; ! 78: int cn, tn, sn; ! 79: ! 80: if ((hpaddr->hpds & HPDS_VV) == 0) { ! 81: hpaddr->hpcs1 = HP_DCLR|HP_GO; ! 82: hpaddr->hpcs1 = HP_PRESET|HP_GO; ! 83: hpaddr->hpof = HPOF_FMT22; ! 84: } ! 85: cn = bn/st->nspc; ! 86: sn = bn%st->nspc; ! 87: tn = sn/st->nsect; ! 88: sn = sn%st->nsect; ! 89: hpaddr->hpdc = cn; ! 90: hpaddr->hpda = (tn << 8) + sn; ! 91: mbastart(io, func); ! 92: while ((hpaddr->hpds & HPDS_DRY) == 0) ! 93: ; ! 94: if (hpaddr->hpds&HPDS_ERR) { ! 95: printf("hp error: (cyl,trk,sec)=(%d,%d,%d) ds=%b er1=%b\n", ! 96: cn, tn, sn, MASKREG(hpaddr->hpds), HPDS_BITS, ! 97: MASKREG(hpaddr->hper1), HPER1_BITS); ! 98: return (-1); ! 99: } ! 100: return (io->i_cc); ! 101: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.